ux: vCard-Eingabe mit Platzhaltern und Live-Vorschau verbessern
Ergänzt aussagekräftige Beispiel-Platzhalter im vCard-Formular und zeigt den generierten vCard-Text als Live-Vorschau im vCard-Modus an. Das erleichtert die Eingabe und macht das spätere QR-Ergebnis sofort nachvollziehbar. Made-with: Cursor
This commit is contained in:
+32
-9
@@ -348,6 +348,26 @@
|
||||
color: #6b7280;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.vcard-preview-label {
|
||||
margin: 4px 0 6px 0;
|
||||
color: #374151;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.vcard-preview {
|
||||
margin: 0 0 15px 0;
|
||||
padding: 10px;
|
||||
border: 1px solid #e5e7eb;
|
||||
border-radius: 6px;
|
||||
background: #f9fafb;
|
||||
color: #374151;
|
||||
font-size: 12px;
|
||||
line-height: 1.45;
|
||||
white-space: pre-wrap;
|
||||
word-break: break-word;
|
||||
min-height: 80px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -439,44 +459,47 @@
|
||||
<div class="options-row">
|
||||
<div class="options-col">
|
||||
<label for="vcard-first-name">Vorname:</label>
|
||||
<input type="text" id="vcard-first-name" placeholder="" autocomplete="off">
|
||||
<input type="text" id="vcard-first-name" placeholder="Max" autocomplete="off">
|
||||
</div>
|
||||
<div class="options-col">
|
||||
<label for="vcard-last-name">Nachname:</label>
|
||||
<input type="text" id="vcard-last-name" placeholder="" autocomplete="off">
|
||||
<input type="text" id="vcard-last-name" placeholder="Mustermann" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="options-row">
|
||||
<div class="options-col">
|
||||
<label for="vcard-org">Organisation:</label>
|
||||
<input type="text" id="vcard-org" placeholder="" autocomplete="off">
|
||||
<input type="text" id="vcard-org" placeholder="Medi Software GmbH" autocomplete="off">
|
||||
</div>
|
||||
<div class="options-col">
|
||||
<label for="vcard-title">Position (optional):</label>
|
||||
<input type="text" id="vcard-title" placeholder="" autocomplete="off">
|
||||
<input type="text" id="vcard-title" placeholder="IT-Leitung" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="options-row">
|
||||
<div class="options-col">
|
||||
<label for="vcard-phone">Telefon (optional):</label>
|
||||
<input type="tel" id="vcard-phone" placeholder="" autocomplete="off">
|
||||
<input type="tel" id="vcard-phone" placeholder="+49 30 1234567" autocomplete="off">
|
||||
</div>
|
||||
<div class="options-col">
|
||||
<label for="vcard-email">E-Mail (optional):</label>
|
||||
<input type="email" id="vcard-email" placeholder="" autocomplete="off">
|
||||
<input type="email" id="vcard-email" placeholder="max@beispiel.de" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label for="vcard-website">Webseite (optional):</label>
|
||||
<input type="url" id="vcard-website" placeholder="" autocomplete="off">
|
||||
<input type="url" id="vcard-website" placeholder="https://beispiel.de" autocomplete="off">
|
||||
|
||||
<label for="vcard-address">Adresse (optional):</label>
|
||||
<textarea id="vcard-address" placeholder="" rows="2"></textarea>
|
||||
<textarea id="vcard-address" placeholder="Musterstraße 1, 10115 Berlin" rows="2"></textarea>
|
||||
|
||||
<label for="vcard-note">Notiz (optional):</label>
|
||||
<textarea id="vcard-note" placeholder="" rows="2"></textarea>
|
||||
<textarea id="vcard-note" placeholder="Erreichbar Mo-Fr 9-17 Uhr" rows="2"></textarea>
|
||||
|
||||
<p class="vcard-preview-label">vCard-Vorschau:</p>
|
||||
<pre id="vcard-preview" class="vcard-preview" aria-live="polite">Bitte mindestens Vorname, Nachname oder Organisation eingeben.</pre>
|
||||
</div>
|
||||
|
||||
<div class="options-row">
|
||||
|
||||
@@ -42,6 +42,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
const shareBtn = document.getElementById('share');
|
||||
const shareHint = document.getElementById('share-hint');
|
||||
const eventBerlinPreview = document.getElementById('event-berlin-preview');
|
||||
const vcardPreview = document.getElementById('vcard-preview');
|
||||
|
||||
const MAX_EVENT_TITLE = 2000;
|
||||
const MAX_EVENT_LOCATION = 1000;
|
||||
@@ -688,6 +689,21 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
return lines.join('\r\n');
|
||||
}
|
||||
|
||||
function updateVCardPreview(text) {
|
||||
if (!vcardPreview) {
|
||||
return;
|
||||
}
|
||||
if (contentModeSelect.value !== 'vcard') {
|
||||
vcardPreview.textContent = '';
|
||||
return;
|
||||
}
|
||||
if (text && String(text).trim()) {
|
||||
vcardPreview.textContent = String(text);
|
||||
return;
|
||||
}
|
||||
vcardPreview.textContent = 'Bitte mindestens Vorname, Nachname oder Organisation eingeben.';
|
||||
}
|
||||
|
||||
function generateQRCode() {
|
||||
const mode = contentModeSelect.value;
|
||||
const text = textInput.value.trim();
|
||||
@@ -707,6 +723,9 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
// Clear previous error
|
||||
errorMessage.textContent = '';
|
||||
downloadBtn.style.display = 'none';
|
||||
if (mode !== 'vcard') {
|
||||
updateVCardPreview('');
|
||||
}
|
||||
|
||||
let qrText = '';
|
||||
|
||||
@@ -811,6 +830,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
const hasIdentity = firstName.trim() || lastName.trim() || org.trim();
|
||||
|
||||
if (!hasIdentity) {
|
||||
updateVCardPreview('');
|
||||
errorMessage.textContent = 'Bitte geben Sie mindestens Vorname, Nachname oder Organisation an';
|
||||
qrcodeCanvas.style.display = 'none';
|
||||
qrcodeImg.style.display = 'none';
|
||||
@@ -828,6 +848,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
address: address,
|
||||
note: note
|
||||
});
|
||||
updateVCardPreview(qrText);
|
||||
textInput.value = qrText;
|
||||
toggleClearButton();
|
||||
} else if (mode === 'wifi') {
|
||||
|
||||
Reference in New Issue
Block a user