hd-wallet-ui 2.0.20 → 2.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +190 -0
- package/README.md +101 -123
- package/data/common-passwords-sdn-v1.source.json +12 -0
- package/data/common-passwords-sdn-v1.txt +10000 -0
- package/dist/browser/sdn-wallet-callback.js +1 -0
- package/dist/browser/sdn-wallet-public-client.js +1 -0
- package/dist/browser/wallet-callback.html +6 -0
- package/dist/client/asset-review.d.ts +8 -0
- package/dist/client/asset-review.js +1570 -0
- package/dist/client/callback.d.ts +13 -0
- package/dist/client/callback.js +29 -0
- package/dist/client/index.d.ts +11 -0
- package/dist/client/index.js +1379 -0
- package/dist/client/sdn.d.ts +8 -0
- package/dist/client/sdn.js +1542 -0
- package/dist/client/style.css +32 -0
- package/dist/client/types.d.ts +278 -0
- package/dist/compat/index.d.ts +26 -0
- package/dist/compat/index.js +62 -0
- package/dist/wallet-origin/index.d.ts +21 -0
- package/dist/wallet-origin/index.js +4607 -0
- package/dist/wallet-origin-host/assets/wallet-origin.3d16729bf9aaca4517cc699bec526c7209be184cdbb0ba0dbf4063d36a091e1d.js +12463 -0
- package/dist/wallet-origin-host/assets/wallet-origin.e22071a3643a57055d29f2e6951c1a2f15e77c1b58b0f81bb7f2afed5bcfb0b4.wasm +0 -0
- package/dist/wallet-origin-host/assets/wallet-origin.f3273f7ea70bb494cda1fc02264b936f2e9b010dc07df15eed05fa3f7d1356de.css +1 -0
- package/dist/wallet-origin-host/index.html +10 -0
- package/dist/wallet-origin-host/integrity.json +1 -0
- package/package.json +46 -18
- package/src/address-derivation.js +0 -514
- package/src/app.js +0 -6008
- package/src/blockchain-trust.js +0 -752
- package/src/clipboard.js +0 -44
- package/src/constants.js +0 -66
- package/src/hash.js +0 -9
- package/src/lib.js +0 -66
- package/src/template.js +0 -626
- package/src/trust-ui.js +0 -745
- package/src/wallet-storage.js +0 -773
- package/styles/main.css +0 -6220
- package/styles/widget.css +0 -6212
package/src/template.js
DELETED
|
@@ -1,626 +0,0 @@
|
|
|
1
|
-
export function getModalHTML() {
|
|
2
|
-
return `
|
|
3
|
-
<!-- Keys Modal -->
|
|
4
|
-
<div id="keys-modal" class="modal">
|
|
5
|
-
<div class="modal-glass modal-wide">
|
|
6
|
-
<div class="modal-header"><div class="account-header-info"><div class="account-header-top"><h3>Account</h3><h3 class="account-total-value" id="account-total-value"></h3></div><div class="account-address-row"><span class="account-address-label">xpub</span><code class="account-address-display" id="account-address-display"></code><button class="account-address-copy" id="account-address-copy" title="Copy xpub"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg></button></div><div class="account-address-row" id="account-peerid-row" style="display:none"><span class="account-address-label">PeerID</span><code class="account-address-display" id="account-peerid-display"></code><button class="account-address-copy" id="account-peerid-copy" title="Copy PeerID"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg></button></div></div><button class="modal-close">×</button></div>
|
|
7
|
-
<div class="modal-tabs">
|
|
8
|
-
<button class="modal-tab active" data-modal-tab="vcard-tab-content">Identity</button>
|
|
9
|
-
<button class="modal-tab" data-modal-tab="trust-tab-content">Trust Map</button>
|
|
10
|
-
<button class="modal-tab" data-modal-tab="messaging-tab-content">Messaging</button>
|
|
11
|
-
<button class="modal-tab" data-modal-tab="wallet-tab-content">Wallet</button>
|
|
12
|
-
</div>
|
|
13
|
-
<div class="modal-body">
|
|
14
|
-
<!-- Wallet Tab -->
|
|
15
|
-
<div id="wallet-tab-content" class="modal-tab-content">
|
|
16
|
-
<!-- Main Wallet View -->
|
|
17
|
-
<div id="wallet-main-view">
|
|
18
|
-
<!-- Portfolio Value (Phantom-style hero) -->
|
|
19
|
-
<div class="ph-portfolio">
|
|
20
|
-
<div class="ph-portfolio-value" id="wallet-bond-value">$0.00</div>
|
|
21
|
-
<div class="ph-portfolio-label">Total Balance</div>
|
|
22
|
-
<div class="ph-portfolio-xpub">
|
|
23
|
-
<code id="wallet-tab-xpub" class="ph-xpub-text truncate"></code>
|
|
24
|
-
<button class="ph-xpub-copy copy-key-btn" data-copy="wallet-tab-xpub" title="Copy xPub"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg></button>
|
|
25
|
-
</div>
|
|
26
|
-
<div class="ph-portfolio-xpub" id="ph-portfolio-peerid-row" style="display:none">
|
|
27
|
-
<code id="wallet-tab-peerid" class="ph-xpub-text truncate"></code>
|
|
28
|
-
<button class="ph-xpub-copy copy-key-btn" data-copy="wallet-tab-peerid" title="Copy PeerID"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg></button>
|
|
29
|
-
</div>
|
|
30
|
-
</div>
|
|
31
|
-
|
|
32
|
-
<div class="wallet-selector-row">
|
|
33
|
-
<div class="wallet-selector-control">
|
|
34
|
-
<select id="wallet-active-select" class="glass-input compact wallet-selector-input"></select>
|
|
35
|
-
<button id="wallet-manage-btn" class="glass-btn small">Manage</button>
|
|
36
|
-
</div>
|
|
37
|
-
</div>
|
|
38
|
-
|
|
39
|
-
<!-- Action Buttons Row -->
|
|
40
|
-
<div class="ph-actions">
|
|
41
|
-
<button class="ph-action-btn" id="wallet-scan-btn">
|
|
42
|
-
<div class="ph-action-icon"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg></div>
|
|
43
|
-
<span>Scan</span>
|
|
44
|
-
</button>
|
|
45
|
-
<div class="ph-action-wrap" id="wallet-send-action">
|
|
46
|
-
<button class="ph-action-btn" id="wallet-send-btn">
|
|
47
|
-
<div class="ph-action-icon"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="19" x2="12" y2="5"/><polyline points="5 12 12 5 19 12"/></svg></div>
|
|
48
|
-
<span>Send</span>
|
|
49
|
-
</button>
|
|
50
|
-
<div class="ph-action-menu" id="wallet-send-menu">
|
|
51
|
-
<button class="ph-action-menu-item" type="button" data-chain="BTC">Bitcoin (BTC)</button>
|
|
52
|
-
<button class="ph-action-menu-item" type="button" data-chain="ETH">Ethereum (ETH)</button>
|
|
53
|
-
<button class="ph-action-menu-item" type="button" data-chain="SOL">Solana (SOL)</button>
|
|
54
|
-
</div>
|
|
55
|
-
</div>
|
|
56
|
-
<div class="ph-action-wrap" id="wallet-receive-action">
|
|
57
|
-
<button class="ph-action-btn" id="wallet-receive-btn-main">
|
|
58
|
-
<div class="ph-action-icon"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="5" x2="12" y2="19"/><polyline points="19 12 12 19 5 12"/></svg></div>
|
|
59
|
-
<span>Receive</span>
|
|
60
|
-
</button>
|
|
61
|
-
<div class="ph-action-menu" id="wallet-receive-menu">
|
|
62
|
-
<button class="ph-action-menu-item" type="button" data-chain="BTC">Bitcoin (BTC)</button>
|
|
63
|
-
<button class="ph-action-menu-item" type="button" data-chain="ETH">Ethereum (ETH)</button>
|
|
64
|
-
<button class="ph-action-menu-item" type="button" data-chain="SOL">Solana (SOL)</button>
|
|
65
|
-
</div>
|
|
66
|
-
</div>
|
|
67
|
-
<button class="ph-action-btn" id="wallet-export-btn-main">
|
|
68
|
-
<div class="ph-action-icon"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg></div>
|
|
69
|
-
<span>Export</span>
|
|
70
|
-
</button>
|
|
71
|
-
<button class="ph-action-btn" id="wallet-advanced-btn-main">
|
|
72
|
-
<div class="ph-action-icon"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="4" y1="21" x2="4" y2="14"/><line x1="4" y1="10" x2="4" y2="3"/><line x1="12" y1="21" x2="12" y2="12"/><line x1="12" y1="8" x2="12" y2="3"/><line x1="20" y1="21" x2="20" y2="16"/><line x1="20" y1="12" x2="20" y2="3"/><line x1="1" y1="14" x2="7" y2="14"/><line x1="9" y1="8" x2="15" y2="8"/><line x1="17" y1="16" x2="23" y2="16"/></svg></div>
|
|
73
|
-
<span>Advanced</span>
|
|
74
|
-
</button>
|
|
75
|
-
</div>
|
|
76
|
-
|
|
77
|
-
<!-- Scan Progress Bar -->
|
|
78
|
-
<div id="wallet-scan-status" class="wallet-scan-progress" style="display:none;">
|
|
79
|
-
<div id="wallet-scan-bar" class="wallet-scan-bar"></div>
|
|
80
|
-
</div>
|
|
81
|
-
|
|
82
|
-
<!-- Token List -->
|
|
83
|
-
<div id="wallet-accounts-list" class="ph-token-list">
|
|
84
|
-
<div class="ph-token-empty" id="wallet-accounts-empty">
|
|
85
|
-
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" opacity="0.25">
|
|
86
|
-
<rect x="2" y="6" width="20" height="12" rx="2"/><line x1="2" y1="12" x2="22" y2="12"/>
|
|
87
|
-
</svg>
|
|
88
|
-
<p>No tokens yet</p>
|
|
89
|
-
<p class="ph-token-empty-sub">Log in and tap Scan to discover your accounts</p>
|
|
90
|
-
</div>
|
|
91
|
-
</div>
|
|
92
|
-
</div>
|
|
93
|
-
|
|
94
|
-
<!-- Wallets View (replaces main view) -->
|
|
95
|
-
<div id="wallet-wallets-view" class="wallet-overlay-view" style="display:none;">
|
|
96
|
-
<div class="wallet-overlay-header wallet-wallets-header">
|
|
97
|
-
<div class="wallet-overlay-title-row">
|
|
98
|
-
<button id="wallet-wallets-back" class="wallet-back-btn"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M19 12H5M12 19l-7-7 7-7"/></svg> Back</button>
|
|
99
|
-
<h4>Wallets</h4>
|
|
100
|
-
</div>
|
|
101
|
-
<button id="wallet-new-btn" class="glass-btn small">+ New Wallet</button>
|
|
102
|
-
</div>
|
|
103
|
-
<div class="wallet-overlay-body">
|
|
104
|
-
<div class="wallet-manage-tabs" role="tablist" aria-label="Wallet status">
|
|
105
|
-
<button id="wallet-manage-tab-active" class="wallet-manage-tab active" type="button">Active</button>
|
|
106
|
-
<button id="wallet-manage-tab-inactive" class="wallet-manage-tab" type="button">Inactive</button>
|
|
107
|
-
</div>
|
|
108
|
-
<div class="settings-group">
|
|
109
|
-
<div id="wallet-list" class="wallet-name-list"></div>
|
|
110
|
-
</div>
|
|
111
|
-
</div>
|
|
112
|
-
</div>
|
|
113
|
-
|
|
114
|
-
<!-- Export View (replaces main view) -->
|
|
115
|
-
<div id="wallet-export-view" class="wallet-overlay-view" style="display:none;">
|
|
116
|
-
<div class="wallet-overlay-header">
|
|
117
|
-
<button id="wallet-export-back" class="wallet-back-btn"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M19 12H5M12 19l-7-7 7-7"/></svg> Back</button>
|
|
118
|
-
<h4>Export Wallet</h4>
|
|
119
|
-
</div>
|
|
120
|
-
<div class="wallet-overlay-body wallet-export-body">
|
|
121
|
-
<div class="settings-group">
|
|
122
|
-
<span class="settings-group-label">HD Wallet Root</span>
|
|
123
|
-
<div class="key-item"><label>Master Public Key (xpub)</label><div class="key-value-row"><code id="wallet-xpub" class="key-value truncate"></code><button class="copy-key-btn" data-copy="wallet-xpub" title="Copy"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg></button></div></div>
|
|
124
|
-
<div class="key-item sensitive"><label>Master Private Key (xprv)</label><div class="key-value-row"><code id="wallet-xprv" class="key-value truncate blurred" data-revealed="false"></code><button class="reveal-key-btn" data-target="wallet-xprv" title="Reveal"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg></button><button class="copy-key-btn" data-copy="wallet-xprv" title="Copy"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg></button></div></div>
|
|
125
|
-
<div class="key-item sensitive"><label>Seed Phrase (BIP39)</label><div class="key-value-row"><code id="wallet-seed-phrase" class="key-value seed-phrase blurred" data-revealed="false"></code><button class="reveal-key-btn" data-target="wallet-seed-phrase" title="Reveal"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg></button><button class="copy-key-btn" data-copy="wallet-seed-phrase" title="Copy"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg></button></div></div>
|
|
126
|
-
</div>
|
|
127
|
-
<div class="settings-group">
|
|
128
|
-
<span class="settings-group-label">Export Format</span>
|
|
129
|
-
<div class="wallet-export-options">
|
|
130
|
-
<button class="export-option export-option-card" data-format="mnemonic"><span class="export-label">BIP39 Mnemonic</span><span class="export-desc">12/24 word recovery phrase</span></button>
|
|
131
|
-
<button class="export-option export-option-card" data-format="xpub"><span class="export-label">Extended Public Key</span><span class="export-desc">Shareable watch-only root</span></button>
|
|
132
|
-
<button class="export-option export-option-card" data-format="xprv"><span class="export-label">Extended Private Key</span><span class="export-desc">Full access master private key</span></button>
|
|
133
|
-
<button class="export-option export-option-card" data-format="hex"><span class="export-label">Raw Seed (Hex)</span><span class="export-desc">Binary seed in hexadecimal</span></button>
|
|
134
|
-
</div>
|
|
135
|
-
</div>
|
|
136
|
-
</div>
|
|
137
|
-
</div>
|
|
138
|
-
|
|
139
|
-
<!-- Advanced View (replaces main view) -->
|
|
140
|
-
<div id="wallet-advanced-view" class="wallet-overlay-view" style="display:none;">
|
|
141
|
-
<div class="wallet-overlay-header">
|
|
142
|
-
<button id="wallet-advanced-back" class="wallet-back-btn"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M19 12H5M12 19l-7-7 7-7"/></svg> Back</button>
|
|
143
|
-
<h4>Advanced</h4>
|
|
144
|
-
</div>
|
|
145
|
-
<div class="wallet-overlay-body">
|
|
146
|
-
<div class="settings-group">
|
|
147
|
-
<span class="settings-group-label">Advanced</span>
|
|
148
|
-
<div class="settings-custom-path">
|
|
149
|
-
<label>Wallet</label>
|
|
150
|
-
<div class="wallet-selected-path" id="custom-path-wallet-label"></div>
|
|
151
|
-
<label>Chain</label>
|
|
152
|
-
<select id="custom-path-chain" class="glass-input compact"><option value="0">BTC</option><option value="60">ETH</option><option value="501">SOL</option></select>
|
|
153
|
-
<label>Custom Derivation Path</label>
|
|
154
|
-
<div class="custom-path-row">
|
|
155
|
-
<input id="custom-path-input" class="glass-input compact" placeholder="m/44'/0'/0'/0/0">
|
|
156
|
-
<button id="custom-path-add" class="glass-btn small">Add</button>
|
|
157
|
-
</div>
|
|
158
|
-
</div>
|
|
159
|
-
</div>
|
|
160
|
-
</div>
|
|
161
|
-
</div>
|
|
162
|
-
|
|
163
|
-
<!-- Send View (replaces main view) -->
|
|
164
|
-
<div id="wallet-send-view" class="wallet-overlay-view" style="display:none;">
|
|
165
|
-
<div class="wallet-overlay-header">
|
|
166
|
-
<button id="wallet-send-back" class="wallet-back-btn"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M19 12H5M12 19l-7-7 7-7"/></svg> Back</button>
|
|
167
|
-
<h4>Send</h4>
|
|
168
|
-
</div>
|
|
169
|
-
<div class="wallet-overlay-body">
|
|
170
|
-
<div id="send-compose-step">
|
|
171
|
-
<div class="send-field-group">
|
|
172
|
-
<label class="send-label">From</label>
|
|
173
|
-
<select id="send-from-account" class="glass-input"></select>
|
|
174
|
-
<div class="send-balance-display">Balance: <span id="send-available-balance">--</span></div>
|
|
175
|
-
</div>
|
|
176
|
-
<div class="send-field-group">
|
|
177
|
-
<label class="send-label">To Address</label>
|
|
178
|
-
<input id="send-to-address" class="glass-input" placeholder="Recipient address" autocomplete="off">
|
|
179
|
-
</div>
|
|
180
|
-
<div class="send-field-group">
|
|
181
|
-
<label class="send-label">Amount</label>
|
|
182
|
-
<div class="send-amount-row">
|
|
183
|
-
<input id="send-amount" class="glass-input" type="number" step="any" min="0" placeholder="0.00">
|
|
184
|
-
<span class="send-currency-label" id="send-currency-label">BTC</span>
|
|
185
|
-
<button id="send-max-btn" class="glass-btn small">Max</button>
|
|
186
|
-
</div>
|
|
187
|
-
<div class="send-fiat-estimate" id="send-fiat-estimate"></div>
|
|
188
|
-
</div>
|
|
189
|
-
<div class="send-fee-display" id="send-fee-section" style="display:none;">
|
|
190
|
-
<span class="send-label">Estimated Fee</span>
|
|
191
|
-
<span id="send-fee-estimate">--</span>
|
|
192
|
-
</div>
|
|
193
|
-
<button id="send-review-btn" class="glass-btn primary full-width" disabled>Review Transaction</button>
|
|
194
|
-
</div>
|
|
195
|
-
<div id="send-review-step" style="display:none;">
|
|
196
|
-
<div class="send-review-card">
|
|
197
|
-
<div class="send-review-row"><span>To</span><code id="send-review-to" class="truncate"></code></div>
|
|
198
|
-
<div class="send-review-row"><span>Amount</span><span id="send-review-amount"></span></div>
|
|
199
|
-
<div class="send-review-row"><span>Network Fee</span><span id="send-review-fee"></span></div>
|
|
200
|
-
<div class="send-review-row send-review-total"><span>Total</span><span id="send-review-total"></span></div>
|
|
201
|
-
</div>
|
|
202
|
-
<button id="send-confirm-btn" class="glass-btn primary full-width">Confirm & Send</button>
|
|
203
|
-
<button id="send-edit-btn" class="glass-btn full-width">Edit</button>
|
|
204
|
-
<div id="send-status" class="send-status" style="display:none;"></div>
|
|
205
|
-
</div>
|
|
206
|
-
</div>
|
|
207
|
-
</div>
|
|
208
|
-
</div>
|
|
209
|
-
<div id="vcard-tab-content" class="modal-tab-content active">
|
|
210
|
-
<div id="vcard-form-view">
|
|
211
|
-
<div class="identity-card">
|
|
212
|
-
<div class="identity-card-photo">
|
|
213
|
-
<div class="photo-preview" id="vcard-photo-preview">
|
|
214
|
-
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" class="photo-placeholder-icon">
|
|
215
|
-
<path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/>
|
|
216
|
-
</svg>
|
|
217
|
-
<video id="vcard-camera-video" autoplay playsinline style="display:none;width:100%;height:100%;object-fit:contain;"></video>
|
|
218
|
-
<div id="vcard-photo-actions" class="photo-actions">
|
|
219
|
-
<label class="glass-btn small" for="vcard-photo-input">Upload</label>
|
|
220
|
-
<button id="vcard-camera-btn" class="glass-btn small" style="display:none;">Take Photo</button>
|
|
221
|
-
<button id="vcard-camera-capture" class="glass-btn small primary" style="display:none;">Capture</button>
|
|
222
|
-
<button id="vcard-camera-cancel" class="glass-btn small" style="display:none;">Cancel</button>
|
|
223
|
-
<button id="vcard-photo-remove" class="glass-btn small" style="display:none;">Remove</button>
|
|
224
|
-
</div>
|
|
225
|
-
<button type="button" id="vcard-photo-edit-btn" class="photo-edit-overlay" title="Edit Photo">
|
|
226
|
-
<svg class="photo-edit-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/></svg>
|
|
227
|
-
<svg class="photo-close-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
|
|
228
|
-
</button>
|
|
229
|
-
</div>
|
|
230
|
-
<input type="file" id="vcard-photo-input" accept="image/*" hidden>
|
|
231
|
-
</div>
|
|
232
|
-
<div class="identity-card-info" id="identity-card-info">
|
|
233
|
-
<button class="identity-edit-btn" id="identity-edit-btn" title="Edit Identity">
|
|
234
|
-
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/></svg>
|
|
235
|
-
</button>
|
|
236
|
-
<div class="identity-card-name" id="identity-card-name">--</div>
|
|
237
|
-
<div class="identity-card-detail" id="identity-card-title"></div>
|
|
238
|
-
<div class="identity-card-detail" id="identity-card-org"></div>
|
|
239
|
-
<div class="identity-card-detail" id="identity-card-email"></div>
|
|
240
|
-
<div class="identity-card-detail" id="identity-card-phone"></div>
|
|
241
|
-
</div>
|
|
242
|
-
</div>
|
|
243
|
-
|
|
244
|
-
<div class="vcard-actions-footer">
|
|
245
|
-
<div class="vcard-split-btn-group">
|
|
246
|
-
<button id="generate-vcard" class="glass-btn vcard-split-btn vcard-split-export">Export vCard</button>
|
|
247
|
-
<label class="glass-btn vcard-split-btn vcard-split-import" for="vcf-import-input">Import vCard</label>
|
|
248
|
-
<input type="file" id="vcf-import-input" accept=".vcf,text/vcard" hidden>
|
|
249
|
-
</div>
|
|
250
|
-
</div>
|
|
251
|
-
|
|
252
|
-
<div id="vcf-import-result" class="vcf-import-result" style="display: none;">
|
|
253
|
-
<h4 class="section-label">Imported Contact</h4>
|
|
254
|
-
<div class="vcf-import-card">
|
|
255
|
-
<div class="vcf-import-photo" id="vcf-import-photo"></div>
|
|
256
|
-
<div class="vcf-import-fields" id="vcf-import-fields"></div>
|
|
257
|
-
</div>
|
|
258
|
-
<div id="vcf-import-sig-status" class="vcard-sig-badge" style="display:none;"></div>
|
|
259
|
-
<div class="vcf-import-actions">
|
|
260
|
-
<button id="vcf-import-apply" class="glass-btn primary">Replace Identity</button>
|
|
261
|
-
<button id="vcf-import-close" class="glass-btn">Dismiss</button>
|
|
262
|
-
</div>
|
|
263
|
-
</div>
|
|
264
|
-
</div>
|
|
265
|
-
|
|
266
|
-
<div id="vcard-edit-view" class="identity-edit-view" style="display: none;">
|
|
267
|
-
<div class="identity-edit-scroll">
|
|
268
|
-
<div class="identity-form">
|
|
269
|
-
<div class="vcard-form-stack">
|
|
270
|
-
<div class="vcard-form-row name-row">
|
|
271
|
-
<div class="vcard-input-group vcard-input-sm">
|
|
272
|
-
<label>Prefix</label>
|
|
273
|
-
<input type="text" id="vcard-prefix" class="vcard-input" placeholder="Mr.">
|
|
274
|
-
</div>
|
|
275
|
-
<div class="vcard-input-group">
|
|
276
|
-
<label>First Name</label>
|
|
277
|
-
<input type="text" id="vcard-firstname" class="vcard-input" placeholder="John">
|
|
278
|
-
</div>
|
|
279
|
-
<div class="vcard-input-group">
|
|
280
|
-
<label>Middle</label>
|
|
281
|
-
<input type="text" id="vcard-middlename" class="vcard-input" placeholder="A.">
|
|
282
|
-
</div>
|
|
283
|
-
</div>
|
|
284
|
-
<div class="vcard-form-row name-row-2">
|
|
285
|
-
<div class="vcard-input-group">
|
|
286
|
-
<label>Last Name</label>
|
|
287
|
-
<input type="text" id="vcard-lastname" class="vcard-input" placeholder="Doe">
|
|
288
|
-
</div>
|
|
289
|
-
<div class="vcard-input-group vcard-input-sm">
|
|
290
|
-
<label>Suffix</label>
|
|
291
|
-
<input type="text" id="vcard-suffix" class="vcard-input" placeholder="Jr.">
|
|
292
|
-
</div>
|
|
293
|
-
</div>
|
|
294
|
-
<div class="vcard-input-group">
|
|
295
|
-
<label>Nickname</label>
|
|
296
|
-
<input type="text" id="vcard-nickname" class="vcard-input" placeholder="e.g., Johnny, Ace">
|
|
297
|
-
</div>
|
|
298
|
-
<div class="vcard-form-row">
|
|
299
|
-
<div class="vcard-input-group">
|
|
300
|
-
<label>Email</label>
|
|
301
|
-
<input type="email" id="vcard-email" class="vcard-input" placeholder="john@example.com">
|
|
302
|
-
</div>
|
|
303
|
-
<div class="vcard-input-group">
|
|
304
|
-
<label>Phone</label>
|
|
305
|
-
<input type="tel" id="vcard-phone" class="vcard-input" placeholder="+1 555-0100">
|
|
306
|
-
</div>
|
|
307
|
-
</div>
|
|
308
|
-
<div class="vcard-form-row">
|
|
309
|
-
<div class="vcard-input-group">
|
|
310
|
-
<label>Organization</label>
|
|
311
|
-
<input type="text" id="vcard-org" class="vcard-input" placeholder="Company Name">
|
|
312
|
-
</div>
|
|
313
|
-
<div class="vcard-input-group">
|
|
314
|
-
<label>Job Title</label>
|
|
315
|
-
<input type="text" id="vcard-title" class="vcard-input" placeholder="Software Engineer">
|
|
316
|
-
</div>
|
|
317
|
-
</div>
|
|
318
|
-
<div class="vcard-input-group">
|
|
319
|
-
<label>Street Address</label>
|
|
320
|
-
<input type="text" id="vcard-street" class="vcard-input" placeholder="123 Main St">
|
|
321
|
-
</div>
|
|
322
|
-
<div class="vcard-form-row">
|
|
323
|
-
<div class="vcard-input-group">
|
|
324
|
-
<label>City</label>
|
|
325
|
-
<input type="text" id="vcard-city" class="vcard-input" placeholder="San Francisco">
|
|
326
|
-
</div>
|
|
327
|
-
<div class="vcard-input-group vcard-input-sm">
|
|
328
|
-
<label>State</label>
|
|
329
|
-
<input type="text" id="vcard-region" class="vcard-input" placeholder="CA">
|
|
330
|
-
</div>
|
|
331
|
-
<div class="vcard-input-group vcard-input-sm">
|
|
332
|
-
<label>ZIP</label>
|
|
333
|
-
<input type="text" id="vcard-postal" class="vcard-input" placeholder="94102">
|
|
334
|
-
</div>
|
|
335
|
-
</div>
|
|
336
|
-
<div class="vcard-input-group">
|
|
337
|
-
<label>Country</label>
|
|
338
|
-
<input type="text" id="vcard-country" class="vcard-input" placeholder="United States">
|
|
339
|
-
</div>
|
|
340
|
-
</div>
|
|
341
|
-
</div>
|
|
342
|
-
</div>
|
|
343
|
-
<div class="identity-edit-actions">
|
|
344
|
-
<button id="identity-save-btn" class="glass-btn primary">Save</button>
|
|
345
|
-
<button id="identity-back-btn" class="glass-btn">Back</button>
|
|
346
|
-
</div>
|
|
347
|
-
</div>
|
|
348
|
-
|
|
349
|
-
<div id="vcard-result-view" style="display: none;">
|
|
350
|
-
<div class="vcard-view-toggle">
|
|
351
|
-
<button id="vcard-toggle-qr" class="vcard-toggle-btn active">QR</button>
|
|
352
|
-
<button id="vcard-toggle-raw" class="vcard-toggle-btn">Raw</button>
|
|
353
|
-
</div>
|
|
354
|
-
<div class="qr-container"><canvas id="qr-code"></canvas></div>
|
|
355
|
-
<pre id="vcard-raw-view" class="vcard-raw-view" style="display:none;"></pre>
|
|
356
|
-
<div id="vcard-sig-badge" class="vcard-sig-badge sig-verified" style="display:none;">
|
|
357
|
-
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>
|
|
358
|
-
Signed with Ed25519
|
|
359
|
-
</div>
|
|
360
|
-
<div class="vcard-result-actions">
|
|
361
|
-
<button id="download-vcard" class="glass-btn primary">Download .vcf</button>
|
|
362
|
-
<button id="copy-vcard" class="glass-btn">Copy</button>
|
|
363
|
-
</div>
|
|
364
|
-
<button id="vcard-back-btn" class="glass-btn vcard-back-btn">
|
|
365
|
-
<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2">
|
|
366
|
-
<path d="M19 12H5M12 19l-7-7 7-7"/>
|
|
367
|
-
</svg> Back to Editor
|
|
368
|
-
</button>
|
|
369
|
-
</div>
|
|
370
|
-
</div>
|
|
371
|
-
<!-- Trust Map Tab -->
|
|
372
|
-
<div id="trust-tab-content" class="modal-tab-content">
|
|
373
|
-
<!-- Collapsible Trust Levels -->
|
|
374
|
-
<details class="trust-levels-box" open>
|
|
375
|
-
<summary class="trust-levels-header">
|
|
376
|
-
<span>Trust Levels</span>
|
|
377
|
-
<svg class="chevron-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg>
|
|
378
|
-
</summary>
|
|
379
|
-
<div class="trust-levels-badges">
|
|
380
|
-
<span class="trust-badge trust-ultimate">Ultimate</span>
|
|
381
|
-
<span class="trust-badge trust-full">Full</span>
|
|
382
|
-
<span class="trust-badge trust-marginal">Marginal</span>
|
|
383
|
-
<span class="trust-badge trust-unknown">Unknown</span>
|
|
384
|
-
<span class="trust-badge trust-never">Never</span>
|
|
385
|
-
</div>
|
|
386
|
-
</details>
|
|
387
|
-
|
|
388
|
-
<!-- Actions bar -->
|
|
389
|
-
<div class="trust-actions-bar">
|
|
390
|
-
<button id="establish-trust-btn" class="glass-btn small primary">+ Establish Trust</button>
|
|
391
|
-
<button id="trust-rules-btn" class="glass-btn small"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3v1m0 16v1m-8-9H3m18 0h-1m-2.636-6.364l-.707.707M6.343 17.657l-.707.707m12.728 0l-.707-.707M6.343 6.343l-.707-.707"/><circle cx="12" cy="12" r="4"/></svg> Rules</button>
|
|
392
|
-
<div class="trust-actions-right">
|
|
393
|
-
<button id="trust-export-btn" class="glass-btn small" title="Export trust data"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg></button>
|
|
394
|
-
<label class="glass-btn small" for="trust-import-input" title="Import trust data"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg></label>
|
|
395
|
-
<input type="file" id="trust-import-input" accept=".json,.trust.json" hidden>
|
|
396
|
-
</div>
|
|
397
|
-
</div>
|
|
398
|
-
|
|
399
|
-
<!-- Trust scan status -->
|
|
400
|
-
<div id="trust-scan-status" class="trust-scan-status">
|
|
401
|
-
<span class="trust-scan-dot"></span>
|
|
402
|
-
<span id="trust-scan-label">Scanning...</span>
|
|
403
|
-
<span id="trust-scan-count" class="trust-scan-count"></span>
|
|
404
|
-
</div>
|
|
405
|
-
|
|
406
|
-
<!-- Scrollable Trust List -->
|
|
407
|
-
<div id="trust-list" class="trust-list">
|
|
408
|
-
<div id="trust-list-empty" class="trust-list-empty">
|
|
409
|
-
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" opacity="0.3">
|
|
410
|
-
<circle cx="12" cy="5" r="3"/><circle cx="6" cy="15" r="3"/><circle cx="18" cy="15" r="3"/>
|
|
411
|
-
<line x1="12" y1="8" x2="8" y2="12"/><line x1="12" y1="8" x2="16" y2="12"/>
|
|
412
|
-
</svg>
|
|
413
|
-
<p>No trust relationships found yet.</p>
|
|
414
|
-
<p class="trust-list-subtitle">Relationships will appear here as your addresses are scanned.</p>
|
|
415
|
-
</div>
|
|
416
|
-
</div>
|
|
417
|
-
</div>
|
|
418
|
-
|
|
419
|
-
<!-- Messaging Tab (Encrypt + Decrypt) -->
|
|
420
|
-
<div id="messaging-tab-content" class="modal-tab-content">
|
|
421
|
-
<div class="glass-card messaging-key-config">
|
|
422
|
-
<div class="messaging-key-config-grid">
|
|
423
|
-
<div class="messaging-key-config-item">
|
|
424
|
-
<label>Key Type</label>
|
|
425
|
-
<select id="messaging-key-type" class="glass-input compact">
|
|
426
|
-
<option value="btc">Bitcoin (BTC) - secp256k1</option>
|
|
427
|
-
<option value="eth">Ethereum (ETH) - secp256k1</option>
|
|
428
|
-
<option value="sol">Solana (SOL) - X25519</option>
|
|
429
|
-
</select>
|
|
430
|
-
</div>
|
|
431
|
-
<div class="messaging-key-config-item">
|
|
432
|
-
<label>HD Path</label>
|
|
433
|
-
<div class="messaging-path-row">
|
|
434
|
-
<input type="text" id="messaging-hd-path" class="glass-input compact" value="m/44'/0'/0'/1/0" spellcheck="false" autocomplete="off">
|
|
435
|
-
<button id="messaging-hd-path-default" class="glass-btn small" title="Reset to default path">Default</button>
|
|
436
|
-
</div>
|
|
437
|
-
<div class="messaging-key-hint">Example: m/44'/60'/0'/1/0</div>
|
|
438
|
-
</div>
|
|
439
|
-
</div>
|
|
440
|
-
</div>
|
|
441
|
-
<div class="messaging-sub-tabs">
|
|
442
|
-
<button class="messaging-sub-tab active" data-messaging-sub="encrypt-sub">Encrypt</button>
|
|
443
|
-
<button class="messaging-sub-tab" data-messaging-sub="decrypt-sub">Decrypt</button>
|
|
444
|
-
</div>
|
|
445
|
-
<div id="encrypt-sub" class="messaging-sub-content active">
|
|
446
|
-
<!-- Encrypt Step 1: Compose -->
|
|
447
|
-
<div id="encrypt-step-compose" class="encrypt-step">
|
|
448
|
-
<div class="encrypt-tab-intro">
|
|
449
|
-
<h4 class="section-label">Encrypt a Message</h4>
|
|
450
|
-
<p>ECDH key agreement + HKDF + AES-256-GCM (ECIES)</p>
|
|
451
|
-
</div>
|
|
452
|
-
<div class="encrypt-keys-section">
|
|
453
|
-
<div class="encrypt-key-row">
|
|
454
|
-
<div class="encrypt-key-card glass-card">
|
|
455
|
-
<div class="encrypt-key-header">
|
|
456
|
-
<span class="encrypt-role-badge sender">Sender (You)</span>
|
|
457
|
-
</div>
|
|
458
|
-
<div class="encrypt-key-detail">
|
|
459
|
-
<label>Encryption Public Key</label>
|
|
460
|
-
<code id="encrypt-sender-pubkey" class="truncate">--</code>
|
|
461
|
-
</div>
|
|
462
|
-
<div class="encrypt-key-detail">
|
|
463
|
-
<label>Derivation Path</label>
|
|
464
|
-
<code id="encrypt-sender-path">--</code>
|
|
465
|
-
</div>
|
|
466
|
-
<div class="encrypt-key-detail">
|
|
467
|
-
<label>Key Algorithm</label>
|
|
468
|
-
<code id="encrypt-sender-algo">--</code>
|
|
469
|
-
</div>
|
|
470
|
-
</div>
|
|
471
|
-
<div class="encrypt-key-card glass-card">
|
|
472
|
-
<div class="encrypt-key-header">
|
|
473
|
-
<span class="encrypt-role-badge recipient">Recipient</span>
|
|
474
|
-
</div>
|
|
475
|
-
<div class="encrypt-key-detail">
|
|
476
|
-
<label>Recipient Public Key (hex)</label>
|
|
477
|
-
<div class="encrypt-recipient-input-row">
|
|
478
|
-
<input type="text" id="encrypt-recipient-pubkey" class="glass-input compact" placeholder="Paste recipient's secp256k1 public key (hex)">
|
|
479
|
-
<button id="encrypt-use-self" class="glass-btn small" title="Use your own key (for testing)">Self</button>
|
|
480
|
-
</div>
|
|
481
|
-
</div>
|
|
482
|
-
</div>
|
|
483
|
-
</div>
|
|
484
|
-
</div>
|
|
485
|
-
<div class="encrypt-message-section">
|
|
486
|
-
<div class="encrypt-input-group">
|
|
487
|
-
<label class="section-label">Message</label>
|
|
488
|
-
<textarea id="encrypt-plaintext" class="glass-input glass-textarea" rows="3" placeholder="Enter a message to encrypt..."></textarea>
|
|
489
|
-
</div>
|
|
490
|
-
<div class="encrypt-actions">
|
|
491
|
-
<button id="encrypt-btn" class="glass-btn primary" disabled>Encrypt</button>
|
|
492
|
-
</div>
|
|
493
|
-
</div>
|
|
494
|
-
</div>
|
|
495
|
-
<!-- Encrypt Step 2: Result -->
|
|
496
|
-
<div id="encrypt-step-result" class="encrypt-step" style="display:none;">
|
|
497
|
-
<div class="encrypt-step-header">
|
|
498
|
-
<button id="encrypt-back-btn" class="glass-btn small encrypt-back-btn"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2"><path d="M19 12H5M12 19l-7-7 7-7"/></svg> Back</button>
|
|
499
|
-
<h4 class="section-label">Encrypted Payload</h4>
|
|
500
|
-
</div>
|
|
501
|
-
<div class="encrypt-output-fields">
|
|
502
|
-
<div class="encrypt-field"><label>Ciphertext</label><code id="encrypt-out-ciphertext" class="encrypt-out-value truncate"></code><button class="copy-btn" data-copy="encrypt-out-ciphertext" title="Copy"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></button></div>
|
|
503
|
-
<div class="encrypt-field"><label>Auth Tag</label><code id="encrypt-out-tag" class="encrypt-out-value truncate"></code></div>
|
|
504
|
-
<div class="encrypt-field"><label>IV (nonce)</label><code id="encrypt-out-iv" class="encrypt-out-value truncate"></code></div>
|
|
505
|
-
<div class="encrypt-field"><label>HKDF Salt</label><code id="encrypt-out-salt" class="encrypt-out-value truncate"></code></div>
|
|
506
|
-
<div class="encrypt-field"><label>Sender Public Key</label><code id="encrypt-out-sender-pub" class="encrypt-out-value truncate"></code></div>
|
|
507
|
-
</div>
|
|
508
|
-
<div class="encrypt-bundle-group">
|
|
509
|
-
<div class="encrypt-format-toggle">
|
|
510
|
-
<label class="section-label">Payload Bundle</label>
|
|
511
|
-
<div class="encrypt-format-btns">
|
|
512
|
-
<button class="glass-btn small encrypt-fmt-btn active" data-format="json">JSON</button>
|
|
513
|
-
<button class="glass-btn small encrypt-fmt-btn" data-format="flatbuffer">FlatBuffer</button>
|
|
514
|
-
</div>
|
|
515
|
-
</div>
|
|
516
|
-
<div class="encrypt-format-info">
|
|
517
|
-
<span id="encrypt-format-label" class="encrypt-format-label">EME (Encrypted Message Envelope) — SpaceDataStandards.org</span>
|
|
518
|
-
</div>
|
|
519
|
-
<textarea id="encrypt-bundle" class="glass-input glass-textarea" rows="4" readonly></textarea>
|
|
520
|
-
<div class="encrypt-bundle-actions">
|
|
521
|
-
<button class="glass-btn small" id="encrypt-copy-bundle">Copy</button>
|
|
522
|
-
<button class="glass-btn small" id="encrypt-download-bundle">Download</button>
|
|
523
|
-
</div>
|
|
524
|
-
</div>
|
|
525
|
-
</div>
|
|
526
|
-
</div>
|
|
527
|
-
<div id="decrypt-sub" class="messaging-sub-content">
|
|
528
|
-
<!-- Decrypt Step 1: Input -->
|
|
529
|
-
<div id="decrypt-step-input" class="encrypt-step">
|
|
530
|
-
<div class="encrypt-tab-intro">
|
|
531
|
-
<h4 class="section-label">Decrypt a Message</h4>
|
|
532
|
-
<p>Paste an EME payload (JSON or base64 FlatBuffer) to decrypt with your key.</p>
|
|
533
|
-
</div>
|
|
534
|
-
<textarea id="decrypt-payload" class="glass-input glass-textarea" rows="6" placeholder='Paste EME JSON or base64 FlatBuffer here...'></textarea>
|
|
535
|
-
<div class="encrypt-actions">
|
|
536
|
-
<button id="decrypt-btn" class="glass-btn primary" disabled>Decrypt</button>
|
|
537
|
-
</div>
|
|
538
|
-
</div>
|
|
539
|
-
<!-- Decrypt Step 2: Result -->
|
|
540
|
-
<div id="decrypt-step-result" class="encrypt-step" style="display:none;">
|
|
541
|
-
<div class="encrypt-step-header">
|
|
542
|
-
<button id="decrypt-back-btn" class="glass-btn small encrypt-back-btn"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2"><path d="M19 12H5M12 19l-7-7 7-7"/></svg> Back</button>
|
|
543
|
-
<h4 class="section-label">Decrypted Message</h4>
|
|
544
|
-
</div>
|
|
545
|
-
<div class="decrypt-result">
|
|
546
|
-
<div class="decrypt-result-value" id="decrypt-result-value"></div>
|
|
547
|
-
</div>
|
|
548
|
-
</div>
|
|
549
|
-
</div>
|
|
550
|
-
</div>
|
|
551
|
-
|
|
552
|
-
</div>
|
|
553
|
-
</div>
|
|
554
|
-
</div>
|
|
555
|
-
|
|
556
|
-
<!-- Login Modal -->
|
|
557
|
-
<div id="login-modal" class="modal">
|
|
558
|
-
<div class="modal-glass login-modal-content">
|
|
559
|
-
<div class="modal-header"><h3>Login</h3><button class="modal-close">×</button></div>
|
|
560
|
-
<div id="wallet-info-box" class="wallet-info-box">
|
|
561
|
-
<div id="wallet-info-expanded" class="wallet-info-expanded"><div class="wallet-info-content"><strong>Decentralized Wallet</strong> — Your credentials never leave your browser.</div><button class="wallet-info-close" id="wallet-info-dismiss" title="Dismiss">×</button></div>
|
|
562
|
-
<div id="wallet-info-collapsed" class="wallet-info-collapsed" style="display:none"><span>Decentralized Wallet</span><div class="wallet-info-icon-wrap"><svg viewBox="0 0 16 16"><circle cx="8" cy="8" r="7" fill="none" stroke="currentColor" stroke-width="0.75"/><text x="8" y="8" text-anchor="middle" dominant-baseline="central" font-size="11" fill="currentColor">i</text></svg></div></div>
|
|
563
|
-
</div>
|
|
564
|
-
<div class="modal-body">
|
|
565
|
-
<div class="method-tabs">
|
|
566
|
-
<button class="method-tab active" data-method="password">Password</button>
|
|
567
|
-
<button class="method-tab" data-method="seed">Seed Phrase</button>
|
|
568
|
-
<button class="method-tab" data-method="stored" id="stored-tab" style="display: none;">Stored</button>
|
|
569
|
-
</div>
|
|
570
|
-
<form id="password-method" class="method-content active" onsubmit="return false;">
|
|
571
|
-
<div class="glass-input-group"><input type="text" id="wallet-username" class="glass-input" placeholder="Username" autocomplete="username"></div>
|
|
572
|
-
<div class="glass-input-group">
|
|
573
|
-
<div class="password-input-wrap"><input type="password" id="wallet-password" class="glass-input" placeholder="Password (24+ chars)" autocomplete="new-password"><button type="button" id="toggle-password-vis" class="password-toggle" title="Show password"><svg class="eye-open" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg><svg class="eye-closed" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="display:none"><path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"/><line x1="1" y1="1" x2="23" y2="23"/></svg></button></div>
|
|
574
|
-
<div class="entropy-bar"><div class="entropy-fill" id="strength-fill"></div><div class="entropy-threshold"></div></div>
|
|
575
|
-
<span class="entropy-label"><span id="entropy-bits">0</span> bits entropy</span>
|
|
576
|
-
</div>
|
|
577
|
-
<div class="remember-wallet-group">
|
|
578
|
-
<label class="glass-checkbox"><input type="checkbox" id="remember-wallet-password"><span class="checkmark"></span><span>Remember wallet</span></label>
|
|
579
|
-
<div class="remember-options" id="remember-options-password" style="display: none;">
|
|
580
|
-
<div class="remember-method-selector"><button type="button" class="remember-method-btn" data-method="pin" data-target="password">PIN</button><button type="button" class="remember-method-btn active" data-method="passkey" data-target="password" id="passkey-btn-password">Passkey</button></div>
|
|
581
|
-
<div class="pin-input-group" id="pin-group-password" style="display: none;"><input type="password" id="pin-input-password" class="glass-input pin-input" placeholder="6-digit PIN" maxlength="6" inputmode="numeric" pattern="[0-9]*"></div>
|
|
582
|
-
<div class="passkey-info" id="passkey-info-password"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2a5 5 0 0 1 5 5v3H7V7a5 5 0 0 1 5-5z"/><rect x="3" y="10" width="18" height="12" rx="2"/><circle cx="12" cy="16" r="1"/></svg><span>Use Face ID, Touch ID, or device PIN</span></div>
|
|
583
|
-
</div>
|
|
584
|
-
</div>
|
|
585
|
-
<button id="derive-from-password" class="glass-btn primary full-width" disabled type="button">Login</button>
|
|
586
|
-
</form>
|
|
587
|
-
<div id="seed-method" class="method-content">
|
|
588
|
-
<div class="glass-input-group"><textarea id="seed-phrase" class="glass-input glass-textarea" rows="3" placeholder="Enter 12 or 24 word seed phrase..."></textarea><div class="seed-actions"><button id="generate-seed" class="glass-btn small">Generate</button><button id="validate-seed" class="glass-btn small">Validate</button></div></div>
|
|
589
|
-
<div class="remember-wallet-group">
|
|
590
|
-
<label class="glass-checkbox"><input type="checkbox" id="remember-wallet-seed"><span class="checkmark"></span><span>Remember wallet</span></label>
|
|
591
|
-
<div class="remember-options" id="remember-options-seed" style="display: none;">
|
|
592
|
-
<div class="remember-method-selector"><button type="button" class="remember-method-btn" data-method="pin" data-target="seed">PIN</button><button type="button" class="remember-method-btn active" data-method="passkey" data-target="seed" id="passkey-btn-seed">Passkey</button></div>
|
|
593
|
-
<div class="pin-input-group" id="pin-group-seed" style="display: none;"><input type="password" id="pin-input-seed" class="glass-input pin-input" placeholder="6-digit PIN" maxlength="6" inputmode="numeric" pattern="[0-9]*"></div>
|
|
594
|
-
<div class="passkey-info" id="passkey-info-seed"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2a5 5 0 0 1 5 5v3H7V7a5 5 0 0 1 5-5z"/><rect x="3" y="10" width="18" height="12" rx="2"/><circle cx="12" cy="16" r="1"/></svg><span>Use Face ID, Touch ID, or device PIN</span></div>
|
|
595
|
-
</div>
|
|
596
|
-
</div>
|
|
597
|
-
<button id="derive-from-seed" class="glass-btn primary full-width" disabled>Login</button>
|
|
598
|
-
</div>
|
|
599
|
-
<div id="stored-method" class="method-content">
|
|
600
|
-
<div class="stored-wallet-info"><svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg><p>Encrypted wallet found</p><span class="stored-wallet-date" id="stored-wallet-date"></span></div>
|
|
601
|
-
<div id="stored-pin-section"><div class="glass-input-group"><input type="password" id="pin-input-unlock" class="glass-input pin-input-large" placeholder="Enter 6-digit PIN" maxlength="6" inputmode="numeric" pattern="[0-9]*"></div><button id="unlock-stored-wallet" class="glass-btn primary full-width" disabled>Unlock with PIN</button></div>
|
|
602
|
-
<div id="stored-passkey-section" style="display: none;"><button id="unlock-with-passkey" class="glass-btn primary full-width passkey-unlock-btn"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2a5 5 0 0 1 5 5v3H7V7a5 5 0 0 1 5-5z"/><rect x="3" y="10" width="18" height="12" rx="2"/><circle cx="12" cy="16" r="1"/></svg> Unlock with Passkey</button></div>
|
|
603
|
-
<div class="stored-divider" id="stored-divider" style="display: none;"><span>or</span></div>
|
|
604
|
-
<button id="forget-stored-wallet" class="glass-btn secondary full-width">Forget Wallet</button>
|
|
605
|
-
</div>
|
|
606
|
-
</div>
|
|
607
|
-
</div>
|
|
608
|
-
</div>
|
|
609
|
-
|
|
610
|
-
<!-- Loading Overlay -->
|
|
611
|
-
<div id="loading-overlay" class="loading-overlay">
|
|
612
|
-
<div class="loading-spinner"></div>
|
|
613
|
-
<span id="status">Loading WASM modules...</span>
|
|
614
|
-
</div>
|
|
615
|
-
|
|
616
|
-
<!-- Photo remove confirmation modal -->
|
|
617
|
-
<div id="photo-remove-confirm-modal" class="modal">
|
|
618
|
-
<div class="modal-glass" style="max-width:340px;padding:24px;text-align:center;">
|
|
619
|
-
<p style="margin:0 0 20px;font-size:1rem;color:var(--white-70);">Are you sure you want to remove this photo?</p>
|
|
620
|
-
<div style="display:flex;gap:12px;justify-content:center;">
|
|
621
|
-
<button id="photo-remove-yes" class="glass-btn small" style="background:rgba(239,68,68,0.2);border-color:rgba(239,68,68,0.4);color:#f87171;">Remove</button>
|
|
622
|
-
<button id="photo-remove-no" class="glass-btn small">Cancel</button>
|
|
623
|
-
</div>
|
|
624
|
-
</div>
|
|
625
|
-
</div>`;
|
|
626
|
-
}
|