|
Server IP : 217.21.85.138 / Your IP : 216.73.216.103 Web Server : LiteSpeed System : Linux in-mum-web906.main-hosting.eu 4.18.0-553.37.1.lve.el8.x86_64 #1 SMP Mon Feb 10 22:45:17 UTC 2025 x86_64 User : u915722082 ( 915722082) PHP Version : 7.4.33 Disable Function : system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail MySQL : OFF | cURL : ON | WGET : ON | Perl : OFF | Python : OFF Directory (0755) : /home/u915722082/.nvm/../public_html/brandessential/ |
| [ Home ] | [ C0mmand ] | [ Upload File ] |
|---|
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Business Card Editor</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: #f5f5f5;
height: 100vh;
overflow: hidden;
}
.header {
background: white;
padding: 12px 20px;
border-bottom: 1px solid #e0e0e0;
display: flex;
align-items: center;
justify-content: space-between;
}
.header-left {
display: flex;
align-items: center;
gap: 20px;
}
.logo {
background: #0066cc;
color: white;
padding: 8px 12px;
border-radius: 4px;
font-weight: bold;
}
.project-info {
display: flex;
align-items: center;
gap: 10px;
color: #666;
}
.header-right {
display: flex;
align-items: center;
gap: 15px;
}
.undo-redo {
display: flex;
gap: 5px;
}
.undo-btn, .redo-btn {
background: #f0f0f0;
border: 1px solid #ddd;
padding: 8px 12px;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
}
.undo-btn:hover, .redo-btn:hover {
background: #e0e0e0;
}
.next-btn {
background: #00b4d8;
color: white;
border: none;
padding: 10px 20px;
border-radius: 4px;
cursor: pointer;
font-weight: 500;
}
.main-container {
display: flex;
height: calc(100vh - 60px);
}
.sidebar {
width: 80px;
background: white;
border-right: 1px solid #e0e0e0;
padding: 15px 0;
display: flex;
flex-direction: column;
align-items: center;
}
.sidebar-option {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
padding: 15px 10px;
cursor: pointer;
transition: background-color 0.2s;
border-radius: 8px;
margin-bottom: 10px;
width: 60px;
}
.sidebar-option:hover {
background: #f8f9fa;
}
.sidebar-option.active {
background: #e3f2fd;
border: 1px solid #2196f3;
}
.sidebar-option-icon {
width: 32px;
height: 32px;
background: #666;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 14px;
font-weight: bold;
}
.sidebar-option-text {
font-size: 12px;
color: #666;
font-weight: 500;
text-align: center;
}
.sidebar-option.active .sidebar-option-text {
color: #2196f3;
}
.form-panel {
width: 350px;
background: white;
border-right: 1px solid #e0e0e0;
padding: 20px;
overflow-y: auto;
}
.form-panel h2 {
color: #333;
margin-bottom: 20px;
font-size: 18px;
}
.text-fields {
margin-top: 20px;
}
.text-field {
margin-bottom: 15px;
}
.text-field label {
display: block;
margin-bottom: 5px;
font-weight: 500;
color: #333;
}
.text-field input {
width: 100%;
padding: 8px 12px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 14px;
}
.text-field input:focus {
outline: none;
border-color: #2196f3;
}
.canvas-container {
flex: 1;
background: #f8f9fa;
display: flex;
align-items: center;
justify-content: center;
padding: 40px;
}
.business-card {
width: 540px;
height: 324px;
background: white;
border: 2px solid #00b4d8;
border-radius: 8px;
position: relative;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
overflow: hidden;
}
.card-content {
padding: 20px;
height: 100%;
display: flex;
flex-direction: column;
position: relative;
}
.card-header {
display: flex;
align-items: flex-start;
gap: 20px;
margin-bottom: 20px;
}
.photo-placeholder {
width: 80px;
height: 80px;
background: #e0e0e0;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
color: #999;
font-size: 12px;
text-align: center;
flex-shrink: 0;
}
.company-info {
flex: 1;
}
.company-name {
font-size: 24px;
font-weight: bold;
color: #2196f3;
margin-bottom: 5px;
}
.company-message {
font-size: 14px;
color: #666;
margin-bottom: 15px;
}
.personal-info {
display: flex;
justify-content: space-between;
margin-top: auto;
}
.personal-left {
display: flex;
flex-direction: column;
gap: 8px;
}
.personal-right {
display: flex;
flex-direction: column;
gap: 8px;
text-align: right;
}
.info-item {
font-size: 14px;
color: #333;
}
.info-label {
font-weight: 500;
color: #2196f3;
}
.address-section {
margin-top: 15px;
padding-top: 15px;
border-top: 1px solid #e0e0e0;
}
.address-row {
display: flex;
justify-content: space-between;
gap: 20px;
}
.address-left, .address-right {
flex: 1;
}
.hidden {
display: none;
}
.upload-section {
margin-bottom: 25px;
}
.upload-tabs {
display: flex;
border-bottom: 2px solid #f0f0f0;
margin-bottom: 20px;
}
.upload-tab {
padding: 12px 20px;
border: none;
background: none;
cursor: pointer;
font-size: 14px;
font-weight: 500;
color: #666;
border-bottom: 2px solid transparent;
transition: all 0.2s;
}
.upload-tab.active {
color: #333;
border-bottom-color: #333;
}
.upload-content {
padding: 20px;
border: 2px dashed #e0e0e0;
border-radius: 8px;
text-align: center;
}
.upload-buttons {
display: flex;
flex-direction: column;
gap: 10px;
}
.upload-btn {
background: #00b4d8;
color: white;
border: none;
padding: 12px 20px;
border-radius: 6px;
cursor: pointer;
font-size: 14px;
font-weight: 500;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.upload-btn:hover {
background: #0099cc;
}
.upload-btn.secondary {
background: #f0f0f0;
color: #333;
border: 1px solid #ddd;
}
.upload-btn.secondary:hover {
background: #e0e0e0;
}
.accepted-formats {
margin-top: 15px;
text-align: left;
}
.accepted-formats h4 {
font-size: 14px;
color: #333;
margin-bottom: 8px;
}
.formats-list {
font-size: 12px;
color: #666;
line-height: 1.4;
}
.recently-uploaded {
margin-top: 20px;
}
.recently-uploaded h4 {
font-size: 14px;
color: #333;
margin-bottom: 10px;
}
.uploaded-item {
width: 60px;
height: 60px;
border: 1px solid #e0e0e0;
border-radius: 4px;
overflow: hidden;
cursor: pointer;
}
.uploaded-item img {
width: 100%;
height: 100%;
object-fit: cover;
}
#imageUpload {
display: none;
}
.uploaded-image {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 4px;
}
</style>
</head>
<body>
<div class="header">
<div class="header-left">
<div class="logo">VP</div>
<div class="project-info">
<span>My Projects</span>
<span>—</span>
<span>Standard Visiting Cards</span>
<span>• Saved</span>
</div>
</div>
<div class="header-right">
<div class="undo-redo">
<button class="undo-btn" onclick="undoAction()">↶</button>
<button class="redo-btn" onclick="redoAction()">↷</button>
</div>
<button class="next-btn">Next</button>
</div>
</div>
<div class="main-container">
<div class="sidebar">
<div class="sidebar-option active" onclick="showPanel('text')">
<div class="sidebar-option-icon">T</div>
<div class="sidebar-option-text">Text</div>
</div>
<div class="sidebar-option" onclick="showPanel('images')">
<div class="sidebar-option-icon">📷</div>
<div class="sidebar-option-text">Images</div>
</div>
<div class="sidebar-option" onclick="showPanel('graphics')">
<div class="sidebar-option-icon">⚙</div>
<div class="sidebar-option-text">Graphics</div>
</div>
<div class="sidebar-option" onclick="showPanel('qr')">
<div class="sidebar-option-icon">QR</div>
<div class="sidebar-option-text">QR-codes</div>
</div>
<div class="sidebar-option" onclick="showPanel('tables')">
<div class="sidebar-option-icon">⊞</div>
<div class="sidebar-option-text">Tables</div>
</div>
<div class="sidebar-option" onclick="showPanel('design')">
<div class="sidebar-option-icon">🎨</div>
<div class="sidebar-option-text">Design Color</div>
</div>
<div class="sidebar-option" onclick="showPanel('background')">
<div class="sidebar-option-icon">⊟</div>
<div class="sidebar-option-text">Background</div>
</div>
</div>
<div class="form-panel">
<div id="textPanel">
<h2>Text</h2>
<div class="text-fields">
<div class="text-field">
<label>Company Name</label>
<input type="text" id="companyName" placeholder="Enter company name" oninput="updateCard()">
</div>
<div class="text-field">
<label>Company Message</label>
<input type="text" id="companyMessage" placeholder="Enter company message" oninput="updateCard()">
</div>
<div class="text-field">
<label>Full Name</label>
<input type="text" id="fullName" placeholder="Enter full name" oninput="updateCard()">
</div>
<div class="text-field">
<label>Job Title</label>
<input type="text" id="jobTitle" placeholder="Enter job title" oninput="updateCard()">
</div>
<div class="text-field">
<label>Email / Other</label>
<input type="text" id="email" placeholder="Enter email" oninput="updateCard()">
</div>
<div class="text-field">
<label>Address Line 1</label>
<input type="text" id="address1" placeholder="Enter address line 1" oninput="updateCard()">
</div>
<div class="text-field">
<label>Address Line 2</label>
<input type="text" id="address2" placeholder="Enter address line 2" oninput="updateCard()">
</div>
<div class="text-field">
<label>Web / Other</label>
<input type="text" id="website" placeholder="Enter website" oninput="updateCard()">
</div>
<div class="text-field">
<label>Phone / Other</label>
<input type="text" id="phone" placeholder="Enter phone number" oninput="updateCard()">
</div>
</div>
</div>
<div id="imagePanel" class="hidden">
<h2>Images</h2>
<div class="upload-section">
<div class="upload-tabs">
<button class="upload-tab active">Upload</button>
</div>
<div class="upload-content">
<div class="upload-buttons">
<button class="upload-btn" onclick="document.getElementById('imageUpload').click()">
📁 Upload from this device
</button>
<button class="upload-btn secondary" onclick="document.getElementById('imageUpload').click()">
📱 Upload from phone
</button>
</div>
<input type="file" id="imageUpload" accept="image/*" onchange="handleImageUpload(event)" style="display: none;">
</div>
<div class="accepted-formats">
<h4>Accepted formats</h4>
<div class="formats-list">
.jpg, .jpeg, .jfif, .bmp, .png, .gif, .heic,<br>
.svg, .webp, .pdf, .psd, .ai, .eps, .ait, .ppt,<br>
.pptx, .tif, .tiff
</div>
</div>
<div class="recently-uploaded">
<h4>Recently uploaded</h4>
<div class="uploaded-item" id="recentImage" style="display: none;">
<img id="recentImageThumb" src="" alt="Recent upload">
</div>
</div>
</div>
</div>
<div id="otherPanels" class="hidden">
<h2>Feature Not Available</h2>
<p>This feature is not implemented in the current version.</p>
</div>
</div>
<div class="canvas-container">
<div class="business-card">
<div class="card-content">
<div class="card-header">
<div class="photo-placeholder" id="photoPlaceholder">
Your Photo or Logo Here
</div>
<div class="company-info">
<div class="company-name" id="cardCompanyName">Company Name</div>
<div class="company-message" id="cardCompanyMessage">Company Message</div>
</div>
</div>
<div class="personal-info">
<div class="personal-left">
<div class="info-item">
<span class="info-label" id="cardFullName">Full Name</span>
</div>
<div class="info-item" id="cardJobTitle">Job Title</div>
<div class="info-item" id="cardEmail">Email / Other</div>
</div>
<div class="personal-right">
<div class="info-item" id="cardPhone">Phone / Other</div>
</div>
</div>
<div class="address-section">
<div class="address-row">
<div class="address-left">
<div class="info-item" id="cardAddress1">Address Line 1</div>
<div class="info-item" id="cardAddress2">Address Line 2</div>
</div>
<div class="address-right">
<div class="info-item" id="cardWebsite">Web / Other</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
let history = [];
let currentState = 0;
function saveState() {
const state = {
companyName: document.getElementById('companyName').value,
companyMessage: document.getElementById('companyMessage').value,
fullName: document.getElementById('fullName').value,
jobTitle: document.getElementById('jobTitle').value,
email: document.getElementById('email').value,
address1: document.getElementById('address1').value,
address2: document.getElementById('address2').value,
website: document.getElementById('website').value,
phone: document.getElementById('phone').value,
image: document.getElementById('photoPlaceholder').innerHTML
};
history = history.slice(0, currentState + 1);
history.push(state);
currentState = history.length - 1;
}
function undoAction() {
if (currentState > 0) {
currentState--;
restoreState(history[currentState]);
}
}
function redoAction() {
if (currentState < history.length - 1) {
currentState++;
restoreState(history[currentState]);
}
}
function restoreState(state) {
document.getElementById('companyName').value = state.companyName || '';
document.getElementById('companyMessage').value = state.companyMessage || '';
document.getElementById('fullName').value = state.fullName || '';
document.getElementById('jobTitle').value = state.jobTitle || '';
document.getElementById('email').value = state.email || '';
document.getElementById('address1').value = state.address1 || '';
document.getElementById('address2').value = state.address2 || '';
document.getElementById('website').value = state.website || '';
document.getElementById('phone').value = state.phone || '';
document.getElementById('photoPlaceholder').innerHTML = state.image || 'Your Photo or Logo Here';
updateCard();
}
function updateCard() {
const companyName = document.getElementById('companyName').value || 'Company Name';
const companyMessage = document.getElementById('companyMessage').value || 'Company Message';
const fullName = document.getElementById('fullName').value || 'Full Name';
const jobTitle = document.getElementById('jobTitle').value || 'Job Title';
const email = document.getElementById('email').value || 'Email / Other';
const address1 = document.getElementById('address1').value || 'Address Line 1';
const address2 = document.getElementById('address2').value || 'Address Line 2';
const website = document.getElementById('website').value || 'Web / Other';
const phone = document.getElementById('phone').value || 'Phone / Other';
document.getElementById('cardCompanyName').textContent = companyName;
document.getElementById('cardCompanyMessage').textContent = companyMessage;
document.getElementById('cardFullName').textContent = fullName;
document.getElementById('cardJobTitle').textContent = jobTitle;
document.getElementById('cardEmail').textContent = email;
document.getElementById('cardAddress1').textContent = address1;
document.getElementById('cardAddress2').textContent = address2;
document.getElementById('cardWebsite').textContent = website;
document.getElementById('cardPhone').textContent = phone;
saveState();
}
function showPanel(panelType) {
// Hide all panels
document.getElementById('textPanel').classList.add('hidden');
document.getElementById('imagePanel').classList.add('hidden');
document.getElementById('otherPanels').classList.add('hidden');
// Remove active class from all sidebar options
document.querySelectorAll('.sidebar-option').forEach(option => {
option.classList.remove('active');
});
// Show selected panel and activate corresponding sidebar option
if (panelType === 'text') {
document.getElementById('textPanel').classList.remove('hidden');
document.querySelectorAll('.sidebar-option')[0].classList.add('active');
} else if (panelType === 'images') {
document.getElementById('imagePanel').classList.remove('hidden');
document.querySelectorAll('.sidebar-option')[1].classList.add('active');
} else {
document.getElementById('otherPanels').classList.remove('hidden');
// Find and activate the clicked option
event.target.closest('.sidebar-option').classList.add('active');
}
}
function handleImageUpload(event) {
const file = event.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = function(e) {
const img = document.createElement('img');
img.src = e.target.result;
img.classList.add('uploaded-image');
const placeholder = document.getElementById('photoPlaceholder');
placeholder.innerHTML = '';
placeholder.appendChild(img);
// Show in recently uploaded
const recentImage = document.getElementById('recentImage');
const recentImageThumb = document.getElementById('recentImageThumb');
recentImageThumb.src = e.target.result;
recentImage.style.display = 'block';
saveState();
};
reader.readAsDataURL(file);
}
}
// Initialize with empty state
saveState();
</script>
</body>
</html>