feat: improvement of user name display

This commit is contained in:
Benjamin
2025-12-29 16:00:25 +01:00
parent e4521d87c7
commit 29d8012c22
7 changed files with 153 additions and 100 deletions
+55 -10
View File
@@ -22,19 +22,64 @@ const isAuthenticated = computed(() => authStore.isAuthenticated)
const isAdmin = computed(() => authStore.isAdmin)
const user = computed(() => authStore.user)
// Extract name parts from email (before @, split by . - _)
function extractNamePartsFromEmail(email: string): string[] {
const localPart = email.split('@')[0] || ''
return localPart.split(/[.\-_]+/).filter(p => p.length > 0)
}
// Capitalize first letter of a string
function capitalize(str: string): string {
return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()
}
// Display name (for menu and header)
const displayName = computed(() => {
// If user has a real name that's not just the email, use it
if (user.value?.name && user.value.name !== user.value.email) {
return user.value.name
}
// Otherwise extract from email
if (user.value?.email) {
const parts = extractNamePartsFromEmail(user.value.email)
if (parts.length > 0) {
return parts.map(capitalize).join(' ')
}
}
return user.value?.email || ''
})
// User initials for avatar
const userInitials = computed(() => {
if (!user.value?.name && !user.value?.email) return '?'
const name = user.value.name || user.value.email || ''
const parts = name.split(/[\s@]+/).filter(p => p.length > 0)
if (parts.length >= 2) {
const first = parts[0] ?? ''
const second = parts[1] ?? ''
if (first.length > 0 && second.length > 0) {
// If user has a real name, use it for initials
if (user.value?.name && user.value.name !== user.value.email) {
const nameParts = user.value.name.split(/\s+/).filter(p => p.length > 0)
if (nameParts.length >= 2) {
const first = nameParts[0] ?? ''
const second = nameParts[1] ?? ''
return (first.charAt(0) + second.charAt(0)).toUpperCase()
}
return user.value.name.slice(0, 2).toUpperCase()
}
return name.slice(0, 2).toUpperCase()
// Extract from email
if (user.value?.email) {
const parts = extractNamePartsFromEmail(user.value.email)
if (parts.length >= 2) {
// nom.prenom@ or prenom.nom@ → 2 initials
const first = parts[0] ?? ''
const second = parts[1] ?? ''
return (first.charAt(0) + second.charAt(0)).toUpperCase()
}
if (parts.length === 1 && parts[0]) {
// Single word → 1 initial only
return parts[0].charAt(0).toUpperCase()
}
}
return '?'
})
const isActive = (path: string) => {
@@ -122,7 +167,7 @@ const closeUserMenu = () => {
<div class="w-8 h-8 rounded-lg bg-slate-100 dark:bg-slate-700 flex items-center justify-center text-xs font-semibold text-slate-600 dark:text-slate-300">
{{ userInitials }}
</div>
<span class="text-slate-700 dark:text-slate-200 hidden lg:inline">{{ user?.name || user?.email?.split('@')[0] }}</span>
<span class="text-slate-700 dark:text-slate-200 hidden lg:inline">{{ displayName }}</span>
<ChevronDown :size="16" class="text-slate-400" />
</button>
@@ -146,7 +191,7 @@ const closeUserMenu = () => {
<div class="p-2">
<!-- User info -->
<div class="px-3 py-2 border-b border-slate-100 dark:border-slate-700 mb-2">
<p class="font-medium text-slate-900 dark:text-slate-100">{{ user?.name }}</p>
<p class="font-medium text-slate-900 dark:text-slate-100">{{ displayName }}</p>
<p class="text-xs text-slate-500 dark:text-slate-400 truncate">{{ user?.email }}</p>
</div>
@@ -256,7 +301,7 @@ const closeUserMenu = () => {
<!-- User section -->
<div class="border-t border-slate-200 dark:border-slate-700 pt-3 mt-3">
<div class="px-3 py-2 mb-2">
<p class="font-medium text-slate-900 dark:text-slate-100">{{ user?.name }}</p>
<p class="font-medium text-slate-900 dark:text-slate-100">{{ displayName }}</p>
<p class="text-xs text-slate-500 dark:text-slate-400">{{ user?.email }}</p>
</div>
<button
+18 -17
View File
@@ -55,15 +55,16 @@
},
"sign": {
"title": "Lesebestätigung",
"subtitle": "Bestätigen Sie Ihre Lektüre mit einer kryptografischen Ed25519-Bestätigung",
"subtitle": "Bestätigen Sie Ihre Lektüre mit einer sicheren und unwiderruflichen Bestätigung",
"loading": {
"title": "Dokument wird geladen...",
"description": "Bitte warten Sie, während wir das Dokument zur Signatur vorbereiten."
"description": "Bitte warten Sie, während wir das Dokument vorbereiten."
},
"noDocument": {
"title": "Kein Dokument angegeben",
"description": "Um ein Dokument zu signieren, fügen Sie den Parameter {code} zur URL hinzu",
"examples": "Beispiele:"
"description": "Um die Lektüre eines Dokuments zu bestätigen, fügen Sie den Parameter {code} zur URL hinzu",
"examples": "Beispiele:",
"orEnterReference": "Oder geben Sie Ihre Dokumentenreferenz unten ein"
},
"success": {
"title": "Lektüre erfolgreich bestätigt!",
@@ -87,7 +88,7 @@
"recorded": "Ihre Bestätigung wird mit den folgenden Informationen aufgezeichnet:",
"email": "Ihre E-Mail-Adresse",
"timestamp": "Präziser Zeitstempel der Bestätigung",
"signature": "Kryptografische Ed25519-Bestätigung",
"signature": "Sicherer kryptografischer Fingerabdruck",
"hash": "SHA-256-Hash des Inhalts"
},
"confirmations": {
@@ -101,7 +102,7 @@
},
"howItWorks": {
"title": "Wie funktioniert es?",
"subtitle": "Ackify ermöglicht es Ihnen, kryptografisch zu beweisen, dass Sie ein Dokument gelesen haben",
"subtitle": "Ackify ermöglicht es Ihnen, offiziell zu bezeugen, dass Sie ein Dokument gelesen haben",
"step1": {
"title": "1. Auf das Dokument zugreifen",
"description": "Fügen Sie {code} zur Adresse dieser Seite hinzu"
@@ -112,12 +113,12 @@
},
"step3": {
"title": "3. Lektüre bestätigen",
"description": "Ihre Bestätigung wird mit einer Ed25519-Signatur aufgezeichnet"
"description": "Ihre Bestätigung wird sicher und überprüfbar aufgezeichnet"
},
"features": {
"crypto": {
"title": "Kryptografische Sicherheit",
"description": "Unwiderrufliche Ed25519-Signaturen garantieren die Authentizität"
"description": "Unwiderrufliche Bestätigungen garantieren die Authentizität"
},
"instant": {
"title": "Sofort",
@@ -206,7 +207,7 @@
"allConfirmations": "Alle meine Bestätigungen",
"about": {
"title": "Über Bestätigungen",
"description": "Jede Bestätigung wird kryptografisch mit Ed25519 aufgezeichnet und verkettet, um die Integrität zu gewährleisten. Bestätigungen sind unwiderruflich und präzise mit Zeitstempel versehen."
"description": "Jede Bestätigung wird kryptografisch aufgezeichnet und verkettet, um die Integrität zu gewährleisten. Bestätigungen sind unwiderruflich und präzise mit Zeitstempel versehen."
},
"search": "Suchen...",
"error": {
@@ -447,17 +448,17 @@
}
},
"embed": {
"loading": "Signaturinformationen werden geladen...",
"title": "Signatur für",
"loading": "Bestätigungsinformationen werden geladen...",
"title": "Bestätigung für",
"document": "Dokument:",
"signedBy": "Signiert von",
"signedBy": "Bestätigt von",
"on": "am",
"verified": "Verifiziert",
"viewAll": "Alle Bestätigungen ansehen",
"error": "Signaturinformationen können nicht geladen werden",
"sign": "Signieren",
"signDocument": "Dieses Dokument signieren",
"noSignatures": "Keine Signatur für dieses Dokument",
"error": "Bestätigungsinformationen können nicht geladen werden",
"sign": "Bestätigen",
"signDocument": "Dieses Dokument bestätigen",
"noSignatures": "Keine Bestätigung für dieses Dokument",
"confirmationsCount": "{count} Bestätigung(en)",
"poweredBy": "Powered by Ackify",
"missingDocId": "Dokument-ID fehlt"
@@ -468,7 +469,7 @@
"home": "Zurück zur Startseite"
},
"footer": {
"description": "Open-Source-Lösung für kryptografische Dokumentlesebestätigung mit unwiderruflichen Ed25519-Signaturen.",
"description": "Open-Source-Lösung für kryptografische Dokumentlesebestätigung mit unwiderruflichen Attestierungen.",
"navigation": {
"title": "Navigation"
},
+18 -17
View File
@@ -55,15 +55,16 @@
},
"sign": {
"title": "Reading Confirmation",
"subtitle": "Certify your reading with an Ed25519 cryptographic confirmation",
"subtitle": "Certify your reading with a secure and non-repudiable confirmation",
"loading": {
"title": "Loading document...",
"description": "Please wait while we prepare the document for signing."
"description": "Please wait while we prepare the document."
},
"noDocument": {
"title": "No document specified",
"description": "To sign a document, add the {code} parameter to the URL",
"examples": "Examples:"
"description": "To confirm reading a document, add the {code} parameter to the URL",
"examples": "Examples:",
"orEnterReference": "Or enter your document reference below"
},
"success": {
"title": "Reading confirmed successfully!",
@@ -87,7 +88,7 @@
"recorded": "Your confirmation will be recorded with the following information:",
"email": "Your email address",
"timestamp": "Precise confirmation timestamp",
"signature": "Ed25519 cryptographic confirmation",
"signature": "Secure cryptographic fingerprint",
"hash": "SHA-256 hash of the content"
},
"confirmations": {
@@ -101,7 +102,7 @@
},
"howItWorks": {
"title": "How does it work?",
"subtitle": "Ackify allows you to cryptographically prove that you've read a document",
"subtitle": "Ackify allows you to officially attest that you've read a document",
"step1": {
"title": "1. Access the document",
"description": "Add {code} to this page's address"
@@ -112,12 +113,12 @@
},
"step3": {
"title": "3. Confirm reading",
"description": "Your confirmation is recorded with an Ed25519 signature"
"description": "Your confirmation is recorded securely and verifiably"
},
"features": {
"crypto": {
"title": "Cryptographic security",
"description": "Non-repudiable Ed25519 signatures guaranteeing authenticity"
"description": "Non-repudiable confirmations guaranteeing authenticity"
},
"instant": {
"title": "Instant",
@@ -206,7 +207,7 @@
"allConfirmations": "All my confirmations",
"about": {
"title": "About confirmations",
"description": "Each confirmation is cryptographically recorded with Ed25519 and chained to ensure integrity. Confirmations are non-repudiable and precisely timestamped."
"description": "Each confirmation is cryptographically recorded and chained to ensure integrity. Confirmations are non-repudiable and precisely timestamped."
},
"search": "Search...",
"error": {
@@ -447,17 +448,17 @@
}
},
"embed": {
"loading": "Loading signature information...",
"title": "Signature for",
"loading": "Loading confirmation information...",
"title": "Confirmation for",
"document": "Document:",
"signedBy": "Signed by",
"signedBy": "Confirmed by",
"on": "on",
"verified": "Verified",
"viewAll": "View all confirmations",
"error": "Unable to load signature information",
"sign": "Sign",
"signDocument": "Sign this document",
"noSignatures": "No signatures for this document",
"error": "Unable to load confirmation information",
"sign": "Confirm",
"signDocument": "Confirm this document",
"noSignatures": "No confirmations for this document",
"confirmationsCount": "{count} confirmation(s)",
"poweredBy": "Powered by Ackify",
"missingDocId": "Document ID missing"
@@ -468,7 +469,7 @@
"home": "Back to home"
},
"footer": {
"description": "Open-source solution for cryptographic confirmation of document reading with non-repudiable Ed25519 signatures.",
"description": "Open-source solution for cryptographic confirmation of document reading with non-repudiable attestations.",
"navigation": {
"title": "Navigation"
},
+18 -17
View File
@@ -55,15 +55,16 @@
},
"sign": {
"title": "Confirmación de Lectura",
"subtitle": "Certifique su lectura con una confirmación criptográfica Ed25519",
"subtitle": "Certifique su lectura con una confirmación segura e irrefutable",
"loading": {
"title": "Cargando el documento...",
"description": "Por favor, espere mientras preparamos el documento para la firma."
"description": "Por favor, espere mientras preparamos el documento."
},
"noDocument": {
"title": "Ningún documento especificado",
"description": "Para firmar un documento, añada el parámetro {code} a la URL",
"examples": "Ejemplos:"
"description": "Para confirmar la lectura de un documento, añada el parámetro {code} a la URL",
"examples": "Ejemplos:",
"orEnterReference": "O introduzca su referencia documental a continuación"
},
"success": {
"title": "¡Lectura confirmada con éxito!",
@@ -87,7 +88,7 @@
"recorded": "Su confirmación será registrada con la siguiente información:",
"email": "Su dirección de email",
"timestamp": "Marca de tiempo precisa de la confirmación",
"signature": "Confirmación criptográfica Ed25519",
"signature": "Huella criptográfica segura",
"hash": "Hash SHA-256 del contenido"
},
"confirmations": {
@@ -101,7 +102,7 @@
},
"howItWorks": {
"title": "¿Cómo funciona?",
"subtitle": "Ackify le permite probar criptográficamente que ha leído un documento",
"subtitle": "Ackify le permite atestiguar oficialmente que ha leído un documento",
"step1": {
"title": "1. Acceda al documento",
"description": "Añada {code} a la dirección de esta página"
@@ -112,12 +113,12 @@
},
"step3": {
"title": "3. Confirme la lectura",
"description": "Su confirmación se registra con una firma Ed25519"
"description": "Su confirmación se registra de manera segura y verificable"
},
"features": {
"crypto": {
"title": "Seguridad criptográfica",
"description": "Firmas Ed25519 irrefutables que garantizan la autenticidad"
"description": "Confirmaciones irrefutables que garantizan la autenticidad"
},
"instant": {
"title": "Instantáneo",
@@ -206,7 +207,7 @@
"allConfirmations": "Todas mis confirmaciones",
"about": {
"title": "Acerca de las confirmaciones",
"description": "Cada confirmación se registra criptográficamente con Ed25519 y se encadena para garantizar la integridad. Las confirmaciones son irrefutables y tienen una marca de tiempo precisa."
"description": "Cada confirmación se registra criptográficamente y se encadena para garantizar la integridad. Las confirmaciones son irrefutables y tienen una marca de tiempo precisa."
},
"search": "Buscar...",
"error": {
@@ -447,17 +448,17 @@
}
},
"embed": {
"loading": "Cargando información de la firma...",
"title": "Firma para",
"loading": "Cargando información de la confirmación...",
"title": "Confirmación para",
"document": "Documento:",
"signedBy": "Firmado por",
"signedBy": "Confirmado por",
"on": "el",
"verified": "Verificado",
"viewAll": "Ver todas las confirmaciones",
"error": "Imposible cargar la información de la firma",
"sign": "Firmar",
"signDocument": "Firmar este documento",
"noSignatures": "Ninguna firma para este documento",
"error": "Imposible cargar la información de la confirmación",
"sign": "Confirmar",
"signDocument": "Confirmar este documento",
"noSignatures": "Ninguna confirmación para este documento",
"confirmationsCount": "{count} confirmación(es)",
"poweredBy": "Desarrollado por Ackify",
"missingDocId": "ID de documento faltante"
@@ -468,7 +469,7 @@
"home": "Volver al inicio"
},
"footer": {
"description": "Solución de código abierto de confirmación criptográfica de lectura de documentos con firmas Ed25519 irrefutables.",
"description": "Solución de código abierto de confirmación criptográfica de lectura de documentos con atestaciones irrefutables.",
"navigation": {
"title": "Navegación"
},
+18 -17
View File
@@ -55,15 +55,16 @@
},
"sign": {
"title": "Confirmation de Lecture",
"subtitle": "Certifiez votre lecture avec une confirmation cryptographique Ed25519",
"subtitle": "Certifiez votre lecture avec une confirmation sécurisée et non répudiable",
"loading": {
"title": "Chargement du document...",
"description": "Veuillez patienter pendant que nous préparons le document pour la signature."
"description": "Veuillez patienter pendant que nous préparons le document."
},
"noDocument": {
"title": "Aucun document spécifié",
"description": "Pour signer un document, ajoutez le paramètre {code} à l'URL",
"examples": "Exemples :"
"description": "Pour confirmer la lecture d'un document, ajoutez le paramètre {code} à l'URL",
"examples": "Exemples :",
"orEnterReference": "Ou saisissez votre référence documentaire ci-dessous"
},
"success": {
"title": "Lecture confirmée avec succès !",
@@ -87,7 +88,7 @@
"recorded": "Votre confirmation sera enregistrée avec les informations suivantes :",
"email": "Votre adresse email",
"timestamp": "Horodatage précis de la confirmation",
"signature": "Confirmation cryptographique Ed25519",
"signature": "Empreinte cryptographique sécurisée",
"hash": "Hash SHA-256 du contenu"
},
"confirmations": {
@@ -101,7 +102,7 @@
},
"howItWorks": {
"title": "Comment ça fonctionne ?",
"subtitle": "Ackify vous permet de prouver cryptographiquement que vous avez lu un document",
"subtitle": "Ackify vous permet d'attester officiellement que vous avez pris connaissance d'un document",
"step1": {
"title": "1. Accédez au document",
"description": "Ajoutez {code} à l'adresse de cette page"
@@ -112,12 +113,12 @@
},
"step3": {
"title": "3. Confirmez la lecture",
"description": "Votre confirmation est enregistrée avec une signature Ed25519"
"description": "Votre confirmation est enregistrée de manière sécurisée et vérifiable"
},
"features": {
"crypto": {
"title": "Sécurité cryptographique",
"description": "Signatures Ed25519 non répudiables garantissant l'authenticité"
"description": "Confirmations non répudiables garantissant l'authenticité"
},
"instant": {
"title": "Instantané",
@@ -206,7 +207,7 @@
"allConfirmations": "Toutes mes confirmations",
"about": {
"title": "À propos des confirmations",
"description": "Chaque confirmation est enregistrée de manière cryptographique avec Ed25519 et chaînée pour garantir l'intégrité. Les confirmations sont non répudiables et horodatées de façon précise."
"description": "Chaque confirmation est enregistrée de manière cryptographique et chaînée pour garantir l'intégrité. Les confirmations sont non répudiables et horodatées de façon précise."
},
"search": "Rechercher...",
"error": {
@@ -444,17 +445,17 @@
}
},
"embed": {
"loading": "Chargement des informations de signature...",
"title": "Signature pour",
"loading": "Chargement des informations de confirmation...",
"title": "Confirmation pour",
"document": "Document:",
"signedBy": "Signé par",
"signedBy": "Confirmé par",
"on": "le",
"verified": "Vérifié",
"viewAll": "Voir toutes les confirmations",
"error": "Impossible de charger les informations de signature",
"sign": "Signer",
"signDocument": "Signer ce document",
"noSignatures": "Aucune signature pour ce document",
"error": "Impossible de charger les informations de confirmation",
"sign": "Confirmer",
"signDocument": "Confirmer ce document",
"noSignatures": "Aucune confirmation pour ce document",
"confirmationsCount": "{count} confirmation(s)",
"poweredBy": "Powered by Ackify",
"missingDocId": "ID de document manquant"
@@ -465,7 +466,7 @@
"home": "Retour à l'accueil"
},
"footer": {
"description": "Solution open-source de confirmation cryptographique de lecture de documents avec signatures Ed25519 non répudiables.",
"description": "Solution open-source de confirmation cryptographique de lecture de documents avec attestations non répudiables.",
"navigation": {
"title": "Navigation"
},
+18 -17
View File
@@ -55,15 +55,16 @@
},
"sign": {
"title": "Conferma di Lettura",
"subtitle": "Certifica la tua lettura con una conferma crittografica Ed25519",
"subtitle": "Certifica la tua lettura con una conferma sicura e non ripudiabile",
"loading": {
"title": "Caricamento del documento...",
"description": "Attendi mentre prepariamo il documento per la firma."
"description": "Attendi mentre prepariamo il documento."
},
"noDocument": {
"title": "Nessun documento specificato",
"description": "Per firmare un documento, aggiungi il parametro {code} all'URL",
"examples": "Esempi:"
"description": "Per confermare la lettura di un documento, aggiungi il parametro {code} all'URL",
"examples": "Esempi:",
"orEnterReference": "Oppure inserisci il riferimento del documento qui sotto"
},
"success": {
"title": "Lettura confermata con successo!",
@@ -87,7 +88,7 @@
"recorded": "La tua conferma sarà registrata con le seguenti informazioni:",
"email": "Il tuo indirizzo email",
"timestamp": "Timestamp preciso della conferma",
"signature": "Conferma crittografica Ed25519",
"signature": "Impronta crittografica sicura",
"hash": "Hash SHA-256 del contenuto"
},
"confirmations": {
@@ -101,7 +102,7 @@
},
"howItWorks": {
"title": "Come funziona?",
"subtitle": "Ackify ti permette di provare crittograficamente di aver letto un documento",
"subtitle": "Ackify ti permette di attestare ufficialmente di aver letto un documento",
"step1": {
"title": "1. Accedi al documento",
"description": "Aggiungi {code} all'indirizzo di questa pagina"
@@ -112,12 +113,12 @@
},
"step3": {
"title": "3. Conferma la lettura",
"description": "La tua conferma è registrata con una firma Ed25519"
"description": "La tua conferma è registrata in modo sicuro e verificabile"
},
"features": {
"crypto": {
"title": "Sicurezza crittografica",
"description": "Firme Ed25519 non ripudiabili che garantiscono l'autenticità"
"description": "Conferme non ripudiabili che garantiscono l'autenticità"
},
"instant": {
"title": "Istantaneo",
@@ -206,7 +207,7 @@
"allConfirmations": "Tutte le mie conferme",
"about": {
"title": "Informazioni sulle conferme",
"description": "Ogni conferma viene registrata crittograficamente con Ed25519 e concatenata per garantire l'integrità. Le conferme sono irrevocabili e timestampate in modo preciso."
"description": "Ogni conferma viene registrata crittograficamente e concatenata per garantire l'integrità. Le conferme sono irrevocabili e timestampate in modo preciso."
},
"search": "Cerca...",
"error": {
@@ -447,17 +448,17 @@
}
},
"embed": {
"loading": "Caricamento delle informazioni di firma...",
"title": "Firma per",
"loading": "Caricamento delle informazioni di conferma...",
"title": "Conferma per",
"document": "Documento:",
"signedBy": "Firmato da",
"signedBy": "Confermato da",
"on": "il",
"verified": "Verificato",
"viewAll": "Vedi tutte le conferme",
"error": "Impossibile caricare le informazioni di firma",
"sign": "Firma",
"signDocument": "Firma questo documento",
"noSignatures": "Nessuna firma per questo documento",
"error": "Impossibile caricare le informazioni di conferma",
"sign": "Conferma",
"signDocument": "Conferma questo documento",
"noSignatures": "Nessuna conferma per questo documento",
"confirmationsCount": "{count} conferma/e",
"poweredBy": "Powered by Ackify",
"missingDocId": "ID documento mancante"
@@ -468,7 +469,7 @@
"home": "Torna alla home"
},
"footer": {
"description": "Soluzione open-source di conferma crittografica di lettura di documenti con firme Ed25519 non ripudiabili.",
"description": "Soluzione open-source di conferma crittografica di lettura di documenti con attestazioni non ripudiabili.",
"navigation": {
"title": "Navigazione"
},
+8 -5
View File
@@ -282,14 +282,17 @@ onMounted(async () => {
<p class="text-slate-500 dark:text-slate-400 mb-4 max-w-md mx-auto">
{{ t('sign.noDocument.description', { code: '?doc=' }) }}
</p>
<div class="text-sm text-slate-500 dark:text-slate-400 space-y-2 max-w-md mx-auto">
<div class="text-sm text-slate-500 dark:text-slate-400 max-w-md mx-auto">
<p class="font-medium text-slate-700 dark:text-slate-300">{{ t('sign.noDocument.examples') }}</p>
<code class="block px-3 py-2 bg-slate-50 dark:bg-slate-900 rounded-lg text-xs font-mono text-slate-600 dark:text-slate-400">/?doc=https://example.com/policy.pdf</code>
<code class="block px-3 py-2 bg-slate-50 dark:bg-slate-900 rounded-lg text-xs font-mono text-slate-600 dark:text-slate-400">/?doc=/path/to/document</code>
<code class="block px-3 py-2 bg-slate-50 dark:bg-slate-900 rounded-lg text-xs font-mono text-slate-600 dark:text-slate-400">/?doc=my-unique-ref</code>
<div class="space-y-1 mt-2">
<code class="block px-3 bg-slate-50 dark:bg-slate-900 rounded-lg text-xs font-mono text-slate-600 dark:text-slate-400">/?doc=https://example.com/policy.pdf</code>
<code class="block px-3 bg-slate-50 dark:bg-slate-900 rounded-lg text-xs font-mono text-slate-600 dark:text-slate-400">/?doc=/path/to/document</code>
<code class="block px-3 bg-slate-50 dark:bg-slate-900 rounded-lg text-xs font-mono text-slate-600 dark:text-slate-400">/?doc=my-unique-ref</code>
</div>
<!-- Document creation form -->
<DocumentForm v-if="canCreateDocument" class="mt-6" />
<p v-if="canCreateDocument" class="mt-6 mb-3 font-medium text-slate-700 dark:text-slate-300">{{ t('sign.noDocument.orEnterReference') }}</p>
<DocumentForm v-if="canCreateDocument" />
<!-- Restricted message -->
<div v-else class="mt-4 accent-border bg-amber-50 dark:bg-amber-900/20 rounded-r-lg p-4 text-left">