aboutsummaryrefslogtreecommitdiffstats
path: root/src/features
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-09-05 19:46:48 -0700
committerAdam Soltys <[email protected]>2026-09-05 19:46:48 -0700
commitc8c18d838573859b61c47875a4320b9ad0ad7514 (patch)
treebd0e28438a2fa6bb52dffcd55cc8490b0ad0f8b8 /src/features
parentc99efea0ab7a724221d439bbc227058223dfe3c4 (diff)
downloadcoinosv3-c8c18d838573859b61c47875a4320b9ad0ad7514.tar.gz
coinosv3-c8c18d838573859b61c47875a4320b9ad0ad7514.zip
morph: leave <details open> to the user; key the names settings sections
Every background repaint stripped the browser-set `open` attribute (the fresh render never carries it), collapsing expanded sections, and the positional child match handed one section's open state to its neighbour whenever the conditional zap-code section came or went. `open` on a details is now user-owned unless a render sets it, and nodes carrying data-key only patch into the same key. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01VMi2Y1oKPZ3TeeFmLej47y
Diffstat (limited to 'src/features')
-rw-r--r--src/features/names.js12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/features/names.js b/src/features/names.js
index fa5bda1..06bb678 100644
--- a/src/features/names.js
+++ b/src/features/names.js
@@ -425,27 +425,27 @@ export function namesFeature(ctx) {
h('button', { class: 'btn-ghost btn-sm', onClick: async () => {
await release(); toast(t('namesReleased')); render();
} }, t('namesRelease'))),
- h('details', { class: 'small faint' },
+ h('details', { class: 'small faint', 'data-key': 'custom' },
h('summary', {}, t('namesCustom')),
h('p', { style: 'margin:4px 0' }, t('namesCustomHow')),
claimForm(false)),
(() => {
const code = hook('nwcOfferString');
- return code ? h('details', { class: 'small faint' },
+ return code ? h('details', { class: 'small faint', 'data-key': 'zapcode' },
h('summary', {}, t('namesZapCode')),
h('p', { style: 'margin:4px 0' }, t('namesZapCodeHow')),
h('div', { class: 'addr-box break', style: 'font-size:10px' }, code),
copyBtn(code, t('namesZapCodeCopy'))) : null;
})(),
- h('details', { class: 'small faint' },
+ h('details', { class: 'small faint', 'data-key': 'pos' },
h('summary', {}, t('namesPos')),
h('p', { style: 'margin:4px 0' }, t('namesPosHow')),
posSection(st)),
- h('details', { class: 'small faint' },
+ h('details', { class: 'small faint', 'data-key': 'ownnode' },
h('summary', {}, t('namesOwnNode')),
h('p', { style: 'margin:4px 0' }, t('namesOwnNodeMenuHow')),
ownNodeSection()),
- h('details', { class: 'small faint' },
+ h('details', { class: 'small faint', 'data-key': 'owndomain' },
h('summary', {}, t('namesOwnDomain')),
h('p', { style: 'margin:4px 0' }, t('namesOwnDomainHow')),
h('div', { class: 'addr-box break', style: 'font-size:11px' },
@@ -483,7 +483,7 @@ export function namesFeature(ctx) {
try { await post('/pos/token', 'DELETE', body()); ui.posToken = null; toast(t('namesPosRevoked')); render(); }
catch (e) { toast(e.message); }
} }, t('namesPosRevoke'))),
- h('details', { class: 'small faint', style: 'margin-top:6px' },
+ h('details', { class: 'small faint', style: 'margin-top:6px', 'data-key': 'poslink' },
h('summary', {}, t('namesPosLink')),
h('p', { style: 'margin:4px 0' }, t('namesPosLinkHow')),
h('div', { style: 'align-self:center;max-width:220px', html: qrSvg(lnurl, { ec: 'L', mode: 'Alphanumeric' }) }),