Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 49 additions & 14 deletions infrastructure/eid-wallet/src/routes/(app)/ePassport/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -668,7 +668,11 @@ onMount(async () => {
<!-- Social binding button — always visible once passport is loaded -->
{#if bindingDocsLoaded}
<div class="mt-4 px-1">
<ButtonAction variant="soft" class="w-full" callback={openSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={openSocialBindingDrawer}
>
Request Social Binding
</ButtonAction>
</div>
Expand All@@ -684,55 +688,82 @@ onMount(async () => {
>
{#if socialBindingSuccess}
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold">✓</div>
<div
class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold"
>
</div>
<h4>Binding Complete!</h4>
</div>
<p class="text-black-700">
{socialBindingSignerName ?? "Someone"} has signed your identity binding.
Both eVaults now hold a mutually-signed social connection document.
</p>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}>Done</ButtonAction>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}
>Done</ButtonAction
>
{:else if socialBindingCounterSigning}
<div class="flex flex-col items-center justify-center gap-4 py-6">
<Shadow size={36} color="rgb(142, 82, 255)" />
<p class="text-black-700 text-center">Completing mutual binding…</p>
<p class="text-black-700 text-center">
Completing mutual binding…
</p>
</div>
{:else if socialBindingAwaitingConsent}
<div>
<h4 class="mb-1">Social Connection Request</h4>
<p class="text-black-700">
<strong>{socialBindingSignerName ?? socialBindingSignerEname ?? "Someone"}</strong>
wants to establish a social connection with you. Accept to confirm the binding.
<strong
>{socialBindingSignerName ??
socialBindingSignerEname ??
"Someone"}</strong
>
wants to establish a social connection with you. Accept to confirm
the binding.
</p>
</div>
<div class="bg-gray rounded-2xl p-4 flex flex-col gap-1">
<p class="small text-black-500">From</p>
<p class="font-semibold">{socialBindingSignerName ?? socialBindingSignerEname}</p>
<p class="font-semibold">
{socialBindingSignerName ?? socialBindingSignerEname}
</p>
{#if socialBindingSignerEname && socialBindingSignerEname !== socialBindingSignerName}
<p class="small text-black-300 break-all">{socialBindingSignerEname}</p>
<p class="small text-black-300 break-all">
{socialBindingSignerEname}
</p>
{/if}
</div>
{#if socialBindingError}
<p class="text-danger">{socialBindingError}</p>
{/if}
<div class="flex flex-col gap-3">
<ButtonAction class="w-full" callback={confirmSocialBinding}>Accept</ButtonAction>
<ButtonAction variant="soft" class="w-full" callback={declineSocialBinding}>Decline</ButtonAction>
<ButtonAction class="w-full" callback={confirmSocialBinding}
>Accept</ButtonAction
>
<ButtonAction
variant="soft"
class="w-full"
callback={declineSocialBinding}>Decline</ButtonAction
>
</div>
{:else}
<div>
<h4 class="mb-1">Request Social Binding</h4>
<p class="text-black-700">
Ask someone with an eID Wallet to scan this QR code to sign your
identity binding document.
Ask a trusted person with an eID Wallet to scan this QR and
confirm it’s you. <br />
They will sign a social binding for your Digital Self – no access
to your data.
</p>
</div>

{#if socialBindingQr}
<div class="flex justify-center py-2">
<QrCode value={socialBindingQr} size={220} />
</div>
<p class="small text-black-500 text-center break-all">{socialBindingQr}</p>
<p class="small text-black-500 text-center break-all">
{socialBindingQr}
</p>
{/if}

{#if socialBindingPolling}
Expand All@@ -746,7 +777,11 @@ onMount(async () => {
<p class="text-danger">{socialBindingError}</p>
{/if}

<ButtonAction variant="soft" class="w-full" callback={closeSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={closeSocialBindingDrawer}
>
Cancel
</ButtonAction>
{/if}
Expand Down
76 changes: 54 additions & 22 deletions infrastructure/eid-wallet/src/routes/(app)/main/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -552,7 +552,9 @@ onDestroy(() => {
onclick={() => goto("/ePassport")}
role="link"
tabindex="0"
onkeydown={(e) => { if (e.key === "Enter") goto("/ePassport"); }}
onkeydown={(e) => {
if (e.key === "Enter") goto("/ePassport");
}}
>
<div class="relative z-10">
<IdentityCard
Expand All@@ -562,16 +564,19 @@ onDestroy(() => {
</div>
{#if bindingDocsLoaded && (hasOnlySelfDocs || missingProvisionerDocs)}
<button
onclick={(e) => { e.stopPropagation(); goto("/ePassport"); }}
class="relative z-0 w-full -mt-3 -translate-y-[10px] rounded-b-2xl px-4 pt-[30px] pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
onclick={(e) => {
e.stopPropagation();
goto("/ePassport");
}}
class="relative z-0 w-full -mt-3 -translate-y-2.5 rounded-b-2xl px-4 pt-7.5 pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
{missingProvisionerDocs
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
>
<span>{missingProvisionerDocs ? '↑' : '⚠'}</span>
<span>{missingProvisionerDocs ? "↑" : "⚠"}</span>
{missingProvisionerDocs
? 'New — upgrade your eVault with verified identity docs'
: 'Tap to verify your identity and increase trust level'}
? "New – add binding docs for trust & recovery"
: "Verify your identity – secure DigitalSelf & earn trust"}
</button>
{/if}
</div>
Expand DownExpand Up@@ -600,12 +605,14 @@ onDestroy(() => {
<span
class="text-sm opacity-90 relative z-10 drop-shadow-md flex gap-1 items-center"
>Explore
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
Marketplace
<div class="flex items-center">
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
-enabled services
</div>
<span class="relative z-10">
<HugeiconsIcon
size={16}
Expand DownExpand Up@@ -753,23 +760,40 @@ onDestroy(() => {
style="padding: 1.5rem 1.5rem max(1.5rem, env(safe-area-inset-bottom));"
>
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold">!</div>
<div
class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold"
>
!
</div>
<h3 class="text-lg font-bold">Identity Already Registered</h3>
</div>
<p class="text-black-700 text-sm leading-relaxed">
This identity document is already linked to an existing eVault. You can't create a duplicate — each person gets one verified eVault.
This identity document is already linked to an existing eVault.
You can't create a duplicate — each person gets one verified
eVault.
</p>
{#if duplicateEName}
<div class="rounded-xl bg-gray-50 border border-gray-200 p-4">
<p class="text-xs text-black-500 mb-1">Your existing eVault eName</p>
<p class="font-mono text-sm font-medium text-black-900 break-all">{duplicateEName}</p>
<p class="text-xs text-black-500 mb-1">
Your existing eVault eName
</p>
<p
class="font-mono text-sm font-medium text-black-900 break-all"
>
{duplicateEName}
</p>
</div>
<p class="text-sm text-black-500">
Use the eName above to recover access to your existing eVault instead.
Use the eName above to recover access to your existing
eVault instead.
</p>
{/if}
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Got it
</Button.Action>
</div>
Expand DownExpand Up@@ -823,7 +847,11 @@ onDestroy(() => {
notified when it's complete.
</p>
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Close
</Button.Action>
</div>
Expand All@@ -844,7 +872,11 @@ onDestroy(() => {
<Button.Action class="w-full" callback={startKycUpgrade}>
Try Again
</Button.Action>
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Cancel
</Button.Action>
</div>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,10 +48,10 @@ onMount(async () => {
>
{#snippet subtitle()}
<p>
You can use it to access any platform that supports the Web
3.0 Data Space – <strong>no usernames, no passwords</strong
>. If you lose your phone, you can reissue your ePassport on
another device, linked to the same <strong>eName</strong>.
Your ePassport lets you log in to any W3DS-enabled platform
– <strong>no usernames, no passwords</strong>. If you lose
or change your phone, you can re-create your ePassport on a
new device with the same eName.
</p>
{/snippet}
</Hero>
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 49 additions & 14 deletions infrastructure/eid-wallet/src/routes/(app)/ePassport/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -668,7 +668,11 @@ onMount(async () => {
<!-- Social binding button — always visible once passport is loaded -->
{#if bindingDocsLoaded}
<div class="mt-4 px-1">
<ButtonAction variant="soft" class="w-full" callback={openSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={openSocialBindingDrawer}
>
Request Social Binding
</ButtonAction>
</div>
Expand All@@ -684,55 +688,82 @@ onMount(async () => {
>
{#if socialBindingSuccess}
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold">✓</div>
<div
class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold"
>
</div>
<h4>Binding Complete!</h4>
</div>
<p class="text-black-700">
{socialBindingSignerName ?? "Someone"} has signed your identity binding.
Both eVaults now hold a mutually-signed social connection document.
</p>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}>Done</ButtonAction>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}
>Done</ButtonAction
>
{:else if socialBindingCounterSigning}
<div class="flex flex-col items-center justify-center gap-4 py-6">
<Shadow size={36} color="rgb(142, 82, 255)" />
<p class="text-black-700 text-center">Completing mutual binding…</p>
<p class="text-black-700 text-center">
Completing mutual binding…
</p>
</div>
{:else if socialBindingAwaitingConsent}
<div>
<h4 class="mb-1">Social Connection Request</h4>
<p class="text-black-700">
<strong>{socialBindingSignerName ?? socialBindingSignerEname ?? "Someone"}</strong>
wants to establish a social connection with you. Accept to confirm the binding.
<strong
>{socialBindingSignerName ??
socialBindingSignerEname ??
"Someone"}</strong
>
wants to establish a social connection with you. Accept to confirm
the binding.
</p>
</div>
<div class="bg-gray rounded-2xl p-4 flex flex-col gap-1">
<p class="small text-black-500">From</p>
<p class="font-semibold">{socialBindingSignerName ?? socialBindingSignerEname}</p>
<p class="font-semibold">
{socialBindingSignerName ?? socialBindingSignerEname}
</p>
{#if socialBindingSignerEname && socialBindingSignerEname !== socialBindingSignerName}
<p class="small text-black-300 break-all">{socialBindingSignerEname}</p>
<p class="small text-black-300 break-all">
{socialBindingSignerEname}
</p>
{/if}
</div>
{#if socialBindingError}
<p class="text-danger">{socialBindingError}</p>
{/if}
<div class="flex flex-col gap-3">
<ButtonAction class="w-full" callback={confirmSocialBinding}>Accept</ButtonAction>
<ButtonAction variant="soft" class="w-full" callback={declineSocialBinding}>Decline</ButtonAction>
<ButtonAction class="w-full" callback={confirmSocialBinding}
>Accept</ButtonAction
>
<ButtonAction
variant="soft"
class="w-full"
callback={declineSocialBinding}>Decline</ButtonAction
>
</div>
{:else}
<div>
<h4 class="mb-1">Request Social Binding</h4>
<p class="text-black-700">
Ask someone with an eID Wallet to scan this QR code to sign your
identity binding document.
Ask a trusted person with an eID Wallet to scan this QR and
confirm it’s you. <br />
They will sign a social binding for your Digital Self – no access
to your data.
</p>
</div>

{#if socialBindingQr}
<div class="flex justify-center py-2">
<QrCode value={socialBindingQr} size={220} />
</div>
<p class="small text-black-500 text-center break-all">{socialBindingQr}</p>
<p class="small text-black-500 text-center break-all">
{socialBindingQr}
</p>
{/if}

{#if socialBindingPolling}
Expand All@@ -746,7 +777,11 @@ onMount(async () => {
<p class="text-danger">{socialBindingError}</p>
{/if}

<ButtonAction variant="soft" class="w-full" callback={closeSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={closeSocialBindingDrawer}
>
Cancel
</ButtonAction>
{/if}
Expand Down
76 changes: 54 additions & 22 deletions infrastructure/eid-wallet/src/routes/(app)/main/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -552,7 +552,9 @@ onDestroy(() => {
onclick={() => goto("/ePassport")}
role="link"
tabindex="0"
onkeydown={(e) => { if (e.key === "Enter") goto("/ePassport"); }}
onkeydown={(e) => {
if (e.key === "Enter") goto("/ePassport");
}}
>
<div class="relative z-10">
<IdentityCard
Expand All@@ -562,16 +564,19 @@ onDestroy(() => {
</div>
{#if bindingDocsLoaded && (hasOnlySelfDocs || missingProvisionerDocs)}
<button
onclick={(e) => { e.stopPropagation(); goto("/ePassport"); }}
class="relative z-0 w-full -mt-3 -translate-y-[10px] rounded-b-2xl px-4 pt-[30px] pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
onclick={(e) => {
e.stopPropagation();
goto("/ePassport");
}}
class="relative z-0 w-full -mt-3 -translate-y-2.5 rounded-b-2xl px-4 pt-7.5 pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
{missingProvisionerDocs
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
>
<span>{missingProvisionerDocs ? '↑' : '⚠'}</span>
<span>{missingProvisionerDocs ? "↑" : "⚠"}</span>
{missingProvisionerDocs
? 'New — upgrade your eVault with verified identity docs'
: 'Tap to verify your identity and increase trust level'}
? "New – add binding docs for trust & recovery"
: "Verify your identity – secure DigitalSelf & earn trust"}
</button>
{/if}
</div>
Expand DownExpand Up@@ -600,12 +605,14 @@ onDestroy(() => {
<span
class="text-sm opacity-90 relative z-10 drop-shadow-md flex gap-1 items-center"
>Explore
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
Marketplace
<div class="flex items-center">
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
-enabled services
</div>
<span class="relative z-10">
<HugeiconsIcon
size={16}
Expand DownExpand Up@@ -753,23 +760,40 @@ onDestroy(() => {
style="padding: 1.5rem 1.5rem max(1.5rem, env(safe-area-inset-bottom));"
>
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold">!</div>
<div
class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold"
>
!
</div>
<h3 class="text-lg font-bold">Identity Already Registered</h3>
</div>
<p class="text-black-700 text-sm leading-relaxed">
This identity document is already linked to an existing eVault. You can't create a duplicate — each person gets one verified eVault.
This identity document is already linked to an existing eVault.
You can't create a duplicate — each person gets one verified
eVault.
</p>
{#if duplicateEName}
<div class="rounded-xl bg-gray-50 border border-gray-200 p-4">
<p class="text-xs text-black-500 mb-1">Your existing eVault eName</p>
<p class="font-mono text-sm font-medium text-black-900 break-all">{duplicateEName}</p>
<p class="text-xs text-black-500 mb-1">
Your existing eVault eName
</p>
<p
class="font-mono text-sm font-medium text-black-900 break-all"
>
{duplicateEName}
</p>
</div>
<p class="text-sm text-black-500">
Use the eName above to recover access to your existing eVault instead.
Use the eName above to recover access to your existing
eVault instead.
</p>
{/if}
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Got it
</Button.Action>
</div>
Expand DownExpand Up@@ -823,7 +847,11 @@ onDestroy(() => {
notified when it's complete.
</p>
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Close
</Button.Action>
</div>
Expand All@@ -844,7 +872,11 @@ onDestroy(() => {
<Button.Action class="w-full" callback={startKycUpgrade}>
Try Again
</Button.Action>
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Cancel
</Button.Action>
</div>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,10 +48,10 @@ onMount(async () => {
>
{#snippet subtitle()}
<p>
You can use it to access any platform that supports the Web
3.0 Data Space – <strong>no usernames, no passwords</strong
>. If you lose your phone, you can reissue your ePassport on
another device, linked to the same <strong>eName</strong>.
Your ePassport lets you log in to any W3DS-enabled platform
– <strong>no usernames, no passwords</strong>. If you lose
or change your phone, you can re-create your ePassport on a
new device with the same eName.
</p>
{/snippet}
</Hero>
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 49 additions & 14 deletions infrastructure/eid-wallet/src/routes/(app)/ePassport/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -668,7 +668,11 @@ onMount(async () => {
<!-- Social binding button — always visible once passport is loaded -->
{#if bindingDocsLoaded}
<div class="mt-4 px-1">
<ButtonAction variant="soft" class="w-full" callback={openSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={openSocialBindingDrawer}
>
Request Social Binding
</ButtonAction>
</div>
Expand All@@ -684,55 +688,82 @@ onMount(async () => {
>
{#if socialBindingSuccess}
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold">✓</div>
<div
class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold"
>
</div>
<h4>Binding Complete!</h4>
</div>
<p class="text-black-700">
{socialBindingSignerName ?? "Someone"} has signed your identity binding.
Both eVaults now hold a mutually-signed social connection document.
</p>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}>Done</ButtonAction>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}
>Done</ButtonAction
>
{:else if socialBindingCounterSigning}
<div class="flex flex-col items-center justify-center gap-4 py-6">
<Shadow size={36} color="rgb(142, 82, 255)" />
<p class="text-black-700 text-center">Completing mutual binding…</p>
<p class="text-black-700 text-center">
Completing mutual binding…
</p>
</div>
{:else if socialBindingAwaitingConsent}
<div>
<h4 class="mb-1">Social Connection Request</h4>
<p class="text-black-700">
<strong>{socialBindingSignerName ?? socialBindingSignerEname ?? "Someone"}</strong>
wants to establish a social connection with you. Accept to confirm the binding.
<strong
>{socialBindingSignerName ??
socialBindingSignerEname ??
"Someone"}</strong
>
wants to establish a social connection with you. Accept to confirm
the binding.
</p>
</div>
<div class="bg-gray rounded-2xl p-4 flex flex-col gap-1">
<p class="small text-black-500">From</p>
<p class="font-semibold">{socialBindingSignerName ?? socialBindingSignerEname}</p>
<p class="font-semibold">
{socialBindingSignerName ?? socialBindingSignerEname}
</p>
{#if socialBindingSignerEname && socialBindingSignerEname !== socialBindingSignerName}
<p class="small text-black-300 break-all">{socialBindingSignerEname}</p>
<p class="small text-black-300 break-all">
{socialBindingSignerEname}
</p>
{/if}
</div>
{#if socialBindingError}
<p class="text-danger">{socialBindingError}</p>
{/if}
<div class="flex flex-col gap-3">
<ButtonAction class="w-full" callback={confirmSocialBinding}>Accept</ButtonAction>
<ButtonAction variant="soft" class="w-full" callback={declineSocialBinding}>Decline</ButtonAction>
<ButtonAction class="w-full" callback={confirmSocialBinding}
>Accept</ButtonAction
>
<ButtonAction
variant="soft"
class="w-full"
callback={declineSocialBinding}>Decline</ButtonAction
>
</div>
{:else}
<div>
<h4 class="mb-1">Request Social Binding</h4>
<p class="text-black-700">
Ask someone with an eID Wallet to scan this QR code to sign your
identity binding document.
Ask a trusted person with an eID Wallet to scan this QR and
confirm it’s you. <br />
They will sign a social binding for your Digital Self – no access
to your data.
</p>
</div>

{#if socialBindingQr}
<div class="flex justify-center py-2">
<QrCode value={socialBindingQr} size={220} />
</div>
<p class="small text-black-500 text-center break-all">{socialBindingQr}</p>
<p class="small text-black-500 text-center break-all">
{socialBindingQr}
</p>
{/if}

{#if socialBindingPolling}
Expand All@@ -746,7 +777,11 @@ onMount(async () => {
<p class="text-danger">{socialBindingError}</p>
{/if}

<ButtonAction variant="soft" class="w-full" callback={closeSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={closeSocialBindingDrawer}
>
Cancel
</ButtonAction>
{/if}
Expand Down
76 changes: 54 additions & 22 deletions infrastructure/eid-wallet/src/routes/(app)/main/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -552,7 +552,9 @@ onDestroy(() => {
onclick={() => goto("/ePassport")}
role="link"
tabindex="0"
onkeydown={(e) => { if (e.key === "Enter") goto("/ePassport"); }}
onkeydown={(e) => {
if (e.key === "Enter") goto("/ePassport");
}}
>
<div class="relative z-10">
<IdentityCard
Expand All@@ -562,16 +564,19 @@ onDestroy(() => {
</div>
{#if bindingDocsLoaded && (hasOnlySelfDocs || missingProvisionerDocs)}
<button
onclick={(e) => { e.stopPropagation(); goto("/ePassport"); }}
class="relative z-0 w-full -mt-3 -translate-y-[10px] rounded-b-2xl px-4 pt-[30px] pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
onclick={(e) => {
e.stopPropagation();
goto("/ePassport");
}}
class="relative z-0 w-full -mt-3 -translate-y-2.5 rounded-b-2xl px-4 pt-7.5 pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
{missingProvisionerDocs
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
>
<span>{missingProvisionerDocs ? '↑' : '⚠'}</span>
<span>{missingProvisionerDocs ? "↑" : "⚠"}</span>
{missingProvisionerDocs
? 'New — upgrade your eVault with verified identity docs'
: 'Tap to verify your identity and increase trust level'}
? "New – add binding docs for trust & recovery"
: "Verify your identity – secure DigitalSelf & earn trust"}
</button>
{/if}
</div>
Expand DownExpand Up@@ -600,12 +605,14 @@ onDestroy(() => {
<span
class="text-sm opacity-90 relative z-10 drop-shadow-md flex gap-1 items-center"
>Explore
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
Marketplace
<div class="flex items-center">
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
-enabled services
</div>
<span class="relative z-10">
<HugeiconsIcon
size={16}
Expand DownExpand Up@@ -753,23 +760,40 @@ onDestroy(() => {
style="padding: 1.5rem 1.5rem max(1.5rem, env(safe-area-inset-bottom));"
>
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold">!</div>
<div
class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold"
>
!
</div>
<h3 class="text-lg font-bold">Identity Already Registered</h3>
</div>
<p class="text-black-700 text-sm leading-relaxed">
This identity document is already linked to an existing eVault. You can't create a duplicate — each person gets one verified eVault.
This identity document is already linked to an existing eVault.
You can't create a duplicate — each person gets one verified
eVault.
</p>
{#if duplicateEName}
<div class="rounded-xl bg-gray-50 border border-gray-200 p-4">
<p class="text-xs text-black-500 mb-1">Your existing eVault eName</p>
<p class="font-mono text-sm font-medium text-black-900 break-all">{duplicateEName}</p>
<p class="text-xs text-black-500 mb-1">
Your existing eVault eName
</p>
<p
class="font-mono text-sm font-medium text-black-900 break-all"
>
{duplicateEName}
</p>
</div>
<p class="text-sm text-black-500">
Use the eName above to recover access to your existing eVault instead.
Use the eName above to recover access to your existing
eVault instead.
</p>
{/if}
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Got it
</Button.Action>
</div>
Expand DownExpand Up@@ -823,7 +847,11 @@ onDestroy(() => {
notified when it's complete.
</p>
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Close
</Button.Action>
</div>
Expand All@@ -844,7 +872,11 @@ onDestroy(() => {
<Button.Action class="w-full" callback={startKycUpgrade}>
Try Again
</Button.Action>
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Cancel
</Button.Action>
</div>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,10 +48,10 @@ onMount(async () => {
>
{#snippet subtitle()}
<p>
You can use it to access any platform that supports the Web
3.0 Data Space – <strong>no usernames, no passwords</strong
>. If you lose your phone, you can reissue your ePassport on
another device, linked to the same <strong>eName</strong>.
Your ePassport lets you log in to any W3DS-enabled platform
– <strong>no usernames, no passwords</strong>. If you lose
or change your phone, you can re-create your ePassport on a
new device with the same eName.
</p>
{/snippet}
</Hero>
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 49 additions & 14 deletions infrastructure/eid-wallet/src/routes/(app)/ePassport/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -668,7 +668,11 @@ onMount(async () => {
<!-- Social binding button — always visible once passport is loaded -->
{#if bindingDocsLoaded}
<div class="mt-4 px-1">
<ButtonAction variant="soft" class="w-full" callback={openSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={openSocialBindingDrawer}
>
Request Social Binding
</ButtonAction>
</div>
Expand All@@ -684,55 +688,82 @@ onMount(async () => {
>
{#if socialBindingSuccess}
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold">✓</div>
<div
class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold"
>
</div>
<h4>Binding Complete!</h4>
</div>
<p class="text-black-700">
{socialBindingSignerName ?? "Someone"} has signed your identity binding.
Both eVaults now hold a mutually-signed social connection document.
</p>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}>Done</ButtonAction>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}
>Done</ButtonAction
>
{:else if socialBindingCounterSigning}
<div class="flex flex-col items-center justify-center gap-4 py-6">
<Shadow size={36} color="rgb(142, 82, 255)" />
<p class="text-black-700 text-center">Completing mutual binding…</p>
<p class="text-black-700 text-center">
Completing mutual binding…
</p>
</div>
{:else if socialBindingAwaitingConsent}
<div>
<h4 class="mb-1">Social Connection Request</h4>
<p class="text-black-700">
<strong>{socialBindingSignerName ?? socialBindingSignerEname ?? "Someone"}</strong>
wants to establish a social connection with you. Accept to confirm the binding.
<strong
>{socialBindingSignerName ??
socialBindingSignerEname ??
"Someone"}</strong
>
wants to establish a social connection with you. Accept to confirm
the binding.
</p>
</div>
<div class="bg-gray rounded-2xl p-4 flex flex-col gap-1">
<p class="small text-black-500">From</p>
<p class="font-semibold">{socialBindingSignerName ?? socialBindingSignerEname}</p>
<p class="font-semibold">
{socialBindingSignerName ?? socialBindingSignerEname}
</p>
{#if socialBindingSignerEname && socialBindingSignerEname !== socialBindingSignerName}
<p class="small text-black-300 break-all">{socialBindingSignerEname}</p>
<p class="small text-black-300 break-all">
{socialBindingSignerEname}
</p>
{/if}
</div>
{#if socialBindingError}
<p class="text-danger">{socialBindingError}</p>
{/if}
<div class="flex flex-col gap-3">
<ButtonAction class="w-full" callback={confirmSocialBinding}>Accept</ButtonAction>
<ButtonAction variant="soft" class="w-full" callback={declineSocialBinding}>Decline</ButtonAction>
<ButtonAction class="w-full" callback={confirmSocialBinding}
>Accept</ButtonAction
>
<ButtonAction
variant="soft"
class="w-full"
callback={declineSocialBinding}>Decline</ButtonAction
>
</div>
{:else}
<div>
<h4 class="mb-1">Request Social Binding</h4>
<p class="text-black-700">
Ask someone with an eID Wallet to scan this QR code to sign your
identity binding document.
Ask a trusted person with an eID Wallet to scan this QR and
confirm it’s you. <br />
They will sign a social binding for your Digital Self – no access
to your data.
</p>
</div>

{#if socialBindingQr}
<div class="flex justify-center py-2">
<QrCode value={socialBindingQr} size={220} />
</div>
<p class="small text-black-500 text-center break-all">{socialBindingQr}</p>
<p class="small text-black-500 text-center break-all">
{socialBindingQr}
</p>
{/if}

{#if socialBindingPolling}
Expand All@@ -746,7 +777,11 @@ onMount(async () => {
<p class="text-danger">{socialBindingError}</p>
{/if}

<ButtonAction variant="soft" class="w-full" callback={closeSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={closeSocialBindingDrawer}
>
Cancel
</ButtonAction>
{/if}
Expand Down
76 changes: 54 additions & 22 deletions infrastructure/eid-wallet/src/routes/(app)/main/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -552,7 +552,9 @@ onDestroy(() => {
onclick={() => goto("/ePassport")}
role="link"
tabindex="0"
onkeydown={(e) => { if (e.key === "Enter") goto("/ePassport"); }}
onkeydown={(e) => {
if (e.key === "Enter") goto("/ePassport");
}}
>
<div class="relative z-10">
<IdentityCard
Expand All@@ -562,16 +564,19 @@ onDestroy(() => {
</div>
{#if bindingDocsLoaded && (hasOnlySelfDocs || missingProvisionerDocs)}
<button
onclick={(e) => { e.stopPropagation(); goto("/ePassport"); }}
class="relative z-0 w-full -mt-3 -translate-y-[10px] rounded-b-2xl px-4 pt-[30px] pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
onclick={(e) => {
e.stopPropagation();
goto("/ePassport");
}}
class="relative z-0 w-full -mt-3 -translate-y-2.5 rounded-b-2xl px-4 pt-7.5 pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
{missingProvisionerDocs
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
>
<span>{missingProvisionerDocs ? '↑' : '⚠'}</span>
<span>{missingProvisionerDocs ? "↑" : "⚠"}</span>
{missingProvisionerDocs
? 'New — upgrade your eVault with verified identity docs'
: 'Tap to verify your identity and increase trust level'}
? "New – add binding docs for trust & recovery"
: "Verify your identity – secure DigitalSelf & earn trust"}
</button>
{/if}
</div>
Expand DownExpand Up@@ -600,12 +605,14 @@ onDestroy(() => {
<span
class="text-sm opacity-90 relative z-10 drop-shadow-md flex gap-1 items-center"
>Explore
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
Marketplace
<div class="flex items-center">
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
-enabled services
</div>
<span class="relative z-10">
<HugeiconsIcon
size={16}
Expand DownExpand Up@@ -753,23 +760,40 @@ onDestroy(() => {
style="padding: 1.5rem 1.5rem max(1.5rem, env(safe-area-inset-bottom));"
>
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold">!</div>
<div
class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold"
>
!
</div>
<h3 class="text-lg font-bold">Identity Already Registered</h3>
</div>
<p class="text-black-700 text-sm leading-relaxed">
This identity document is already linked to an existing eVault. You can't create a duplicate — each person gets one verified eVault.
This identity document is already linked to an existing eVault.
You can't create a duplicate — each person gets one verified
eVault.
</p>
{#if duplicateEName}
<div class="rounded-xl bg-gray-50 border border-gray-200 p-4">
<p class="text-xs text-black-500 mb-1">Your existing eVault eName</p>
<p class="font-mono text-sm font-medium text-black-900 break-all">{duplicateEName}</p>
<p class="text-xs text-black-500 mb-1">
Your existing eVault eName
</p>
<p
class="font-mono text-sm font-medium text-black-900 break-all"
>
{duplicateEName}
</p>
</div>
<p class="text-sm text-black-500">
Use the eName above to recover access to your existing eVault instead.
Use the eName above to recover access to your existing
eVault instead.
</p>
{/if}
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Got it
</Button.Action>
</div>
Expand DownExpand Up@@ -823,7 +847,11 @@ onDestroy(() => {
notified when it's complete.
</p>
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Close
</Button.Action>
</div>
Expand All@@ -844,7 +872,11 @@ onDestroy(() => {
<Button.Action class="w-full" callback={startKycUpgrade}>
Try Again
</Button.Action>
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Cancel
</Button.Action>
</div>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,10 +48,10 @@ onMount(async () => {
>
{#snippet subtitle()}
<p>
You can use it to access any platform that supports the Web
3.0 Data Space – <strong>no usernames, no passwords</strong
>. If you lose your phone, you can reissue your ePassport on
another device, linked to the same <strong>eName</strong>.
Your ePassport lets you log in to any W3DS-enabled platform
– <strong>no usernames, no passwords</strong>. If you lose
or change your phone, you can re-create your ePassport on a
new device with the same eName.
</p>
{/snippet}
</Hero>
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 49 additions & 14 deletions infrastructure/eid-wallet/src/routes/(app)/ePassport/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -668,7 +668,11 @@ onMount(async () => {
<!-- Social binding button — always visible once passport is loaded -->
{#if bindingDocsLoaded}
<div class="mt-4 px-1">
<ButtonAction variant="soft" class="w-full" callback={openSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={openSocialBindingDrawer}
>
Request Social Binding
</ButtonAction>
</div>
Expand All@@ -684,55 +688,82 @@ onMount(async () => {
>
{#if socialBindingSuccess}
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold">✓</div>
<div
class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold"
>
</div>
<h4>Binding Complete!</h4>
</div>
<p class="text-black-700">
{socialBindingSignerName ?? "Someone"} has signed your identity binding.
Both eVaults now hold a mutually-signed social connection document.
</p>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}>Done</ButtonAction>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}
>Done</ButtonAction
>
{:else if socialBindingCounterSigning}
<div class="flex flex-col items-center justify-center gap-4 py-6">
<Shadow size={36} color="rgb(142, 82, 255)" />
<p class="text-black-700 text-center">Completing mutual binding…</p>
<p class="text-black-700 text-center">
Completing mutual binding…
</p>
</div>
{:else if socialBindingAwaitingConsent}
<div>
<h4 class="mb-1">Social Connection Request</h4>
<p class="text-black-700">
<strong>{socialBindingSignerName ?? socialBindingSignerEname ?? "Someone"}</strong>
wants to establish a social connection with you. Accept to confirm the binding.
<strong
>{socialBindingSignerName ??
socialBindingSignerEname ??
"Someone"}</strong
>
wants to establish a social connection with you. Accept to confirm
the binding.
</p>
</div>
<div class="bg-gray rounded-2xl p-4 flex flex-col gap-1">
<p class="small text-black-500">From</p>
<p class="font-semibold">{socialBindingSignerName ?? socialBindingSignerEname}</p>
<p class="font-semibold">
{socialBindingSignerName ?? socialBindingSignerEname}
</p>
{#if socialBindingSignerEname && socialBindingSignerEname !== socialBindingSignerName}
<p class="small text-black-300 break-all">{socialBindingSignerEname}</p>
<p class="small text-black-300 break-all">
{socialBindingSignerEname}
</p>
{/if}
</div>
{#if socialBindingError}
<p class="text-danger">{socialBindingError}</p>
{/if}
<div class="flex flex-col gap-3">
<ButtonAction class="w-full" callback={confirmSocialBinding}>Accept</ButtonAction>
<ButtonAction variant="soft" class="w-full" callback={declineSocialBinding}>Decline</ButtonAction>
<ButtonAction class="w-full" callback={confirmSocialBinding}
>Accept</ButtonAction
>
<ButtonAction
variant="soft"
class="w-full"
callback={declineSocialBinding}>Decline</ButtonAction
>
</div>
{:else}
<div>
<h4 class="mb-1">Request Social Binding</h4>
<p class="text-black-700">
Ask someone with an eID Wallet to scan this QR code to sign your
identity binding document.
Ask a trusted person with an eID Wallet to scan this QR and
confirm it’s you. <br />
They will sign a social binding for your Digital Self – no access
to your data.
</p>
</div>

{#if socialBindingQr}
<div class="flex justify-center py-2">
<QrCode value={socialBindingQr} size={220} />
</div>
<p class="small text-black-500 text-center break-all">{socialBindingQr}</p>
<p class="small text-black-500 text-center break-all">
{socialBindingQr}
</p>
{/if}

{#if socialBindingPolling}
Expand All@@ -746,7 +777,11 @@ onMount(async () => {
<p class="text-danger">{socialBindingError}</p>
{/if}

<ButtonAction variant="soft" class="w-full" callback={closeSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={closeSocialBindingDrawer}
>
Cancel
</ButtonAction>
{/if}
Expand Down
76 changes: 54 additions & 22 deletions infrastructure/eid-wallet/src/routes/(app)/main/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -552,7 +552,9 @@ onDestroy(() => {
onclick={() => goto("/ePassport")}
role="link"
tabindex="0"
onkeydown={(e) => { if (e.key === "Enter") goto("/ePassport"); }}
onkeydown={(e) => {
if (e.key === "Enter") goto("/ePassport");
}}
>
<div class="relative z-10">
<IdentityCard
Expand All@@ -562,16 +564,19 @@ onDestroy(() => {
</div>
{#if bindingDocsLoaded && (hasOnlySelfDocs || missingProvisionerDocs)}
<button
onclick={(e) => { e.stopPropagation(); goto("/ePassport"); }}
class="relative z-0 w-full -mt-3 -translate-y-[10px] rounded-b-2xl px-4 pt-[30px] pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
onclick={(e) => {
e.stopPropagation();
goto("/ePassport");
}}
class="relative z-0 w-full -mt-3 -translate-y-2.5 rounded-b-2xl px-4 pt-7.5 pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
{missingProvisionerDocs
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
>
<span>{missingProvisionerDocs ? '↑' : '⚠'}</span>
<span>{missingProvisionerDocs ? "↑" : "⚠"}</span>
{missingProvisionerDocs
? 'New — upgrade your eVault with verified identity docs'
: 'Tap to verify your identity and increase trust level'}
? "New – add binding docs for trust & recovery"
: "Verify your identity – secure DigitalSelf & earn trust"}
</button>
{/if}
</div>
Expand DownExpand Up@@ -600,12 +605,14 @@ onDestroy(() => {
<span
class="text-sm opacity-90 relative z-10 drop-shadow-md flex gap-1 items-center"
>Explore
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
Marketplace
<div class="flex items-center">
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
-enabled services
</div>
<span class="relative z-10">
<HugeiconsIcon
size={16}
Expand DownExpand Up@@ -753,23 +760,40 @@ onDestroy(() => {
style="padding: 1.5rem 1.5rem max(1.5rem, env(safe-area-inset-bottom));"
>
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold">!</div>
<div
class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold"
>
!
</div>
<h3 class="text-lg font-bold">Identity Already Registered</h3>
</div>
<p class="text-black-700 text-sm leading-relaxed">
This identity document is already linked to an existing eVault. You can't create a duplicate — each person gets one verified eVault.
This identity document is already linked to an existing eVault.
You can't create a duplicate — each person gets one verified
eVault.
</p>
{#if duplicateEName}
<div class="rounded-xl bg-gray-50 border border-gray-200 p-4">
<p class="text-xs text-black-500 mb-1">Your existing eVault eName</p>
<p class="font-mono text-sm font-medium text-black-900 break-all">{duplicateEName}</p>
<p class="text-xs text-black-500 mb-1">
Your existing eVault eName
</p>
<p
class="font-mono text-sm font-medium text-black-900 break-all"
>
{duplicateEName}
</p>
</div>
<p class="text-sm text-black-500">
Use the eName above to recover access to your existing eVault instead.
Use the eName above to recover access to your existing
eVault instead.
</p>
{/if}
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Got it
</Button.Action>
</div>
Expand DownExpand Up@@ -823,7 +847,11 @@ onDestroy(() => {
notified when it's complete.
</p>
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Close
</Button.Action>
</div>
Expand All@@ -844,7 +872,11 @@ onDestroy(() => {
<Button.Action class="w-full" callback={startKycUpgrade}>
Try Again
</Button.Action>
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Cancel
</Button.Action>
</div>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,10 +48,10 @@ onMount(async () => {
>
{#snippet subtitle()}
<p>
You can use it to access any platform that supports the Web
3.0 Data Space – <strong>no usernames, no passwords</strong
>. If you lose your phone, you can reissue your ePassport on
another device, linked to the same <strong>eName</strong>.
Your ePassport lets you log in to any W3DS-enabled platform
– <strong>no usernames, no passwords</strong>. If you lose
or change your phone, you can re-create your ePassport on a
new device with the same eName.
</p>
{/snippet}
</Hero>
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 49 additions & 14 deletions infrastructure/eid-wallet/src/routes/(app)/ePassport/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -668,7 +668,11 @@ onMount(async () => {
<!-- Social binding button — always visible once passport is loaded -->
{#if bindingDocsLoaded}
<div class="mt-4 px-1">
<ButtonAction variant="soft" class="w-full" callback={openSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={openSocialBindingDrawer}
>
Request Social Binding
</ButtonAction>
</div>
Expand All@@ -684,55 +688,82 @@ onMount(async () => {
>
{#if socialBindingSuccess}
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold">✓</div>
<div
class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold"
>
</div>
<h4>Binding Complete!</h4>
</div>
<p class="text-black-700">
{socialBindingSignerName ?? "Someone"} has signed your identity binding.
Both eVaults now hold a mutually-signed social connection document.
</p>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}>Done</ButtonAction>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}
>Done</ButtonAction
>
{:else if socialBindingCounterSigning}
<div class="flex flex-col items-center justify-center gap-4 py-6">
<Shadow size={36} color="rgb(142, 82, 255)" />
<p class="text-black-700 text-center">Completing mutual binding…</p>
<p class="text-black-700 text-center">
Completing mutual binding…
</p>
</div>
{:else if socialBindingAwaitingConsent}
<div>
<h4 class="mb-1">Social Connection Request</h4>
<p class="text-black-700">
<strong>{socialBindingSignerName ?? socialBindingSignerEname ?? "Someone"}</strong>
wants to establish a social connection with you. Accept to confirm the binding.
<strong
>{socialBindingSignerName ??
socialBindingSignerEname ??
"Someone"}</strong
>
wants to establish a social connection with you. Accept to confirm
the binding.
</p>
</div>
<div class="bg-gray rounded-2xl p-4 flex flex-col gap-1">
<p class="small text-black-500">From</p>
<p class="font-semibold">{socialBindingSignerName ?? socialBindingSignerEname}</p>
<p class="font-semibold">
{socialBindingSignerName ?? socialBindingSignerEname}
</p>
{#if socialBindingSignerEname && socialBindingSignerEname !== socialBindingSignerName}
<p class="small text-black-300 break-all">{socialBindingSignerEname}</p>
<p class="small text-black-300 break-all">
{socialBindingSignerEname}
</p>
{/if}
</div>
{#if socialBindingError}
<p class="text-danger">{socialBindingError}</p>
{/if}
<div class="flex flex-col gap-3">
<ButtonAction class="w-full" callback={confirmSocialBinding}>Accept</ButtonAction>
<ButtonAction variant="soft" class="w-full" callback={declineSocialBinding}>Decline</ButtonAction>
<ButtonAction class="w-full" callback={confirmSocialBinding}
>Accept</ButtonAction
>
<ButtonAction
variant="soft"
class="w-full"
callback={declineSocialBinding}>Decline</ButtonAction
>
</div>
{:else}
<div>
<h4 class="mb-1">Request Social Binding</h4>
<p class="text-black-700">
Ask someone with an eID Wallet to scan this QR code to sign your
identity binding document.
Ask a trusted person with an eID Wallet to scan this QR and
confirm it’s you. <br />
They will sign a social binding for your Digital Self – no access
to your data.
</p>
</div>

{#if socialBindingQr}
<div class="flex justify-center py-2">
<QrCode value={socialBindingQr} size={220} />
</div>
<p class="small text-black-500 text-center break-all">{socialBindingQr}</p>
<p class="small text-black-500 text-center break-all">
{socialBindingQr}
</p>
{/if}

{#if socialBindingPolling}
Expand All@@ -746,7 +777,11 @@ onMount(async () => {
<p class="text-danger">{socialBindingError}</p>
{/if}

<ButtonAction variant="soft" class="w-full" callback={closeSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={closeSocialBindingDrawer}
>
Cancel
</ButtonAction>
{/if}
Expand Down
76 changes: 54 additions & 22 deletions infrastructure/eid-wallet/src/routes/(app)/main/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -552,7 +552,9 @@ onDestroy(() => {
onclick={() => goto("/ePassport")}
role="link"
tabindex="0"
onkeydown={(e) => { if (e.key === "Enter") goto("/ePassport"); }}
onkeydown={(e) => {
if (e.key === "Enter") goto("/ePassport");
}}
>
<div class="relative z-10">
<IdentityCard
Expand All@@ -562,16 +564,19 @@ onDestroy(() => {
</div>
{#if bindingDocsLoaded && (hasOnlySelfDocs || missingProvisionerDocs)}
<button
onclick={(e) => { e.stopPropagation(); goto("/ePassport"); }}
class="relative z-0 w-full -mt-3 -translate-y-[10px] rounded-b-2xl px-4 pt-[30px] pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
onclick={(e) => {
e.stopPropagation();
goto("/ePassport");
}}
class="relative z-0 w-full -mt-3 -translate-y-2.5 rounded-b-2xl px-4 pt-7.5 pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
{missingProvisionerDocs
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
>
<span>{missingProvisionerDocs ? '↑' : '⚠'}</span>
<span>{missingProvisionerDocs ? "↑" : "⚠"}</span>
{missingProvisionerDocs
? 'New — upgrade your eVault with verified identity docs'
: 'Tap to verify your identity and increase trust level'}
? "New – add binding docs for trust & recovery"
: "Verify your identity – secure DigitalSelf & earn trust"}
</button>
{/if}
</div>
Expand DownExpand Up@@ -600,12 +605,14 @@ onDestroy(() => {
<span
class="text-sm opacity-90 relative z-10 drop-shadow-md flex gap-1 items-center"
>Explore
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
Marketplace
<div class="flex items-center">
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
-enabled services
</div>
<span class="relative z-10">
<HugeiconsIcon
size={16}
Expand DownExpand Up@@ -753,23 +760,40 @@ onDestroy(() => {
style="padding: 1.5rem 1.5rem max(1.5rem, env(safe-area-inset-bottom));"
>
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold">!</div>
<div
class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold"
>
!
</div>
<h3 class="text-lg font-bold">Identity Already Registered</h3>
</div>
<p class="text-black-700 text-sm leading-relaxed">
This identity document is already linked to an existing eVault. You can't create a duplicate — each person gets one verified eVault.
This identity document is already linked to an existing eVault.
You can't create a duplicate — each person gets one verified
eVault.
</p>
{#if duplicateEName}
<div class="rounded-xl bg-gray-50 border border-gray-200 p-4">
<p class="text-xs text-black-500 mb-1">Your existing eVault eName</p>
<p class="font-mono text-sm font-medium text-black-900 break-all">{duplicateEName}</p>
<p class="text-xs text-black-500 mb-1">
Your existing eVault eName
</p>
<p
class="font-mono text-sm font-medium text-black-900 break-all"
>
{duplicateEName}
</p>
</div>
<p class="text-sm text-black-500">
Use the eName above to recover access to your existing eVault instead.
Use the eName above to recover access to your existing
eVault instead.
</p>
{/if}
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Got it
</Button.Action>
</div>
Expand DownExpand Up@@ -823,7 +847,11 @@ onDestroy(() => {
notified when it's complete.
</p>
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Close
</Button.Action>
</div>
Expand All@@ -844,7 +872,11 @@ onDestroy(() => {
<Button.Action class="w-full" callback={startKycUpgrade}>
Try Again
</Button.Action>
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Cancel
</Button.Action>
</div>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,10 +48,10 @@ onMount(async () => {
>
{#snippet subtitle()}
<p>
You can use it to access any platform that supports the Web
3.0 Data Space – <strong>no usernames, no passwords</strong
>. If you lose your phone, you can reissue your ePassport on
another device, linked to the same <strong>eName</strong>.
Your ePassport lets you log in to any W3DS-enabled platform
– <strong>no usernames, no passwords</strong>. If you lose
or change your phone, you can re-create your ePassport on a
new device with the same eName.
</p>
{/snippet}
</Hero>
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 49 additions & 14 deletions infrastructure/eid-wallet/src/routes/(app)/ePassport/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -668,7 +668,11 @@ onMount(async () => {
<!-- Social binding button — always visible once passport is loaded -->
{#if bindingDocsLoaded}
<div class="mt-4 px-1">
<ButtonAction variant="soft" class="w-full" callback={openSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={openSocialBindingDrawer}
>
Request Social Binding
</ButtonAction>
</div>
Expand All@@ -684,55 +688,82 @@ onMount(async () => {
>
{#if socialBindingSuccess}
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold">✓</div>
<div
class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold"
>
</div>
<h4>Binding Complete!</h4>
</div>
<p class="text-black-700">
{socialBindingSignerName ?? "Someone"} has signed your identity binding.
Both eVaults now hold a mutually-signed social connection document.
</p>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}>Done</ButtonAction>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}
>Done</ButtonAction
>
{:else if socialBindingCounterSigning}
<div class="flex flex-col items-center justify-center gap-4 py-6">
<Shadow size={36} color="rgb(142, 82, 255)" />
<p class="text-black-700 text-center">Completing mutual binding…</p>
<p class="text-black-700 text-center">
Completing mutual binding…
</p>
</div>
{:else if socialBindingAwaitingConsent}
<div>
<h4 class="mb-1">Social Connection Request</h4>
<p class="text-black-700">
<strong>{socialBindingSignerName ?? socialBindingSignerEname ?? "Someone"}</strong>
wants to establish a social connection with you. Accept to confirm the binding.
<strong
>{socialBindingSignerName ??
socialBindingSignerEname ??
"Someone"}</strong
>
wants to establish a social connection with you. Accept to confirm
the binding.
</p>
</div>
<div class="bg-gray rounded-2xl p-4 flex flex-col gap-1">
<p class="small text-black-500">From</p>
<p class="font-semibold">{socialBindingSignerName ?? socialBindingSignerEname}</p>
<p class="font-semibold">
{socialBindingSignerName ?? socialBindingSignerEname}
</p>
{#if socialBindingSignerEname && socialBindingSignerEname !== socialBindingSignerName}
<p class="small text-black-300 break-all">{socialBindingSignerEname}</p>
<p class="small text-black-300 break-all">
{socialBindingSignerEname}
</p>
{/if}
</div>
{#if socialBindingError}
<p class="text-danger">{socialBindingError}</p>
{/if}
<div class="flex flex-col gap-3">
<ButtonAction class="w-full" callback={confirmSocialBinding}>Accept</ButtonAction>
<ButtonAction variant="soft" class="w-full" callback={declineSocialBinding}>Decline</ButtonAction>
<ButtonAction class="w-full" callback={confirmSocialBinding}
>Accept</ButtonAction
>
<ButtonAction
variant="soft"
class="w-full"
callback={declineSocialBinding}>Decline</ButtonAction
>
</div>
{:else}
<div>
<h4 class="mb-1">Request Social Binding</h4>
<p class="text-black-700">
Ask someone with an eID Wallet to scan this QR code to sign your
identity binding document.
Ask a trusted person with an eID Wallet to scan this QR and
confirm it’s you. <br />
They will sign a social binding for your Digital Self – no access
to your data.
</p>
</div>

{#if socialBindingQr}
<div class="flex justify-center py-2">
<QrCode value={socialBindingQr} size={220} />
</div>
<p class="small text-black-500 text-center break-all">{socialBindingQr}</p>
<p class="small text-black-500 text-center break-all">
{socialBindingQr}
</p>
{/if}

{#if socialBindingPolling}
Expand All@@ -746,7 +777,11 @@ onMount(async () => {
<p class="text-danger">{socialBindingError}</p>
{/if}

<ButtonAction variant="soft" class="w-full" callback={closeSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={closeSocialBindingDrawer}
>
Cancel
</ButtonAction>
{/if}
Expand Down
76 changes: 54 additions & 22 deletions infrastructure/eid-wallet/src/routes/(app)/main/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -552,7 +552,9 @@ onDestroy(() => {
onclick={() => goto("/ePassport")}
role="link"
tabindex="0"
onkeydown={(e) => { if (e.key === "Enter") goto("/ePassport"); }}
onkeydown={(e) => {
if (e.key === "Enter") goto("/ePassport");
}}
>
<div class="relative z-10">
<IdentityCard
Expand All@@ -562,16 +564,19 @@ onDestroy(() => {
</div>
{#if bindingDocsLoaded && (hasOnlySelfDocs || missingProvisionerDocs)}
<button
onclick={(e) => { e.stopPropagation(); goto("/ePassport"); }}
class="relative z-0 w-full -mt-3 -translate-y-[10px] rounded-b-2xl px-4 pt-[30px] pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
onclick={(e) => {
e.stopPropagation();
goto("/ePassport");
}}
class="relative z-0 w-full -mt-3 -translate-y-2.5 rounded-b-2xl px-4 pt-7.5 pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
{missingProvisionerDocs
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
>
<span>{missingProvisionerDocs ? '↑' : '⚠'}</span>
<span>{missingProvisionerDocs ? "↑" : "⚠"}</span>
{missingProvisionerDocs
? 'New — upgrade your eVault with verified identity docs'
: 'Tap to verify your identity and increase trust level'}
? "New – add binding docs for trust & recovery"
: "Verify your identity – secure DigitalSelf & earn trust"}
</button>
{/if}
</div>
Expand DownExpand Up@@ -600,12 +605,14 @@ onDestroy(() => {
<span
class="text-sm opacity-90 relative z-10 drop-shadow-md flex gap-1 items-center"
>Explore
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
Marketplace
<div class="flex items-center">
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
-enabled services
</div>
<span class="relative z-10">
<HugeiconsIcon
size={16}
Expand DownExpand Up@@ -753,23 +760,40 @@ onDestroy(() => {
style="padding: 1.5rem 1.5rem max(1.5rem, env(safe-area-inset-bottom));"
>
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold">!</div>
<div
class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold"
>
!
</div>
<h3 class="text-lg font-bold">Identity Already Registered</h3>
</div>
<p class="text-black-700 text-sm leading-relaxed">
This identity document is already linked to an existing eVault. You can't create a duplicate — each person gets one verified eVault.
This identity document is already linked to an existing eVault.
You can't create a duplicate — each person gets one verified
eVault.
</p>
{#if duplicateEName}
<div class="rounded-xl bg-gray-50 border border-gray-200 p-4">
<p class="text-xs text-black-500 mb-1">Your existing eVault eName</p>
<p class="font-mono text-sm font-medium text-black-900 break-all">{duplicateEName}</p>
<p class="text-xs text-black-500 mb-1">
Your existing eVault eName
</p>
<p
class="font-mono text-sm font-medium text-black-900 break-all"
>
{duplicateEName}
</p>
</div>
<p class="text-sm text-black-500">
Use the eName above to recover access to your existing eVault instead.
Use the eName above to recover access to your existing
eVault instead.
</p>
{/if}
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Got it
</Button.Action>
</div>
Expand DownExpand Up@@ -823,7 +847,11 @@ onDestroy(() => {
notified when it's complete.
</p>
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Close
</Button.Action>
</div>
Expand All@@ -844,7 +872,11 @@ onDestroy(() => {
<Button.Action class="w-full" callback={startKycUpgrade}>
Try Again
</Button.Action>
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Cancel
</Button.Action>
</div>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,10 +48,10 @@ onMount(async () => {
>
{#snippet subtitle()}
<p>
You can use it to access any platform that supports the Web
3.0 Data Space – <strong>no usernames, no passwords</strong
>. If you lose your phone, you can reissue your ePassport on
another device, linked to the same <strong>eName</strong>.
Your ePassport lets you log in to any W3DS-enabled platform
– <strong>no usernames, no passwords</strong>. If you lose
or change your phone, you can re-create your ePassport on a
new device with the same eName.
</p>
{/snippet}
</Hero>
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 49 additions & 14 deletions infrastructure/eid-wallet/src/routes/(app)/ePassport/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -668,7 +668,11 @@ onMount(async () => {
<!-- Social binding button — always visible once passport is loaded -->
{#if bindingDocsLoaded}
<div class="mt-4 px-1">
<ButtonAction variant="soft" class="w-full" callback={openSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={openSocialBindingDrawer}
>
Request Social Binding
</ButtonAction>
</div>
Expand All@@ -684,55 +688,82 @@ onMount(async () => {
>
{#if socialBindingSuccess}
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold">✓</div>
<div
class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center text-green-600 text-lg font-bold"
>
</div>
<h4>Binding Complete!</h4>
</div>
<p class="text-black-700">
{socialBindingSignerName ?? "Someone"} has signed your identity binding.
Both eVaults now hold a mutually-signed social connection document.
</p>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}>Done</ButtonAction>
<ButtonAction class="w-full" callback={closeSocialBindingDrawer}
>Done</ButtonAction
>
{:else if socialBindingCounterSigning}
<div class="flex flex-col items-center justify-center gap-4 py-6">
<Shadow size={36} color="rgb(142, 82, 255)" />
<p class="text-black-700 text-center">Completing mutual binding…</p>
<p class="text-black-700 text-center">
Completing mutual binding…
</p>
</div>
{:else if socialBindingAwaitingConsent}
<div>
<h4 class="mb-1">Social Connection Request</h4>
<p class="text-black-700">
<strong>{socialBindingSignerName ?? socialBindingSignerEname ?? "Someone"}</strong>
wants to establish a social connection with you. Accept to confirm the binding.
<strong
>{socialBindingSignerName ??
socialBindingSignerEname ??
"Someone"}</strong
>
wants to establish a social connection with you. Accept to confirm
the binding.
</p>
</div>
<div class="bg-gray rounded-2xl p-4 flex flex-col gap-1">
<p class="small text-black-500">From</p>
<p class="font-semibold">{socialBindingSignerName ?? socialBindingSignerEname}</p>
<p class="font-semibold">
{socialBindingSignerName ?? socialBindingSignerEname}
</p>
{#if socialBindingSignerEname && socialBindingSignerEname !== socialBindingSignerName}
<p class="small text-black-300 break-all">{socialBindingSignerEname}</p>
<p class="small text-black-300 break-all">
{socialBindingSignerEname}
</p>
{/if}
</div>
{#if socialBindingError}
<p class="text-danger">{socialBindingError}</p>
{/if}
<div class="flex flex-col gap-3">
<ButtonAction class="w-full" callback={confirmSocialBinding}>Accept</ButtonAction>
<ButtonAction variant="soft" class="w-full" callback={declineSocialBinding}>Decline</ButtonAction>
<ButtonAction class="w-full" callback={confirmSocialBinding}
>Accept</ButtonAction
>
<ButtonAction
variant="soft"
class="w-full"
callback={declineSocialBinding}>Decline</ButtonAction
>
</div>
{:else}
<div>
<h4 class="mb-1">Request Social Binding</h4>
<p class="text-black-700">
Ask someone with an eID Wallet to scan this QR code to sign your
identity binding document.
Ask a trusted person with an eID Wallet to scan this QR and
confirm it’s you. <br />
They will sign a social binding for your Digital Self – no access
to your data.
</p>
</div>

{#if socialBindingQr}
<div class="flex justify-center py-2">
<QrCode value={socialBindingQr} size={220} />
</div>
<p class="small text-black-500 text-center break-all">{socialBindingQr}</p>
<p class="small text-black-500 text-center break-all">
{socialBindingQr}
</p>
{/if}

{#if socialBindingPolling}
Expand All@@ -746,7 +777,11 @@ onMount(async () => {
<p class="text-danger">{socialBindingError}</p>
{/if}

<ButtonAction variant="soft" class="w-full" callback={closeSocialBindingDrawer}>
<ButtonAction
variant="soft"
class="w-full"
callback={closeSocialBindingDrawer}
>
Cancel
</ButtonAction>
{/if}
Expand Down
76 changes: 54 additions & 22 deletions infrastructure/eid-wallet/src/routes/(app)/main/+page.svelte
Original file line numberDiff line numberDiff line change
Expand Up@@ -552,7 +552,9 @@ onDestroy(() => {
onclick={() => goto("/ePassport")}
role="link"
tabindex="0"
onkeydown={(e) => { if (e.key === "Enter") goto("/ePassport"); }}
onkeydown={(e) => {
if (e.key === "Enter") goto("/ePassport");
}}
>
<div class="relative z-10">
<IdentityCard
Expand All@@ -562,16 +564,19 @@ onDestroy(() => {
</div>
{#if bindingDocsLoaded && (hasOnlySelfDocs || missingProvisionerDocs)}
<button
onclick={(e) => { e.stopPropagation(); goto("/ePassport"); }}
class="relative z-0 w-full -mt-3 -translate-y-[10px] rounded-b-2xl px-4 pt-[30px] pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
onclick={(e) => {
e.stopPropagation();
goto("/ePassport");
}}
class="relative z-0 w-full -mt-3 -translate-y-2.5 rounded-b-2xl px-4 pt-7.5 pb-3 flex items-center justify-center gap-2 text-sm font-medium shadow-md transition-colors
{missingProvisionerDocs
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
? 'bg-emerald-400 text-emerald-900 active:bg-emerald-500'
: 'bg-amber-400 text-amber-900 active:bg-amber-500'}"
>
<span>{missingProvisionerDocs ? '↑' : '⚠'}</span>
<span>{missingProvisionerDocs ? "↑" : "⚠"}</span>
{missingProvisionerDocs
? 'New — upgrade your eVault with verified identity docs'
: 'Tap to verify your identity and increase trust level'}
? "New – add binding docs for trust & recovery"
: "Verify your identity – secure DigitalSelf & earn trust"}
</button>
{/if}
</div>
Expand DownExpand Up@@ -600,12 +605,14 @@ onDestroy(() => {
<span
class="text-sm opacity-90 relative z-10 drop-shadow-md flex gap-1 items-center"
>Explore
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
Marketplace
<div class="flex items-center">
<img
src="/images/W3DSLogoBlack.svg"
alt="W3DS Logo"
class="h-4"
/>
-enabled services
</div>
<span class="relative z-10">
<HugeiconsIcon
size={16}
Expand DownExpand Up@@ -753,23 +760,40 @@ onDestroy(() => {
style="padding: 1.5rem 1.5rem max(1.5rem, env(safe-area-inset-bottom));"
>
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold">!</div>
<div
class="w-10 h-10 rounded-full bg-orange-100 flex items-center justify-center text-orange-600 text-lg font-bold"
>
!
</div>
<h3 class="text-lg font-bold">Identity Already Registered</h3>
</div>
<p class="text-black-700 text-sm leading-relaxed">
This identity document is already linked to an existing eVault. You can't create a duplicate — each person gets one verified eVault.
This identity document is already linked to an existing eVault.
You can't create a duplicate — each person gets one verified
eVault.
</p>
{#if duplicateEName}
<div class="rounded-xl bg-gray-50 border border-gray-200 p-4">
<p class="text-xs text-black-500 mb-1">Your existing eVault eName</p>
<p class="font-mono text-sm font-medium text-black-900 break-all">{duplicateEName}</p>
<p class="text-xs text-black-500 mb-1">
Your existing eVault eName
</p>
<p
class="font-mono text-sm font-medium text-black-900 break-all"
>
{duplicateEName}
</p>
</div>
<p class="text-sm text-black-500">
Use the eName above to recover access to your existing eVault instead.
Use the eName above to recover access to your existing
eVault instead.
</p>
{/if}
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Got it
</Button.Action>
</div>
Expand DownExpand Up@@ -823,7 +847,11 @@ onDestroy(() => {
notified when it's complete.
</p>
<div class="flex flex-col gap-3 pt-2">
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Close
</Button.Action>
</div>
Expand All@@ -844,7 +872,11 @@ onDestroy(() => {
<Button.Action class="w-full" callback={startKycUpgrade}>
Try Again
</Button.Action>
<Button.Action variant="soft" class="w-full" callback={resetKyc}>
<Button.Action
variant="soft"
class="w-full"
callback={resetKyc}
>
Cancel
</Button.Action>
</div>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,10 +48,10 @@ onMount(async () => {
>
{#snippet subtitle()}
<p>
You can use it to access any platform that supports the Web
3.0 Data Space – <strong>no usernames, no passwords</strong
>. If you lose your phone, you can reissue your ePassport on
another device, linked to the same <strong>eName</strong>.
Your ePassport lets you log in to any W3DS-enabled platform
– <strong>no usernames, no passwords</strong>. If you lose
or change your phone, you can re-create your ePassport on a
new device with the same eName.
</p>
{/snippet}
</Hero>
Expand Down
Loading