selfstore 1.0.0 → 1.0.1

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.
Files changed (46) hide show
  1. package/README.md +4 -0
  2. package/dist/advanced.js +7 -7
  3. package/dist/backups.js +1 -1
  4. package/dist/backups.js.map +1 -1
  5. package/dist/{cache-lock-LZILZNLP.js → cache-lock-NXIR6JRB.js} +3 -3
  6. package/dist/{cache-lock-LZILZNLP.js.map → cache-lock-NXIR6JRB.js.map} +1 -1
  7. package/dist/{chunk-SGISYMT5.js → chunk-43BJDRPT.js} +2 -2
  8. package/dist/{chunk-SGISYMT5.js.map → chunk-43BJDRPT.js.map} +1 -1
  9. package/dist/{chunk-N4RPMX3Y.js → chunk-5AAWNPCP.js} +119 -30
  10. package/dist/chunk-5AAWNPCP.js.map +1 -0
  11. package/dist/{chunk-FDPAKHQS.js → chunk-6746AL4I.js} +9 -4
  12. package/dist/chunk-6746AL4I.js.map +1 -0
  13. package/dist/{chunk-OWLX6PNT.js → chunk-KHER6MWR.js} +26 -8
  14. package/dist/chunk-KHER6MWR.js.map +1 -0
  15. package/dist/{chunk-CUWB5EWF.js → chunk-P34WACTD.js} +12 -7
  16. package/dist/chunk-P34WACTD.js.map +1 -0
  17. package/dist/{chunk-IBIEKK36.js → chunk-SKWHKM25.js} +24 -5
  18. package/dist/chunk-SKWHKM25.js.map +1 -0
  19. package/dist/{chunk-JB4JHM7V.js → chunk-SRKUHFRG.js} +17 -8
  20. package/dist/chunk-SRKUHFRG.js.map +1 -0
  21. package/dist/{chunk-BJ3RUMGI.js → chunk-UWVAKBU4.js} +3 -3
  22. package/dist/{chunk-BJ3RUMGI.js.map → chunk-UWVAKBU4.js.map} +1 -1
  23. package/dist/{chunk-ATUPHVLG.js → chunk-Z2MRZSEP.js} +5 -5
  24. package/dist/chunk-Z2MRZSEP.js.map +1 -0
  25. package/dist/flows.js +7 -7
  26. package/dist/flows.js.map +1 -1
  27. package/dist/groups.js +3 -3
  28. package/dist/groups.js.map +1 -1
  29. package/dist/households.js +10 -4
  30. package/dist/households.js.map +1 -1
  31. package/dist/index.js +14 -11
  32. package/dist/index.js.map +1 -1
  33. package/dist/local-KIP25T7I.js +7 -0
  34. package/dist/{local-AM22RWRR.js.map → local-KIP25T7I.js.map} +1 -1
  35. package/dist/sync.js +1 -1
  36. package/dist/widgets.js +445 -86
  37. package/dist/widgets.js.map +1 -1
  38. package/package.json +129 -97
  39. package/dist/chunk-ATUPHVLG.js.map +0 -1
  40. package/dist/chunk-CUWB5EWF.js.map +0 -1
  41. package/dist/chunk-FDPAKHQS.js.map +0 -1
  42. package/dist/chunk-IBIEKK36.js.map +0 -1
  43. package/dist/chunk-JB4JHM7V.js.map +0 -1
  44. package/dist/chunk-N4RPMX3Y.js.map +0 -1
  45. package/dist/chunk-OWLX6PNT.js.map +0 -1
  46. package/dist/local-AM22RWRR.js +0 -7
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/widgets/base.ts","../src/widgets/connect.ts","../src/widgets/share.ts","../src/widgets/join.ts","../src/widgets/status.ts","../src/widgets/backups.ts","../src/entries/widgets.ts"],"names":["EN","isOff"],"mappings":";;;;;;;;;;AAcO,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","file":"widgets.js","sourcesContent":["// Shared foundation for the widgets: zero-dependency custom elements over\n// the headless flows. Look and words stay the host's business through three\n// layers - --selfstore-* custom properties (fonts and text colors inherit),\n// part=\"...\" on every significant node, and a flat `labels` map merged over\n// the EN defaults (also the localization story). Elements are inert until\n// wired: assign the properties, the widget builds its flow and renders; they\n// clean up on disconnect and expose the flow for programmatic control.\n\n/** Flat key -> string map; widgets merge a partial override over EN defaults. */\nexport type WidgetLabels = Record<string, string>;\n\n/** Structural theme, applied inside every widget's shadow root. Neutral by\n * design: it borrows the host font and text color, and every visual decision\n * routes through a --selfstore-* custom property a host page can set. */\nexport const baseStyles = `\n:host {\n\tdisplay: block;\n\tfont: inherit;\n\tcolor: inherit;\n\t--_accent: var(--selfstore-accent, #2563eb);\n\t--_accent-ink: var(--selfstore-accent-contrast, #ffffff);\n\t--_ink-dim: var(--selfstore-muted, color-mix(in srgb, currentColor 55%, transparent));\n\t--_border: var(--selfstore-border, color-mix(in srgb, currentColor 16%, transparent));\n\t--_radius: var(--selfstore-radius, 12px);\n\t--_gap: var(--selfstore-gap, 0.6rem);\n\t--_danger: var(--selfstore-danger, #dc2626);\n\t--_ok: var(--selfstore-ok, #16a34a);\n\t--_warn: var(--selfstore-warn, #d97706);\n}\n/* Status severity, as a text color the dot inherits (background: currentColor). */\n[part~='sev-ok'] { color: var(--_ok); }\n[part~='sev-info'] { color: var(--_accent); }\n[part~='sev-warn'] { color: var(--_warn); }\n[part~='sev-danger'] { color: var(--_danger); }\nspan[part~='status-dot'] {\n\tdisplay: inline-block;\n\twidth: 0.6em;\n\theight: 0.6em;\n\tborder-radius: 50%;\n\tbackground: currentColor;\n\tflex-shrink: 0;\n}\nbutton[part~='dot-button'] {\n\tbackground: none;\n\tborder: none;\n\tpadding: 0.2em;\n\tcursor: pointer;\n\tline-height: 0;\n}\n[part~='status-row'] [part~='status-action'] { margin-left: auto; }\n[part~='card'] {\n\tborder: 1px solid var(--_border);\n\tborder-radius: var(--_radius);\n\tpadding: 0.8rem 0.9rem;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--_gap);\n\twidth: 100%;\n\tbox-sizing: border-box;\n\tbackground: transparent;\n\ttext-align: left;\n}\nbutton[part~='card'] { cursor: pointer; font: inherit; color: inherit; }\nbutton[part~='card']:hover { border-color: var(--_accent); }\nimg[part~='icon'] {\n\twidth: var(--selfstore-icon-size, 2.1em);\n\theight: var(--selfstore-icon-size, 2.1em);\n\tobject-fit: contain;\n\tflex-shrink: 0;\n}\n[part~='stack'] { display: flex; flex-direction: column; gap: var(--_gap); container-type: inline-size; }\n[part~='row'] { display: flex; align-items: center; gap: var(--_gap); flex-wrap: wrap; }\n[part~='title'] { font-weight: 600; }\n[part~='sub'], [part~='hint'] { color: var(--_ink-dim); font-size: 0.9em; }\n[part~='tag'] {\n\tdisplay: inline-block;\n\tfont-size: 0.72em;\n\tfont-weight: 600;\n\tline-height: 1.5;\n\tpadding: 0 0.55em;\n\tmargin-left: 0.5em;\n\tborder-radius: 999px;\n\tbackground: var(--_accent);\n\tcolor: var(--_accent-ink);\n\tvertical-align: middle;\n}\n[part~='status'] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--_gap);\n\tpadding: 0.7rem 0.9rem;\n\tborder-radius: var(--_radius);\n\tbackground: color-mix(in srgb, var(--_accent) 10%, transparent);\n}\n[part~='status-ok'] { background: color-mix(in srgb, var(--_ok) 12%, transparent); }\n[part~='status-error'] { background: color-mix(in srgb, var(--_danger) 12%, transparent); }\n[part='spinner'] {\n\twidth: 0.7em; height: 0.7em; flex-shrink: 0;\n\tborder-radius: 50%;\n\tborder: 2px solid var(--_accent);\n\tborder-top-color: transparent;\n\tanimation: ss-spin 0.8s linear infinite;\n}\n@keyframes ss-spin { to { transform: rotate(360deg); } }\nbutton[part~='button'] {\n\tfont: inherit;\n\tpadding: 0.45rem 0.9rem;\n\tborder-radius: calc(var(--_radius) * 0.75);\n\tborder: 1px solid var(--_border);\n\tbackground: transparent;\n\tcolor: inherit;\n\tcursor: pointer;\n}\nbutton[part~='button']:disabled { opacity: 0.55; cursor: default; }\nbutton[part~='button-primary'] {\n\tbackground: var(--_accent);\n\tborder-color: var(--_accent);\n\tcolor: var(--_accent-ink);\n}\nbutton[part~='button-danger'] { color: var(--_danger); }\nbutton[part~='link'] {\n\tfont: inherit;\n\tbackground: none;\n\tborder: none;\n\tpadding: 0;\n\tcolor: var(--_ink-dim);\n\ttext-decoration: underline;\n\tcursor: pointer;\n}\nbutton[part~='link']:disabled { opacity: 0.55; cursor: default; }\nbutton[part~='link-danger'] { color: var(--_danger); }\nbutton[part~='advanced-link'] {\n\twidth: fit-content;\n\tfont-size: 0.85em;\n\tmargin-top: 0.1rem;\n}\n[part~='card'] [part~='row'] { margin-top: 0.45rem; }\ninput[part~='input'] {\n\tfont: inherit;\n\tcolor: inherit;\n\tbackground: transparent;\n\tborder: 1px solid var(--_border);\n\tborder-radius: calc(var(--_radius) * 0.75);\n\tpadding: 0.45rem 0.6rem;\n\twidth: 100%;\n\tbox-sizing: border-box;\n}\ninput[part~='input']:focus { outline: 2px solid var(--_accent); outline-offset: 1px; }\n/* A text input with a trailing button (the password eye) tucked inside it. */\n[part~='field'] { position: relative; display: flex; align-items: center; width: 100%; }\n[part~='field'] input[part~='input'] { padding-right: 2.4rem; }\nbutton[part~='eye'] {\n\tposition: absolute;\n\tright: 0.25rem;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 2rem;\n\theight: 2rem;\n\tbackground: none;\n\tborder: none;\n\tpadding: 0;\n\tcursor: pointer;\n\tcolor: var(--_ink-dim);\n}\nbutton[part~='eye']:hover { color: inherit; }\nbutton[part~='eye'] svg { width: 1.15em; height: 1.15em; display: block; }\n[part~='warn-note'] { color: var(--_warn); }\nbutton[part~='forgot-link'] { width: fit-content; font-size: 0.85em; margin-top: 0.15rem; }\n[part~='error-note'] { color: var(--_danger); font-size: 0.9em; }\n/* WebDAV/S3 segmented control: a rail with the inactive segments quiet and the\n active one lifted onto the surface. Full-width segments, equal share. */\n[part~='tabs'] {\n\tdisplay: flex;\n\tgap: 0.2rem;\n\tpadding: 0.25rem;\n\tborder-radius: calc(var(--_radius) * 0.7);\n\tbackground: color-mix(in srgb, currentColor 8%, transparent);\n}\nbutton[part~='tab'] {\n\tflex: 1 1 0;\n\tfont: inherit;\n\tfont-weight: 600;\n\tpadding: 0.4rem 0.7rem;\n\tborder: none;\n\tborder-radius: calc(var(--_radius) * 0.5);\n\tbackground: transparent;\n\tcolor: var(--_ink-dim);\n\tcursor: pointer;\n}\nbutton[part~='tab']:hover { color: inherit; }\nbutton[part~='tab-on'] {\n\tbackground: Canvas;\n\tcolor: inherit;\n\tbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n/* WebDAV provider quick-pick chips. */\n[part~='presets'] { display: flex; flex-wrap: wrap; gap: 0.4rem; }\nbutton[part~='preset'] {\n\tfont: inherit;\n\tfont-size: 0.85em;\n\tpadding: 0.3rem 0.75rem;\n\tborder: 1px solid var(--_border);\n\tborder-radius: 999px;\n\tbackground: transparent;\n\tcolor: inherit;\n\tcursor: pointer;\n}\nbutton[part~='preset']:hover { border-color: var(--_accent); }\nbutton[part~='preset-on'] {\n\tborder-color: var(--_accent);\n\tbackground: color-mix(in srgb, var(--_accent) 12%, transparent);\n}\nul[part~='list'] { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--_gap); }\nimg[part~='qr'] {\n\twidth: var(--selfstore-qr-size, 6.5em);\n\theight: var(--selfstore-qr-size, 6.5em);\n\tborder-radius: calc(var(--_radius) * 0.5);\n\tbackground: #ffffff;\n\tflex-shrink: 0;\n}\n/* Overflow menu. The trigger is a quiet in-card button; the open menu is a\n dropdown over the trigger's corner on wide screens and a bottom sheet on\n phones. The backdrop catches every outside click or tap (the standard\n dismiss), sitting above the sibling cards but under the panel. */\nbutton[part~='menu-button'] {\n\tborder: none;\n\tbackground: none;\n\tpadding: 0.25rem 0.6rem;\n\tfont-size: 1.1em;\n\tline-height: 1.3;\n\tborder-radius: calc(var(--_radius) * 0.5);\n\tcolor: var(--_ink-dim);\n\tcursor: pointer;\n}\nbutton[part~='menu-button']:hover,\nbutton[part~='menu-button'][aria-expanded='true'] {\n\tbackground: color-mix(in srgb, currentColor 10%, transparent);\n\tcolor: inherit;\n}\n[part~='card'] > button[part~='menu-button'] { align-self: flex-start; }\n[part~='menu-layer'] { display: contents; }\n[part~='menu-backdrop'] { position: fixed; inset: 0; z-index: 29; background: transparent; }\n[part~='menu'] {\n\tposition: absolute;\n\tright: 0.4rem;\n\ttop: 0.4rem;\n\tz-index: 30;\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 11rem;\n\tpadding: 0.3rem 0;\n\tborder: 1px solid var(--_border);\n\tborder-radius: calc(var(--_radius) * 0.75);\n\tbackground: Canvas;\n\tcolor: CanvasText;\n\tbox-shadow: 0 10px 30px rgba(0, 0, 0, 0.16);\n\toutline: none;\n}\nbutton[part~='menu-item'] {\n\tfont: inherit;\n\ttext-align: left;\n\tpadding: 0.55rem 0.95rem;\n\tborder: none;\n\tbackground: none;\n\tcolor: inherit;\n\tcursor: pointer;\n\twhite-space: nowrap;\n}\nbutton[part~='menu-item']:hover,\nbutton[part~='menu-item']:focus-visible {\n\tbackground: color-mix(in srgb, var(--_accent) 10%, transparent);\n}\nbutton[part~='menu-item-danger'] { color: var(--_danger); }\n@media (pointer: coarse) {\n\tbutton[part~='menu-item'] { padding: 0.8rem 1rem; }\n}\n@media (max-width: 500px) {\n\t[part~='menu-backdrop'] { background: rgba(0, 0, 0, 0.35); }\n\t[part~='menu'] {\n\t\tposition: fixed;\n\t\tinset: auto 0 0 0;\n\t\tborder-radius: var(--_radius) var(--_radius) 0 0;\n\t\tborder-bottom: none;\n\t\tmin-width: 0;\n\t\tpadding: 0.4rem 0 max(0.5rem, env(safe-area-inset-bottom));\n\t\tbox-shadow: 0 -12px 34px rgba(0, 0, 0, 0.28);\n\t}\n\tbutton[part~='menu-item'] { padding: 0.95rem 1.2rem; }\n}\n/* Responsive by default. The stack div above is the query container, so a\n widget reacts to ITS OWN width (a narrow column on a wide screen counts),\n and the host element's own sizing stays untouched. When the widget is\n narrow, a list card's row (QR + url + copy + revoke) would squeeze the\n text into a sliver: stack the card and centre the QR instead. */\n@container (max-width: 480px) {\n\tli[part~='card'] {\n\t\tflex-direction: column;\n\t\talign-items: stretch;\n\t}\n\tli[part~='card'] img[part~='qr'] { align-self: center; }\n\t/* Stacked cards must not push the overflow trigger below the body: it\n\t stays a top-right kebab (the card is position:relative already). */\n\tli[part~='card']:has(> button[part~='menu-button']) { padding-right: 2.4rem; }\n\tli[part~='card'] > button[part~='menu-button'] {\n\t\tposition: absolute;\n\t\ttop: 0.4rem;\n\t\tright: 0.4rem;\n\t}\n}\n`;\n\ntype Child = Node | string | null | undefined;\n\n/** Append children to an element, skipping null/undefined (conditional bits). */\nexport function put(el: HTMLElement, ...children: Child[]): void {\n\tfor (const c of children) {\n\t\tif (c == null) continue;\n\t\tel.append(typeof c === 'string' ? document.createTextNode(c) : c);\n\t}\n}\n\n/** Tiny DOM builder: h('button', { part: 'button', onclick }, label). */\nexport function h<K extends keyof HTMLElementTagNameMap>(\n\ttag: K,\n\tattrs: Record<string, unknown> = {},\n\t...children: Child[]\n): HTMLElementTagNameMap[K] {\n\tconst el = document.createElement(tag);\n\tfor (const [k, v] of Object.entries(attrs)) {\n\t\tif (v == null || v === false) continue;\n\t\tif (k.startsWith('on') && typeof v === 'function') {\n\t\t\tel.addEventListener(k.slice(2), v as EventListener);\n\t\t} else if (v === true) {\n\t\t\tel.setAttribute(k, '');\n\t\t} else {\n\t\t\tel.setAttribute(k, String(v));\n\t\t}\n\t}\n\tfor (const c of children) {\n\t\tif (c == null) continue;\n\t\tel.append(typeof c === 'string' ? document.createTextNode(c) : c);\n\t}\n\treturn el;\n}\n\n/** The common shell: shadow root + styles, label merging, focus-preserving\n * re-render, event emission, subscription cleanup. */\nexport abstract class FlowWidget extends HTMLElement {\n\tprotected root: ShadowRoot;\n\tprivate styleEl: HTMLStyleElement;\n\tprivate body: HTMLDivElement;\n\tprivate overrides: WidgetLabels = {};\n\tprotected unsub: (() => void) | null = null;\n\n\t/** The widget's EN default strings; subclasses provide theirs. */\n\tprotected abstract defaults(): WidgetLabels;\n\t/** Build the current view into the given container. */\n\tprotected abstract view(into: HTMLElement): void;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.root = this.attachShadow({ mode: 'open' });\n\t\tthis.styleEl = document.createElement('style');\n\t\tthis.styleEl.textContent = baseStyles;\n\t\tthis.body = document.createElement('div');\n\t\tthis.body.setAttribute('part', 'stack');\n\t\tthis.root.append(this.styleEl, this.body);\n\t}\n\n\t/** Partial override map, merged over the EN defaults (also the i18n hook). */\n\tget labels(): WidgetLabels {\n\t\treturn this.overrides;\n\t}\n\tset labels(map: WidgetLabels) {\n\t\tthis.overrides = map ?? {};\n\t\tthis.rerender();\n\t}\n\n\tprotected t(key: string): string {\n\t\treturn this.overrides[key] ?? this.defaults()[key] ?? key;\n\t}\n\n\t/** A heading an empty-string label removes: labels = { 'share.title': '' }\n\t * hides that heading (the host page already says it) without a fork.\n\t * Append through put(), which skips the null. */\n\tprotected heading(part: string, key: string): HTMLElement | null {\n\t\tconst text = this.t(key);\n\t\treturn text ? h('div', { part }, text) : null;\n\t}\n\n\t/** Map a flow error to copy: labels can override per labelKey\n\t * ('error.targetUnavailable', ...), with a generic fallback. */\n\tprotected errorText(labelKey: string | undefined): string {\n\t\tif (labelKey) {\n\t\t\tconst specific = this.overrides[labelKey] ?? this.defaults()[labelKey];\n\t\t\tif (specific) return specific;\n\t\t}\n\t\treturn this.t('error.generic');\n\t}\n\n\tprotected emit(name: string, detail?: unknown): void {\n\t\tthis.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n\t}\n\n\t/** Rebuild the body, keeping the focused input's value and focus across the\n\t * rebuild (inputs carry data-keep so typing survives a snapshot change). */\n\tprotected rerender(): void {\n\t\t// happy-dom's ShadowRoot.activeElement throws once the focused node was\n\t\t// replaced by an earlier rebuild; browsers just report null/body.\n\t\tlet active: HTMLInputElement | null = null;\n\t\ttry {\n\t\t\tactive = this.root.activeElement as HTMLInputElement | null;\n\t\t} catch {\n\t\t\tactive = null;\n\t\t}\n\t\tconst keep = active?.getAttribute?.('data-keep') ?? null;\n\t\tconst value = active?.value;\n\t\tthis.body.replaceChildren();\n\t\tthis.view(this.body);\n\t\tif (keep != null) {\n\t\t\tconst again = this.body.querySelector<HTMLInputElement>(`[data-keep=\"${keep}\"]`);\n\t\t\tif (again) {\n\t\t\t\tif (value != null) again.value = value;\n\t\t\t\tagain.focus();\n\t\t\t}\n\t\t}\n\t}\n\n\tdisconnectedCallback(): void {\n\t\tthis.unsub?.();\n\t\tthis.unsub = null;\n\t}\n}\n","/**\n * <selfstore-connect>: the \"where does my data live\" journey, ready to drop\n * in. A thin skin over connectFlow - every ordering and failure rule lives in\n * the flow (and its tests); this element only renders the snapshot and calls\n * the actions. Theme it with --selfstore-* custom properties and ::part()\n * selectors; reword or localize it through the `labels` property.\n *\n * import { defineSelfstoreWidgets } from 'selfstore/widgets';\n * defineSelfstoreWidgets();\n *\n * const el = document.querySelector('selfstore-connect');\n * el.store = store; // simple store (or a FlowHost)\n * el.targets = { drive: gisDriveAuth({ clientId }), file: true };\n * el.addEventListener('selfstore-connected', (e) => ...e.detail.outcome...);\n */\n\nimport type { WebdavConfig } from '../persistence/targets/webdav';\nimport type { S3Config } from '../persistence/targets/s3';\nimport {\n\tconnectFlow,\n\ttype ConnectFlow,\n\ttype ConnectFlowOptions,\n\ttype ConnectKind,\n\ttype ConnectSnapshot,\n\ttype ConnectTargets,\n\ttype FlowHost\n} from '../flows/connect';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\n/** A named WebDAV provider offered in the connect form's quick-pick row, so a\n * user can start from their host instead of a blank URL field. selfstore ships\n * no list - the app supplies whichever providers it wants to surface (its own\n * server, a sovereign host, ...); the widget just renders them and pre-fills the\n * URL field on pick. Pure UI sugar over the same WebDAV form. */\nexport interface WebdavPreset {\n\t/** Stable id (also the `data-preset` attribute, for theming/tests). */\n\tid: string;\n\t/** Button text: the provider or host name. */\n\tlabel: string;\n\t/** Base server URL that pre-fills the WebDAV URL field when picked. Omit for a\n\t * label-only entry (the user then types the full URL themselves). */\n\turl?: string;\n\t/** Optional guidance, shown as a line under the form once this preset is\n\t * picked (e.g. where to find the app password for this host) and as the\n\t * quick-pick button's tooltip. */\n\thelp?: string;\n\t/** Optional link appended to the `help` line (e.g. a how-to page). */\n\thelpUrl?: string;\n\t/** Optional \"create an account\" link shown once this preset is picked, for a\n\t * user who has no account with the host yet. The app owns the URL; selfstore\n\t * hard-codes no provider. */\n\tsignupUrl?: string;\n}\n\nconst EN: WidgetLabels = {\n\t'connect.title': 'Where should we save your data?',\n\t'connect.recommended': 'Recommended',\n\t'connect.drive': 'Google Drive',\n\t'connect.drive.sub': 'Available on all your devices',\n\t'connect.file': 'A file on this device',\n\t'connect.file.sub': 'Offline, you keep the file',\n\t'connect.file.new': 'New backup',\n\t'connect.file.open': 'Load an existing file',\n\t'connect.webdav': 'My own server (WebDAV)',\n\t'connect.webdav.sub': 'Nextcloud, ownCloud, yours',\n\t'connect.s3': 'My own bucket (S3)',\n\t'connect.s3.sub': 'Amazon S3, R2, B2, MinIO',\n\t'connect.server': 'My own server',\n\t'connect.server.sub': 'WebDAV or an S3 bucket you control',\n\t'connect.tab.webdav': 'WebDAV',\n\t'connect.tab.s3': 'S3',\n\t'connect.s3.endpoint': 'Endpoint URL',\n\t'connect.s3.region': 'Region',\n\t'connect.s3.bucket': 'Bucket',\n\t'connect.s3.key': 'Object key (path)',\n\t'connect.s3.accessKeyId': 'Access key ID',\n\t'connect.s3.secret': 'Secret access key',\n\t'connect.s3.submit': 'Connect',\n\t'connect.connecting': 'Connecting...',\n\t'connect.connecting.drive': 'Authorise access in the Google window.',\n\t'connect.cancel': 'Cancel',\n\t'connect.retry': 'Try again',\n\t'connect.password.title': 'This backup is protected',\n\t'connect.password.hint': 'Enter its password to open it.',\n\t'connect.password.placeholder': 'Password',\n\t'connect.password.wrong': 'Wrong password. Try again.',\n\t'connect.password.submit': 'Open',\n\t'connect.password.show': 'Show password',\n\t'connect.password.hide': 'Hide password',\n\t'connect.password.forgot': 'Forgot the password?',\n\t'connect.password.forgot.warn':\n\t\t'Without the password, this backup cannot be opened. You can erase it and start from an empty one. The old backup is lost for good.',\n\t'connect.password.forgot.confirm': 'Overwrite the backup',\n\t'connect.password.forgot.back': 'Back',\n\t'connect.conflict.title': 'This destination already holds a backup',\n\t'connect.conflict.merge': 'Merge both',\n\t'connect.conflict.merge.sub': 'Keep everything from both sides',\n\t'connect.conflict.resume': 'Use the backup',\n\t'connect.conflict.resume.sub': 'This device adopts it',\n\t'connect.conflict.replace': 'Replace the backup',\n\t'connect.conflict.replace.sub': 'This device wins, the backup is overwritten',\n\t'connect.webdav.url': 'Server URL',\n\t'connect.webdav.user': 'Username',\n\t'connect.webdav.password': 'Password',\n\t'connect.webdav.submit': 'Connect',\n\t'connect.webdav.signup': 'Create an account',\n\t'connect.webdav.help.more': 'How?',\n\t'connect.done': 'Connected. Your data is saved.',\n\t'connect.done.manual': 'Download mode: save the file after each change.',\n\t'error.generic': 'That did not work. Check the connection and try again.',\n\t'error.targetUnavailable': 'The destination did not answer. Try again in a moment.',\n\t'error.authExpired': 'Access expired: reconnect to continue.',\n\t'error.decryptFailed': 'This backup could not be opened with that password.',\n\t'error.badFormat': 'This file does not look like a readable backup.'\n};\n\n// Two glyphs for the password eye: an open eye when the value is hidden (click\n// to reveal), a struck-through eye when it is shown (click to hide). Plain\n// stroke SVG, currentColor, so they inherit the host's text color like any icon.\nconst EYE_SHOW =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 12s3-8 10-8 10 8 10 8-3 8-10 8-10-8-10-8Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>';\nconst EYE_HIDE =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 10 8 10 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"/><path d=\"M6.61 6.61A18.45 18.45 0 0 0 2 12s3 8 10 8a9.12 9.12 0 0 0 5.39-1.61\"/><line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\"/></svg>';\n\n/** Build the eye glyph for the current visibility (shown value -> struck eye). */\nfunction eyeIcon(visible: boolean): SVGElement {\n\tconst span = document.createElement('span');\n\tspan.innerHTML = visible ? EYE_HIDE : EYE_SHOW;\n\treturn span.firstElementChild as SVGElement;\n}\n\nexport class SelfstoreConnectElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['recommended', 'advanced'];\n\t}\n\n\t#store: FlowHost | { flowHost: FlowHost } | null = null;\n\t#targets: ConnectTargets | null = null;\n\t#options: ConnectFlowOptions = {};\n\t#flow: ConnectFlow | null = null;\n\t#recommended: ConnectKind | null = null;\n\t#icons: Partial<Record<ConnectKind, string>> = {};\n\t#advanced: ConnectKind[] = [];\n\t#webdavPresets: WebdavPreset[] = [];\n\t#webdavUrl = '';\n\t#webdavUser = '';\n\t#webdavPass = '';\n\t#pickedPreset: WebdavPreset | null = null;\n\t// S3 form fields (kept on the element, like the WebDAV ones, so switching the\n\t// server tab never loses what was typed).\n\t#s3Endpoint = '';\n\t#s3Region = '';\n\t#s3Bucket = '';\n\t#s3Key = '';\n\t#s3AccessKeyId = '';\n\t#s3Secret = '';\n\t// Password-step local UI state (never in the flow: purely how this element\n\t// draws the step). Reset whenever the flow leaves 'password' (see wire()).\n\t#pwVisible = false;\n\t#confirmOverwrite = false;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\t/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */\n\tget store(): FlowHost | { flowHost: FlowHost } | null {\n\t\treturn this.#store;\n\t}\n\tset store(v: FlowHost | { flowHost: FlowHost } | null) {\n\t\tthis.#store = v;\n\t\tthis.wire();\n\t}\n\n\tget targets(): ConnectTargets | null {\n\t\treturn this.#targets;\n\t}\n\tset targets(v: ConnectTargets | null) {\n\t\tthis.#targets = v;\n\t\tthis.wire();\n\t}\n\n\tget options(): ConnectFlowOptions {\n\t\treturn this.#options;\n\t}\n\tset options(v: ConnectFlowOptions) {\n\t\tthis.#options = v ?? {};\n\t\tthis.wire();\n\t}\n\n\t/** Badge one destination as the one to pick (part=\"tag\", label\n\t * 'connect.recommended'). Purely a highlight: the order still follows the\n\t * targets object. Also the `recommended` attribute. Default: none. */\n\tget recommended(): ConnectKind | null {\n\t\treturn this.#recommended;\n\t}\n\tset recommended(v: ConnectKind | null) {\n\t\tthis.#recommended = v === 'drive' || v === 'file' || v === 'webdav' || v === 's3' ? v : null;\n\t\tthis.rerender();\n\t}\n\n\t/** An optional icon per destination - an image URL or data URI, rendered as\n\t * part=\"icon\" at the head of that card. Purely decorative and per-instance;\n\t * omit a kind for no icon. Size it with --selfstore-icon-size. */\n\tget icons(): Partial<Record<ConnectKind, string>> {\n\t\treturn this.#icons;\n\t}\n\tset icons(v: Partial<Record<ConnectKind, string>> | null) {\n\t\tthis.#icons = v ?? {};\n\t\tthis.rerender();\n\t}\n\n\t/** Destinations to tuck behind a discreet link under the cards instead of a\n\t * full card - for power-user options (say, WebDAV) that must stay reachable\n\t * without weighing the everyday choice. Also the `advanced` attribute\n\t * (comma-separated). The journey after the click is exactly the same. */\n\tget advanced(): ConnectKind[] {\n\t\treturn this.#advanced;\n\t}\n\tset advanced(v: ConnectKind[] | null) {\n\t\tthis.#advanced = (v ?? []).filter(\n\t\t\t(k) => k === 'drive' || k === 'file' || k === 'webdav' || k === 's3'\n\t\t);\n\t\tthis.rerender();\n\t}\n\n\t/** Named WebDAV providers offered as a quick-pick row above the WebDAV form,\n\t * pre-filling the URL field. The app owns the list (its own host, sovereign\n\t * providers, ...); selfstore ships none. Purely additive - the blank form\n\t * still works. */\n\tget webdavPresets(): WebdavPreset[] {\n\t\treturn this.#webdavPresets;\n\t}\n\tset webdavPresets(v: WebdavPreset[] | null) {\n\t\tthis.#webdavPresets = Array.isArray(v) ? v : [];\n\t\tthis.rerender();\n\t}\n\n\t/** The underlying flow, for programmatic control (may be null until wired). */\n\tget flow(): ConnectFlow | null {\n\t\treturn this.#flow;\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'recommended') this.recommended = value as ConnectKind | null;\n\t\tif (name === 'advanced') {\n\t\t\tthis.advanced = (value ?? '').split(',').map((s) => s.trim()) as ConnectKind[];\n\t\t}\n\t}\n\n\tconnectedCallback(): void {\n\t\tif (this.#recommended === null && this.hasAttribute('recommended')) {\n\t\t\tthis.recommended = this.getAttribute('recommended') as ConnectKind;\n\t\t}\n\t\tif (this.#advanced.length === 0 && this.hasAttribute('advanced')) {\n\t\t\tthis.advanced = (this.getAttribute('advanced') ?? '')\n\t\t\t\t.split(',')\n\t\t\t\t.map((s) => s.trim()) as ConnectKind[];\n\t\t}\n\t\tthis.wire();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#store || !this.#targets) return;\n\t\tthis.unsub?.();\n\t\tthis.#flow = connectFlow(this.#store, this.#targets, this.#options);\n\t\tlet last: ConnectSnapshot | null = null;\n\t\tthis.unsub = this.#flow.subscribe((snap) => {\n\t\t\tconst was = last;\n\t\t\tlast = snap;\n\t\t\tif (snap.step === 'connected' && was?.step !== 'connected') {\n\t\t\t\tthis.emit('selfstore-connected', { outcome: snap.outcome });\n\t\t\t}\n\t\t\tif (snap.step === 'error' && was?.step !== 'error') {\n\t\t\t\tthis.emit('selfstore-error', { error: snap.error });\n\t\t\t}\n\t\t\t// Leaving the password step clears its local UI state, so a later\n\t\t\t// return starts masked and on the form (not on a stale confirmation).\n\t\t\tif (snap.step !== 'password') {\n\t\t\t\tthis.#pwVisible = false;\n\t\t\t\tthis.#confirmOverwrite = false;\n\t\t\t}\n\t\t\tthis.rerender();\n\t\t});\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst flow = this.#flow;\n\t\tif (!flow) return; // inert until wired\n\t\tconst s = flow.snapshot;\n\n\t\tif (s.step === 'choose') {\n\t\t\tput(into, this.heading('title', 'connect.title'));\n\t\t\t// WebDAV and S3 are both \"your own server\": when both are offered as\n\t\t\t// cards, fold them into one entry that opens the tabbed form, so a new\n\t\t\t// backend never adds another top-level button.\n\t\t\tconst serverKinds = (['webdav', 's3'] as const).filter(\n\t\t\t\t(k) => s.kinds.includes(k) && !this.#advanced.includes(k)\n\t\t\t);\n\t\t\tconst groupServer = serverKinds.length >= 2;\n\t\t\tfor (const kind of s.kinds) {\n\t\t\t\tif (this.#advanced.includes(kind)) continue;\n\t\t\t\tif (groupServer && (kind === 'webdav' || kind === 's3')) {\n\t\t\t\t\tif (kind === serverKinds[0]) into.append(this.serverCard(serverKinds[0]));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tinto.append(this.destCard(kind));\n\t\t\t}\n\t\t\t// The tucked-away destinations: same journey, discreet entry.\n\t\t\tfor (const kind of s.kinds) {\n\t\t\t\tif (this.#advanced.includes(kind)) {\n\t\t\t\t\tinto.append(\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'link advanced-link', 'data-kind': kind, onclick: () => this.#flow?.choose(kind) },\n\t\t\t\t\t\t\tthis.t(`connect.${kind}`)\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'form') {\n\t\t\tconst kind = s.kind === 's3' ? 's3' : 'webdav';\n\t\t\t// The WebDAV/S3 toggle shows only when both are offered as form kinds\n\t\t\t// (a fixed config skips the form and never reaches here).\n\t\t\tconst tabbed =\n\t\t\t\t(['webdav', 's3'] as const).filter((k) => this.#targets?.[k] === true).length >= 2;\n\t\t\tconst children: HTMLElement[] = [\n\t\t\t\th('div', { part: 'title' }, this.t(tabbed ? 'connect.server' : `connect.${kind}`))\n\t\t\t];\n\t\t\tif (tabbed) children.push(this.serverTabs(kind));\n\t\t\tchildren.push(\n\t\t\t\t...(kind === 's3' ? this.s3FormChildren(flow) : this.webdavFormChildren(flow))\n\t\t\t);\n\t\t\tinto.append(...children);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'authorizing') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'status' },\n\t\t\t\t\th('span', { part: 'spinner', 'aria-hidden': 'true' }),\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{},\n\t\t\t\t\t\th('div', { part: 'title' }, this.t('connect.connecting')),\n\t\t\t\t\t\ts.kind === 'drive' ? h('div', { part: 'sub' }, this.t('connect.connecting.drive')) : null\n\t\t\t\t\t),\n\t\t\t\t\th('button', { part: 'button', onclick: () => this.cancel() }, this.t('connect.cancel'))\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'password') {\n\t\t\t// Escape sub-state: the password is forgotten - confirm erasing the\n\t\t\t// protected backup before overwrite() makes it unrecoverable.\n\t\t\tif (this.#confirmOverwrite) {\n\t\t\t\tput(\n\t\t\t\t\tinto,\n\t\t\t\t\th('div', { part: 'title' }, this.t('connect.password.title')),\n\t\t\t\t\th('div', { part: 'hint warn-note' }, this.t('connect.password.forgot.warn')),\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'button button-danger', disabled: s.busy, onclick: () => this.doOverwrite() },\n\t\t\t\t\t\t\tthis.t('connect.password.forgot.confirm')\n\t\t\t\t\t\t),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'button', disabled: s.busy, onclick: () => this.setConfirmOverwrite(false) },\n\t\t\t\t\t\t\tthis.t('connect.password.forgot.back')\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// The password field wears a show/hide eye. The eye toggles the input\n\t\t\t// type in place (never a re-render) so the typed value is never lost.\n\t\t\tconst field = h(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'field' },\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\ttype: this.#pwVisible ? 'text' : 'password',\n\t\t\t\t\tplaceholder: this.t('connect.password.placeholder'),\n\t\t\t\t\t'data-keep': 'password',\n\t\t\t\t\tautocomplete: 'current-password'\n\t\t\t\t}),\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'eye',\n\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t'aria-label': this.t(this.#pwVisible ? 'connect.password.hide' : 'connect.password.show'),\n\t\t\t\t\t\t'aria-pressed': this.#pwVisible ? 'true' : 'false',\n\t\t\t\t\t\tonclick: () => this.togglePassword()\n\t\t\t\t\t},\n\t\t\t\t\teyeIcon(this.#pwVisible)\n\t\t\t\t)\n\t\t\t);\n\t\t\tput(\n\t\t\t\tinto,\n\t\t\t\th('div', { part: 'title' }, this.t('connect.password.title')),\n\t\t\t\th('div', { part: 'hint' }, this.t('connect.password.hint')),\n\t\t\t\tfield,\n\t\t\t\ts.passwordError ? h('div', { part: 'error-note' }, this.t('connect.password.wrong')) : null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{ part: 'button button-primary', disabled: s.busy, onclick: () => this.submitPassword() },\n\t\t\t\t\t\tthis.t('connect.password.submit')\n\t\t\t\t\t),\n\t\t\t\t\t// Cancel is never disabled, even mid-trial-read: a hung leg must\n\t\t\t\t\t// always have a working way out. The generation counter makes a\n\t\t\t\t\t// late resolution of the abandoned leg a no-op, so leaving is safe.\n\t\t\t\t\th('button', { part: 'button', onclick: () => this.cancel() }, this.t('connect.cancel'))\n\t\t\t\t),\n\t\t\t\t// The forgotten-password escape: a discreet link into the confirm\n\t\t\t\t// sub-state above (erasing the backup is never one careless click).\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'link forgot-link', onclick: () => this.setConfirmOverwrite(true) },\n\t\t\t\t\tthis.t('connect.password.forgot')\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'conflict') {\n\t\t\tinto.append(h('div', { part: 'title' }, this.t('connect.conflict.title')));\n\t\t\tfor (const how of ['merge', 'resume', 'replace'] as const) {\n\t\t\t\tinto.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{ part: 'card', disabled: s.busy, onclick: () => flow.resolveConflict(how) },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{},\n\t\t\t\t\t\t\th('div', { part: 'title' }, this.t(`connect.conflict.${how}`)),\n\t\t\t\t\t\t\th('div', { part: 'sub' }, this.t(`connect.conflict.${how}.sub`))\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tinto.append(h('button', { part: 'link', onclick: () => this.cancel() }, this.t('connect.cancel')));\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'connected') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'status status-ok' },\n\t\t\t\t\th('div', { part: 'title' }, this.t(s.outcome === 'manual' ? 'connect.done.manual' : 'connect.done'))\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// error: retry goes back to the choices; cancel is always offered too, so\n\t\t// a failing destination is never a dead end (the host hears\n\t\t// selfstore-cancelled and can dismiss the widget entirely).\n\t\tinto.append(\n\t\t\th('div', { part: 'status status-error' }, h('div', { part: 'title' }, this.errorText(s.error?.labelKey))),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th('button', { part: 'button button-primary', onclick: () => flow.retry() }, this.t('connect.retry')),\n\t\t\t\th('button', { part: 'button', onclick: () => this.cancel() }, this.t('connect.cancel'))\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate destCard(kind: ConnectKind): HTMLElement {\n\t\tconst icon = this.#icons[kind];\n\t\tconst head = icon ? h('img', { part: 'icon', src: icon, alt: '' }) : null;\n\t\tconst title = h(\n\t\t\t'div',\n\t\t\t{ part: 'title' },\n\t\t\tthis.t(`connect.${kind}`),\n\t\t\tthis.#recommended === kind ? h('span', { part: 'tag' }, this.t('connect.recommended')) : null\n\t\t);\n\t\tconst sub = h('div', { part: 'sub' }, this.t(`connect.${kind}.sub`));\n\n\t\t// A file target declared with the object form offers TWO gestures on one\n\t\t// card: start a new backup, or adopt an existing file. Buttons cannot\n\t\t// nest, so this card is a div carrying its own action row. The open\n\t\t// gesture needs the browser's open picker; without it only new remains.\n\t\tconst fileSpec = kind === 'file' ? this.#targets?.file : null;\n\t\tif (fileSpec && typeof fileSpec === 'object') {\n\t\t\tconst openSupported =\n\t\t\t\ttypeof window !== 'undefined' && 'showOpenFilePicker' in window;\n\t\t\tconst actions = h('div', { part: 'row' });\n\t\t\tif (fileSpec.create != null) {\n\t\t\t\tactions.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{ part: 'button button-primary', 'data-action': 'create', onclick: () => this.#flow?.choose('file', 'create') },\n\t\t\t\t\t\tthis.t('connect.file.new')\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (fileSpec.open != null && (typeof fileSpec.open === 'function' || openSupported)) {\n\t\t\t\tactions.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{ part: 'button', 'data-action': 'open', onclick: () => this.#flow?.choose('file', 'open') },\n\t\t\t\t\t\tthis.t('connect.file.open')\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst body = h('div', {}, title, sub);\n\t\t\tif (actions.childElementCount > 0) body.append(actions);\n\t\t\treturn h('div', { part: 'card', 'data-kind': kind }, head, body);\n\t\t}\n\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{ part: 'card', 'data-kind': kind, onclick: () => this.#flow?.choose(kind) },\n\t\t\thead,\n\t\t\th('div', {}, title, sub)\n\t\t);\n\t}\n\n\t/** The grouped \"your own server\" card shown when both WebDAV and S3 are\n\t * offered: one entry into the tabbed form, opening on the first server kind. */\n\tprivate serverCard(defaultKind: ConnectKind): HTMLElement {\n\t\tconst recommended = this.#recommended === 'webdav' || this.#recommended === 's3';\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{ part: 'card', 'data-kind': 'server', onclick: () => this.#flow?.choose(defaultKind) },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{},\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\tthis.t('connect.server'),\n\t\t\t\t\trecommended ? h('span', { part: 'tag' }, this.t('connect.recommended')) : null\n\t\t\t\t),\n\t\t\t\th('div', { part: 'sub' }, this.t('connect.server.sub'))\n\t\t\t)\n\t\t);\n\t}\n\n\t/** WebDAV/S3 segmented toggle. Switching leaves the form and re-enters it on\n\t * the other kind - no flow surgery - and the typed fields live on the element,\n\t * so nothing the user wrote is lost across the switch. */\n\tprivate serverTabs(active: ConnectKind): HTMLElement {\n\t\tconst tab = (k: 'webdav' | 's3'): HTMLElement =>\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{\n\t\t\t\t\tpart: active === k ? 'tab tab-on' : 'tab',\n\t\t\t\t\ttype: 'button',\n\t\t\t\t\t'data-tab': k,\n\t\t\t\t\t'aria-pressed': active === k ? 'true' : 'false',\n\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\tif (active === k) return;\n\t\t\t\t\t\tthis.#flow?.cancel();\n\t\t\t\t\t\tthis.#flow?.choose(k);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tthis.t(`connect.tab.${k}`)\n\t\t\t);\n\t\treturn h('div', { part: 'tabs' }, tab('webdav'), tab('s3'));\n\t}\n\n\tprivate webdavFormChildren(flow: ConnectFlow): HTMLElement[] {\n\t\tconst picked = this.#pickedPreset;\n\t\tconst out: HTMLElement[] = [];\n\t\t// Optional quick-pick row: the app's WebDAV providers, pre-filling the URL.\n\t\tif (this.#webdavPresets.length > 0) {\n\t\t\tout.push(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'presets' },\n\t\t\t\t\t...this.#webdavPresets.map((p) =>\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: picked?.id === p.id ? 'preset preset-on' : 'preset',\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t'data-preset': p.id,\n\t\t\t\t\t\t\t\t'aria-pressed': picked?.id === p.id ? 'true' : 'false',\n\t\t\t\t\t\t\t\ttitle: p.help ?? '',\n\t\t\t\t\t\t\t\tonclick: () => this.pickWebdavPreset(p)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tp.label\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tout.push(\n\t\t\th('input', {\n\t\t\t\tpart: 'input',\n\t\t\t\ttype: 'url',\n\t\t\t\tplaceholder: this.t('connect.webdav.url'),\n\t\t\t\t'data-keep': 'wd-url',\n\t\t\t\tvalue: this.#webdavUrl,\n\t\t\t\toninput: (e: Event) => (this.#webdavUrl = (e.target as HTMLInputElement).value)\n\t\t\t}),\n\t\t\th('input', {\n\t\t\t\tpart: 'input',\n\t\t\t\ttype: 'text',\n\t\t\t\tplaceholder: this.t('connect.webdav.user'),\n\t\t\t\t'data-keep': 'wd-user',\n\t\t\t\tvalue: this.#webdavUser,\n\t\t\t\toninput: (e: Event) => (this.#webdavUser = (e.target as HTMLInputElement).value)\n\t\t\t}),\n\t\t\th('input', {\n\t\t\t\tpart: 'input',\n\t\t\t\ttype: 'password',\n\t\t\t\tplaceholder: this.t('connect.webdav.password'),\n\t\t\t\t'data-keep': 'wd-pass',\n\t\t\t\tvalue: this.#webdavPass,\n\t\t\t\toninput: (e: Event) => (this.#webdavPass = (e.target as HTMLInputElement).value)\n\t\t\t})\n\t\t);\n\t\t// A picked provider may carry guidance and a sign-up link (no account yet).\n\t\tif (picked?.help) {\n\t\t\tout.push(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'hint webdav-note' },\n\t\t\t\t\tpicked.help,\n\t\t\t\t\tpicked.helpUrl\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'a',\n\t\t\t\t\t\t\t\t{ part: 'link webdav-help', href: picked.helpUrl, target: '_blank', rel: 'noopener noreferrer' },\n\t\t\t\t\t\t\t\t` ${this.t('connect.webdav.help.more')}`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tout.push(\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th('button', { part: 'button button-primary', onclick: () => this.submitWebdav() }, this.t('connect.webdav.submit')),\n\t\t\t\th('button', { part: 'button', onclick: () => flow.cancel() }, this.t('connect.cancel'))\n\t\t\t)\n\t\t);\n\t\tif (picked?.signupUrl) {\n\t\t\tout.push(\n\t\t\t\th(\n\t\t\t\t\t'a',\n\t\t\t\t\t{ part: 'link webdav-signup', href: picked.signupUrl, target: '_blank', rel: 'noopener noreferrer' },\n\t\t\t\t\tthis.t('connect.webdav.signup')\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate s3FormChildren(flow: ConnectFlow): HTMLElement[] {\n\t\tconst field = (\n\t\t\ttype: string,\n\t\t\tlabel: string,\n\t\t\tkeep: string,\n\t\t\tget: () => string,\n\t\t\tset: (v: string) => void\n\t\t): HTMLElement =>\n\t\t\th('input', {\n\t\t\t\tpart: 'input',\n\t\t\t\ttype,\n\t\t\t\tplaceholder: this.t(label),\n\t\t\t\t'data-keep': keep,\n\t\t\t\tvalue: get(),\n\t\t\t\toninput: (e: Event) => set((e.target as HTMLInputElement).value)\n\t\t\t});\n\t\treturn [\n\t\t\tfield('url', 'connect.s3.endpoint', 's3-endpoint', () => this.#s3Endpoint, (v) => (this.#s3Endpoint = v)),\n\t\t\tfield('text', 'connect.s3.region', 's3-region', () => this.#s3Region, (v) => (this.#s3Region = v)),\n\t\t\tfield('text', 'connect.s3.bucket', 's3-bucket', () => this.#s3Bucket, (v) => (this.#s3Bucket = v)),\n\t\t\tfield('text', 'connect.s3.key', 's3-key', () => this.#s3Key, (v) => (this.#s3Key = v)),\n\t\t\tfield('text', 'connect.s3.accessKeyId', 's3-akid', () => this.#s3AccessKeyId, (v) => (this.#s3AccessKeyId = v)),\n\t\t\tfield('password', 'connect.s3.secret', 's3-secret', () => this.#s3Secret, (v) => (this.#s3Secret = v)),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th('button', { part: 'button button-primary', onclick: () => this.submitS3() }, this.t('connect.s3.submit')),\n\t\t\t\th('button', { part: 'button', onclick: () => flow.cancel() }, this.t('connect.cancel'))\n\t\t\t)\n\t\t];\n\t}\n\n\tprivate submitS3(): void {\n\t\tconst endpoint = this.#s3Endpoint.trim();\n\t\tconst region = this.#s3Region.trim();\n\t\tconst bucket = this.#s3Bucket.trim();\n\t\tconst key = this.#s3Key.trim();\n\t\tif (!endpoint || !region || !bucket || !key) return;\n\t\tconst config: S3Config = {\n\t\t\tendpoint,\n\t\t\tregion,\n\t\t\tbucket,\n\t\t\tkey,\n\t\t\taccessKeyId: this.#s3AccessKeyId.trim(),\n\t\t\tsecretAccessKey: this.#s3Secret\n\t\t};\n\t\tthis.#flow?.submitS3(config);\n\t}\n\n\tprivate cancel(): void {\n\t\tthis.#flow?.cancel();\n\t\tthis.emit('selfstore-cancelled');\n\t}\n\n\tprivate submitPassword(): void {\n\t\tconst input = this.root.querySelector<HTMLInputElement>('[data-keep=\"password\"]');\n\t\tif (input) this.#flow?.submitPassword(input.value);\n\t}\n\n\t/** Flip the password field between hidden and shown IN PLACE - swap the\n\t * input type and the eye glyph without a re-render, so what the user has\n\t * already typed survives the toggle. */\n\tprivate togglePassword(): void {\n\t\tthis.#pwVisible = !this.#pwVisible;\n\t\tconst input = this.root.querySelector<HTMLInputElement>('[data-keep=\"password\"]');\n\t\tif (input) {\n\t\t\tinput.type = this.#pwVisible ? 'text' : 'password';\n\t\t\tinput.focus();\n\t\t}\n\t\tconst eye = this.root.querySelector<HTMLButtonElement>('[part~=\"eye\"]');\n\t\tif (eye) {\n\t\t\teye.setAttribute(\n\t\t\t\t'aria-label',\n\t\t\t\tthis.t(this.#pwVisible ? 'connect.password.hide' : 'connect.password.show')\n\t\t\t);\n\t\t\teye.setAttribute('aria-pressed', this.#pwVisible ? 'true' : 'false');\n\t\t\teye.replaceChildren(eyeIcon(this.#pwVisible));\n\t\t}\n\t}\n\n\t/** Enter or leave the forgotten-password confirmation sub-state. */\n\tprivate setConfirmOverwrite(on: boolean): void {\n\t\tthis.#confirmOverwrite = on;\n\t\tthis.rerender();\n\t}\n\n\t/** Confirmed: abandon the forgotten password and start a fresh backup over\n\t * the protected one (the flow makes this device win). */\n\tprivate doOverwrite(): void {\n\t\tthis.#flow?.overwrite();\n\t}\n\n\t/** Fill the WebDAV URL field from a picked provider preset and move focus on to\n\t * the username, so the pick just seeds the form the user then completes. The\n\t * pick is remembered so its guidance / sign-up link render and its chip flags\n\t * as active; a re-render keeps the already-typed username and password. */\n\tprivate pickWebdavPreset(p: WebdavPreset): void {\n\t\tthis.#pickedPreset = p;\n\t\tthis.#webdavUrl = p.url ?? '';\n\t\tthis.rerender();\n\t\tthis.root.querySelector<HTMLInputElement>('[data-keep=\"wd-user\"]')?.focus();\n\t}\n\n\tprivate submitWebdav(): void {\n\t\tconst url = this.#webdavUrl.trim();\n\t\tif (!url) return;\n\t\tconst config: WebdavConfig = {\n\t\t\turl,\n\t\t\tusername: this.#webdavUser.trim(),\n\t\t\tpassword: this.#webdavPass\n\t\t};\n\t\tthis.#flow?.submitWebdav(config);\n\t}\n}\n","// <selfstore-share>: the share panel over shareFlow, driving an app-provided\n// ShareEngine (how links travel is the app's business).\n//\n// One link per level: each level shows its live link or offers to create it.\n// No second write link next to a first (which one was live?), no name to\n// invent - the level says what it is. Links the engine lists always render,\n// whatever `levels` says: the panel never hides an access that exists.\n//\n// Knobs (all optional): levels, with-create / with-members, confirmAction\n// (host veto over destructive actions), qrProvider (injected, so the element\n// stays zero-dependency). Engines exposing revokeAll get a \"stop sharing\"\n// foot link, rendered only once somebody besides you is in the member list.\n\nimport { shareFlow, type ShareEngine, type ShareFlow, type ShareLevel } from '../flows/share';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'share.title': 'Sharing',\n\t'share.create.read': 'Create a view link',\n\t'share.create.write': 'Create an edit link',\n\t'share.creating': 'Creating...',\n\t'share.level.read': 'Can view',\n\t'share.level.write': 'Can edit',\n\t'share.copy': 'Copy',\n\t'share.copied': 'Copied',\n\t'share.revoke': 'Revoke',\n\t'share.members': 'People with access',\n\t'share.member.you': 'you',\n\t'share.member.owner': 'owner',\n\t'share.remove': 'Remove',\n\t'share.stop': 'Stop sharing',\n\t'share.empty': 'Nobody else has access yet.',\n\t'share.stale': 'Connection hiccup: this view may be behind.',\n\t'error.generic': 'That did not work. Check the connection and try again.',\n\t'error.targetUnavailable': 'The share service did not answer. Try again in a moment.'\n};\n\n/** A destructive action, offered to confirmAction before it runs: a row's\n * revoke/remove, or 'stop' - ending the whole share. */\nexport type ShareAction = { type: 'revoke' | 'remove'; id: string } | { type: 'stop' };\n\n/** \"off\"-style attribute values; anything else (including empty) reads as on. */\nconst isOff = (v: string | null): boolean =>\n\tv != null && ['off', 'false', 'no', '0'].includes(v.trim().toLowerCase());\n\nexport class SelfstoreShareElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['levels', 'with-create', 'with-members'];\n\t}\n\n\t#engine: ShareEngine | null = null;\n\t#flow: ShareFlow | null = null;\n\t#options: { deadlineMs?: number } = {};\n\t#levels: ShareLevel[] = ['read', 'write'];\n\t#withCreate = true;\n\t#withMembers = true;\n\t#confirmAction: ((action: ShareAction) => boolean | Promise<boolean>) | null = null;\n\t#qrProvider: ((url: string) => Promise<string>) | null = null;\n\t#qr = new Map<string, string>();\n\t#qrPending = new Set<string>();\n\t#copiedId: string | null = null;\n\t#creating: ShareLevel | null = null;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\t/** The app-side transport of links and memberships (see ShareEngine). */\n\tget engine(): ShareEngine | null {\n\t\treturn this.#engine;\n\t}\n\tset engine(v: ShareEngine | null) {\n\t\tthis.#engine = v;\n\t\tthis.wire();\n\t}\n\n\t/** Flow options (deadlineMs), for engines whose legs outgrow the default\n\t * 30s guard (a large first upload, a slow relay). */\n\tget options(): { deadlineMs?: number } {\n\t\treturn this.#options;\n\t}\n\tset options(v: { deadlineMs?: number } | null) {\n\t\tthis.#options = v ?? {};\n\t\tthis.wire();\n\t}\n\n\t/** Which levels the panel OFFERS to create (['read', 'write'] by default) -\n\t * one create button per level without a live link. Also the `levels`\n\t * attribute, comma-separated: levels=\"read\". Links the engine lists\n\t * render whatever this says. */\n\tget levels(): ShareLevel[] {\n\t\treturn [...this.#levels];\n\t}\n\tset levels(v: ShareLevel[]) {\n\t\tconst clean = [...new Set((v ?? []).filter((l) => l === 'read' || l === 'write'))];\n\t\tthis.#levels = clean.length > 0 ? clean : ['read', 'write'];\n\t\tthis.rerender();\n\t}\n\n\t/** Render the create buttons (default). `with-create=\"off\"` hides them: the\n\t * panel becomes list-and-revoke only. */\n\tget withCreate(): boolean {\n\t\treturn this.#withCreate;\n\t}\n\tset withCreate(v: boolean) {\n\t\tthis.#withCreate = v !== false;\n\t\tthis.rerender();\n\t}\n\n\t/** Render the members section (default). `with-members=\"off\"` hides it:\n\t * a links-only panel. */\n\tget withMembers(): boolean {\n\t\treturn this.#withMembers;\n\t}\n\tset withMembers(v: boolean) {\n\t\tthis.#withMembers = v !== false;\n\t\tthis.rerender();\n\t}\n\n\t/** Host veto over the destructive actions: called before revoke, remove or\n\t * stop runs; answer (or resolve) false to keep things as they are -\n\t * window.confirm fits as-is. Default: everything proceeds. */\n\tget confirmAction(): ((action: ShareAction) => boolean | Promise<boolean>) | null {\n\t\treturn this.#confirmAction;\n\t}\n\tset confirmAction(v: ((action: ShareAction) => boolean | Promise<boolean>) | null) {\n\t\tthis.#confirmAction = v ?? null;\n\t}\n\n\t/** Turn a link URL into an image source (a data URL fits): when set, each\n\t * link card renders it as an img part=\"qr\". Injected so the element ships\n\t * no QR dependency. */\n\tget qrProvider(): ((url: string) => Promise<string>) | null {\n\t\treturn this.#qrProvider;\n\t}\n\tset qrProvider(v: ((url: string) => Promise<string>) | null) {\n\t\tthis.#qrProvider = v ?? null;\n\t\tthis.#qr.clear();\n\t\tthis.#qrPending.clear();\n\t\tthis.rerender();\n\t}\n\n\tget flow(): ShareFlow | null {\n\t\treturn this.#flow;\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'levels') {\n\t\t\tthis.levels = (value ?? '').split(',').map((s) => s.trim()) as ShareLevel[];\n\t\t}\n\t\tif (name === 'with-create') this.withCreate = value == null || !isOff(value);\n\t\tif (name === 'with-members') this.withMembers = value == null || !isOff(value);\n\t}\n\n\tconnectedCallback(): void {\n\t\tthis.wire();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#engine) return;\n\t\tthis.unsub?.();\n\t\tthis.#flow = shareFlow(this.#engine, this.#options);\n\t\tthis.unsub = this.#flow.subscribe(() => this.rerender());\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst flow = this.#flow;\n\t\tif (!flow) return;\n\t\tconst s = flow.snapshot;\n\n\t\tput(into, this.heading('title', 'share.title'));\n\t\tif (s.stale) into.append(h('div', { part: 'hint' }, this.t('share.stale')));\n\t\tif (s.error && !s.stale) {\n\t\t\tinto.append(h('div', { part: 'error-note' }, this.errorText(s.error.labelKey)));\n\t\t}\n\n\t\t// One link per level: a level with a live link shows it below instead of\n\t\t// offering a second one. One gesture per missing level, nothing to name.\n\t\tif (this.#withCreate) {\n\t\t\tconst missing = this.#levels.filter((l) => !s.links.some((k) => k.level === l));\n\t\t\tif (missing.length > 0) {\n\t\t\t\tinto.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\t\t...missing.map((level) =>\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t\t\t'data-action': `create-${level}`,\n\t\t\t\t\t\t\t\t\tdisabled: s.busy !== null,\n\t\t\t\t\t\t\t\t\tonclick: () => this.create(level)\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tthis.t(\n\t\t\t\t\t\t\t\t\ts.busy === 'create' && this.#creating === level\n\t\t\t\t\t\t\t\t\t\t? 'share.creating'\n\t\t\t\t\t\t\t\t\t\t: `share.create.${level}`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (s.links.length > 0) {\n\t\t\tconst list = h('ul', { part: 'list' });\n\t\t\tfor (const link of s.links) {\n\t\t\t\tconst qr = this.qrFor(link.url);\n\t\t\t\tlist.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'li',\n\t\t\t\t\t\t{ part: 'card', 'data-link': link.id },\n\t\t\t\t\t\tqr ? h('img', { part: 'qr', src: qr, alt: '' }) : null,\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\t\t\t\th('div', { part: 'title' }, this.t(`share.level.${link.level}`)),\n\t\t\t\t\t\t\th('div', { part: 'sub', style: 'word-break:break-all' }, link.url)\n\t\t\t\t\t\t),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'button', 'data-action': 'copy', onclick: () => this.copy(link.id, link.url) },\n\t\t\t\t\t\t\tthis.t(this.#copiedId === link.id ? 'share.copied' : 'share.copy')\n\t\t\t\t\t\t),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'button button-danger', 'data-action': 'revoke', disabled: s.busy !== null, onclick: () => this.revoke(link.id) },\n\t\t\t\t\t\t\tthis.t('share.revoke')\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tinto.append(list);\n\t\t}\n\n\t\tif (this.#withMembers) {\n\t\t\tput(into, this.heading('sub', 'share.members'));\n\t\t\tif (s.members.length === 0) {\n\t\t\t\tinto.append(h('div', { part: 'hint' }, this.t('share.empty')));\n\t\t\t} else {\n\t\t\t\tconst members = h('ul', { part: 'list' });\n\t\t\t\tfor (const m of s.members) {\n\t\t\t\t\tconst badges: string[] = [];\n\t\t\t\t\tif (m.self) badges.push(this.t('share.member.you'));\n\t\t\t\t\tif (m.owner) badges.push(this.t('share.member.owner'));\n\t\t\t\t\tmembers.append(\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'li',\n\t\t\t\t\t\t\t{ part: 'card', 'data-member': m.id },\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ style: 'flex:1' },\n\t\t\t\t\t\t\t\th('div', { part: 'title' }, m.label || m.id),\n\t\t\t\t\t\t\t\tbadges.length ? h('div', { part: 'sub' }, badges.join(' - ')) : null\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ts.canRemoveMembers && !m.self\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{ part: 'button button-danger', 'data-action': 'remove', disabled: s.busy !== null, onclick: () => this.removeRow(m.id) },\n\t\t\t\t\t\t\t\t\t\tthis.t('share.remove')\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tinto.append(members);\n\t\t\t}\n\t\t}\n\n\t\t// Ending the whole share: a quiet link at the panel's foot, not a banner.\n\t\t// Rare, destructive, and only real when the engine has such a move and\n\t\t// somebody besides you is in - kicking nobody is noise, and a share\n\t\t// nobody joined yet ends by revoking its link.\n\t\tif (s.canRevokeAll && s.members.some((m) => !m.self)) {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'footer', style: 'text-align:right' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{ part: 'link link-danger', 'data-action': 'stop', disabled: s.busy !== null, onclick: () => this.stop() },\n\t\t\t\t\t\tthis.t('share.stop')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate create(level: ShareLevel): void {\n\t\tthis.#creating = level;\n\t\tvoid this.#flow?.createLink({ level }).then((link) => {\n\t\t\tthis.#creating = null;\n\t\t\tif (link) this.emit('selfstore-link-created', { link });\n\t\t\tthis.rerender();\n\t\t});\n\t}\n\n\t/** Run a destructive action through the host's veto (default: proceed).\n\t * A throwing hook reads as \"no\": destruction needs a clear yes. */\n\tprivate guarded(action: ShareAction, run: () => void): void {\n\t\tconst gate = this.#confirmAction;\n\t\tif (!gate) {\n\t\t\trun();\n\t\t\treturn;\n\t\t}\n\t\tvoid Promise.resolve()\n\t\t\t.then(() => gate(action))\n\t\t\t.then((ok) => {\n\t\t\t\tif (ok) run();\n\t\t\t})\n\t\t\t.catch(() => undefined);\n\t}\n\n\tprivate revoke(id: string): void {\n\t\tthis.guarded({ type: 'revoke', id }, () => void this.#flow?.revokeLink(id));\n\t}\n\n\tprivate removeRow(id: string): void {\n\t\tthis.guarded({ type: 'remove', id }, () => void this.#flow?.removeMember(id));\n\t}\n\n\tprivate stop(): void {\n\t\tthis.guarded({ type: 'stop' }, () => {\n\t\t\tvoid this.#flow?.revokeAll().then((ok) => {\n\t\t\t\tif (ok) this.emit('selfstore-share-stopped');\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate qrFor(url: string): string | null {\n\t\tconst provider = this.#qrProvider;\n\t\tif (!provider) return null;\n\t\tconst got = this.#qr.get(url);\n\t\tif (got) return got;\n\t\tif (!this.#qrPending.has(url)) {\n\t\t\tthis.#qrPending.add(url);\n\t\t\tvoid provider(url)\n\t\t\t\t.then((src) => {\n\t\t\t\t\tif (this.#qrProvider !== provider) return; // swapped since: stale image\n\t\t\t\t\tthis.#qr.set(url, src);\n\t\t\t\t\tthis.rerender();\n\t\t\t\t})\n\t\t\t\t.catch(() => undefined)\n\t\t\t\t.finally(() => this.#qrPending.delete(url));\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate copy(id: string, url: string): void {\n\t\tthis.#copiedId = id;\n\t\tthis.emit('selfstore-link-copied', { url });\n\t\tvoid navigator.clipboard?.writeText(url).catch(() => undefined);\n\t\tthis.rerender();\n\t\tsetTimeout(() => {\n\t\t\tif (this.#copiedId !== id) return;\n\t\t\tthis.#copiedId = null;\n\t\t\tthis.rerender();\n\t\t}, 1500);\n\t}\n}\n","/**\n * <selfstore-join>: opening an invitation link, ready to drop in. A skin over\n * joinFlow: preview first, join on an explicit yes, named outcomes (already\n * following another share / invite spent) instead of generic errors, and the\n * account switch as part of the journey when the engine offers one.\n *\n * el.link = location.href; // or the link attribute\n * el.engine = myJoinEngine;\n * el.addEventListener('selfstore-joined', () => goHome());\n *\n * variant=\"banner\" collapses the invitation card to a one-line row (label,\n * join, account switch) for pages that render their own preview around it.\n */\n\nimport { joinFlow, type JoinEngine, type JoinFlow } from '../flows/join';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'join.previewing': 'Reading the invitation...',\n\t'join.title': 'You are invited',\n\t'join.from': 'Shared by {from}',\n\t'join.level.read': 'You will be able to view it.',\n\t'join.level.write': 'You will be able to view and edit it.',\n\t'join.accept': 'Join',\n\t'join.joining': 'Joining...',\n\t'join.joined': 'You are in. The shared data now syncs on this device.',\n\t'join.mismatch': 'This device already follows another share. Leave it first, or use another profile.',\n\t'join.noInvite': 'This invitation is spent, or meant for another account.',\n\t'join.switchAccount': 'Use another account',\n\t'join.retry': 'Try again',\n\t'error.generic': 'That did not work. Check the connection and try again.',\n\t'error.targetUnavailable': 'The invitation could not be read. Try again in a moment.'\n};\n\nexport class SelfstoreJoinElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['link', 'variant'];\n\t}\n\n\t#engine: JoinEngine | null = null;\n\t#link: string | null = null;\n\t#flow: JoinFlow | null = null;\n\t#variant: 'card' | 'banner' = 'card';\n\t#options: { deadlineMs?: number } = {};\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tget engine(): JoinEngine | null {\n\t\treturn this.#engine;\n\t}\n\tset engine(v: JoinEngine | null) {\n\t\tthis.#engine = v;\n\t\tthis.wire();\n\t}\n\n\t/** The invitation. Also settable as the `link` attribute. */\n\tget link(): string | null {\n\t\treturn this.#link;\n\t}\n\tset link(v: string | null) {\n\t\tthis.#link = v;\n\t\tthis.wire();\n\t}\n\n\t/** Flow options (deadlineMs). Set it when the engine's join opens a popup:\n\t * a generous deadline keeps the network guard without timing out a human\n\t * who is reading an account chooser. */\n\tget options(): { deadlineMs?: number } {\n\t\treturn this.#options;\n\t}\n\tset options(v: { deadlineMs?: number } | null) {\n\t\tthis.#options = v ?? {};\n\t\tthis.wire();\n\t}\n\n\t/** 'card' (default): the full invitation card - who shared, what level.\n\t * 'banner': one line - label, join, account switch - for a host page that\n\t * renders its own preview around the widget. Also the `variant` attribute. */\n\tget variant(): 'card' | 'banner' {\n\t\treturn this.#variant;\n\t}\n\tset variant(v: 'card' | 'banner') {\n\t\tthis.#variant = v === 'banner' ? 'banner' : 'card';\n\t\tthis.rerender();\n\t}\n\n\tget flow(): JoinFlow | null {\n\t\treturn this.#flow;\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'link') this.link = value;\n\t\tif (name === 'variant') this.variant = (value ?? 'card') as 'card' | 'banner';\n\t}\n\n\tconnectedCallback(): void {\n\t\tif (!this.#link && this.hasAttribute('link')) this.#link = this.getAttribute('link');\n\t\tif (this.hasAttribute('variant')) {\n\t\t\tthis.#variant = this.getAttribute('variant') === 'banner' ? 'banner' : 'card';\n\t\t}\n\t\tthis.wire();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#engine || !this.#link) return;\n\t\tthis.unsub?.();\n\t\tthis.#flow = joinFlow(this.#link, this.#engine, this.#options);\n\t\tlet lastStep: string | null = null;\n\t\tthis.unsub = this.#flow.subscribe((snap) => {\n\t\t\tif (snap.step !== lastStep) {\n\t\t\t\tif (snap.step === 'joined') this.emit('selfstore-joined', { outcome: 'joined' });\n\t\t\t\tif (snap.step === 'mismatch' || snap.step === 'no-invite') {\n\t\t\t\t\tthis.emit('selfstore-join-refused', { outcome: snap.step });\n\t\t\t\t}\n\t\t\t\tif (snap.step === 'ready' && lastStep === 'joining') {\n\t\t\t\t\t// join() answered null: the user backed out of the engine's popup.\n\t\t\t\t\tthis.emit('selfstore-cancelled');\n\t\t\t\t}\n\t\t\t\tlastStep = snap.step;\n\t\t\t}\n\t\t\tthis.rerender();\n\t\t});\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst flow = this.#flow;\n\t\tif (!flow) return;\n\t\tconst s = flow.snapshot;\n\n\t\tif (s.step === 'previewing' || s.step === 'joining') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'status' },\n\t\t\t\t\th('span', { part: 'spinner', 'aria-hidden': 'true' }),\n\t\t\t\t\th('div', { part: 'title' }, this.t(s.step === 'joining' ? 'join.joining' : 'join.previewing'))\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'ready') {\n\t\t\tconst p = s.preview;\n\t\t\tif (this.#variant === 'banner') {\n\t\t\t\tput(\n\t\t\t\t\tinto,\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'row banner' },\n\t\t\t\t\t\th('div', { part: 'title', style: 'flex:1;min-width:0' }, p?.label || this.t('join.title')),\n\t\t\t\t\t\th('button', { part: 'button button-primary', 'data-action': 'accept', onclick: () => flow.accept() }, this.t('join.accept')),\n\t\t\t\t\t\ts.canSwitchAccount\n\t\t\t\t\t\t\t? h('button', { part: 'link', 'data-action': 'switch', onclick: () => flow.switchAccount() }, this.t('join.switchAccount'))\n\t\t\t\t\t\t\t: null\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tput(\n\t\t\t\tinto,\n\t\t\t\th('div', { part: 'title' }, p?.label || this.t('join.title')),\n\t\t\t\tp?.from ? h('div', { part: 'sub' }, this.t('join.from').replace('{from}', p.from)) : null,\n\t\t\t\tp?.level ? h('div', { part: 'hint' }, this.t(`join.level.${p.level}`)) : null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\th('button', { part: 'button button-primary', 'data-action': 'accept', onclick: () => flow.accept() }, this.t('join.accept')),\n\t\t\t\t\ts.canSwitchAccount\n\t\t\t\t\t\t? h('button', { part: 'link', 'data-action': 'switch', onclick: () => flow.switchAccount() }, this.t('join.switchAccount'))\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'joined') {\n\t\t\tinto.append(h('div', { part: 'status status-ok' }, h('div', { part: 'title' }, this.t('join.joined'))));\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'mismatch' || s.step === 'no-invite') {\n\t\t\tinto.append(\n\t\t\t\th('div', { part: 'status' }, h('div', { part: 'title' }, this.t(s.step === 'mismatch' ? 'join.mismatch' : 'join.noInvite')))\n\t\t\t);\n\t\t\tif (s.step === 'no-invite' && s.canSwitchAccount) {\n\t\t\t\tinto.append(\n\t\t\t\t\th('div', { part: 'row' }, h('button', { part: 'button', 'data-action': 'switch', onclick: () => flow.switchAccount() }, this.t('join.switchAccount')))\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// error\n\t\tinto.append(\n\t\t\th('div', { part: 'status status-error' }, h('div', { part: 'title' }, this.errorText(s.error?.labelKey))),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th('button', { part: 'button', onclick: () => flow.retry() }, this.t('join.retry')),\n\t\t\t\ts.canSwitchAccount\n\t\t\t\t\t? h('button', { part: 'link', 'data-action': 'switch', onclick: () => flow.switchAccount() }, this.t('join.switchAccount'))\n\t\t\t\t\t: null\n\t\t\t)\n\t\t);\n\t}\n}\n","// <selfstore-status>: the store's save status. Renders the engine's own\n// StatusDescriptor - the widget never invents a state. variant=\"row\" is a\n// severity dot + status line + one action button (settings panel, menu);\n// variant=\"dot\" is just the dot as an aria-labelled button (header corner).\n// An actionable status emits 'selfstore-status-action' with the suggested\n// action; what it means (open settings, run reconnect) is the host's call.\n\nimport type { FlowHost } from '../flows/connect';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'status.ephemeral': 'Nothing is saved',\n\t'status.cacheOnly': 'Only on this device',\n\t'status.saving': 'Saving...',\n\t'status.saved': 'Saved',\n\t'status.needsAttention': 'Reconnect to continue',\n\t'status.locked': 'Locked',\n\t'status.pendingDownload': 'Changes to download',\n\t'status.action.choose-destination': 'Choose a destination',\n\t'status.action.download': 'Download',\n\t'status.action.reconnect': 'Reconnect',\n\t'status.action.unlock': 'Unlock'\n};\n\nexport class SelfstoreStatusElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['variant'];\n\t}\n\n\t#store: FlowHost | { flowHost: FlowHost } | null = null;\n\t#variant: 'row' | 'dot' = 'row';\n\t#icons: Record<string, string> = {};\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\t/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */\n\tget store(): FlowHost | { flowHost: FlowHost } | null {\n\t\treturn this.#store;\n\t}\n\tset store(v: FlowHost | { flowHost: FlowHost } | null) {\n\t\tthis.#store = v;\n\t\tthis.wire();\n\t}\n\n\t/** 'row' (dot + text + action) or 'dot' (the dot alone). Also the attribute. */\n\tget variant(): 'row' | 'dot' {\n\t\treturn this.#variant;\n\t}\n\tset variant(v: 'row' | 'dot' | null) {\n\t\tthis.#variant = v === 'dot' ? 'dot' : 'row';\n\t\tthis.rerender();\n\t}\n\n\t/** Optional icon per target kind (e.g. { drive: url, file: url }), shown\n\t * before the text in the row variant. Same contract as the connect cards. */\n\tget icons(): Record<string, string> {\n\t\treturn this.#icons;\n\t}\n\tset icons(v: Record<string, string> | null) {\n\t\tthis.#icons = v ?? {};\n\t\tthis.rerender();\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'variant') this.variant = value as 'row' | 'dot' | null;\n\t}\n\n\tconnectedCallback(): void {\n\t\tif (this.hasAttribute('variant')) this.variant = this.getAttribute('variant') as 'row' | 'dot';\n\t\tthis.wire();\n\t}\n\n\tprivate host(): FlowHost | null {\n\t\tconst s = this.#store;\n\t\tif (!s) return null;\n\t\treturn 'flowHost' in s ? s.flowHost : s;\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected) return;\n\t\tthis.unsub?.();\n\t\tthis.unsub = null;\n\t\tconst host = this.host();\n\t\tif (!host) return;\n\t\tthis.unsub = host.engine.subscribe(() => this.rerender());\n\t\tthis.rerender();\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst host = this.host();\n\t\tif (!host) return; // inert until wired\n\t\tconst { status, targetKind, label } = host.engine.state;\n\t\tconst text = this.t(status.labelKey);\n\t\tconst dot = h('span', {\n\t\t\tpart: `status-dot sev-${status.severity}`,\n\t\t\t'aria-hidden': 'true'\n\t\t});\n\n\t\tif (this.#variant === 'dot') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'dot-button',\n\t\t\t\t\t\t'aria-label': text,\n\t\t\t\t\t\ttitle: text,\n\t\t\t\t\t\tonclick: () => this.emit('selfstore-status-action', { action: status.action ?? null })\n\t\t\t\t\t},\n\t\t\t\t\tdot\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst icon = this.#icons[targetKind];\n\t\tconst where = this.t(`status.where.${targetKind}`);\n\t\t// `status.where.<kind>` is a host-provided label; the raw key means \"not\n\t\t// provided\" - fall back to the target's own label (file name, server).\n\t\tconst sub = where !== `status.where.${targetKind}` ? where : (label ?? '');\n\t\tput(\n\t\t\tinto,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row status-row' },\n\t\t\t\tdot,\n\t\t\t\ticon ? h('img', { part: 'icon', src: icon, alt: '' }) : null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{},\n\t\t\t\t\th('div', { part: 'title' }, text),\n\t\t\t\t\tsub ? h('div', { part: 'sub' }, sub) : null\n\t\t\t\t),\n\t\t\t\tstatus.actionable && status.action\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: 'button status-action',\n\t\t\t\t\t\t\t\tonclick: () => this.emit('selfstore-status-action', { action: status.action })\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.t(`status.action.${status.action}`)\n\t\t\t\t\t\t)\n\t\t\t\t\t: null\n\t\t\t)\n\t\t);\n\t}\n}\n","// <selfstore-backups>: the backups lists over the headless BackupsManager.\n// Two sections. \"My backups\": every file this account owns, the attached one\n// included (badge + outline, never clickable); tapping another row opens it,\n// collecting its passphrase inline when protected; each row carries state\n// pills (omitted while unknown, never guessed) and an overflow menu. \"Shared\n// with me\": files someone else shares with this device, labelled by who -\n// removal is the only gesture, and for the member row it means leaving,\n// which the host performs ('selfstore-backups-leave').\n//\n// The status card, the unlock gate and the encrypt/share sub-views stay the\n// host's - they carry app identity, passkeys, sharing transport. Encrypt and\n// Share menu items only emit; the host opens its own surface. Destructive\n// gestures route through confirmAction (window.confirm fits as-is). The\n// with-* attributes turn sections and menu items off; labels localize.\n\nimport type { BackupRow, BackupsManager } from '../backups/manager';\nimport type { ConnectKind } from '../flows/connect';\nimport type { ReplicaFlow, ReplicaSnapshot } from '../flows/replica';\nimport type { WebdavConfig } from '../persistence/targets/webdav';\nimport type { S3Config } from '../persistence/targets/s3';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'backups.mine.heading': 'My backups',\n\t'backups.mine.personal': 'Main backup',\n\t'backups.active': 'Active',\n\t'backups.pill.encrypted': 'Encrypted',\n\t'backups.pill.plain': 'Not encrypted',\n\t'backups.pill.shared': 'Shared',\n\t'backups.pill.private': 'Not shared',\n\t'backups.modified': 'modified {when}',\n\t'backups.replaceHint': 'Opening replaces the data on this device.',\n\t'backups.loading': 'Opening...',\n\t'backups.menu': 'Backup actions',\n\t'backups.open': 'Open',\n\t'backups.encrypt': 'Encrypt',\n\t'backups.share': 'Share',\n\t'backups.rename': 'Rename',\n\t'backups.delete': 'Delete',\n\t'backups.new': '+ New backup',\n\t'backups.newTitle': 'New backup',\n\t'backups.startsBlank': 'It starts empty.',\n\t'backups.namePh': 'Its name',\n\t'backups.willBe': 'File: {file}',\n\t'backups.taken': 'This name is already taken.',\n\t'backups.create': 'Create',\n\t'backups.renameTitle': 'Rename this backup',\n\t'backups.pwHint': 'This backup is protected: enter its password.',\n\t'backups.pwShow': 'Show the password',\n\t'backups.pwHide': 'Hide the password',\n\t'backups.cancel': 'Cancel',\n\t'backups.shared.heading': 'Shared with me',\n\t'backups.shared.by': 'Shared by {who}',\n\t'backups.shared.leave': 'Leave',\n\t'backups.replica.add': 'Backup copy',\n\t'backups.replica.title': 'Backup copy',\n\t'backups.replica.intro':\n\t\t'The same encrypted file, also written to a second destination. If one fails, the other remains.',\n\t'backups.replica.dest.drive': 'Google Drive',\n\t'backups.replica.dest.file': 'A file on this device',\n\t'backups.replica.dest.webdav': 'A WebDAV server',\n\t'backups.replica.dest.s3': 'An S3 bucket',\n\t'backups.replica.card': 'Backup copy - {label}',\n\t'backups.replica.uptodate': 'Up to date, {when}',\n\t'backups.replica.pending': 'First copy at the next save',\n\t'backups.replica.error': 'Unreachable - will retry at the next save',\n\t'backups.replica.remove': 'Remove',\n\t'backups.replica.save': 'Add the copy',\n\t'backups.replica.webdav.url': 'File URL on the server (https://host:8443/dav/file.zip)',\n\t'backups.replica.webdav.help':\n\t\t'The full URL of the backup file, including a custom port if any. The server must allow this app to reach it (CORS) - some hosted drives do not, and will not connect from a browser.',\n\t'backups.replica.webdav.user': 'Username',\n\t'backups.replica.webdav.password': 'Password',\n\t'backups.replica.s3.endpoint': 'Endpoint URL',\n\t'backups.replica.s3.region': 'Region',\n\t'backups.replica.s3.bucket': 'Bucket',\n\t'backups.replica.s3.key': 'Object key (file name)',\n\t'backups.replica.s3.accessKeyId': 'Access key ID',\n\t'backups.replica.s3.secret': 'Secret access key',\n\t'error.generic': 'That did not work. Check the connection and try again.'\n};\n\n/** A destructive gesture, offered to confirmAction before it runs. `delete`\n * and `forget` carry the row; `leave` is a membership's removal (fileId =\n * its wallet, null for a legacy unbound one) - the host performs the actual\n * leave on the 'selfstore-backups-leave' event, whose detail repeats it. */\nexport type BackupsAction =\n\t| { type: 'delete'; fileId: string; name: string; active: boolean }\n\t| { type: 'forget'; fileId: string; who: string }\n\t| { type: 'leave'; fileId: string | null; who: string }\n\t| { type: 'replica-remove'; label: string };\n\n/** \"off\"-style attribute values; anything else (including empty) reads as on. */\nconst isOff = (v: string | null): boolean =>\n\tv != null && ['off', 'false', 'no', '0'].includes(v.trim().toLowerCase());\n\nconst EYE_OPEN =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>';\nconst EYE_SHUT =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m3 3 18 18\"/><path d=\"M10.6 5.1A10.9 10.9 0 0 1 12 5c6.5 0 10 7 10 7a17.4 17.4 0 0 1-3.4 4.4M6.6 6.6A17 17 0 0 0 2 12s3.5 7 10 7a10.7 10.7 0 0 0 5.4-1.4\"/></svg>';\n\nexport class SelfstoreBackupsElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['with-create', 'with-rename', 'with-delete', 'with-open', 'with-encrypt', 'with-share', 'with-shared'];\n\t}\n\n\t#manager: BackupsManager | null = null;\n\t#rows: BackupRow[] | null = null;\n\t#lastActive: string | null | undefined = undefined;\n\t#listing = false;\n\t#busy = false;\n\t#openBusy: string | null = null;\n\t#menuFor: string | null = null;\n\t#pwFor: string | null = null;\n\t#pw = '';\n\t#pwShown = false;\n\t#renameFor: BackupRow | null = null;\n\t#renameLabel = '';\n\t#createOpen = false;\n\t#createLabel = '';\n\t#members: { by: string; fileId?: string | null }[] = [];\n\t#replicaFlow: ReplicaFlow | null = null;\n\t#replicaSnap: ReplicaSnapshot | null = null;\n\t#repWebdav: WebdavConfig = { url: '', username: '', password: '' };\n\t#repS3: S3Config = { endpoint: '', region: '', bucket: '', key: '', accessKeyId: '', secretAccessKey: '' };\n\t#activeEncrypted: boolean | null = null;\n\t#activeShared: boolean | null = null;\n\t#confirmAction: ((action: BackupsAction) => boolean | Promise<boolean>) | null = null;\n\t#withCreate = true;\n\t#withRename = true;\n\t#withDelete = true;\n\t#withOpen = true;\n\t#withEncrypt = true;\n\t#withShare = true;\n\t#withShared = true;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\t/** The headless manager this panel drives (see 'selfstore/backups'). */\n\tget manager(): BackupsManager | null {\n\t\treturn this.#manager;\n\t}\n\tset manager(v: BackupsManager | null) {\n\t\tthis.#manager = v;\n\t\tthis.wire();\n\t}\n\n\t/** The households this device is a member of (one entry per share, or a\n\t * single object for one): each renders in \"Shared with me\" labeled by who\n\t * shares it, removal = leaving (host performs it on\n\t * 'selfstore-backups-leave', whose detail names the entry's fileId). With\n\t * `fileId` (the share's dedicated wallet), that registry row IS the\n\t * member row: active it wears the badge, inactive it opens like any\n\t * shared silo - and its one menu action is leaving, never a mere forget. */\n\tget member(): { by: string; fileId?: string | null }[] | null {\n\t\treturn this.#members.length > 0 ? this.#members : null;\n\t}\n\tset member(v: { by: string; fileId?: string | null }[] | { by: string; fileId?: string | null } | null) {\n\t\tthis.#members = v == null ? [] : Array.isArray(v) ? v : [v];\n\t\tthis.rerender();\n\t}\n\n\t/** Live state of the ATTACHED backup, from the host's store: the active\n\t * row's pills prefer these over the learned memories (which may lag). */\n\tget activeEncrypted(): boolean | null {\n\t\treturn this.#activeEncrypted;\n\t}\n\tset activeEncrypted(v: boolean | null) {\n\t\tthis.#activeEncrypted = v;\n\t\tthis.rerender();\n\t}\n\tget activeShared(): boolean | null {\n\t\treturn this.#activeShared;\n\t}\n\tset activeShared(v: boolean | null) {\n\t\tthis.#activeShared = v;\n\t\tthis.rerender();\n\t}\n\n\t/** Host veto over the destructive gestures (delete / forget / leave):\n\t * answer (or resolve) false to keep things as they are - window.confirm\n\t * fits as-is. Default: everything proceeds. */\n\tget confirmAction(): ((action: BackupsAction) => boolean | Promise<boolean>) | null {\n\t\treturn this.#confirmAction;\n\t}\n\tset confirmAction(v: ((action: BackupsAction) => boolean | Promise<boolean>) | null) {\n\t\tthis.#confirmAction = v ?? null;\n\t}\n\n\tget withCreate(): boolean {\n\t\treturn this.#withCreate;\n\t}\n\tset withCreate(v: boolean) {\n\t\tthis.#withCreate = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withRename(): boolean {\n\t\treturn this.#withRename;\n\t}\n\tset withRename(v: boolean) {\n\t\tthis.#withRename = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withDelete(): boolean {\n\t\treturn this.#withDelete;\n\t}\n\tset withDelete(v: boolean) {\n\t\tthis.#withDelete = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withOpen(): boolean {\n\t\treturn this.#withOpen;\n\t}\n\tset withOpen(v: boolean) {\n\t\tthis.#withOpen = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withEncrypt(): boolean {\n\t\treturn this.#withEncrypt;\n\t}\n\tset withEncrypt(v: boolean) {\n\t\tthis.#withEncrypt = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withShare(): boolean {\n\t\treturn this.#withShare;\n\t}\n\tset withShare(v: boolean) {\n\t\tthis.#withShare = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withShared(): boolean {\n\t\treturn this.#withShared;\n\t}\n\tset withShared(v: boolean) {\n\t\tthis.#withShared = v !== false;\n\t\tthis.rerender();\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tconst on = value == null || !isOff(value);\n\t\tif (name === 'with-create') this.withCreate = on;\n\t\tif (name === 'with-rename') this.withRename = on;\n\t\tif (name === 'with-delete') this.withDelete = on;\n\t\tif (name === 'with-open') this.withOpen = on;\n\t\tif (name === 'with-encrypt') this.withEncrypt = on;\n\t\tif (name === 'with-share') this.withShare = on;\n\t\tif (name === 'with-shared') this.withShared = on;\n\t}\n\n\tconnectedCallback(): void {\n\t\tthis.wire();\n\t}\n\n\t/** Re-list the rows from the destination (the host calls this after a\n\t * gesture of its own moved things - a leave, an external change). */\n\trefresh(): void {\n\t\tvoid this.loadRows();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#manager) return;\n\t\tthis.unsub?.();\n\t\tconst manager = this.#manager;\n\t\tconst unsubManager = manager.subscribe((snap) => {\n\t\t\t// A switch (or first attach) re-lists; every snapshot repaints.\n\t\t\tif (snap.activeFileId !== this.#lastActive) {\n\t\t\t\tthis.#lastActive = snap.activeFileId;\n\t\t\t\tvoid this.loadRows();\n\t\t\t}\n\t\t\tthis.rerender();\n\t\t});\n\t\tconst unsubReplica = this.#replicaFlow?.subscribe((snap) => {\n\t\t\tthis.#replicaSnap = snap;\n\t\t\tthis.rerender();\n\t\t});\n\t\tthis.unsub = () => {\n\t\t\tunsubManager();\n\t\t\tunsubReplica?.();\n\t\t};\n\t\tvoid manager.hydrate().then(() => this.loadRows());\n\t}\n\n\t/** The backup-copy journey (see 'selfstore/flows' replicaFlow). Setting it\n\t * adds a menu entry on the active backup's card and renders the copy\n\t * cards under it; without it the panel is byte-identical to before. The\n\t * widget restores a recorded copy by itself. */\n\tget replica(): ReplicaFlow | null {\n\t\treturn this.#replicaFlow;\n\t}\n\tset replica(v: ReplicaFlow | null) {\n\t\tthis.#replicaFlow = v;\n\t\tthis.#replicaSnap = v?.snapshot ?? null;\n\t\tif (v) void v.restore();\n\t\tthis.wire();\n\t}\n\n\t/** One destination listing, then the lazy encryption probes (each learned\n\t * bit repaints its row). A transient failure keeps the last good list. */\n\tprivate async loadRows(): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager || this.#listing) return;\n\t\tthis.#listing = true;\n\t\ttry {\n\t\t\tthis.#rows = await manager.list();\n\t\t\tthis.rerender();\n\t\t\tfor (const r of this.#rows ?? []) {\n\t\t\t\tif (r.encrypted !== null) continue;\n\t\t\t\tconst enc = await manager.probeEncryption(r.fileId);\n\t\t\t\tif (enc === null || this.#rows === null) continue;\n\t\t\t\tthis.#rows = this.#rows.map((x) => (x.fileId === r.fileId ? { ...x, encrypted: enc } : x));\n\t\t\t\tthis.rerender();\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.#rows = this.#rows ?? [];\n\t\t\tthis.rerender();\n\t\t} finally {\n\t\t\tthis.#listing = false;\n\t\t}\n\t}\n\n\t/** t() with {placeholders}. */\n\tprivate ts(key: string, params: Record<string, string>): string {\n\t\treturn this.t(key).replace(/\\{(\\w+)\\}/g, (_, k: string) => params[k] ?? '');\n\t}\n\n\tprivate label(row: BackupRow): string {\n\t\treturn row.label ?? this.t('backups.mine.personal');\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst manager = this.#manager;\n\t\tif (!manager) return;\n\t\tconst snap = manager.snapshot;\n\t\tconst rows = this.#rows ?? [];\n\t\tconst active = snap.activeFileId;\n\n\t\t// --- My backups -----------------------------------------------------\n\t\tconst mine = snap.joined ? rows.filter((r) => r.fileId !== active) : rows;\n\t\tif (this.#rows !== null) put(into, this.heading('sub heading', 'backups.mine.heading'));\n\t\tconst list = h('ul', { part: 'list' });\n\t\tfor (const r of mine) {\n\t\t\tconst isActive = r.fileId === active;\n\t\t\tif (this.#pwFor === r.fileId) list.append(this.passwordCard(r));\n\t\t\telse if (this.#renameFor?.fileId === r.fileId) list.append(this.renameCard(r));\n\t\t\t// The attached copy is not a backup of its own: it rides INSIDE the\n\t\t\t// active card as one line under its pills (never a card of its own,\n\t\t\t// never for a joined member's shared file).\n\t\t\telse list.append(this.rowCard(r, isActive, isActive ? this.replicaAttachedLine() : null));\n\t\t\t// The destination choice / config form (transient setup) renders as a\n\t\t\t// card right under the active one.\n\t\t\tif (isActive) for (const el of this.replicaSetup()) list.append(el);\n\t\t}\n\t\tif (list.childElementCount > 0) into.append(list);\n\n\t\t// --- Create ---------------------------------------------------------\n\t\tif (this.#withCreate) {\n\t\t\tif (this.#createOpen) into.append(this.createCard());\n\t\t\telse {\n\t\t\t\tinto.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button new-button',\n\t\t\t\t\t\t\t'data-action': 'new',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\t\t\tthis.#createOpen = true;\n\t\t\t\t\t\t\t\tthis.#createLabel = '';\n\t\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.new')\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// --- Shared with me -------------------------------------------------\n\t\tif (!this.#withShared) return;\n\t\tconst members = this.#members;\n\t\t// The badge row: the membership riding the ATTACHED file - wallet-bound\n\t\t// when its silo is active (the others' registry rows stand in), or a\n\t\t// legacy unbound one on whatever file is attached.\n\t\tconst badge = members.find((m) => (m.fileId != null ? m.fileId === active : true)) ?? null;\n\t\t// An owner already present as a MEMBERSHIP owns its row, and its one\n\t\t// action is Leave. A registry entry for that same owner is a stale\n\t\t// duplicate of the same share (a re-join left the old file behind): never\n\t\t// show it as a second, Forget-only row. Forget rows also collapse to one\n\t\t// per owner - never the same email twice.\n\t\tconst memberWhos = new Set(members.map((m) => m.by));\n\t\tconst others: { fileId: string; who: string; member: boolean }[] = [];\n\t\tconst seenForget = new Set<string>();\n\t\tfor (const s of snap.registry.shared) {\n\t\t\tif (s.fileId === active && !snap.joined) continue;\n\t\t\tconst member = members.some((m) => m.fileId === s.fileId);\n\t\t\tconst who = s.ownerEmail ?? s.ownerName ?? '?';\n\t\t\tif (!member) {\n\t\t\t\tif (memberWhos.has(who) || seenForget.has(who)) continue;\n\t\t\t\tseenForget.add(who);\n\t\t\t}\n\t\t\tothers.push({ fileId: s.fileId, who, member });\n\t\t}\n\t\tif (members.length === 0 && others.length === 0) return;\n\t\tput(into, this.heading('sub heading', 'backups.shared.heading'));\n\t\tconst shared = h('ul', { part: 'list' });\n\t\tif (badge) {\n\t\t\tconst activeRow = rows.find((r) => r.fileId === active) ?? null;\n\t\t\tconst leaveAction: BackupsAction = { type: 'leave', fileId: badge.fileId ?? null, who: badge.by };\n\t\t\tshared.append(\n\t\t\t\th(\n\t\t\t\t\t'li',\n\t\t\t\t\t{ part: 'card card-active', style: 'position:relative;border-color:var(--_ok)', 'data-member': '' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\t\t\tbadge.fileId != null || !activeRow\n\t\t\t\t\t\t\t\t? this.ts('backups.shared.by', { who: badge.by })\n\t\t\t\t\t\t\t\t: this.label(activeRow),\n\t\t\t\t\t\t\th('span', { part: 'tag' }, this.t('backups.active'))\n\t\t\t\t\t\t),\n\t\t\t\t\t\tbadge.fileId == null && activeRow\n\t\t\t\t\t\t\t? h('div', { part: 'sub' }, this.ts('backups.shared.by', { who: badge.by }))\n\t\t\t\t\t\t\t: null\n\t\t\t\t\t),\n\t\t\t\t\tthis.menuButton('member'),\n\t\t\t\t\tthis.#menuFor === 'member'\n\t\t\t\t\t\t? this.menu(\n\t\t\t\t\t\t\t\tthis.#withDelete\n\t\t\t\t\t\t\t\t\t? this.menuItem('leave', this.t('backups.shared.leave'), true, () =>\n\t\t\t\t\t\t\t\t\t\t\tthis.guarded(leaveAction, () =>\n\t\t\t\t\t\t\t\t\t\t\t\tthis.emit('selfstore-backups-leave', { fileId: leaveAction.fileId })\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tfor (const s of others) {\n\t\t\t// The badge row's file never doubles as a registry row.\n\t\t\tif (badge && s.fileId === active) continue;\n\t\t\tconst memberEntry = s.member;\n\t\t\tshared.append(\n\t\t\t\th(\n\t\t\t\t\t'li',\n\t\t\t\t\t{ part: 'card', style: 'position:relative', 'data-shared': s.fileId },\n\t\t\t\t\tthis.#withOpen\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t{ part: 'link open-shared', style: 'flex:1;min-width:0;text-align:left;text-decoration:none', 'data-action': 'open-shared', disabled: this.#busy, onclick: () => this.open(s.fileId) },\n\t\t\t\t\t\t\t\th('div', { part: 'title' }, this.ts('backups.shared.by', { who: s.who })),\n\t\t\t\t\t\t\t\th('div', { part: 'sub' }, this.#openBusy === s.fileId ? this.t('backups.loading') : this.t('backups.replaceHint'))\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\t\t\t\t\th('div', { part: 'title' }, this.ts('backups.shared.by', { who: s.who })),\n\t\t\t\t\t\t\t\th('div', { part: 'sub' }, this.t('backups.replaceHint'))\n\t\t\t\t\t\t\t),\n\t\t\t\t\tthis.menuButton(s.fileId),\n\t\t\t\t\tthis.#menuFor === s.fileId\n\t\t\t\t\t\t? this.menu(\n\t\t\t\t\t\t\t\tthis.#withDelete\n\t\t\t\t\t\t\t\t\t? memberEntry\n\t\t\t\t\t\t\t\t\t\t? this.menuItem('leave', this.t('backups.shared.leave'), true, () =>\n\t\t\t\t\t\t\t\t\t\t\t\tthis.guarded({ type: 'leave', fileId: s.fileId, who: s.who }, () =>\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.emit('selfstore-backups-leave', { fileId: s.fileId })\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t: this.menuItem('forget', this.t('backups.delete'), true, () =>\n\t\t\t\t\t\t\t\t\t\t\t\tthis.guarded({ type: 'forget', fileId: s.fileId, who: s.who }, () => void this.forget(s.fileId))\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tif (shared.childElementCount > 0) into.append(shared);\n\t}\n\n\t// --- Cards ----------------------------------------------------------------\n\n\tprivate pills(r: BackupRow, active: boolean): (HTMLElement | string | null)[] {\n\t\tconst enc = active && this.#activeEncrypted !== null ? this.#activeEncrypted : r.encrypted;\n\t\tconst shr = active && this.#activeShared !== null ? this.#activeShared : r.shared;\n\t\tconst bits: (HTMLElement | string | null)[] = [];\n\t\tif (enc !== null) {\n\t\t\tbits.push(\n\t\t\t\th('span', { part: enc ? 'pill pill-encrypted sev-ok' : 'pill pill-plain', style: pillStyle }, this.t(enc ? 'backups.pill.encrypted' : 'backups.pill.plain'))\n\t\t\t);\n\t\t}\n\t\tif (shr !== null) {\n\t\t\tbits.push(\n\t\t\t\th('span', { part: shr ? 'pill pill-shared sev-warn' : 'pill pill-private', style: pillStyle }, this.t(shr ? 'backups.pill.shared' : 'backups.pill.private'))\n\t\t\t);\n\t\t}\n\t\tif (r.modifiedAt) {\n\t\t\tbits.push(h('span', { part: 'sub' }, this.ts('backups.modified', { when: new Date(r.modifiedAt).toLocaleDateString() })));\n\t\t}\n\t\treturn bits;\n\t}\n\n\tprivate rowCard(r: BackupRow, active: boolean, footer: HTMLElement | null = null): HTMLElement {\n\t\tconst body = h(\n\t\t\t'div',\n\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\th('div', { part: 'title' }, this.label(r), active ? h('span', { part: 'tag' }, this.t('backups.active')) : null),\n\t\t\th('div', { part: 'row', style: 'margin-top:0.2rem' }, ...this.pills(r, active)),\n\t\t\tfooter\n\t\t);\n\t\tconst opens = this.#withOpen && !active;\n\t\tconst face = opens\n\t\t\t? h(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'link open-row', style: 'flex:1;min-width:0;text-align:left;text-decoration:none', 'data-action': 'open', disabled: this.#busy, onclick: () => this.open(r.fileId) },\n\t\t\t\t\tthis.#openBusy === r.fileId ? h('div', { part: 'sub' }, this.t('backups.loading')) : body\n\t\t\t\t)\n\t\t\t: body;\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: active ? 'card card-active' : 'card', style: active ? 'position:relative;border-color:var(--_ok)' : 'position:relative', 'data-row': r.fileId },\n\t\t\tface,\n\t\t\tthis.menuButton(r.fileId),\n\t\t\tthis.#menuFor === r.fileId\n\t\t\t\t? this.menu(\n\t\t\t\t\t\topens ? this.menuItem('open', this.t('backups.open'), false, () => this.open(r.fileId)) : null,\n\t\t\t\t\t\tthis.#withEncrypt\n\t\t\t\t\t\t\t? this.menuItem('encrypt', this.t('backups.encrypt'), false, () => this.emit('selfstore-backups-encrypt', { fileId: r.fileId, label: r.label, active }))\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tthis.#withShare\n\t\t\t\t\t\t\t? this.menuItem('share', this.t('backups.share'), false, () => this.emit('selfstore-backups-share', { fileId: r.fileId, label: r.label, active }))\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tactive && this.#replicaFlow && this.#replicaSnap?.step === 'idle' && !this.#replicaSnap.replica\n\t\t\t\t\t\t\t? this.menuItem('replica-add', this.t('backups.replica.add'), false, () => this.#replicaFlow?.open())\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tthis.#withRename\n\t\t\t\t\t\t\t? this.menuItem('rename', this.t('backups.rename'), false, () => {\n\t\t\t\t\t\t\t\t\tthis.#renameFor = r;\n\t\t\t\t\t\t\t\t\tthis.#renameLabel = r.label ?? '';\n\t\t\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tthis.#withDelete\n\t\t\t\t\t\t\t? this.menuItem('delete', this.t('backups.delete'), true, () =>\n\t\t\t\t\t\t\t\t\tthis.guarded({ type: 'delete', fileId: r.fileId, name: r.name, active }, () => void this.deleteRow(r.fileId))\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null\n\t\t\t\t\t)\n\t\t\t\t: null\n\t\t);\n\t}\n\n\tprivate passwordCard(r: BackupRow): HTMLElement {\n\t\tconst submit = (): void => {\n\t\t\tif (this.#pw.length > 0) void this.open(r.fileId, this.#pw);\n\t\t};\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card', 'data-password': r.fileId },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\th('div', { part: 'title' }, this.label(r)),\n\t\t\t\th('div', { part: 'sub' }, this.t('backups.pwHint')),\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'span',\n\t\t\t\t\t\t{ part: 'field', style: 'flex:1;min-width:9rem' },\n\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\tpart: 'input',\n\t\t\t\t\t\t\ttype: this.#pwShown ? 'text' : 'password',\n\t\t\t\t\t\t\tautocomplete: 'current-password',\n\t\t\t\t\t\t\t'data-keep': 'backup-pw',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\toninput: (e: Event) => (this.#pw = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\tonkeydown: (e: Event) => {\n\t\t\t\t\t\t\t\tif ((e as KeyboardEvent).key === 'Enter') submit();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tthis.eye()\n\t\t\t\t\t),\n\t\t\t\t\th('button', { part: 'button button-primary', 'data-action': 'pw-open', disabled: this.#busy, onclick: submit }, this.t('backups.open')),\n\t\t\t\t\th('button', { part: 'button', 'data-action': 'pw-cancel', disabled: this.#busy, onclick: () => this.closePw() }, this.t('backups.cancel'))\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate renameCard(r: BackupRow): HTMLElement {\n\t\tconst taken = this.nameTaken(this.#renameLabel, r.fileId);\n\t\tconst clean = this.#renameLabel.trim();\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card', 'data-rename': r.fileId },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\th('div', { part: 'title' }, this.t('backups.renameTitle')),\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\tstyle: 'margin-top:0.45rem',\n\t\t\t\t\t'data-keep': 'rename-label',\n\t\t\t\t\tmaxlength: '40',\n\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\tvalue: this.#renameLabel,\n\t\t\t\t\toninput: (e: Event) => {\n\t\t\t\t\t\tthis.#renameLabel = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\ttaken\n\t\t\t\t\t? h('div', { part: 'error-note' }, this.t('backups.taken'))\n\t\t\t\t\t: clean\n\t\t\t\t\t\t? h('div', { part: 'sub' }, this.ts('backups.willBe', { file: this.#manager?.fileNameFor(clean) ?? '' }))\n\t\t\t\t\t\t: null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\t\th('button', { part: 'button button-primary', 'data-action': 'rename-save', disabled: this.#busy || !clean || taken, onclick: () => void this.rename(r) }, this.t('backups.rename')),\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{ part: 'button', 'data-action': 'rename-cancel', disabled: this.#busy, onclick: () => {\n\t\t\t\t\t\t\tthis.#renameFor = null;\n\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t} },\n\t\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate createCard(): HTMLElement {\n\t\tconst taken = this.nameTaken(this.#createLabel, null);\n\t\tconst clean = this.#createLabel.trim();\n\t\treturn h(\n\t\t\t'div',\n\t\t\t{ part: 'card', 'data-create': '' },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\th('div', { part: 'title' }, this.t('backups.newTitle')),\n\t\t\t\th('div', { part: 'sub' }, this.t('backups.startsBlank')),\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\tstyle: 'margin-top:0.45rem',\n\t\t\t\t\tplaceholder: this.t('backups.namePh'),\n\t\t\t\t\t'data-keep': 'create-label',\n\t\t\t\t\tmaxlength: '40',\n\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\toninput: (e: Event) => {\n\t\t\t\t\t\tthis.#createLabel = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\ttaken\n\t\t\t\t\t? h('div', { part: 'error-note' }, this.t('backups.taken'))\n\t\t\t\t\t: clean\n\t\t\t\t\t\t? h('div', { part: 'sub' }, this.ts('backups.willBe', { file: this.#manager?.fileNameFor(clean) ?? '' }))\n\t\t\t\t\t\t: null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\t\th('button', { part: 'button button-primary', 'data-action': 'create', disabled: this.#busy || !clean || taken, onclick: () => void this.create() }, this.t('backups.create')),\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{ part: 'button', 'data-action': 'create-cancel', disabled: this.#busy, onclick: () => {\n\t\t\t\t\t\t\tthis.#createOpen = false;\n\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t} },\n\t\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\t// --- Backup copy (replica) -------------------------------------------------\n\n\t/** The transient setup UI under the active card: the destination choice or a\n\t * config form. The ATTACHED copy is not here - it rides inside the active\n\t * card (replicaAttachedLine). Idle renders nothing - the entry point lives\n\t * in the active card's menu. */\n\tprivate replicaSetup(): HTMLElement[] {\n\t\tconst snap = this.#replicaSnap;\n\t\tif (!this.#replicaFlow || !snap || snap.replica) return [];\n\t\tif (snap.step === 'choose') return [this.replicaPicker(snap)];\n\t\tif (snap.step === 'form-webdav') return [this.replicaWebdavForm(snap)];\n\t\tif (snap.step === 'form-s3') return [this.replicaS3Form(snap)];\n\t\treturn [];\n\t}\n\n\t/** The attached copy is not a backup of its own: it renders as ONE line\n\t * INSIDE the active backup's card, under its pills (label, freshness, an\n\t * inline \"remove\") - never a card or a block of its own. Null when no copy\n\t * is attached. */\n\tprivate replicaAttachedLine(): HTMLElement | null {\n\t\tconst snap = this.#replicaSnap;\n\t\tif (!this.#replicaFlow || !snap || !snap.replica) return null;\n\t\tconst rep = snap.replica;\n\t\tconst label = rep.label;\n\t\tconst status = rep.lastError\n\t\t\t? h('span', { part: 'sub replica-error' }, this.t('backups.replica.error'))\n\t\t\t: rep.lastPublishAt\n\t\t\t\t? h(\n\t\t\t\t\t\t'span',\n\t\t\t\t\t\t{ part: 'sub replica-ok' },\n\t\t\t\t\t\tthis.ts('backups.replica.uptodate', {\n\t\t\t\t\t\t\twhen: new Date(rep.lastPublishAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\t: h('span', { part: 'sub' }, this.t('backups.replica.pending'));\n\t\treturn h(\n\t\t\t'div',\n\t\t\t{\n\t\t\t\tpart: 'sub replica-line',\n\t\t\t\t'data-replica': '',\n\t\t\t\tstyle: 'display:flex;flex-wrap:wrap;align-items:baseline;gap:0.1rem 0.5rem;margin-top:0.35rem'\n\t\t\t},\n\t\t\th('span', { part: 'replica-label' }, this.ts('backups.replica.card', { label })),\n\t\t\tstatus,\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{\n\t\t\t\t\tpart: 'link replica-remove',\n\t\t\t\t\ttype: 'button',\n\t\t\t\t\t'data-action': 'replica-remove',\n\t\t\t\t\tonclick: () =>\n\t\t\t\t\t\tthis.guarded({ type: 'replica-remove', label }, () => void this.#replicaFlow?.remove())\n\t\t\t\t},\n\t\t\t\tthis.t('backups.replica.remove')\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate replicaPicker(snap: ReplicaSnapshot): HTMLElement {\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card replica-picker', style: 'display:block' },\n\t\t\th('div', { part: 'title' }, this.t('backups.replica.title')),\n\t\t\th('div', { part: 'sub', style: 'margin:0.2rem 0 0.6rem' }, this.t('backups.replica.intro')),\n\t\t\t...snap.kinds.map((kind: ConnectKind) =>\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'button replica-dest',\n\t\t\t\t\t\tstyle: 'display:block;width:100%;text-align:left;margin-bottom:0.4rem',\n\t\t\t\t\t\t'data-kind': kind,\n\t\t\t\t\t\tdisabled: snap.busy,\n\t\t\t\t\t\tonclick: () => this.#replicaFlow?.pick(kind)\n\t\t\t\t\t},\n\t\t\t\t\tthis.t(`backups.replica.dest.${kind}`)\n\t\t\t\t)\n\t\t\t),\n\t\t\tsnap.error ? h('div', { part: 'error-note' }, this.t('error.generic')) : null,\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{ part: 'button', 'data-action': 'replica-cancel', disabled: snap.busy, onclick: () => this.#replicaFlow?.cancel() },\n\t\t\t\tthis.t('backups.cancel')\n\t\t\t)\n\t\t);\n\t}\n\n\t/** A config field: mutates state on input, no repaint (validated on submit). */\n\tprivate replicaField(key: string, type: string, value: string, oninput: (v: string) => void): HTMLElement {\n\t\treturn h('input', {\n\t\t\tpart: 'input',\n\t\t\tstyle: 'display:block;width:100%;margin-bottom:0.4rem',\n\t\t\ttype,\n\t\t\tplaceholder: this.t(key),\n\t\t\t'aria-label': this.t(key),\n\t\t\tvalue,\n\t\t\toninput: (e: Event) => oninput((e.target as HTMLInputElement).value)\n\t\t});\n\t}\n\n\tprivate replicaWebdavForm(snap: ReplicaSnapshot): HTMLElement {\n\t\tconst c = this.#repWebdav;\n\t\tconst submit = (): void => {\n\t\t\tif (!c.url.trim()) return;\n\t\t\tthis.#replicaFlow?.submitWebdav({ url: c.url.trim(), username: c.username.trim(), password: c.password });\n\t\t};\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card replica-form', style: 'display:block' },\n\t\t\th('div', { part: 'title', style: 'margin-bottom:0.3rem' }, this.t('backups.replica.title')),\n\t\t\th('div', { part: 'sub', style: 'margin-bottom:0.6rem' }, this.t('backups.replica.webdav.help')),\n\t\t\tthis.replicaField('backups.replica.webdav.url', 'url', c.url, (v) => (c.url = v)),\n\t\t\tthis.replicaField('backups.replica.webdav.user', 'text', c.username, (v) => (c.username = v)),\n\t\t\tthis.replicaField('backups.replica.webdav.password', 'password', c.password, (v) => (c.password = v)),\n\t\t\tsnap.error ? h('div', { part: 'error-note' }, this.t('error.generic')) : null,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\th('button', { part: 'button button-primary', 'data-action': 'replica-webdav', disabled: snap.busy, onclick: submit }, this.t('backups.replica.save')),\n\t\t\t\th('button', { part: 'button', disabled: snap.busy, onclick: () => this.#replicaFlow?.cancel() }, this.t('backups.cancel'))\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate replicaS3Form(snap: ReplicaSnapshot): HTMLElement {\n\t\tconst c = this.#repS3;\n\t\tconst submit = (): void => {\n\t\t\tconst config: S3Config = {\n\t\t\t\tendpoint: c.endpoint.trim(),\n\t\t\t\tregion: c.region.trim(),\n\t\t\t\tbucket: c.bucket.trim(),\n\t\t\t\tkey: c.key.trim(),\n\t\t\t\taccessKeyId: c.accessKeyId.trim(),\n\t\t\t\tsecretAccessKey: c.secretAccessKey\n\t\t\t};\n\t\t\tif (!config.endpoint || !config.region || !config.bucket || !config.key) return;\n\t\t\tif (!config.accessKeyId || !config.secretAccessKey) return;\n\t\t\tthis.#replicaFlow?.submitS3(config);\n\t\t};\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card replica-form', style: 'display:block' },\n\t\t\th('div', { part: 'title', style: 'margin-bottom:0.5rem' }, this.t('backups.replica.title')),\n\t\t\tthis.replicaField('backups.replica.s3.endpoint', 'url', c.endpoint, (v) => (c.endpoint = v)),\n\t\t\tthis.replicaField('backups.replica.s3.region', 'text', c.region, (v) => (c.region = v)),\n\t\t\tthis.replicaField('backups.replica.s3.bucket', 'text', c.bucket, (v) => (c.bucket = v)),\n\t\t\tthis.replicaField('backups.replica.s3.key', 'text', c.key, (v) => (c.key = v)),\n\t\t\tthis.replicaField('backups.replica.s3.accessKeyId', 'text', c.accessKeyId, (v) => (c.accessKeyId = v)),\n\t\t\tthis.replicaField('backups.replica.s3.secret', 'password', c.secretAccessKey, (v) => (c.secretAccessKey = v)),\n\t\t\tsnap.error ? h('div', { part: 'error-note' }, this.t('error.generic')) : null,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\th('button', { part: 'button button-primary', 'data-action': 'replica-s3', disabled: snap.busy, onclick: submit }, this.t('backups.replica.save')),\n\t\t\t\th('button', { part: 'button', disabled: snap.busy, onclick: () => this.#replicaFlow?.cancel() }, this.t('backups.cancel'))\n\t\t\t)\n\t\t);\n\t}\n\n\t// --- Menu -----------------------------------------------------------------\n\n\tprivate menuButton(key: string): HTMLElement {\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{\n\t\t\t\tpart: 'button menu-button',\n\t\t\t\t'aria-label': this.t('backups.menu'),\n\t\t\t\t'aria-haspopup': 'menu',\n\t\t\t\t'aria-expanded': this.#menuFor === key ? 'true' : 'false',\n\t\t\t\t'data-action': 'menu',\n\t\t\t\t'data-menu-key': key,\n\t\t\t\tdisabled: this.#busy,\n\t\t\t\tonclick: () => {\n\t\t\t\t\tthis.#menuFor = this.#menuFor === key ? null : key;\n\t\t\t\t\tthis.rerender();\n\t\t\t\t\t(this.root.querySelector('[part~=\"menu\"]') as HTMLElement | null)?.focus();\n\t\t\t\t}\n\t\t\t},\n\t\t\t'⋯'\n\t\t);\n\t}\n\n\t/** The open overflow menu: a backdrop closes it on any outside click or\n\t * tap, Escape closes it and hands focus back to its trigger. The panel is\n\t * a dropdown over the trigger's corner on wide screens and a bottom sheet\n\t * on phones - both styled in the base sheet. */\n\tprivate menu(...items: (HTMLElement | null)[]): HTMLElement {\n\t\tconst key = this.#menuFor;\n\t\tconst close = (): void => {\n\t\t\tthis.#menuFor = null;\n\t\t\tthis.rerender();\n\t\t\t(this.root.querySelector(`[data-menu-key=\"${key}\"]`) as HTMLElement | null)?.focus();\n\t\t};\n\t\treturn h(\n\t\t\t'div',\n\t\t\t{ part: 'menu-layer' },\n\t\t\th('div', { part: 'menu-backdrop', 'data-action': 'menu-close', onclick: close }),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\tpart: 'menu',\n\t\t\t\t\trole: 'menu',\n\t\t\t\t\ttabindex: '-1',\n\t\t\t\t\tonkeydown: (e: Event) => {\n\t\t\t\t\t\tif ((e as KeyboardEvent).key === 'Escape') close();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t...items.filter((i): i is HTMLElement => i !== null)\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate menuItem(action: string, text: string, danger: boolean, run: () => void): HTMLElement {\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{\n\t\t\t\tpart: danger ? 'menu-item menu-item-danger' : 'menu-item',\n\t\t\t\ttype: 'button',\n\t\t\t\trole: 'menuitem',\n\t\t\t\t'data-action': action,\n\t\t\t\tonclick: () => {\n\t\t\t\t\tthis.#menuFor = null;\n\t\t\t\t\trun();\n\t\t\t\t}\n\t\t\t},\n\t\t\ttext\n\t\t);\n\t}\n\n\tprivate eye(): HTMLElement {\n\t\tconst btn = h('button', {\n\t\t\tpart: 'eye',\n\t\t\ttype: 'button',\n\t\t\t'aria-label': this.t(this.#pwShown ? 'backups.pwHide' : 'backups.pwShow'),\n\t\t\tonclick: () => {\n\t\t\t\tthis.#pwShown = !this.#pwShown;\n\t\t\t\tthis.rerender();\n\t\t\t}\n\t\t});\n\t\tbtn.innerHTML = this.#pwShown ? EYE_SHUT : EYE_OPEN;\n\t\treturn btn;\n\t}\n\n\t// --- Gestures --------------------------------------------------------------\n\n\tprivate nameTaken(label: string, exceptFileId: string | null): boolean {\n\t\tconst clean = label.trim().toLowerCase();\n\t\tif (!clean || this.#busy) return false;\n\t\treturn (this.#rows ?? []).some(\n\t\t\t(r) => r.fileId !== exceptFileId && r.label !== null && r.label.trim().toLowerCase() === clean\n\t\t);\n\t}\n\n\t/** Run a destructive action through the host's veto (default: proceed).\n\t * A throwing hook reads as \"no\": destruction needs a clear yes. */\n\tprivate guarded(action: BackupsAction, run: () => void): void {\n\t\tconst gate = this.#confirmAction;\n\t\tif (!gate) {\n\t\t\trun();\n\t\t\treturn;\n\t\t}\n\t\tvoid Promise.resolve()\n\t\t\t.then(() => gate(action))\n\t\t\t.then((ok) => {\n\t\t\t\tif (ok) run();\n\t\t\t})\n\t\t\t.catch(() => undefined);\n\t}\n\n\t/** Open a row programmatically - the same gesture as tapping it, password\n\t * card included. Lets a host chain \"open this backup, then act on it\"\n\t * (its own sub-views) without re-implementing the passphrase step. */\n\tasync open(fileId: string, passphrase?: string): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.#openBusy = fileId;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tconst r = await manager.openBackup(fileId, passphrase ?? null);\n\t\t\tif (r === 'encrypted') {\n\t\t\t\tthis.#pwFor = fileId;\n\t\t\t\tif (passphrase) this.emit('selfstore-backups-wrong-password', { fileId });\n\t\t\t} else if (r === 'ok') {\n\t\t\t\tthis.closePw();\n\t\t\t\tthis.emit('selfstore-backups-opened', { fileId });\n\t\t\t\tvoid this.loadRows();\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t\tvoid this.loadRows(); // a GONE file was pruned: repaint truthfully\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.#openBusy = null;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async create(): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tconst label = this.#createLabel.trim();\n\t\tif (!manager || !label || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tconst r = await manager.createNamed(label);\n\t\t\tif (r === 'ok') {\n\t\t\t\tthis.#createOpen = false;\n\t\t\t\tthis.#createLabel = '';\n\t\t\t\tthis.emit('selfstore-backups-created', { label });\n\t\t\t\tvoid this.loadRows();\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async rename(row: BackupRow): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tconst label = this.#renameLabel.trim();\n\t\tif (!manager || !label || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tconst r = await manager.renameBackup(row.fileId, label);\n\t\t\tif (r === 'ok') {\n\t\t\t\tthis.#renameFor = null;\n\t\t\t\tthis.emit('selfstore-backups-renamed', { fileId: row.fileId, label });\n\t\t\t\tvoid this.loadRows();\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async deleteRow(fileId: string): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tif (await manager.deleteBackup(fileId)) {\n\t\t\t\tthis.#rows = (this.#rows ?? []).filter((r) => r.fileId !== fileId);\n\t\t\t\tthis.emit('selfstore-backups-deleted', { fileId });\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async forget(fileId: string): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager) return;\n\t\tawait manager.forgetShared(fileId);\n\t\tthis.emit('selfstore-backups-forgotten', { fileId });\n\t\tthis.rerender();\n\t}\n\n\tprivate closePw(): void {\n\t\tthis.#pwFor = null;\n\t\tthis.#pw = '';\n\t\tthis.#pwShown = false;\n\t}\n}\n\nconst pillStyle =\n\t'display:inline-block;font-size:0.72em;font-weight:600;line-height:1.6;padding:0 0.55em;border-radius:999px;border:1px solid var(--_border)';\n","// selfstore/widgets - the connect / share / join / backups journeys as\n// drop-in custom elements, skins over the headless flows. Framework-free:\n// plain HTML, Svelte, Vue and React all take them as-is.\n//\n// import { defineSelfstoreWidgets } from 'selfstore/widgets';\n// defineSelfstoreWidgets();\n//\n// Customization is layered, never a fork: --selfstore-* CSS custom\n// properties, ::part() on every node, a `labels` map merged over the EN\n// defaults (also the localization story), per-widget attributes with the\n// full journey as the default, and bubbling composed `selfstore-*` events.\n// The full knob and event list lives in the README.\n\nexport { SelfstoreConnectElement, type WebdavPreset } from '../widgets/connect';\nexport { SelfstoreShareElement, type ShareAction } from '../widgets/share';\nexport { SelfstoreJoinElement } from '../widgets/join';\nexport { SelfstoreStatusElement } from '../widgets/status';\nexport { SelfstoreBackupsElement, type BackupsAction } from '../widgets/backups';\nexport { FlowWidget, type WidgetLabels } from '../widgets/base';\n\nimport { SelfstoreConnectElement } from '../widgets/connect';\nimport { SelfstoreShareElement } from '../widgets/share';\nimport { SelfstoreJoinElement } from '../widgets/join';\nimport { SelfstoreStatusElement } from '../widgets/status';\nimport { SelfstoreBackupsElement } from '../widgets/backups';\n\n/** Register the elements as <PREFIX-connect>, <PREFIX-share>, <PREFIX-join>,\n * <PREFIX-status> and <PREFIX-backups> (default prefix 'selfstore'). Safe to\n * call twice; throws in environments without custom elements (browser code\n * only). */\nexport function defineSelfstoreWidgets(prefix = 'selfstore'): void {\n\tconst define = (name: string, ctor: CustomElementConstructor): void => {\n\t\tif (!customElements.get(name)) customElements.define(name, ctor);\n\t};\n\tdefine(`${prefix}-connect`, SelfstoreConnectElement);\n\tdefine(`${prefix}-share`, SelfstoreShareElement);\n\tdefine(`${prefix}-join`, SelfstoreJoinElement);\n\tdefine(`${prefix}-status`, SelfstoreStatusElement);\n\tdefine(`${prefix}-backups`, SelfstoreBackupsElement);\n}\n"]}
1
+ {"version":3,"sources":["../src/widgets/base.ts","../src/widgets/connect.ts","../src/widgets/share.ts","../src/widgets/join.ts","../src/widgets/status.ts","../src/widgets/backups.ts","../src/entries/widgets.ts"],"names":["EN","isOff"],"mappings":";;;;;;;;;;AAcO,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","file":"widgets.js","sourcesContent":["// Shared foundation for the widgets: zero-dependency custom elements over\n// the headless flows. Look and words stay the host's business through three\n// layers - --selfstore-* custom properties (fonts and text colors inherit),\n// part=\"...\" on every significant node, and a flat `labels` map merged over\n// the EN defaults (also the localization story). Elements are inert until\n// wired: assign the properties, the widget builds its flow and renders; they\n// clean up on disconnect and expose the flow for programmatic control.\n\n/** Flat key -> string map; widgets merge a partial override over EN defaults. */\nexport type WidgetLabels = Record<string, string>;\n\n/** Structural theme, applied inside every widget's shadow root. Neutral by\n * design: it borrows the host font and text color, and every visual decision\n * routes through a --selfstore-* custom property a host page can set. */\nexport const baseStyles = `\n:host {\n\tdisplay: block;\n\tfont: inherit;\n\tcolor: inherit;\n\t--_accent: var(--selfstore-accent, #2563eb);\n\t--_accent-ink: var(--selfstore-accent-contrast, #ffffff);\n\t--_ink-dim: var(--selfstore-muted, color-mix(in srgb, currentColor 55%, transparent));\n\t--_border: var(--selfstore-border, color-mix(in srgb, currentColor 16%, transparent));\n\t--_radius: var(--selfstore-radius, 12px);\n\t--_gap: var(--selfstore-gap, 0.6rem);\n\t--_danger: var(--selfstore-danger, #dc2626);\n\t--_ok: var(--selfstore-ok, #16a34a);\n\t--_warn: var(--selfstore-warn, #d97706);\n}\n/* Status severity, as a text color the dot inherits (background: currentColor). */\n[part~='sev-ok'] { color: var(--_ok); }\n[part~='sev-info'] { color: var(--_accent); }\n[part~='sev-warn'] { color: var(--_warn); }\n[part~='sev-danger'] { color: var(--_danger); }\nspan[part~='status-dot'] {\n\tdisplay: inline-block;\n\twidth: 0.6em;\n\theight: 0.6em;\n\tborder-radius: 50%;\n\tbackground: currentColor;\n\tflex-shrink: 0;\n}\nbutton[part~='dot-button'] {\n\tbackground: none;\n\tborder: none;\n\tpadding: 0.2em;\n\tcursor: pointer;\n\tline-height: 0;\n}\n[part~='status-row'] [part~='status-action'] { margin-left: auto; }\n[part~='card'] {\n\tborder: 1px solid var(--_border);\n\tborder-radius: var(--_radius);\n\tpadding: 0.8rem 0.9rem;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--_gap);\n\twidth: 100%;\n\tbox-sizing: border-box;\n\tbackground: transparent;\n\ttext-align: left;\n}\nbutton[part~='card'] { cursor: pointer; font: inherit; color: inherit; }\nbutton[part~='card']:hover { border-color: var(--_accent); }\nimg[part~='icon'] {\n\twidth: var(--selfstore-icon-size, 2.1em);\n\theight: var(--selfstore-icon-size, 2.1em);\n\tobject-fit: contain;\n\tflex-shrink: 0;\n}\n[part~='stack'] { display: flex; flex-direction: column; gap: var(--_gap); container-type: inline-size; }\n[part~='row'] { display: flex; align-items: center; gap: var(--_gap); flex-wrap: wrap; }\n[part~='title'] { font-weight: 600; }\n[part~='sub'], [part~='hint'] { color: var(--_ink-dim); font-size: 0.9em; }\n[part~='tag'] {\n\tdisplay: inline-block;\n\tfont-size: 0.72em;\n\tfont-weight: 600;\n\tline-height: 1.5;\n\tpadding: 0 0.55em;\n\tmargin-left: 0.5em;\n\tborder-radius: 999px;\n\tbackground: var(--_accent);\n\tcolor: var(--_accent-ink);\n\tvertical-align: middle;\n}\n[part~='status'] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--_gap);\n\tpadding: 0.7rem 0.9rem;\n\tborder-radius: var(--_radius);\n\tbackground: color-mix(in srgb, var(--_accent) 10%, transparent);\n}\n[part~='status-ok'] { background: color-mix(in srgb, var(--_ok) 12%, transparent); }\n[part~='status-error'] { background: color-mix(in srgb, var(--_danger) 12%, transparent); }\n[part='spinner'] {\n\twidth: 0.7em; height: 0.7em; flex-shrink: 0;\n\tborder-radius: 50%;\n\tborder: 2px solid var(--_accent);\n\tborder-top-color: transparent;\n\tanimation: ss-spin 0.8s linear infinite;\n}\n@keyframes ss-spin { to { transform: rotate(360deg); } }\nbutton[part~='button'] {\n\tfont: inherit;\n\tpadding: 0.45rem 0.9rem;\n\tborder-radius: calc(var(--_radius) * 0.75);\n\tborder: 1px solid var(--_border);\n\tbackground: transparent;\n\tcolor: inherit;\n\tcursor: pointer;\n}\nbutton[part~='button']:disabled { opacity: 0.55; cursor: default; }\nbutton[part~='button-primary'] {\n\tbackground: var(--_accent);\n\tborder-color: var(--_accent);\n\tcolor: var(--_accent-ink);\n}\nbutton[part~='button-danger'] { color: var(--_danger); }\nbutton[part~='link'] {\n\tfont: inherit;\n\tbackground: none;\n\tborder: none;\n\tpadding: 0;\n\tcolor: var(--_ink-dim);\n\ttext-decoration: underline;\n\tcursor: pointer;\n}\nbutton[part~='link']:disabled { opacity: 0.55; cursor: default; }\nbutton[part~='link-danger'] { color: var(--_danger); }\nbutton[part~='advanced-link'] {\n\twidth: fit-content;\n\tfont-size: 0.85em;\n\tmargin-top: 0.1rem;\n}\n[part~='card'] [part~='row'] { margin-top: 0.45rem; }\ninput[part~='input'] {\n\tfont: inherit;\n\tcolor: inherit;\n\tbackground: transparent;\n\tborder: 1px solid var(--_border);\n\tborder-radius: calc(var(--_radius) * 0.75);\n\tpadding: 0.45rem 0.6rem;\n\twidth: 100%;\n\tbox-sizing: border-box;\n}\ninput[part~='input']:focus { outline: 2px solid var(--_accent); outline-offset: 1px; }\n/* A text input with a trailing button (the password eye) tucked inside it. */\n[part~='field'] { position: relative; display: flex; align-items: center; width: 100%; }\n[part~='field'] input[part~='input'] { padding-right: 2.4rem; }\nbutton[part~='eye'] {\n\tposition: absolute;\n\tright: 0.25rem;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 2rem;\n\theight: 2rem;\n\tbackground: none;\n\tborder: none;\n\tpadding: 0;\n\tcursor: pointer;\n\tcolor: var(--_ink-dim);\n}\nbutton[part~='eye']:hover { color: inherit; }\nbutton[part~='eye'] svg { width: 1.15em; height: 1.15em; display: block; }\n[part~='warn-note'] { color: var(--_warn); }\nbutton[part~='forgot-link'] { width: fit-content; font-size: 0.85em; margin-top: 0.15rem; }\n[part~='error-note'] { color: var(--_danger); font-size: 0.9em; }\n/* WebDAV/S3 segmented control: a rail with the inactive segments quiet and the\n active one lifted onto the surface. Full-width segments, equal share. */\n[part~='tabs'] {\n\tdisplay: flex;\n\tgap: 0.2rem;\n\tpadding: 0.25rem;\n\tborder-radius: calc(var(--_radius) * 0.7);\n\tbackground: color-mix(in srgb, currentColor 8%, transparent);\n}\nbutton[part~='tab'] {\n\tflex: 1 1 0;\n\tfont: inherit;\n\tfont-weight: 600;\n\tpadding: 0.4rem 0.7rem;\n\tborder: none;\n\tborder-radius: calc(var(--_radius) * 0.5);\n\tbackground: transparent;\n\tcolor: var(--_ink-dim);\n\tcursor: pointer;\n}\nbutton[part~='tab']:hover { color: inherit; }\nbutton[part~='tab-on'] {\n\tbackground: Canvas;\n\tcolor: inherit;\n\tbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n/* WebDAV provider quick-pick chips. */\n[part~='presets'] { display: flex; flex-wrap: wrap; gap: 0.4rem; }\nbutton[part~='preset'] {\n\tfont: inherit;\n\tfont-size: 0.85em;\n\tpadding: 0.3rem 0.75rem;\n\tborder: 1px solid var(--_border);\n\tborder-radius: 999px;\n\tbackground: transparent;\n\tcolor: inherit;\n\tcursor: pointer;\n}\nbutton[part~='preset']:hover { border-color: var(--_accent); }\nbutton[part~='preset-on'] {\n\tborder-color: var(--_accent);\n\tbackground: color-mix(in srgb, var(--_accent) 12%, transparent);\n}\nul[part~='list'] { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--_gap); }\nimg[part~='qr'] {\n\twidth: var(--selfstore-qr-size, 6.5em);\n\theight: var(--selfstore-qr-size, 6.5em);\n\tborder-radius: calc(var(--_radius) * 0.5);\n\tbackground: #ffffff;\n\tflex-shrink: 0;\n}\n/* Overflow menu. The trigger is a quiet in-card button; the open menu is a\n dropdown over the trigger's corner on wide screens and a bottom sheet on\n phones. The backdrop catches every outside click or tap (the standard\n dismiss), sitting above the sibling cards but under the panel. */\nbutton[part~='menu-button'] {\n\tborder: none;\n\tbackground: none;\n\tpadding: 0.25rem 0.6rem;\n\tfont-size: 1.1em;\n\tline-height: 1.3;\n\tborder-radius: calc(var(--_radius) * 0.5);\n\tcolor: var(--_ink-dim);\n\tcursor: pointer;\n}\nbutton[part~='menu-button']:hover,\nbutton[part~='menu-button'][aria-expanded='true'] {\n\tbackground: color-mix(in srgb, currentColor 10%, transparent);\n\tcolor: inherit;\n}\n[part~='card'] > button[part~='menu-button'] { align-self: flex-start; }\n[part~='menu-layer'] { display: contents; }\n[part~='menu-backdrop'] { position: fixed; inset: 0; z-index: 29; background: transparent; }\n[part~='menu'] {\n\tposition: absolute;\n\tright: 0.4rem;\n\ttop: 0.4rem;\n\tz-index: 30;\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 11rem;\n\tpadding: 0.3rem 0;\n\tborder: 1px solid var(--_border);\n\tborder-radius: calc(var(--_radius) * 0.75);\n\tbackground: Canvas;\n\tcolor: CanvasText;\n\tbox-shadow: 0 10px 30px rgba(0, 0, 0, 0.16);\n\toutline: none;\n}\nbutton[part~='menu-item'] {\n\tfont: inherit;\n\ttext-align: left;\n\tpadding: 0.55rem 0.95rem;\n\tborder: none;\n\tbackground: none;\n\tcolor: inherit;\n\tcursor: pointer;\n\twhite-space: nowrap;\n}\nbutton[part~='menu-item']:hover,\nbutton[part~='menu-item']:focus-visible {\n\tbackground: color-mix(in srgb, var(--_accent) 10%, transparent);\n}\nbutton[part~='menu-item-danger'] { color: var(--_danger); }\n@media (pointer: coarse) {\n\tbutton[part~='menu-item'] { padding: 0.8rem 1rem; }\n}\n@media (max-width: 500px) {\n\t[part~='menu-backdrop'] { background: rgba(0, 0, 0, 0.35); }\n\t[part~='menu'] {\n\t\tposition: fixed;\n\t\tinset: auto 0 0 0;\n\t\tborder-radius: var(--_radius) var(--_radius) 0 0;\n\t\tborder-bottom: none;\n\t\tmin-width: 0;\n\t\tpadding: 0.4rem 0 max(0.5rem, env(safe-area-inset-bottom));\n\t\tbox-shadow: 0 -12px 34px rgba(0, 0, 0, 0.28);\n\t}\n\tbutton[part~='menu-item'] { padding: 0.95rem 1.2rem; }\n}\n/* Responsive by default. The stack div above is the query container, so a\n widget reacts to ITS OWN width (a narrow column on a wide screen counts),\n and the host element's own sizing stays untouched. When the widget is\n narrow, a list card's row (QR + url + copy + revoke) would squeeze the\n text into a sliver: stack the card and centre the QR instead. */\n@container (max-width: 480px) {\n\tli[part~='card'] {\n\t\tflex-direction: column;\n\t\talign-items: stretch;\n\t}\n\tli[part~='card'] img[part~='qr'] { align-self: center; }\n\t/* Stacked cards must not push the overflow trigger below the body: it\n\t stays a top-right kebab (the card is position:relative already). */\n\tli[part~='card']:has(> button[part~='menu-button']) { padding-right: 2.4rem; }\n\tli[part~='card'] > button[part~='menu-button'] {\n\t\tposition: absolute;\n\t\ttop: 0.4rem;\n\t\tright: 0.4rem;\n\t}\n}\n`;\n\ntype Child = Node | string | null | undefined;\n\n/** Append children to an element, skipping null/undefined (conditional bits). */\nexport function put(el: HTMLElement, ...children: Child[]): void {\n\tfor (const c of children) {\n\t\tif (c == null) continue;\n\t\tel.append(typeof c === 'string' ? document.createTextNode(c) : c);\n\t}\n}\n\n/** Tiny DOM builder: h('button', { part: 'button', onclick }, label). */\nexport function h<K extends keyof HTMLElementTagNameMap>(\n\ttag: K,\n\tattrs: Record<string, unknown> = {},\n\t...children: Child[]\n): HTMLElementTagNameMap[K] {\n\tconst el = document.createElement(tag);\n\tfor (const [k, v] of Object.entries(attrs)) {\n\t\tif (v == null || v === false) continue;\n\t\tif (k.startsWith('on') && typeof v === 'function') {\n\t\t\tel.addEventListener(k.slice(2), v as EventListener);\n\t\t} else if (v === true) {\n\t\t\tel.setAttribute(k, '');\n\t\t} else {\n\t\t\tel.setAttribute(k, String(v));\n\t\t}\n\t}\n\tfor (const c of children) {\n\t\tif (c == null) continue;\n\t\tel.append(typeof c === 'string' ? document.createTextNode(c) : c);\n\t}\n\treturn el;\n}\n\n/** The common shell: shadow root + styles, label merging, focus-preserving\n * re-render, event emission, subscription cleanup. */\nexport abstract class FlowWidget extends HTMLElement {\n\tprotected root: ShadowRoot;\n\tprivate styleEl: HTMLStyleElement;\n\tprivate body: HTMLDivElement;\n\tprivate overrides: WidgetLabels = {};\n\tprotected unsub: (() => void) | null = null;\n\n\t/** The widget's EN default strings; subclasses provide theirs. */\n\tprotected abstract defaults(): WidgetLabels;\n\t/** Build the current view into the given container. */\n\tprotected abstract view(into: HTMLElement): void;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.root = this.attachShadow({ mode: 'open' });\n\t\tthis.styleEl = document.createElement('style');\n\t\tthis.styleEl.textContent = baseStyles;\n\t\tthis.body = document.createElement('div');\n\t\tthis.body.setAttribute('part', 'stack');\n\t\tthis.root.append(this.styleEl, this.body);\n\t}\n\n\t/** Partial override map, merged over the EN defaults (also the i18n hook). */\n\tget labels(): WidgetLabels {\n\t\treturn this.overrides;\n\t}\n\tset labels(map: WidgetLabels) {\n\t\tthis.overrides = map ?? {};\n\t\tthis.rerender();\n\t}\n\n\tprotected t(key: string): string {\n\t\treturn this.overrides[key] ?? this.defaults()[key] ?? key;\n\t}\n\n\t/** A heading an empty-string label removes: labels = { 'share.title': '' }\n\t * hides that heading (the host page already says it) without a fork.\n\t * Append through put(), which skips the null. */\n\tprotected heading(part: string, key: string): HTMLElement | null {\n\t\tconst text = this.t(key);\n\t\treturn text ? h('div', { part }, text) : null;\n\t}\n\n\t/** Map a flow error to copy: labels can override per labelKey\n\t * ('error.targetUnavailable', ...), with a generic fallback. */\n\tprotected errorText(labelKey: string | undefined): string {\n\t\tif (labelKey) {\n\t\t\tconst specific = this.overrides[labelKey] ?? this.defaults()[labelKey];\n\t\t\tif (specific) return specific;\n\t\t}\n\t\treturn this.t('error.generic');\n\t}\n\n\tprotected emit(name: string, detail?: unknown): void {\n\t\tthis.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n\t}\n\n\t/** Rebuild the body, keeping the focused input's value and focus across the\n\t * rebuild (inputs carry data-keep so typing survives a snapshot change). */\n\tprotected rerender(): void {\n\t\t// happy-dom's ShadowRoot.activeElement throws once the focused node was\n\t\t// replaced by an earlier rebuild; browsers just report null/body.\n\t\tlet active: HTMLInputElement | null;\n\t\ttry {\n\t\t\tactive = this.root.activeElement as HTMLInputElement | null;\n\t\t} catch {\n\t\t\tactive = null;\n\t\t}\n\t\tconst keep = active?.getAttribute?.('data-keep') ?? null;\n\t\tconst value = active?.value;\n\t\tthis.body.replaceChildren();\n\t\tthis.view(this.body);\n\t\tif (keep != null) {\n\t\t\tconst again = this.body.querySelector<HTMLInputElement>(`[data-keep=\"${keep}\"]`);\n\t\t\tif (again) {\n\t\t\t\tif (value != null) again.value = value;\n\t\t\t\tagain.focus();\n\t\t\t}\n\t\t}\n\t}\n\n\tdisconnectedCallback(): void {\n\t\tthis.unsub?.();\n\t\tthis.unsub = null;\n\t}\n}\n","/**\n * <selfstore-connect>: the \"where does my data live\" journey, ready to drop\n * in. A thin skin over connectFlow - every ordering and failure rule lives in\n * the flow (and its tests); this element only renders the snapshot and calls\n * the actions. Theme it with --selfstore-* custom properties and ::part()\n * selectors; reword or localize it through the `labels` property.\n *\n * import { defineSelfstoreWidgets } from 'selfstore/widgets';\n * defineSelfstoreWidgets();\n *\n * const el = document.querySelector('selfstore-connect');\n * el.store = store; // simple store (or a FlowHost)\n * el.targets = { drive: gisDriveAuth({ clientId }), file: true };\n * el.addEventListener('selfstore-connected', (e) => ...e.detail.outcome...);\n */\n\nimport type { WebdavConfig } from '../persistence/targets/webdav';\nimport type { S3Config } from '../persistence/targets/s3';\nimport {\n\tconnectFlow,\n\ttype ConnectFlow,\n\ttype ConnectFlowOptions,\n\ttype ConnectKind,\n\ttype ConnectSnapshot,\n\ttype ConnectTargets,\n\ttype FlowHost\n} from '../flows/connect';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\n/** A named WebDAV provider offered in the connect form's quick-pick row, so a\n * user can start from their host instead of a blank URL field. selfstore ships\n * no list - the app supplies whichever providers it wants to surface (its own\n * server, a sovereign host, ...); the widget just renders them and pre-fills the\n * URL field on pick. Pure UI sugar over the same WebDAV form. */\nexport interface WebdavPreset {\n\t/** Stable id (also the `data-preset` attribute, for theming/tests). */\n\tid: string;\n\t/** Button text: the provider or host name. */\n\tlabel: string;\n\t/** Base server URL that pre-fills the WebDAV URL field when picked. Omit for a\n\t * label-only entry (the user then types the full URL themselves). */\n\turl?: string;\n\t/** Optional guidance, shown as a line under the form once this preset is\n\t * picked (e.g. where to find the app password for this host) and as the\n\t * quick-pick button's tooltip. */\n\thelp?: string;\n\t/** Optional link appended to the `help` line (e.g. a how-to page). */\n\thelpUrl?: string;\n\t/** Optional \"create an account\" link shown once this preset is picked, for a\n\t * user who has no account with the host yet. The app owns the URL; selfstore\n\t * hard-codes no provider. */\n\tsignupUrl?: string;\n}\n\nconst EN: WidgetLabels = {\n\t'connect.title': 'Where should we save your data?',\n\t'connect.recommended': 'Recommended',\n\t'connect.drive': 'Google Drive',\n\t'connect.drive.sub': 'Available on all your devices',\n\t'connect.file': 'A file on this device',\n\t'connect.file.sub': 'Offline, you keep the file',\n\t'connect.file.new': 'New backup',\n\t'connect.file.open': 'Load an existing file',\n\t'connect.webdav': 'My own server (WebDAV)',\n\t'connect.webdav.sub': 'Nextcloud, ownCloud, yours',\n\t'connect.s3': 'My own bucket (S3)',\n\t'connect.s3.sub': 'Amazon S3, R2, B2, MinIO',\n\t'connect.server': 'My own server',\n\t'connect.server.sub': 'WebDAV or an S3 bucket you control',\n\t'connect.tab.webdav': 'WebDAV',\n\t'connect.tab.s3': 'S3',\n\t'connect.s3.endpoint': 'Endpoint URL',\n\t'connect.s3.region': 'Region',\n\t'connect.s3.bucket': 'Bucket',\n\t'connect.s3.key': 'Object key (path)',\n\t'connect.s3.accessKeyId': 'Access key ID',\n\t'connect.s3.secret': 'Secret access key',\n\t'connect.s3.submit': 'Connect',\n\t'connect.connecting': 'Connecting...',\n\t'connect.connecting.drive': 'Authorise access in the Google window.',\n\t'connect.cancel': 'Cancel',\n\t'connect.retry': 'Try again',\n\t'connect.password.title': 'This backup is protected',\n\t'connect.password.hint': 'Enter its password to open it.',\n\t'connect.password.placeholder': 'Password',\n\t'connect.password.wrong': 'Wrong password. Try again.',\n\t'connect.password.submit': 'Open',\n\t'connect.password.show': 'Show password',\n\t'connect.password.hide': 'Hide password',\n\t'connect.password.forgot': 'Forgot the password?',\n\t'connect.password.forgot.warn':\n\t\t'Without the password, this backup cannot be opened. You can erase it and start from an empty one. The old backup is lost for good.',\n\t'connect.password.forgot.confirm': 'Overwrite the backup',\n\t'connect.password.forgot.back': 'Back',\n\t'connect.conflict.title': 'This destination already holds a backup',\n\t'connect.conflict.merge': 'Merge both',\n\t'connect.conflict.merge.sub': 'Keep everything from both sides',\n\t'connect.conflict.resume': 'Use the backup',\n\t'connect.conflict.resume.sub': 'This device adopts it',\n\t'connect.conflict.replace': 'Replace the backup',\n\t'connect.conflict.replace.sub': 'This device wins, the backup is overwritten',\n\t'connect.webdav.url': 'Server URL',\n\t'connect.webdav.user': 'Username',\n\t'connect.webdav.password': 'Password',\n\t'connect.webdav.submit': 'Connect',\n\t'connect.webdav.signup': 'Create an account',\n\t'connect.webdav.help.more': 'How?',\n\t'connect.done': 'Connected. Your data is saved.',\n\t'connect.done.manual': 'Download mode: save the file after each change.',\n\t'error.generic': 'That did not work. Check the connection and try again.',\n\t'error.targetUnavailable': 'The destination did not answer. Try again in a moment.',\n\t'error.authExpired': 'Access expired: reconnect to continue.',\n\t'error.decryptFailed': 'This backup could not be opened with that password.',\n\t'error.badFormat': 'This file does not look like a readable backup.'\n};\n\n// Two glyphs for the password eye: an open eye when the value is hidden (click\n// to reveal), a struck-through eye when it is shown (click to hide). Plain\n// stroke SVG, currentColor, so they inherit the host's text color like any icon.\nconst EYE_SHOW =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 12s3-8 10-8 10 8 10 8-3 8-10 8-10-8-10-8Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>';\nconst EYE_HIDE =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 10 8 10 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"/><path d=\"M6.61 6.61A18.45 18.45 0 0 0 2 12s3 8 10 8a9.12 9.12 0 0 0 5.39-1.61\"/><line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\"/></svg>';\n\n/** Build the eye glyph for the current visibility (shown value -> struck eye). */\nfunction eyeIcon(visible: boolean): SVGElement {\n\tconst span = document.createElement('span');\n\tspan.innerHTML = visible ? EYE_HIDE : EYE_SHOW;\n\treturn span.firstElementChild as SVGElement;\n}\n\nexport class SelfstoreConnectElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['recommended', 'advanced'];\n\t}\n\n\t#store: FlowHost | { flowHost: FlowHost } | null = null;\n\t#targets: ConnectTargets | null = null;\n\t#options: ConnectFlowOptions = {};\n\t#flow: ConnectFlow | null = null;\n\t#recommended: ConnectKind | null = null;\n\t#icons: Partial<Record<ConnectKind, string>> = {};\n\t#advanced: ConnectKind[] = [];\n\t#webdavPresets: WebdavPreset[] = [];\n\t#webdavUrl = '';\n\t#webdavUser = '';\n\t#webdavPass = '';\n\t#pickedPreset: WebdavPreset | null = null;\n\t// S3 form fields (kept on the element, like the WebDAV ones, so switching the\n\t// server tab never loses what was typed).\n\t#s3Endpoint = '';\n\t#s3Region = '';\n\t#s3Bucket = '';\n\t#s3Key = '';\n\t#s3AccessKeyId = '';\n\t#s3Secret = '';\n\t// Password-step local UI state (never in the flow: purely how this element\n\t// draws the step). Reset whenever the flow leaves 'password' (see wire()).\n\t#pwVisible = false;\n\t#confirmOverwrite = false;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\t/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */\n\tget store(): FlowHost | { flowHost: FlowHost } | null {\n\t\treturn this.#store;\n\t}\n\tset store(v: FlowHost | { flowHost: FlowHost } | null) {\n\t\tthis.#store = v;\n\t\tthis.wire();\n\t}\n\n\tget targets(): ConnectTargets | null {\n\t\treturn this.#targets;\n\t}\n\tset targets(v: ConnectTargets | null) {\n\t\tthis.#targets = v;\n\t\tthis.wire();\n\t}\n\n\tget options(): ConnectFlowOptions {\n\t\treturn this.#options;\n\t}\n\tset options(v: ConnectFlowOptions) {\n\t\tthis.#options = v ?? {};\n\t\tthis.wire();\n\t}\n\n\t/** Badge one destination as the one to pick (part=\"tag\", label\n\t * 'connect.recommended'). Purely a highlight: the order still follows the\n\t * targets object. Also the `recommended` attribute. Default: none. */\n\tget recommended(): ConnectKind | null {\n\t\treturn this.#recommended;\n\t}\n\tset recommended(v: ConnectKind | null) {\n\t\tthis.#recommended = v === 'drive' || v === 'file' || v === 'webdav' || v === 's3' ? v : null;\n\t\tthis.rerender();\n\t}\n\n\t/** An optional icon per destination - an image URL or data URI, rendered as\n\t * part=\"icon\" at the head of that card. Purely decorative and per-instance;\n\t * omit a kind for no icon. Size it with --selfstore-icon-size. */\n\tget icons(): Partial<Record<ConnectKind, string>> {\n\t\treturn this.#icons;\n\t}\n\tset icons(v: Partial<Record<ConnectKind, string>> | null) {\n\t\tthis.#icons = v ?? {};\n\t\tthis.rerender();\n\t}\n\n\t/** Destinations to tuck behind a discreet link under the cards instead of a\n\t * full card - for power-user options (say, WebDAV) that must stay reachable\n\t * without weighing the everyday choice. Also the `advanced` attribute\n\t * (comma-separated). The journey after the click is exactly the same. */\n\tget advanced(): ConnectKind[] {\n\t\treturn this.#advanced;\n\t}\n\tset advanced(v: ConnectKind[] | null) {\n\t\tthis.#advanced = (v ?? []).filter(\n\t\t\t(k) => k === 'drive' || k === 'file' || k === 'webdav' || k === 's3'\n\t\t);\n\t\tthis.rerender();\n\t}\n\n\t/** Named WebDAV providers offered as a quick-pick row above the WebDAV form,\n\t * pre-filling the URL field. The app owns the list (its own host, sovereign\n\t * providers, ...); selfstore ships none. Purely additive - the blank form\n\t * still works. */\n\tget webdavPresets(): WebdavPreset[] {\n\t\treturn this.#webdavPresets;\n\t}\n\tset webdavPresets(v: WebdavPreset[] | null) {\n\t\tthis.#webdavPresets = Array.isArray(v) ? v : [];\n\t\tthis.rerender();\n\t}\n\n\t/** The underlying flow, for programmatic control (may be null until wired). */\n\tget flow(): ConnectFlow | null {\n\t\treturn this.#flow;\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'recommended') this.recommended = value as ConnectKind | null;\n\t\tif (name === 'advanced') {\n\t\t\tthis.advanced = (value ?? '').split(',').map((s) => s.trim()) as ConnectKind[];\n\t\t}\n\t}\n\n\tconnectedCallback(): void {\n\t\tif (this.#recommended === null && this.hasAttribute('recommended')) {\n\t\t\tthis.recommended = this.getAttribute('recommended') as ConnectKind;\n\t\t}\n\t\tif (this.#advanced.length === 0 && this.hasAttribute('advanced')) {\n\t\t\tthis.advanced = (this.getAttribute('advanced') ?? '')\n\t\t\t\t.split(',')\n\t\t\t\t.map((s) => s.trim()) as ConnectKind[];\n\t\t}\n\t\tthis.wire();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#store || !this.#targets) return;\n\t\tthis.unsub?.();\n\t\tthis.#flow = connectFlow(this.#store, this.#targets, this.#options);\n\t\tlet last: ConnectSnapshot | null = null;\n\t\tthis.unsub = this.#flow.subscribe((snap) => {\n\t\t\tconst was = last;\n\t\t\tlast = snap;\n\t\t\tif (snap.step === 'connected' && was?.step !== 'connected') {\n\t\t\t\tthis.emit('selfstore-connected', { outcome: snap.outcome });\n\t\t\t}\n\t\t\tif (snap.step === 'error' && was?.step !== 'error') {\n\t\t\t\tthis.emit('selfstore-error', { error: snap.error });\n\t\t\t}\n\t\t\t// Leaving the password step clears its local UI state, so a later\n\t\t\t// return starts masked and on the form (not on a stale confirmation).\n\t\t\tif (snap.step !== 'password') {\n\t\t\t\tthis.#pwVisible = false;\n\t\t\t\tthis.#confirmOverwrite = false;\n\t\t\t}\n\t\t\tthis.rerender();\n\t\t});\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst flow = this.#flow;\n\t\tif (!flow) return; // inert until wired\n\t\tconst s = flow.snapshot;\n\n\t\tif (s.step === 'choose') {\n\t\t\tput(into, this.heading('title', 'connect.title'));\n\t\t\t// WebDAV and S3 are both \"your own server\": when both are offered as\n\t\t\t// cards, fold them into one entry that opens the tabbed form, so a new\n\t\t\t// backend never adds another top-level button.\n\t\t\tconst serverKinds = (['webdav', 's3'] as const).filter(\n\t\t\t\t(k) => s.kinds.includes(k) && !this.#advanced.includes(k)\n\t\t\t);\n\t\t\tconst groupServer = serverKinds.length >= 2;\n\t\t\tfor (const kind of s.kinds) {\n\t\t\t\tif (this.#advanced.includes(kind)) continue;\n\t\t\t\tif (groupServer && (kind === 'webdav' || kind === 's3')) {\n\t\t\t\t\tif (kind === serverKinds[0]) into.append(this.serverCard(serverKinds[0]));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tinto.append(this.destCard(kind));\n\t\t\t}\n\t\t\t// The tucked-away destinations: same journey, discreet entry.\n\t\t\tfor (const kind of s.kinds) {\n\t\t\t\tif (this.#advanced.includes(kind)) {\n\t\t\t\t\tinto.append(\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: 'link advanced-link',\n\t\t\t\t\t\t\t\t'data-kind': kind,\n\t\t\t\t\t\t\t\tonclick: () => this.#flow?.choose(kind)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.t(`connect.${kind}`)\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'form') {\n\t\t\tconst kind = s.kind === 's3' ? 's3' : 'webdav';\n\t\t\t// The WebDAV/S3 toggle shows only when both are offered as form kinds\n\t\t\t// (a fixed config skips the form and never reaches here).\n\t\t\tconst tabbed =\n\t\t\t\t(['webdav', 's3'] as const).filter((k) => this.#targets?.[k] === true).length >= 2;\n\t\t\tconst children: HTMLElement[] = [\n\t\t\t\th('div', { part: 'title' }, this.t(tabbed ? 'connect.server' : `connect.${kind}`))\n\t\t\t];\n\t\t\tif (tabbed) children.push(this.serverTabs(kind));\n\t\t\tchildren.push(...(kind === 's3' ? this.s3FormChildren(flow) : this.webdavFormChildren(flow)));\n\t\t\tinto.append(...children);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'authorizing') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'status' },\n\t\t\t\t\th('span', { part: 'spinner', 'aria-hidden': 'true' }),\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{},\n\t\t\t\t\t\th('div', { part: 'title' }, this.t('connect.connecting')),\n\t\t\t\t\t\ts.kind === 'drive'\n\t\t\t\t\t\t\t? h('div', { part: 'sub' }, this.t('connect.connecting.drive'))\n\t\t\t\t\t\t\t: null\n\t\t\t\t\t),\n\t\t\t\t\th('button', { part: 'button', onclick: () => this.cancel() }, this.t('connect.cancel'))\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'password') {\n\t\t\t// Escape sub-state: the password is forgotten - confirm erasing the\n\t\t\t// protected backup before overwrite() makes it unrecoverable.\n\t\t\tif (this.#confirmOverwrite) {\n\t\t\t\tput(\n\t\t\t\t\tinto,\n\t\t\t\t\th('div', { part: 'title' }, this.t('connect.password.title')),\n\t\t\t\t\th('div', { part: 'hint warn-note' }, this.t('connect.password.forgot.warn')),\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'button button-danger', disabled: s.busy, onclick: () => this.doOverwrite() },\n\t\t\t\t\t\t\tthis.t('connect.password.forgot.confirm')\n\t\t\t\t\t\t),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'button', disabled: s.busy, onclick: () => this.setConfirmOverwrite(false) },\n\t\t\t\t\t\t\tthis.t('connect.password.forgot.back')\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// The password field wears a show/hide eye. The eye toggles the input\n\t\t\t// type in place (never a re-render) so the typed value is never lost.\n\t\t\tconst field = h(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'field' },\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\ttype: this.#pwVisible ? 'text' : 'password',\n\t\t\t\t\tplaceholder: this.t('connect.password.placeholder'),\n\t\t\t\t\t'data-keep': 'password',\n\t\t\t\t\tautocomplete: 'current-password'\n\t\t\t\t}),\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'eye',\n\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t'aria-label': this.t(\n\t\t\t\t\t\t\tthis.#pwVisible ? 'connect.password.hide' : 'connect.password.show'\n\t\t\t\t\t\t),\n\t\t\t\t\t\t'aria-pressed': this.#pwVisible ? 'true' : 'false',\n\t\t\t\t\t\tonclick: () => this.togglePassword()\n\t\t\t\t\t},\n\t\t\t\t\teyeIcon(this.#pwVisible)\n\t\t\t\t)\n\t\t\t);\n\t\t\tput(\n\t\t\t\tinto,\n\t\t\t\th('div', { part: 'title' }, this.t('connect.password.title')),\n\t\t\t\th('div', { part: 'hint' }, this.t('connect.password.hint')),\n\t\t\t\tfield,\n\t\t\t\ts.passwordError ? h('div', { part: 'error-note' }, this.t('connect.password.wrong')) : null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\tdisabled: s.busy,\n\t\t\t\t\t\t\tonclick: () => this.submitPassword()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('connect.password.submit')\n\t\t\t\t\t),\n\t\t\t\t\t// Cancel is never disabled, even mid-trial-read: a hung leg must\n\t\t\t\t\t// always have a working way out. The generation counter makes a\n\t\t\t\t\t// late resolution of the abandoned leg a no-op, so leaving is safe.\n\t\t\t\t\th('button', { part: 'button', onclick: () => this.cancel() }, this.t('connect.cancel'))\n\t\t\t\t),\n\t\t\t\t// The forgotten-password escape: a discreet link into the confirm\n\t\t\t\t// sub-state above (erasing the backup is never one careless click).\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'link forgot-link', onclick: () => this.setConfirmOverwrite(true) },\n\t\t\t\t\tthis.t('connect.password.forgot')\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'conflict') {\n\t\t\tinto.append(h('div', { part: 'title' }, this.t('connect.conflict.title')));\n\t\t\tfor (const how of ['merge', 'resume', 'replace'] as const) {\n\t\t\t\tinto.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{ part: 'card', disabled: s.busy, onclick: () => flow.resolveConflict(how) },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{},\n\t\t\t\t\t\t\th('div', { part: 'title' }, this.t(`connect.conflict.${how}`)),\n\t\t\t\t\t\t\th('div', { part: 'sub' }, this.t(`connect.conflict.${how}.sub`))\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tinto.append(\n\t\t\t\th('button', { part: 'link', onclick: () => this.cancel() }, this.t('connect.cancel'))\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'connected') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'status status-ok' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\t\tthis.t(s.outcome === 'manual' ? 'connect.done.manual' : 'connect.done')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// error: retry goes back to the choices; cancel is always offered too, so\n\t\t// a failing destination is never a dead end (the host hears\n\t\t// selfstore-cancelled and can dismiss the widget entirely).\n\t\tinto.append(\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'status status-error' },\n\t\t\t\th('div', { part: 'title' }, this.errorText(s.error?.labelKey))\n\t\t\t),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'button button-primary', onclick: () => flow.retry() },\n\t\t\t\t\tthis.t('connect.retry')\n\t\t\t\t),\n\t\t\t\th('button', { part: 'button', onclick: () => this.cancel() }, this.t('connect.cancel'))\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate destCard(kind: ConnectKind): HTMLElement {\n\t\tconst icon = this.#icons[kind];\n\t\tconst head = icon ? h('img', { part: 'icon', src: icon, alt: '' }) : null;\n\t\tconst title = h(\n\t\t\t'div',\n\t\t\t{ part: 'title' },\n\t\t\tthis.t(`connect.${kind}`),\n\t\t\tthis.#recommended === kind ? h('span', { part: 'tag' }, this.t('connect.recommended')) : null\n\t\t);\n\t\tconst sub = h('div', { part: 'sub' }, this.t(`connect.${kind}.sub`));\n\n\t\t// A file target declared with the object form offers TWO gestures on one\n\t\t// card: start a new backup, or adopt an existing file. Buttons cannot\n\t\t// nest, so this card is a div carrying its own action row. The open\n\t\t// gesture needs the browser's open picker; without it only new remains.\n\t\tconst fileSpec = kind === 'file' ? this.#targets?.file : null;\n\t\tif (fileSpec && typeof fileSpec === 'object') {\n\t\t\tconst openSupported = typeof window !== 'undefined' && 'showOpenFilePicker' in window;\n\t\t\tconst actions = h('div', { part: 'row' });\n\t\t\tif (fileSpec.create != null) {\n\t\t\t\tactions.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t'data-action': 'create',\n\t\t\t\t\t\t\tonclick: () => this.#flow?.choose('file', 'create')\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('connect.file.new')\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (fileSpec.open != null && (typeof fileSpec.open === 'function' || openSupported)) {\n\t\t\t\tactions.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button',\n\t\t\t\t\t\t\t'data-action': 'open',\n\t\t\t\t\t\t\tonclick: () => this.#flow?.choose('file', 'open')\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('connect.file.open')\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst body = h('div', {}, title, sub);\n\t\t\tif (actions.childElementCount > 0) body.append(actions);\n\t\t\treturn h('div', { part: 'card', 'data-kind': kind }, head, body);\n\t\t}\n\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{ part: 'card', 'data-kind': kind, onclick: () => this.#flow?.choose(kind) },\n\t\t\thead,\n\t\t\th('div', {}, title, sub)\n\t\t);\n\t}\n\n\t/** The grouped \"your own server\" card shown when both WebDAV and S3 are\n\t * offered: one entry into the tabbed form, opening on the first server kind. */\n\tprivate serverCard(defaultKind: ConnectKind): HTMLElement {\n\t\tconst recommended = this.#recommended === 'webdav' || this.#recommended === 's3';\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{ part: 'card', 'data-kind': 'server', onclick: () => this.#flow?.choose(defaultKind) },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{},\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\tthis.t('connect.server'),\n\t\t\t\t\trecommended ? h('span', { part: 'tag' }, this.t('connect.recommended')) : null\n\t\t\t\t),\n\t\t\t\th('div', { part: 'sub' }, this.t('connect.server.sub'))\n\t\t\t)\n\t\t);\n\t}\n\n\t/** WebDAV/S3 segmented toggle. Switching leaves the form and re-enters it on\n\t * the other kind - no flow surgery - and the typed fields live on the element,\n\t * so nothing the user wrote is lost across the switch. */\n\tprivate serverTabs(active: ConnectKind): HTMLElement {\n\t\tconst tab = (k: 'webdav' | 's3'): HTMLElement =>\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{\n\t\t\t\t\tpart: active === k ? 'tab tab-on' : 'tab',\n\t\t\t\t\ttype: 'button',\n\t\t\t\t\t'data-tab': k,\n\t\t\t\t\t'aria-pressed': active === k ? 'true' : 'false',\n\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\tif (active === k) return;\n\t\t\t\t\t\tthis.#flow?.cancel();\n\t\t\t\t\t\tthis.#flow?.choose(k);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tthis.t(`connect.tab.${k}`)\n\t\t\t);\n\t\treturn h('div', { part: 'tabs' }, tab('webdav'), tab('s3'));\n\t}\n\n\tprivate webdavFormChildren(flow: ConnectFlow): HTMLElement[] {\n\t\tconst picked = this.#pickedPreset;\n\t\tconst out: HTMLElement[] = [];\n\t\t// Optional quick-pick row: the app's WebDAV providers, pre-filling the URL.\n\t\tif (this.#webdavPresets.length > 0) {\n\t\t\tout.push(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'presets' },\n\t\t\t\t\t...this.#webdavPresets.map((p) =>\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: picked?.id === p.id ? 'preset preset-on' : 'preset',\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t'data-preset': p.id,\n\t\t\t\t\t\t\t\t'aria-pressed': picked?.id === p.id ? 'true' : 'false',\n\t\t\t\t\t\t\t\ttitle: p.help ?? '',\n\t\t\t\t\t\t\t\tonclick: () => this.pickWebdavPreset(p)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tp.label\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tout.push(\n\t\t\th('input', {\n\t\t\t\tpart: 'input',\n\t\t\t\ttype: 'url',\n\t\t\t\tplaceholder: this.t('connect.webdav.url'),\n\t\t\t\t'data-keep': 'wd-url',\n\t\t\t\tvalue: this.#webdavUrl,\n\t\t\t\toninput: (e: Event) => (this.#webdavUrl = (e.target as HTMLInputElement).value)\n\t\t\t}),\n\t\t\th('input', {\n\t\t\t\tpart: 'input',\n\t\t\t\ttype: 'text',\n\t\t\t\tplaceholder: this.t('connect.webdav.user'),\n\t\t\t\t'data-keep': 'wd-user',\n\t\t\t\tvalue: this.#webdavUser,\n\t\t\t\toninput: (e: Event) => (this.#webdavUser = (e.target as HTMLInputElement).value)\n\t\t\t}),\n\t\t\th('input', {\n\t\t\t\tpart: 'input',\n\t\t\t\ttype: 'password',\n\t\t\t\tplaceholder: this.t('connect.webdav.password'),\n\t\t\t\t'data-keep': 'wd-pass',\n\t\t\t\tvalue: this.#webdavPass,\n\t\t\t\toninput: (e: Event) => (this.#webdavPass = (e.target as HTMLInputElement).value)\n\t\t\t})\n\t\t);\n\t\t// A picked provider may carry guidance and a sign-up link (no account yet).\n\t\tif (picked?.help) {\n\t\t\tout.push(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'hint webdav-note' },\n\t\t\t\t\tpicked.help,\n\t\t\t\t\tpicked.helpUrl\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'a',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpart: 'link webdav-help',\n\t\t\t\t\t\t\t\t\thref: picked.helpUrl,\n\t\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t\t\trel: 'noopener noreferrer'\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t` ${this.t('connect.webdav.help.more')}`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tout.push(\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'button button-primary', onclick: () => this.submitWebdav() },\n\t\t\t\t\tthis.t('connect.webdav.submit')\n\t\t\t\t),\n\t\t\t\th('button', { part: 'button', onclick: () => flow.cancel() }, this.t('connect.cancel'))\n\t\t\t)\n\t\t);\n\t\tif (picked?.signupUrl) {\n\t\t\tout.push(\n\t\t\t\th(\n\t\t\t\t\t'a',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'link webdav-signup',\n\t\t\t\t\t\thref: picked.signupUrl,\n\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\trel: 'noopener noreferrer'\n\t\t\t\t\t},\n\t\t\t\t\tthis.t('connect.webdav.signup')\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate s3FormChildren(flow: ConnectFlow): HTMLElement[] {\n\t\tconst field = (\n\t\t\ttype: string,\n\t\t\tlabel: string,\n\t\t\tkeep: string,\n\t\t\tget: () => string,\n\t\t\tset: (v: string) => void\n\t\t): HTMLElement =>\n\t\t\th('input', {\n\t\t\t\tpart: 'input',\n\t\t\t\ttype,\n\t\t\t\tplaceholder: this.t(label),\n\t\t\t\t'data-keep': keep,\n\t\t\t\tvalue: get(),\n\t\t\t\toninput: (e: Event) => set((e.target as HTMLInputElement).value)\n\t\t\t});\n\t\treturn [\n\t\t\tfield(\n\t\t\t\t'url',\n\t\t\t\t'connect.s3.endpoint',\n\t\t\t\t's3-endpoint',\n\t\t\t\t() => this.#s3Endpoint,\n\t\t\t\t(v) => (this.#s3Endpoint = v)\n\t\t\t),\n\t\t\tfield(\n\t\t\t\t'text',\n\t\t\t\t'connect.s3.region',\n\t\t\t\t's3-region',\n\t\t\t\t() => this.#s3Region,\n\t\t\t\t(v) => (this.#s3Region = v)\n\t\t\t),\n\t\t\tfield(\n\t\t\t\t'text',\n\t\t\t\t'connect.s3.bucket',\n\t\t\t\t's3-bucket',\n\t\t\t\t() => this.#s3Bucket,\n\t\t\t\t(v) => (this.#s3Bucket = v)\n\t\t\t),\n\t\t\tfield(\n\t\t\t\t'text',\n\t\t\t\t'connect.s3.key',\n\t\t\t\t's3-key',\n\t\t\t\t() => this.#s3Key,\n\t\t\t\t(v) => (this.#s3Key = v)\n\t\t\t),\n\t\t\tfield(\n\t\t\t\t'text',\n\t\t\t\t'connect.s3.accessKeyId',\n\t\t\t\t's3-akid',\n\t\t\t\t() => this.#s3AccessKeyId,\n\t\t\t\t(v) => (this.#s3AccessKeyId = v)\n\t\t\t),\n\t\t\tfield(\n\t\t\t\t'password',\n\t\t\t\t'connect.s3.secret',\n\t\t\t\t's3-secret',\n\t\t\t\t() => this.#s3Secret,\n\t\t\t\t(v) => (this.#s3Secret = v)\n\t\t\t),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'button button-primary', onclick: () => this.submitS3() },\n\t\t\t\t\tthis.t('connect.s3.submit')\n\t\t\t\t),\n\t\t\t\th('button', { part: 'button', onclick: () => flow.cancel() }, this.t('connect.cancel'))\n\t\t\t)\n\t\t];\n\t}\n\n\tprivate submitS3(): void {\n\t\tconst endpoint = this.#s3Endpoint.trim();\n\t\tconst region = this.#s3Region.trim();\n\t\tconst bucket = this.#s3Bucket.trim();\n\t\tconst key = this.#s3Key.trim();\n\t\tif (!endpoint || !region || !bucket || !key) return;\n\t\tconst config: S3Config = {\n\t\t\tendpoint,\n\t\t\tregion,\n\t\t\tbucket,\n\t\t\tkey,\n\t\t\taccessKeyId: this.#s3AccessKeyId.trim(),\n\t\t\tsecretAccessKey: this.#s3Secret\n\t\t};\n\t\tthis.#flow?.submitS3(config);\n\t}\n\n\tprivate cancel(): void {\n\t\tthis.#flow?.cancel();\n\t\tthis.emit('selfstore-cancelled');\n\t}\n\n\tprivate submitPassword(): void {\n\t\tconst input = this.root.querySelector<HTMLInputElement>('[data-keep=\"password\"]');\n\t\tif (input) this.#flow?.submitPassword(input.value);\n\t}\n\n\t/** Flip the password field between hidden and shown IN PLACE - swap the\n\t * input type and the eye glyph without a re-render, so what the user has\n\t * already typed survives the toggle. */\n\tprivate togglePassword(): void {\n\t\tthis.#pwVisible = !this.#pwVisible;\n\t\tconst input = this.root.querySelector<HTMLInputElement>('[data-keep=\"password\"]');\n\t\tif (input) {\n\t\t\tinput.type = this.#pwVisible ? 'text' : 'password';\n\t\t\tinput.focus();\n\t\t}\n\t\tconst eye = this.root.querySelector<HTMLButtonElement>('[part~=\"eye\"]');\n\t\tif (eye) {\n\t\t\teye.setAttribute(\n\t\t\t\t'aria-label',\n\t\t\t\tthis.t(this.#pwVisible ? 'connect.password.hide' : 'connect.password.show')\n\t\t\t);\n\t\t\teye.setAttribute('aria-pressed', this.#pwVisible ? 'true' : 'false');\n\t\t\teye.replaceChildren(eyeIcon(this.#pwVisible));\n\t\t}\n\t}\n\n\t/** Enter or leave the forgotten-password confirmation sub-state. */\n\tprivate setConfirmOverwrite(on: boolean): void {\n\t\tthis.#confirmOverwrite = on;\n\t\tthis.rerender();\n\t}\n\n\t/** Confirmed: abandon the forgotten password and start a fresh backup over\n\t * the protected one (the flow makes this device win). */\n\tprivate doOverwrite(): void {\n\t\tthis.#flow?.overwrite();\n\t}\n\n\t/** Fill the WebDAV URL field from a picked provider preset and move focus on to\n\t * the username, so the pick just seeds the form the user then completes. The\n\t * pick is remembered so its guidance / sign-up link render and its chip flags\n\t * as active; a re-render keeps the already-typed username and password. */\n\tprivate pickWebdavPreset(p: WebdavPreset): void {\n\t\tthis.#pickedPreset = p;\n\t\tthis.#webdavUrl = p.url ?? '';\n\t\tthis.rerender();\n\t\tthis.root.querySelector<HTMLInputElement>('[data-keep=\"wd-user\"]')?.focus();\n\t}\n\n\tprivate submitWebdav(): void {\n\t\tconst url = this.#webdavUrl.trim();\n\t\tif (!url) return;\n\t\tconst config: WebdavConfig = {\n\t\t\turl,\n\t\t\tusername: this.#webdavUser.trim(),\n\t\t\tpassword: this.#webdavPass\n\t\t};\n\t\tthis.#flow?.submitWebdav(config);\n\t}\n}\n","// <selfstore-share>: the share panel over shareFlow, driving an app-provided\n// ShareEngine (how links travel is the app's business).\n//\n// One link per level: each level shows its live link or offers to create it.\n// No second write link next to a first (which one was live?), no name to\n// invent - the level says what it is. Links the engine lists always render,\n// whatever `levels` says: the panel never hides an access that exists.\n//\n// Knobs (all optional): levels, with-create / with-members, confirmAction\n// (host veto over destructive actions), qrProvider (injected, so the element\n// stays zero-dependency). Engines exposing revokeAll get a \"stop sharing\"\n// foot link, rendered only once somebody besides you is in the member list.\n\nimport { shareFlow, type ShareEngine, type ShareFlow, type ShareLevel } from '../flows/share';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'share.title': 'Sharing',\n\t'share.create.read': 'Create a view link',\n\t'share.create.write': 'Create an edit link',\n\t'share.creating': 'Creating...',\n\t'share.level.read': 'Can view',\n\t'share.level.write': 'Can edit',\n\t'share.copy': 'Copy',\n\t'share.copied': 'Copied',\n\t'share.revoke': 'Revoke',\n\t'share.members': 'People with access',\n\t'share.member.you': 'you',\n\t'share.member.owner': 'owner',\n\t'share.remove': 'Remove',\n\t'share.stop': 'Stop sharing',\n\t'share.empty': 'Nobody else has access yet.',\n\t'share.stale': 'Connection hiccup: this view may be behind.',\n\t'error.generic': 'That did not work. Check the connection and try again.',\n\t'error.targetUnavailable': 'The share service did not answer. Try again in a moment.'\n};\n\n/** A destructive action, offered to confirmAction before it runs: a row's\n * revoke/remove, or 'stop' - ending the whole share. */\nexport type ShareAction = { type: 'revoke' | 'remove'; id: string } | { type: 'stop' };\n\n/** \"off\"-style attribute values; anything else (including empty) reads as on. */\nconst isOff = (v: string | null): boolean =>\n\tv != null && ['off', 'false', 'no', '0'].includes(v.trim().toLowerCase());\n\nexport class SelfstoreShareElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['levels', 'with-create', 'with-members'];\n\t}\n\n\t#engine: ShareEngine | null = null;\n\t#flow: ShareFlow | null = null;\n\t#options: { deadlineMs?: number } = {};\n\t#levels: ShareLevel[] = ['read', 'write'];\n\t#withCreate = true;\n\t#withMembers = true;\n\t#confirmAction: ((action: ShareAction) => boolean | Promise<boolean>) | null = null;\n\t#qrProvider: ((url: string) => Promise<string>) | null = null;\n\t#qr = new Map<string, string>();\n\t#qrPending = new Set<string>();\n\t#copiedId: string | null = null;\n\t#creating: ShareLevel | null = null;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\t/** The app-side transport of links and memberships (see ShareEngine). */\n\tget engine(): ShareEngine | null {\n\t\treturn this.#engine;\n\t}\n\tset engine(v: ShareEngine | null) {\n\t\tthis.#engine = v;\n\t\tthis.wire();\n\t}\n\n\t/** Flow options (deadlineMs), for engines whose legs outgrow the default\n\t * 30s guard (a large first upload, a slow relay). */\n\tget options(): { deadlineMs?: number } {\n\t\treturn this.#options;\n\t}\n\tset options(v: { deadlineMs?: number } | null) {\n\t\tthis.#options = v ?? {};\n\t\tthis.wire();\n\t}\n\n\t/** Which levels the panel OFFERS to create (['read', 'write'] by default) -\n\t * one create button per level without a live link. Also the `levels`\n\t * attribute, comma-separated: levels=\"read\". Links the engine lists\n\t * render whatever this says. */\n\tget levels(): ShareLevel[] {\n\t\treturn [...this.#levels];\n\t}\n\tset levels(v: ShareLevel[]) {\n\t\tconst clean = [...new Set((v ?? []).filter((l) => l === 'read' || l === 'write'))];\n\t\tthis.#levels = clean.length > 0 ? clean : ['read', 'write'];\n\t\tthis.rerender();\n\t}\n\n\t/** Render the create buttons (default). `with-create=\"off\"` hides them: the\n\t * panel becomes list-and-revoke only. */\n\tget withCreate(): boolean {\n\t\treturn this.#withCreate;\n\t}\n\tset withCreate(v: boolean) {\n\t\tthis.#withCreate = v !== false;\n\t\tthis.rerender();\n\t}\n\n\t/** Render the members section (default). `with-members=\"off\"` hides it:\n\t * a links-only panel. */\n\tget withMembers(): boolean {\n\t\treturn this.#withMembers;\n\t}\n\tset withMembers(v: boolean) {\n\t\tthis.#withMembers = v !== false;\n\t\tthis.rerender();\n\t}\n\n\t/** Host veto over the destructive actions: called before revoke, remove or\n\t * stop runs; answer (or resolve) false to keep things as they are -\n\t * window.confirm fits as-is. Default: everything proceeds. */\n\tget confirmAction(): ((action: ShareAction) => boolean | Promise<boolean>) | null {\n\t\treturn this.#confirmAction;\n\t}\n\tset confirmAction(v: ((action: ShareAction) => boolean | Promise<boolean>) | null) {\n\t\tthis.#confirmAction = v ?? null;\n\t}\n\n\t/** Turn a link URL into an image source (a data URL fits): when set, each\n\t * link card renders it as an img part=\"qr\". Injected so the element ships\n\t * no QR dependency. */\n\tget qrProvider(): ((url: string) => Promise<string>) | null {\n\t\treturn this.#qrProvider;\n\t}\n\tset qrProvider(v: ((url: string) => Promise<string>) | null) {\n\t\tthis.#qrProvider = v ?? null;\n\t\tthis.#qr.clear();\n\t\tthis.#qrPending.clear();\n\t\tthis.rerender();\n\t}\n\n\tget flow(): ShareFlow | null {\n\t\treturn this.#flow;\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'levels') {\n\t\t\tthis.levels = (value ?? '').split(',').map((s) => s.trim()) as ShareLevel[];\n\t\t}\n\t\tif (name === 'with-create') this.withCreate = value == null || !isOff(value);\n\t\tif (name === 'with-members') this.withMembers = value == null || !isOff(value);\n\t}\n\n\tconnectedCallback(): void {\n\t\tthis.wire();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#engine) return;\n\t\tthis.unsub?.();\n\t\tthis.#flow = shareFlow(this.#engine, this.#options);\n\t\tthis.unsub = this.#flow.subscribe(() => this.rerender());\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst flow = this.#flow;\n\t\tif (!flow) return;\n\t\tconst s = flow.snapshot;\n\n\t\tput(into, this.heading('title', 'share.title'));\n\t\tif (s.stale) into.append(h('div', { part: 'hint' }, this.t('share.stale')));\n\t\tif (s.error && !s.stale) {\n\t\t\tinto.append(h('div', { part: 'error-note' }, this.errorText(s.error.labelKey)));\n\t\t}\n\n\t\t// One link per level: a level with a live link shows it below instead of\n\t\t// offering a second one. One gesture per missing level, nothing to name.\n\t\tif (this.#withCreate) {\n\t\t\tconst missing = this.#levels.filter((l) => !s.links.some((k) => k.level === l));\n\t\t\tif (missing.length > 0) {\n\t\t\t\tinto.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\t\t...missing.map((level) =>\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t\t\t'data-action': `create-${level}`,\n\t\t\t\t\t\t\t\t\tdisabled: s.busy !== null,\n\t\t\t\t\t\t\t\t\tonclick: () => this.create(level)\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tthis.t(\n\t\t\t\t\t\t\t\t\ts.busy === 'create' && this.#creating === level\n\t\t\t\t\t\t\t\t\t\t? 'share.creating'\n\t\t\t\t\t\t\t\t\t\t: `share.create.${level}`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (s.links.length > 0) {\n\t\t\tconst list = h('ul', { part: 'list' });\n\t\t\tfor (const link of s.links) {\n\t\t\t\tconst qr = this.qrFor(link.url);\n\t\t\t\tlist.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'li',\n\t\t\t\t\t\t{ part: 'card', 'data-link': link.id },\n\t\t\t\t\t\tqr ? h('img', { part: 'qr', src: qr, alt: '' }) : null,\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\t\t\t\th('div', { part: 'title' }, this.t(`share.level.${link.level}`)),\n\t\t\t\t\t\t\th('div', { part: 'sub', style: 'word-break:break-all' }, link.url)\n\t\t\t\t\t\t),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: 'button',\n\t\t\t\t\t\t\t\t'data-action': 'copy',\n\t\t\t\t\t\t\t\tonclick: () => this.copy(link.id, link.url)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.t(this.#copiedId === link.id ? 'share.copied' : 'share.copy')\n\t\t\t\t\t\t),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: 'button button-danger',\n\t\t\t\t\t\t\t\t'data-action': 'revoke',\n\t\t\t\t\t\t\t\tdisabled: s.busy !== null,\n\t\t\t\t\t\t\t\tonclick: () => this.revoke(link.id)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.t('share.revoke')\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tinto.append(list);\n\t\t}\n\n\t\tif (this.#withMembers) {\n\t\t\tput(into, this.heading('sub', 'share.members'));\n\t\t\tif (s.members.length === 0) {\n\t\t\t\tinto.append(h('div', { part: 'hint' }, this.t('share.empty')));\n\t\t\t} else {\n\t\t\t\tconst members = h('ul', { part: 'list' });\n\t\t\t\tfor (const m of s.members) {\n\t\t\t\t\tconst badges: string[] = [];\n\t\t\t\t\tif (m.self) badges.push(this.t('share.member.you'));\n\t\t\t\t\tif (m.owner) badges.push(this.t('share.member.owner'));\n\t\t\t\t\tmembers.append(\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'li',\n\t\t\t\t\t\t\t{ part: 'card', 'data-member': m.id },\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ style: 'flex:1' },\n\t\t\t\t\t\t\t\th('div', { part: 'title' }, m.label || m.id),\n\t\t\t\t\t\t\t\tbadges.length ? h('div', { part: 'sub' }, badges.join(' - ')) : null\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ts.canRemoveMembers && !m.self\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tpart: 'button button-danger',\n\t\t\t\t\t\t\t\t\t\t\t'data-action': 'remove',\n\t\t\t\t\t\t\t\t\t\t\tdisabled: s.busy !== null,\n\t\t\t\t\t\t\t\t\t\t\tonclick: () => this.removeRow(m.id)\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tthis.t('share.remove')\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tinto.append(members);\n\t\t\t}\n\t\t}\n\n\t\t// Ending the whole share: a quiet link at the panel's foot, not a banner.\n\t\t// Rare, destructive, and only real when the engine has such a move and\n\t\t// somebody besides you is in - kicking nobody is noise, and a share\n\t\t// nobody joined yet ends by revoking its link.\n\t\tif (s.canRevokeAll && s.members.some((m) => !m.self)) {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'footer', style: 'text-align:right' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'link link-danger',\n\t\t\t\t\t\t\t'data-action': 'stop',\n\t\t\t\t\t\t\tdisabled: s.busy !== null,\n\t\t\t\t\t\t\tonclick: () => this.stop()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('share.stop')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate create(level: ShareLevel): void {\n\t\tthis.#creating = level;\n\t\tvoid this.#flow?.createLink({ level }).then((link) => {\n\t\t\tthis.#creating = null;\n\t\t\tif (link) this.emit('selfstore-link-created', { link });\n\t\t\tthis.rerender();\n\t\t});\n\t}\n\n\t/** Run a destructive action through the host's veto (default: proceed).\n\t * A throwing hook reads as \"no\": destruction needs a clear yes. */\n\tprivate guarded(action: ShareAction, run: () => void): void {\n\t\tconst gate = this.#confirmAction;\n\t\tif (!gate) {\n\t\t\trun();\n\t\t\treturn;\n\t\t}\n\t\tvoid Promise.resolve()\n\t\t\t.then(() => gate(action))\n\t\t\t.then((ok) => {\n\t\t\t\tif (ok) run();\n\t\t\t})\n\t\t\t.catch(() => undefined);\n\t}\n\n\tprivate revoke(id: string): void {\n\t\tthis.guarded({ type: 'revoke', id }, () => void this.#flow?.revokeLink(id));\n\t}\n\n\tprivate removeRow(id: string): void {\n\t\tthis.guarded({ type: 'remove', id }, () => void this.#flow?.removeMember(id));\n\t}\n\n\tprivate stop(): void {\n\t\tthis.guarded({ type: 'stop' }, () => {\n\t\t\tvoid this.#flow?.revokeAll().then((ok) => {\n\t\t\t\tif (ok) this.emit('selfstore-share-stopped');\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate qrFor(url: string): string | null {\n\t\tconst provider = this.#qrProvider;\n\t\tif (!provider) return null;\n\t\tconst got = this.#qr.get(url);\n\t\tif (got) return got;\n\t\tif (!this.#qrPending.has(url)) {\n\t\t\tthis.#qrPending.add(url);\n\t\t\tvoid provider(url)\n\t\t\t\t.then((src) => {\n\t\t\t\t\tif (this.#qrProvider !== provider) return; // swapped since: stale image\n\t\t\t\t\tthis.#qr.set(url, src);\n\t\t\t\t\tthis.rerender();\n\t\t\t\t})\n\t\t\t\t.catch(() => undefined)\n\t\t\t\t.finally(() => this.#qrPending.delete(url));\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate copy(id: string, url: string): void {\n\t\tthis.#copiedId = id;\n\t\tthis.emit('selfstore-link-copied', { url });\n\t\tvoid navigator.clipboard?.writeText(url).catch(() => undefined);\n\t\tthis.rerender();\n\t\tsetTimeout(() => {\n\t\t\tif (this.#copiedId !== id) return;\n\t\t\tthis.#copiedId = null;\n\t\t\tthis.rerender();\n\t\t}, 1500);\n\t}\n}\n","/**\n * <selfstore-join>: opening an invitation link, ready to drop in. A skin over\n * joinFlow: preview first, join on an explicit yes, named outcomes (already\n * following another share / invite spent) instead of generic errors, and the\n * account switch as part of the journey when the engine offers one.\n *\n * el.link = location.href; // or the link attribute\n * el.engine = myJoinEngine;\n * el.addEventListener('selfstore-joined', () => goHome());\n *\n * variant=\"banner\" collapses the invitation card to a one-line row (label,\n * join, account switch) for pages that render their own preview around it.\n */\n\nimport { joinFlow, type JoinEngine, type JoinFlow } from '../flows/join';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'join.previewing': 'Reading the invitation...',\n\t'join.title': 'You are invited',\n\t'join.from': 'Shared by {from}',\n\t'join.level.read': 'You will be able to view it.',\n\t'join.level.write': 'You will be able to view and edit it.',\n\t'join.accept': 'Join',\n\t'join.joining': 'Joining...',\n\t'join.joined': 'You are in. The shared data now syncs on this device.',\n\t'join.mismatch':\n\t\t'This device already follows another share. Leave it first, or use another profile.',\n\t'join.noInvite': 'This invitation is spent, or meant for another account.',\n\t'join.switchAccount': 'Use another account',\n\t'join.retry': 'Try again',\n\t'error.generic': 'That did not work. Check the connection and try again.',\n\t'error.targetUnavailable': 'The invitation could not be read. Try again in a moment.'\n};\n\nexport class SelfstoreJoinElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['link', 'variant'];\n\t}\n\n\t#engine: JoinEngine | null = null;\n\t#link: string | null = null;\n\t#flow: JoinFlow | null = null;\n\t#variant: 'card' | 'banner' = 'card';\n\t#options: { deadlineMs?: number } = {};\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tget engine(): JoinEngine | null {\n\t\treturn this.#engine;\n\t}\n\tset engine(v: JoinEngine | null) {\n\t\tthis.#engine = v;\n\t\tthis.wire();\n\t}\n\n\t/** The invitation. Also settable as the `link` attribute. */\n\tget link(): string | null {\n\t\treturn this.#link;\n\t}\n\tset link(v: string | null) {\n\t\tthis.#link = v;\n\t\tthis.wire();\n\t}\n\n\t/** Flow options (deadlineMs). Set it when the engine's join opens a popup:\n\t * a generous deadline keeps the network guard without timing out a human\n\t * who is reading an account chooser. */\n\tget options(): { deadlineMs?: number } {\n\t\treturn this.#options;\n\t}\n\tset options(v: { deadlineMs?: number } | null) {\n\t\tthis.#options = v ?? {};\n\t\tthis.wire();\n\t}\n\n\t/** 'card' (default): the full invitation card - who shared, what level.\n\t * 'banner': one line - label, join, account switch - for a host page that\n\t * renders its own preview around the widget. Also the `variant` attribute. */\n\tget variant(): 'card' | 'banner' {\n\t\treturn this.#variant;\n\t}\n\tset variant(v: 'card' | 'banner') {\n\t\tthis.#variant = v === 'banner' ? 'banner' : 'card';\n\t\tthis.rerender();\n\t}\n\n\tget flow(): JoinFlow | null {\n\t\treturn this.#flow;\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'link') this.link = value;\n\t\tif (name === 'variant') this.variant = (value ?? 'card') as 'card' | 'banner';\n\t}\n\n\tconnectedCallback(): void {\n\t\tif (!this.#link && this.hasAttribute('link')) this.#link = this.getAttribute('link');\n\t\tif (this.hasAttribute('variant')) {\n\t\t\tthis.#variant = this.getAttribute('variant') === 'banner' ? 'banner' : 'card';\n\t\t}\n\t\tthis.wire();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#engine || !this.#link) return;\n\t\tthis.unsub?.();\n\t\tthis.#flow = joinFlow(this.#link, this.#engine, this.#options);\n\t\tlet lastStep: string | null = null;\n\t\tthis.unsub = this.#flow.subscribe((snap) => {\n\t\t\tif (snap.step !== lastStep) {\n\t\t\t\tif (snap.step === 'joined') this.emit('selfstore-joined', { outcome: 'joined' });\n\t\t\t\tif (snap.step === 'mismatch' || snap.step === 'no-invite') {\n\t\t\t\t\tthis.emit('selfstore-join-refused', { outcome: snap.step });\n\t\t\t\t}\n\t\t\t\tif (snap.step === 'ready' && lastStep === 'joining') {\n\t\t\t\t\t// join() answered null: the user backed out of the engine's popup.\n\t\t\t\t\tthis.emit('selfstore-cancelled');\n\t\t\t\t}\n\t\t\t\tlastStep = snap.step;\n\t\t\t}\n\t\t\tthis.rerender();\n\t\t});\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst flow = this.#flow;\n\t\tif (!flow) return;\n\t\tconst s = flow.snapshot;\n\n\t\tif (s.step === 'previewing' || s.step === 'joining') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'status' },\n\t\t\t\t\th('span', { part: 'spinner', 'aria-hidden': 'true' }),\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\t\tthis.t(s.step === 'joining' ? 'join.joining' : 'join.previewing')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'ready') {\n\t\t\tconst p = s.preview;\n\t\t\tif (this.#variant === 'banner') {\n\t\t\t\tput(\n\t\t\t\t\tinto,\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'row banner' },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ part: 'title', style: 'flex:1;min-width:0' },\n\t\t\t\t\t\t\tp?.label || this.t('join.title')\n\t\t\t\t\t\t),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t\t'data-action': 'accept',\n\t\t\t\t\t\t\t\tonclick: () => flow.accept()\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.t('join.accept')\n\t\t\t\t\t\t),\n\t\t\t\t\t\ts.canSwitchAccount\n\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{ part: 'link', 'data-action': 'switch', onclick: () => flow.switchAccount() },\n\t\t\t\t\t\t\t\t\tthis.t('join.switchAccount')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tput(\n\t\t\t\tinto,\n\t\t\t\th('div', { part: 'title' }, p?.label || this.t('join.title')),\n\t\t\t\tp?.from ? h('div', { part: 'sub' }, this.t('join.from').replace('{from}', p.from)) : null,\n\t\t\t\tp?.level ? h('div', { part: 'hint' }, this.t(`join.level.${p.level}`)) : null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t'data-action': 'accept',\n\t\t\t\t\t\t\tonclick: () => flow.accept()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('join.accept')\n\t\t\t\t\t),\n\t\t\t\t\ts.canSwitchAccount\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t{ part: 'link', 'data-action': 'switch', onclick: () => flow.switchAccount() },\n\t\t\t\t\t\t\t\tthis.t('join.switchAccount')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'joined') {\n\t\t\tinto.append(\n\t\t\t\th('div', { part: 'status status-ok' }, h('div', { part: 'title' }, this.t('join.joined')))\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'mismatch' || s.step === 'no-invite') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'status' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\t\tthis.t(s.step === 'mismatch' ? 'join.mismatch' : 'join.noInvite')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t\tif (s.step === 'no-invite' && s.canSwitchAccount) {\n\t\t\t\tinto.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'button', 'data-action': 'switch', onclick: () => flow.switchAccount() },\n\t\t\t\t\t\t\tthis.t('join.switchAccount')\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// error\n\t\tinto.append(\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'status status-error' },\n\t\t\t\th('div', { part: 'title' }, this.errorText(s.error?.labelKey))\n\t\t\t),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th('button', { part: 'button', onclick: () => flow.retry() }, this.t('join.retry')),\n\t\t\t\ts.canSwitchAccount\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'link', 'data-action': 'switch', onclick: () => flow.switchAccount() },\n\t\t\t\t\t\t\tthis.t('join.switchAccount')\n\t\t\t\t\t\t)\n\t\t\t\t\t: null\n\t\t\t)\n\t\t);\n\t}\n}\n","// <selfstore-status>: the store's save status. Renders the engine's own\n// StatusDescriptor - the widget never invents a state. variant=\"row\" is a\n// severity dot + status line + one action button (settings panel, menu);\n// variant=\"dot\" is just the dot as an aria-labelled button (header corner).\n// An actionable status emits 'selfstore-status-action' with the suggested\n// action; what it means (open settings, run reconnect) is the host's call.\n\nimport type { FlowHost } from '../flows/connect';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'status.ephemeral': 'Nothing is saved',\n\t'status.cacheOnly': 'Only on this device',\n\t'status.saving': 'Saving...',\n\t'status.saved': 'Saved',\n\t'status.needsAttention': 'Reconnect to continue',\n\t'status.locked': 'Locked',\n\t'status.pendingDownload': 'Changes to download',\n\t'status.action.choose-destination': 'Choose a destination',\n\t'status.action.download': 'Download',\n\t'status.action.reconnect': 'Reconnect',\n\t'status.action.unlock': 'Unlock'\n};\n\nexport class SelfstoreStatusElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['variant'];\n\t}\n\n\t#store: FlowHost | { flowHost: FlowHost } | null = null;\n\t#variant: 'row' | 'dot' = 'row';\n\t#icons: Record<string, string> = {};\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\t/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */\n\tget store(): FlowHost | { flowHost: FlowHost } | null {\n\t\treturn this.#store;\n\t}\n\tset store(v: FlowHost | { flowHost: FlowHost } | null) {\n\t\tthis.#store = v;\n\t\tthis.wire();\n\t}\n\n\t/** 'row' (dot + text + action) or 'dot' (the dot alone). Also the attribute. */\n\tget variant(): 'row' | 'dot' {\n\t\treturn this.#variant;\n\t}\n\tset variant(v: 'row' | 'dot' | null) {\n\t\tthis.#variant = v === 'dot' ? 'dot' : 'row';\n\t\tthis.rerender();\n\t}\n\n\t/** Optional icon per target kind (e.g. { drive: url, file: url }), shown\n\t * before the text in the row variant. Same contract as the connect cards. */\n\tget icons(): Record<string, string> {\n\t\treturn this.#icons;\n\t}\n\tset icons(v: Record<string, string> | null) {\n\t\tthis.#icons = v ?? {};\n\t\tthis.rerender();\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'variant') this.variant = value as 'row' | 'dot' | null;\n\t}\n\n\tconnectedCallback(): void {\n\t\tif (this.hasAttribute('variant')) this.variant = this.getAttribute('variant') as 'row' | 'dot';\n\t\tthis.wire();\n\t}\n\n\tprivate host(): FlowHost | null {\n\t\tconst s = this.#store;\n\t\tif (!s) return null;\n\t\treturn 'flowHost' in s ? s.flowHost : s;\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected) return;\n\t\tthis.unsub?.();\n\t\tthis.unsub = null;\n\t\tconst host = this.host();\n\t\tif (!host) return;\n\t\tthis.unsub = host.engine.subscribe(() => this.rerender());\n\t\tthis.rerender();\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst host = this.host();\n\t\tif (!host) return; // inert until wired\n\t\tconst { status, targetKind, label } = host.engine.state;\n\t\tconst text = this.t(status.labelKey);\n\t\tconst dot = h('span', {\n\t\t\tpart: `status-dot sev-${status.severity}`,\n\t\t\t'aria-hidden': 'true'\n\t\t});\n\n\t\tif (this.#variant === 'dot') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'dot-button',\n\t\t\t\t\t\t'aria-label': text,\n\t\t\t\t\t\ttitle: text,\n\t\t\t\t\t\tonclick: () => this.emit('selfstore-status-action', { action: status.action ?? null })\n\t\t\t\t\t},\n\t\t\t\t\tdot\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst icon = this.#icons[targetKind];\n\t\tconst where = this.t(`status.where.${targetKind}`);\n\t\t// `status.where.<kind>` is a host-provided label; the raw key means \"not\n\t\t// provided\" - fall back to the target's own label (file name, server).\n\t\tconst sub = where !== `status.where.${targetKind}` ? where : (label ?? '');\n\t\tput(\n\t\t\tinto,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row status-row' },\n\t\t\t\tdot,\n\t\t\t\ticon ? h('img', { part: 'icon', src: icon, alt: '' }) : null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{},\n\t\t\t\t\th('div', { part: 'title' }, text),\n\t\t\t\t\tsub ? h('div', { part: 'sub' }, sub) : null\n\t\t\t\t),\n\t\t\t\tstatus.actionable && status.action\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: 'button status-action',\n\t\t\t\t\t\t\t\tonclick: () => this.emit('selfstore-status-action', { action: status.action })\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.t(`status.action.${status.action}`)\n\t\t\t\t\t\t)\n\t\t\t\t\t: null\n\t\t\t)\n\t\t);\n\t}\n}\n","// <selfstore-backups>: the backups lists over the headless BackupsManager.\n// Two sections. \"My backups\": every file this account owns, the attached one\n// included (badge + outline, never clickable); tapping another row opens it,\n// collecting its passphrase inline when protected; each row carries state\n// pills (omitted while unknown, never guessed) and an overflow menu. \"Shared\n// with me\": files someone else shares with this device, labelled by who -\n// removal is the only gesture, and for the member row it means leaving,\n// which the host performs ('selfstore-backups-leave').\n//\n// The status card, the unlock gate and the encrypt/share sub-views stay the\n// host's - they carry app identity, passkeys, sharing transport. Encrypt and\n// Share menu items only emit; the host opens its own surface. Destructive\n// gestures route through confirmAction (window.confirm fits as-is). The\n// with-* attributes turn sections and menu items off; labels localize.\n\nimport type { BackupRow, BackupsManager } from '../backups/manager';\nimport type { ConnectKind } from '../flows/connect';\nimport type { ReplicaFlow, ReplicaSnapshot } from '../flows/replica';\nimport type { WebdavConfig } from '../persistence/targets/webdav';\nimport type { S3Config } from '../persistence/targets/s3';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'backups.mine.heading': 'My backups',\n\t'backups.mine.personal': 'Main backup',\n\t'backups.active': 'Active',\n\t'backups.pill.encrypted': 'Encrypted',\n\t'backups.pill.plain': 'Not encrypted',\n\t'backups.pill.shared': 'Shared',\n\t'backups.pill.private': 'Not shared',\n\t'backups.modified': 'modified {when}',\n\t'backups.replaceHint': 'Opening replaces the data on this device.',\n\t'backups.loading': 'Opening...',\n\t'backups.menu': 'Backup actions',\n\t'backups.open': 'Open',\n\t'backups.encrypt': 'Encrypt',\n\t'backups.share': 'Share',\n\t'backups.rename': 'Rename',\n\t'backups.delete': 'Delete',\n\t'backups.new': '+ New backup',\n\t'backups.newTitle': 'New backup',\n\t'backups.startsBlank': 'It starts empty.',\n\t'backups.namePh': 'Its name',\n\t'backups.willBe': 'File: {file}',\n\t'backups.taken': 'This name is already taken.',\n\t'backups.create': 'Create',\n\t'backups.renameTitle': 'Rename this backup',\n\t'backups.pwHint': 'This backup is protected: enter its password.',\n\t'backups.pwShow': 'Show the password',\n\t'backups.pwHide': 'Hide the password',\n\t'backups.cancel': 'Cancel',\n\t'backups.shared.heading': 'Shared with me',\n\t'backups.shared.by': 'Shared by {who}',\n\t'backups.shared.leave': 'Leave',\n\t'backups.replica.add': 'Backup copy',\n\t'backups.replica.title': 'Backup copy',\n\t'backups.replica.intro':\n\t\t'The same encrypted file, also written to a second destination. If one fails, the other remains.',\n\t'backups.replica.dest.drive': 'Google Drive',\n\t'backups.replica.dest.file': 'A file on this device',\n\t'backups.replica.dest.webdav': 'A WebDAV server',\n\t'backups.replica.dest.s3': 'An S3 bucket',\n\t'backups.replica.card': 'Backup copy - {label}',\n\t'backups.replica.uptodate': 'Up to date, {when}',\n\t'backups.replica.pending': 'First copy at the next save',\n\t'backups.replica.error': 'Unreachable - will retry at the next save',\n\t'backups.replica.remove': 'Remove',\n\t'backups.replica.save': 'Add the copy',\n\t'backups.replica.webdav.url': 'File URL on the server (https://host:8443/dav/file.zip)',\n\t'backups.replica.webdav.help':\n\t\t'The full URL of the backup file, including a custom port if any. The server must allow this app to reach it (CORS) - some hosted drives do not, and will not connect from a browser.',\n\t'backups.replica.webdav.user': 'Username',\n\t'backups.replica.webdav.password': 'Password',\n\t'backups.replica.s3.endpoint': 'Endpoint URL',\n\t'backups.replica.s3.region': 'Region',\n\t'backups.replica.s3.bucket': 'Bucket',\n\t'backups.replica.s3.key': 'Object key (file name)',\n\t'backups.replica.s3.accessKeyId': 'Access key ID',\n\t'backups.replica.s3.secret': 'Secret access key',\n\t'error.generic': 'That did not work. Check the connection and try again.'\n};\n\n/** A destructive gesture, offered to confirmAction before it runs. `delete`\n * and `forget` carry the row; `leave` is a membership's removal (fileId =\n * its wallet, null for a legacy unbound one) - the host performs the actual\n * leave on the 'selfstore-backups-leave' event, whose detail repeats it. */\nexport type BackupsAction =\n\t| { type: 'delete'; fileId: string; name: string; active: boolean }\n\t| { type: 'forget'; fileId: string; who: string }\n\t| { type: 'leave'; fileId: string | null; who: string }\n\t| { type: 'replica-remove'; label: string };\n\n/** \"off\"-style attribute values; anything else (including empty) reads as on. */\nconst isOff = (v: string | null): boolean =>\n\tv != null && ['off', 'false', 'no', '0'].includes(v.trim().toLowerCase());\n\nconst EYE_OPEN =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>';\nconst EYE_SHUT =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m3 3 18 18\"/><path d=\"M10.6 5.1A10.9 10.9 0 0 1 12 5c6.5 0 10 7 10 7a17.4 17.4 0 0 1-3.4 4.4M6.6 6.6A17 17 0 0 0 2 12s3.5 7 10 7a10.7 10.7 0 0 0 5.4-1.4\"/></svg>';\n\nexport class SelfstoreBackupsElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn [\n\t\t\t'with-create',\n\t\t\t'with-rename',\n\t\t\t'with-delete',\n\t\t\t'with-open',\n\t\t\t'with-encrypt',\n\t\t\t'with-share',\n\t\t\t'with-shared'\n\t\t];\n\t}\n\n\t#manager: BackupsManager | null = null;\n\t#rows: BackupRow[] | null = null;\n\t#lastActive: string | null | undefined = undefined;\n\t#listing = false;\n\t#busy = false;\n\t#openBusy: string | null = null;\n\t#menuFor: string | null = null;\n\t#pwFor: string | null = null;\n\t#pw = '';\n\t#pwShown = false;\n\t#renameFor: BackupRow | null = null;\n\t#renameLabel = '';\n\t#createOpen = false;\n\t#createLabel = '';\n\t#members: { by: string; fileId?: string | null }[] = [];\n\t#replicaFlow: ReplicaFlow | null = null;\n\t#replicaSnap: ReplicaSnapshot | null = null;\n\t#repWebdav: WebdavConfig = { url: '', username: '', password: '' };\n\t#repS3: S3Config = {\n\t\tendpoint: '',\n\t\tregion: '',\n\t\tbucket: '',\n\t\tkey: '',\n\t\taccessKeyId: '',\n\t\tsecretAccessKey: ''\n\t};\n\t#activeEncrypted: boolean | null = null;\n\t#activeShared: boolean | null = null;\n\t#confirmAction: ((action: BackupsAction) => boolean | Promise<boolean>) | null = null;\n\t#withCreate = true;\n\t#withRename = true;\n\t#withDelete = true;\n\t#withOpen = true;\n\t#withEncrypt = true;\n\t#withShare = true;\n\t#withShared = true;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\t/** The headless manager this panel drives (see 'selfstore/backups'). */\n\tget manager(): BackupsManager | null {\n\t\treturn this.#manager;\n\t}\n\tset manager(v: BackupsManager | null) {\n\t\tthis.#manager = v;\n\t\tthis.wire();\n\t}\n\n\t/** The households this device is a member of (one entry per share, or a\n\t * single object for one): each renders in \"Shared with me\" labeled by who\n\t * shares it, removal = leaving (host performs it on\n\t * 'selfstore-backups-leave', whose detail names the entry's fileId). With\n\t * `fileId` (the share's dedicated wallet), that registry row IS the\n\t * member row: active it wears the badge, inactive it opens like any\n\t * shared silo - and its one menu action is leaving, never a mere forget. */\n\tget member(): { by: string; fileId?: string | null }[] | null {\n\t\treturn this.#members.length > 0 ? this.#members : null;\n\t}\n\tset member(\n\t\tv: { by: string; fileId?: string | null }[] | { by: string; fileId?: string | null } | null\n\t) {\n\t\tthis.#members = v == null ? [] : Array.isArray(v) ? v : [v];\n\t\tthis.rerender();\n\t}\n\n\t/** Live state of the ATTACHED backup, from the host's store: the active\n\t * row's pills prefer these over the learned memories (which may lag). */\n\tget activeEncrypted(): boolean | null {\n\t\treturn this.#activeEncrypted;\n\t}\n\tset activeEncrypted(v: boolean | null) {\n\t\tthis.#activeEncrypted = v;\n\t\tthis.rerender();\n\t}\n\tget activeShared(): boolean | null {\n\t\treturn this.#activeShared;\n\t}\n\tset activeShared(v: boolean | null) {\n\t\tthis.#activeShared = v;\n\t\tthis.rerender();\n\t}\n\n\t/** Host veto over the destructive gestures (delete / forget / leave):\n\t * answer (or resolve) false to keep things as they are - window.confirm\n\t * fits as-is. Default: everything proceeds. */\n\tget confirmAction(): ((action: BackupsAction) => boolean | Promise<boolean>) | null {\n\t\treturn this.#confirmAction;\n\t}\n\tset confirmAction(v: ((action: BackupsAction) => boolean | Promise<boolean>) | null) {\n\t\tthis.#confirmAction = v ?? null;\n\t}\n\n\tget withCreate(): boolean {\n\t\treturn this.#withCreate;\n\t}\n\tset withCreate(v: boolean) {\n\t\tthis.#withCreate = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withRename(): boolean {\n\t\treturn this.#withRename;\n\t}\n\tset withRename(v: boolean) {\n\t\tthis.#withRename = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withDelete(): boolean {\n\t\treturn this.#withDelete;\n\t}\n\tset withDelete(v: boolean) {\n\t\tthis.#withDelete = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withOpen(): boolean {\n\t\treturn this.#withOpen;\n\t}\n\tset withOpen(v: boolean) {\n\t\tthis.#withOpen = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withEncrypt(): boolean {\n\t\treturn this.#withEncrypt;\n\t}\n\tset withEncrypt(v: boolean) {\n\t\tthis.#withEncrypt = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withShare(): boolean {\n\t\treturn this.#withShare;\n\t}\n\tset withShare(v: boolean) {\n\t\tthis.#withShare = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withShared(): boolean {\n\t\treturn this.#withShared;\n\t}\n\tset withShared(v: boolean) {\n\t\tthis.#withShared = v !== false;\n\t\tthis.rerender();\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tconst on = value == null || !isOff(value);\n\t\tif (name === 'with-create') this.withCreate = on;\n\t\tif (name === 'with-rename') this.withRename = on;\n\t\tif (name === 'with-delete') this.withDelete = on;\n\t\tif (name === 'with-open') this.withOpen = on;\n\t\tif (name === 'with-encrypt') this.withEncrypt = on;\n\t\tif (name === 'with-share') this.withShare = on;\n\t\tif (name === 'with-shared') this.withShared = on;\n\t}\n\n\tconnectedCallback(): void {\n\t\tthis.wire();\n\t}\n\n\t/** Re-list the rows from the destination (the host calls this after a\n\t * gesture of its own moved things - a leave, an external change). */\n\trefresh(): void {\n\t\tvoid this.loadRows();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#manager) return;\n\t\tthis.unsub?.();\n\t\tconst manager = this.#manager;\n\t\tconst unsubManager = manager.subscribe((snap) => {\n\t\t\t// A switch (or first attach) re-lists; every snapshot repaints.\n\t\t\tif (snap.activeFileId !== this.#lastActive) {\n\t\t\t\tthis.#lastActive = snap.activeFileId;\n\t\t\t\tvoid this.loadRows();\n\t\t\t}\n\t\t\tthis.rerender();\n\t\t});\n\t\tconst unsubReplica = this.#replicaFlow?.subscribe((snap) => {\n\t\t\tthis.#replicaSnap = snap;\n\t\t\tthis.rerender();\n\t\t});\n\t\tthis.unsub = () => {\n\t\t\tunsubManager();\n\t\t\tunsubReplica?.();\n\t\t};\n\t\tvoid manager.hydrate().then(() => this.loadRows());\n\t}\n\n\t/** The backup-copy journey (see 'selfstore/flows' replicaFlow). Setting it\n\t * adds a menu entry on the active backup's card and renders the copy\n\t * cards under it; without it the panel is byte-identical to before. The\n\t * widget restores a recorded copy by itself. */\n\tget replica(): ReplicaFlow | null {\n\t\treturn this.#replicaFlow;\n\t}\n\tset replica(v: ReplicaFlow | null) {\n\t\tthis.#replicaFlow = v;\n\t\tthis.#replicaSnap = v?.snapshot ?? null;\n\t\tif (v) void v.restore();\n\t\tthis.wire();\n\t}\n\n\t/** One destination listing, then the lazy encryption probes (each learned\n\t * bit repaints its row). A transient failure keeps the last good list. */\n\tprivate async loadRows(): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager || this.#listing) return;\n\t\tthis.#listing = true;\n\t\ttry {\n\t\t\tthis.#rows = await manager.list();\n\t\t\tthis.rerender();\n\t\t\tfor (const r of this.#rows ?? []) {\n\t\t\t\tif (r.encrypted !== null) continue;\n\t\t\t\tconst enc = await manager.probeEncryption(r.fileId);\n\t\t\t\tif (enc === null || this.#rows === null) continue;\n\t\t\t\tthis.#rows = this.#rows.map((x) => (x.fileId === r.fileId ? { ...x, encrypted: enc } : x));\n\t\t\t\tthis.rerender();\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.#rows = this.#rows ?? [];\n\t\t\tthis.rerender();\n\t\t} finally {\n\t\t\tthis.#listing = false;\n\t\t}\n\t}\n\n\t/** t() with {placeholders}. */\n\tprivate ts(key: string, params: Record<string, string>): string {\n\t\treturn this.t(key).replace(/\\{(\\w+)\\}/g, (_, k: string) => params[k] ?? '');\n\t}\n\n\tprivate label(row: BackupRow): string {\n\t\treturn row.label ?? this.t('backups.mine.personal');\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst manager = this.#manager;\n\t\tif (!manager) return;\n\t\tconst snap = manager.snapshot;\n\t\tconst rows = this.#rows ?? [];\n\t\tconst active = snap.activeFileId;\n\n\t\t// --- My backups -----------------------------------------------------\n\t\tconst mine = snap.joined ? rows.filter((r) => r.fileId !== active) : rows;\n\t\tif (this.#rows !== null) put(into, this.heading('sub heading', 'backups.mine.heading'));\n\t\tconst list = h('ul', { part: 'list' });\n\t\tfor (const r of mine) {\n\t\t\tconst isActive = r.fileId === active;\n\t\t\tif (this.#pwFor === r.fileId) list.append(this.passwordCard(r));\n\t\t\telse if (this.#renameFor?.fileId === r.fileId) list.append(this.renameCard(r));\n\t\t\t// The attached copy is not a backup of its own: it rides INSIDE the\n\t\t\t// active card as one line under its pills (never a card of its own,\n\t\t\t// never for a joined member's shared file).\n\t\t\telse list.append(this.rowCard(r, isActive, isActive ? this.replicaAttachedLine() : null));\n\t\t\t// The destination choice / config form (transient setup) renders as a\n\t\t\t// card right under the active one.\n\t\t\tif (isActive) for (const el of this.replicaSetup()) list.append(el);\n\t\t}\n\t\tif (list.childElementCount > 0) into.append(list);\n\n\t\t// --- Create ---------------------------------------------------------\n\t\tif (this.#withCreate) {\n\t\t\tif (this.#createOpen) into.append(this.createCard());\n\t\t\telse {\n\t\t\t\tinto.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button new-button',\n\t\t\t\t\t\t\t'data-action': 'new',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\t\t\tthis.#createOpen = true;\n\t\t\t\t\t\t\t\tthis.#createLabel = '';\n\t\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.new')\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// --- Shared with me -------------------------------------------------\n\t\tif (!this.#withShared) return;\n\t\tconst members = this.#members;\n\t\t// The badge row: the membership riding the ATTACHED file - wallet-bound\n\t\t// when its silo is active (the others' registry rows stand in), or a\n\t\t// legacy unbound one on whatever file is attached.\n\t\tconst badge = members.find((m) => (m.fileId != null ? m.fileId === active : true)) ?? null;\n\t\t// An owner already present as a MEMBERSHIP owns its row, and its one\n\t\t// action is Leave. A registry entry for that same owner is a stale\n\t\t// duplicate of the same share (a re-join left the old file behind): never\n\t\t// show it as a second, Forget-only row. Forget rows also collapse to one\n\t\t// per owner - never the same email twice.\n\t\tconst memberWhos = new Set(members.map((m) => m.by));\n\t\tconst others: { fileId: string; who: string; member: boolean }[] = [];\n\t\tconst seenForget = new Set<string>();\n\t\tfor (const s of snap.registry.shared) {\n\t\t\tif (s.fileId === active && !snap.joined) continue;\n\t\t\tconst member = members.some((m) => m.fileId === s.fileId);\n\t\t\tconst who = s.ownerEmail ?? s.ownerName ?? '?';\n\t\t\tif (!member) {\n\t\t\t\tif (memberWhos.has(who) || seenForget.has(who)) continue;\n\t\t\t\tseenForget.add(who);\n\t\t\t}\n\t\t\tothers.push({ fileId: s.fileId, who, member });\n\t\t}\n\t\tif (members.length === 0 && others.length === 0) return;\n\t\tput(into, this.heading('sub heading', 'backups.shared.heading'));\n\t\tconst shared = h('ul', { part: 'list' });\n\t\tif (badge) {\n\t\t\tconst activeRow = rows.find((r) => r.fileId === active) ?? null;\n\t\t\tconst leaveAction: BackupsAction = {\n\t\t\t\ttype: 'leave',\n\t\t\t\tfileId: badge.fileId ?? null,\n\t\t\t\twho: badge.by\n\t\t\t};\n\t\t\tshared.append(\n\t\t\t\th(\n\t\t\t\t\t'li',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'card card-active',\n\t\t\t\t\t\tstyle: 'position:relative;border-color:var(--_ok)',\n\t\t\t\t\t\t'data-member': ''\n\t\t\t\t\t},\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\t\t\tbadge.fileId != null || !activeRow\n\t\t\t\t\t\t\t\t? this.ts('backups.shared.by', { who: badge.by })\n\t\t\t\t\t\t\t\t: this.label(activeRow),\n\t\t\t\t\t\t\th('span', { part: 'tag' }, this.t('backups.active'))\n\t\t\t\t\t\t),\n\t\t\t\t\t\tbadge.fileId == null && activeRow\n\t\t\t\t\t\t\t? h('div', { part: 'sub' }, this.ts('backups.shared.by', { who: badge.by }))\n\t\t\t\t\t\t\t: null\n\t\t\t\t\t),\n\t\t\t\t\tthis.menuButton('member'),\n\t\t\t\t\tthis.#menuFor === 'member'\n\t\t\t\t\t\t? this.menu(\n\t\t\t\t\t\t\t\tthis.#withDelete\n\t\t\t\t\t\t\t\t\t? this.menuItem('leave', this.t('backups.shared.leave'), true, () =>\n\t\t\t\t\t\t\t\t\t\t\tthis.guarded(leaveAction, () =>\n\t\t\t\t\t\t\t\t\t\t\t\tthis.emit('selfstore-backups-leave', { fileId: leaveAction.fileId })\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tfor (const s of others) {\n\t\t\t// The badge row's file never doubles as a registry row.\n\t\t\tif (badge && s.fileId === active) continue;\n\t\t\tconst memberEntry = s.member;\n\t\t\tshared.append(\n\t\t\t\th(\n\t\t\t\t\t'li',\n\t\t\t\t\t{ part: 'card', style: 'position:relative', 'data-shared': s.fileId },\n\t\t\t\t\tthis.#withOpen\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpart: 'link open-shared',\n\t\t\t\t\t\t\t\t\tstyle: 'flex:1;min-width:0;text-align:left;text-decoration:none',\n\t\t\t\t\t\t\t\t\t'data-action': 'open-shared',\n\t\t\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\t\t\tonclick: () => this.open(s.fileId)\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\th('div', { part: 'title' }, this.ts('backups.shared.by', { who: s.who })),\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t{ part: 'sub' },\n\t\t\t\t\t\t\t\t\tthis.#openBusy === s.fileId\n\t\t\t\t\t\t\t\t\t\t? this.t('backups.loading')\n\t\t\t\t\t\t\t\t\t\t: this.t('backups.replaceHint')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\t\t\t\t\th('div', { part: 'title' }, this.ts('backups.shared.by', { who: s.who })),\n\t\t\t\t\t\t\t\th('div', { part: 'sub' }, this.t('backups.replaceHint'))\n\t\t\t\t\t\t\t),\n\t\t\t\t\tthis.menuButton(s.fileId),\n\t\t\t\t\tthis.#menuFor === s.fileId\n\t\t\t\t\t\t? this.menu(\n\t\t\t\t\t\t\t\tthis.#withDelete\n\t\t\t\t\t\t\t\t\t? memberEntry\n\t\t\t\t\t\t\t\t\t\t? this.menuItem('leave', this.t('backups.shared.leave'), true, () =>\n\t\t\t\t\t\t\t\t\t\t\t\tthis.guarded({ type: 'leave', fileId: s.fileId, who: s.who }, () =>\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.emit('selfstore-backups-leave', { fileId: s.fileId })\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t: this.menuItem('forget', this.t('backups.delete'), true, () =>\n\t\t\t\t\t\t\t\t\t\t\t\tthis.guarded(\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ type: 'forget', fileId: s.fileId, who: s.who },\n\t\t\t\t\t\t\t\t\t\t\t\t\t() => void this.forget(s.fileId)\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tif (shared.childElementCount > 0) into.append(shared);\n\t}\n\n\t// --- Cards ----------------------------------------------------------------\n\n\tprivate pills(r: BackupRow, active: boolean): (HTMLElement | string | null)[] {\n\t\tconst enc = active && this.#activeEncrypted !== null ? this.#activeEncrypted : r.encrypted;\n\t\tconst shr = active && this.#activeShared !== null ? this.#activeShared : r.shared;\n\t\tconst bits: (HTMLElement | string | null)[] = [];\n\t\tif (enc !== null) {\n\t\t\tbits.push(\n\t\t\t\th(\n\t\t\t\t\t'span',\n\t\t\t\t\t{ part: enc ? 'pill pill-encrypted sev-ok' : 'pill pill-plain', style: pillStyle },\n\t\t\t\t\tthis.t(enc ? 'backups.pill.encrypted' : 'backups.pill.plain')\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tif (shr !== null) {\n\t\t\tbits.push(\n\t\t\t\th(\n\t\t\t\t\t'span',\n\t\t\t\t\t{ part: shr ? 'pill pill-shared sev-warn' : 'pill pill-private', style: pillStyle },\n\t\t\t\t\tthis.t(shr ? 'backups.pill.shared' : 'backups.pill.private')\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tif (r.modifiedAt) {\n\t\t\tbits.push(\n\t\t\t\th(\n\t\t\t\t\t'span',\n\t\t\t\t\t{ part: 'sub' },\n\t\t\t\t\tthis.ts('backups.modified', { when: new Date(r.modifiedAt).toLocaleDateString() })\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\treturn bits;\n\t}\n\n\tprivate rowCard(r: BackupRow, active: boolean, footer: HTMLElement | null = null): HTMLElement {\n\t\tconst body = h(\n\t\t\t'div',\n\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'title' },\n\t\t\t\tthis.label(r),\n\t\t\t\tactive ? h('span', { part: 'tag' }, this.t('backups.active')) : null\n\t\t\t),\n\t\t\th('div', { part: 'row', style: 'margin-top:0.2rem' }, ...this.pills(r, active)),\n\t\t\tfooter\n\t\t);\n\t\tconst opens = this.#withOpen && !active;\n\t\tconst face = opens\n\t\t\t? h(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'link open-row',\n\t\t\t\t\t\tstyle: 'flex:1;min-width:0;text-align:left;text-decoration:none',\n\t\t\t\t\t\t'data-action': 'open',\n\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\tonclick: () => this.open(r.fileId)\n\t\t\t\t\t},\n\t\t\t\t\tthis.#openBusy === r.fileId ? h('div', { part: 'sub' }, this.t('backups.loading')) : body\n\t\t\t\t)\n\t\t\t: body;\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{\n\t\t\t\tpart: active ? 'card card-active' : 'card',\n\t\t\t\tstyle: active ? 'position:relative;border-color:var(--_ok)' : 'position:relative',\n\t\t\t\t'data-row': r.fileId\n\t\t\t},\n\t\t\tface,\n\t\t\tthis.menuButton(r.fileId),\n\t\t\tthis.#menuFor === r.fileId\n\t\t\t\t? this.menu(\n\t\t\t\t\t\topens\n\t\t\t\t\t\t\t? this.menuItem('open', this.t('backups.open'), false, () => this.open(r.fileId))\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tthis.#withEncrypt\n\t\t\t\t\t\t\t? this.menuItem('encrypt', this.t('backups.encrypt'), false, () =>\n\t\t\t\t\t\t\t\t\tthis.emit('selfstore-backups-encrypt', {\n\t\t\t\t\t\t\t\t\t\tfileId: r.fileId,\n\t\t\t\t\t\t\t\t\t\tlabel: r.label,\n\t\t\t\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tthis.#withShare\n\t\t\t\t\t\t\t? this.menuItem('share', this.t('backups.share'), false, () =>\n\t\t\t\t\t\t\t\t\tthis.emit('selfstore-backups-share', { fileId: r.fileId, label: r.label, active })\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tactive &&\n\t\t\t\t\t\t\tthis.#replicaFlow &&\n\t\t\t\t\t\t\tthis.#replicaSnap?.step === 'idle' &&\n\t\t\t\t\t\t\t!this.#replicaSnap.replica\n\t\t\t\t\t\t\t? this.menuItem('replica-add', this.t('backups.replica.add'), false, () =>\n\t\t\t\t\t\t\t\t\tthis.#replicaFlow?.open()\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tthis.#withRename\n\t\t\t\t\t\t\t? this.menuItem('rename', this.t('backups.rename'), false, () => {\n\t\t\t\t\t\t\t\t\tthis.#renameFor = r;\n\t\t\t\t\t\t\t\t\tthis.#renameLabel = r.label ?? '';\n\t\t\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tthis.#withDelete\n\t\t\t\t\t\t\t? this.menuItem('delete', this.t('backups.delete'), true, () =>\n\t\t\t\t\t\t\t\t\tthis.guarded(\n\t\t\t\t\t\t\t\t\t\t{ type: 'delete', fileId: r.fileId, name: r.name, active },\n\t\t\t\t\t\t\t\t\t\t() => void this.deleteRow(r.fileId)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null\n\t\t\t\t\t)\n\t\t\t\t: null\n\t\t);\n\t}\n\n\tprivate passwordCard(r: BackupRow): HTMLElement {\n\t\tconst submit = (): void => {\n\t\t\tif (this.#pw.length > 0) void this.open(r.fileId, this.#pw);\n\t\t};\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card', 'data-password': r.fileId },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\th('div', { part: 'title' }, this.label(r)),\n\t\t\t\th('div', { part: 'sub' }, this.t('backups.pwHint')),\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'span',\n\t\t\t\t\t\t{ part: 'field', style: 'flex:1;min-width:9rem' },\n\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\tpart: 'input',\n\t\t\t\t\t\t\ttype: this.#pwShown ? 'text' : 'password',\n\t\t\t\t\t\t\tautocomplete: 'current-password',\n\t\t\t\t\t\t\t'data-keep': 'backup-pw',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\toninput: (e: Event) => (this.#pw = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\tonkeydown: (e: Event) => {\n\t\t\t\t\t\t\t\tif ((e as KeyboardEvent).key === 'Enter') submit();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tthis.eye()\n\t\t\t\t\t),\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t'data-action': 'pw-open',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: submit\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.open')\n\t\t\t\t\t),\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button',\n\t\t\t\t\t\t\t'data-action': 'pw-cancel',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: () => this.closePw()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate renameCard(r: BackupRow): HTMLElement {\n\t\tconst taken = this.nameTaken(this.#renameLabel, r.fileId);\n\t\tconst clean = this.#renameLabel.trim();\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card', 'data-rename': r.fileId },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\th('div', { part: 'title' }, this.t('backups.renameTitle')),\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\tstyle: 'margin-top:0.45rem',\n\t\t\t\t\t'data-keep': 'rename-label',\n\t\t\t\t\tmaxlength: '40',\n\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\tvalue: this.#renameLabel,\n\t\t\t\t\toninput: (e: Event) => {\n\t\t\t\t\t\tthis.#renameLabel = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\ttaken\n\t\t\t\t\t? h('div', { part: 'error-note' }, this.t('backups.taken'))\n\t\t\t\t\t: clean\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ part: 'sub' },\n\t\t\t\t\t\t\t\tthis.ts('backups.willBe', { file: this.#manager?.fileNameFor(clean) ?? '' })\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t'data-action': 'rename-save',\n\t\t\t\t\t\t\tdisabled: this.#busy || !clean || taken,\n\t\t\t\t\t\t\tonclick: () => void this.rename(r)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.rename')\n\t\t\t\t\t),\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button',\n\t\t\t\t\t\t\t'data-action': 'rename-cancel',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\t\t\tthis.#renameFor = null;\n\t\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate createCard(): HTMLElement {\n\t\tconst taken = this.nameTaken(this.#createLabel, null);\n\t\tconst clean = this.#createLabel.trim();\n\t\treturn h(\n\t\t\t'div',\n\t\t\t{ part: 'card', 'data-create': '' },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\th('div', { part: 'title' }, this.t('backups.newTitle')),\n\t\t\t\th('div', { part: 'sub' }, this.t('backups.startsBlank')),\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\tstyle: 'margin-top:0.45rem',\n\t\t\t\t\tplaceholder: this.t('backups.namePh'),\n\t\t\t\t\t'data-keep': 'create-label',\n\t\t\t\t\tmaxlength: '40',\n\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\toninput: (e: Event) => {\n\t\t\t\t\t\tthis.#createLabel = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\ttaken\n\t\t\t\t\t? h('div', { part: 'error-note' }, this.t('backups.taken'))\n\t\t\t\t\t: clean\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ part: 'sub' },\n\t\t\t\t\t\t\t\tthis.ts('backups.willBe', { file: this.#manager?.fileNameFor(clean) ?? '' })\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t'data-action': 'create',\n\t\t\t\t\t\t\tdisabled: this.#busy || !clean || taken,\n\t\t\t\t\t\t\tonclick: () => void this.create()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.create')\n\t\t\t\t\t),\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button',\n\t\t\t\t\t\t\t'data-action': 'create-cancel',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\t\t\tthis.#createOpen = false;\n\t\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\t// --- Backup copy (replica) -------------------------------------------------\n\n\t/** The transient setup UI under the active card: the destination choice or a\n\t * config form. The ATTACHED copy is not here - it rides inside the active\n\t * card (replicaAttachedLine). Idle renders nothing - the entry point lives\n\t * in the active card's menu. */\n\tprivate replicaSetup(): HTMLElement[] {\n\t\tconst snap = this.#replicaSnap;\n\t\tif (!this.#replicaFlow || !snap || snap.replica) return [];\n\t\tif (snap.step === 'choose') return [this.replicaPicker(snap)];\n\t\tif (snap.step === 'form-webdav') return [this.replicaWebdavForm(snap)];\n\t\tif (snap.step === 'form-s3') return [this.replicaS3Form(snap)];\n\t\treturn [];\n\t}\n\n\t/** The attached copy is not a backup of its own: it renders as ONE line\n\t * INSIDE the active backup's card, under its pills (label, freshness, an\n\t * inline \"remove\") - never a card or a block of its own. Null when no copy\n\t * is attached. */\n\tprivate replicaAttachedLine(): HTMLElement | null {\n\t\tconst snap = this.#replicaSnap;\n\t\tif (!this.#replicaFlow || !snap || !snap.replica) return null;\n\t\tconst rep = snap.replica;\n\t\tconst label = rep.label;\n\t\tconst status = rep.lastError\n\t\t\t? h('span', { part: 'sub replica-error' }, this.t('backups.replica.error'))\n\t\t\t: rep.lastPublishAt\n\t\t\t\t? h(\n\t\t\t\t\t\t'span',\n\t\t\t\t\t\t{ part: 'sub replica-ok' },\n\t\t\t\t\t\tthis.ts('backups.replica.uptodate', {\n\t\t\t\t\t\t\twhen: new Date(rep.lastPublishAt).toLocaleTimeString([], {\n\t\t\t\t\t\t\t\thour: '2-digit',\n\t\t\t\t\t\t\t\tminute: '2-digit'\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\t: h('span', { part: 'sub' }, this.t('backups.replica.pending'));\n\t\treturn h(\n\t\t\t'div',\n\t\t\t{\n\t\t\t\tpart: 'sub replica-line',\n\t\t\t\t'data-replica': '',\n\t\t\t\tstyle:\n\t\t\t\t\t'display:flex;flex-wrap:wrap;align-items:baseline;gap:0.1rem 0.5rem;margin-top:0.35rem'\n\t\t\t},\n\t\t\th('span', { part: 'replica-label' }, this.ts('backups.replica.card', { label })),\n\t\t\tstatus,\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{\n\t\t\t\t\tpart: 'link replica-remove',\n\t\t\t\t\ttype: 'button',\n\t\t\t\t\t'data-action': 'replica-remove',\n\t\t\t\t\tonclick: () =>\n\t\t\t\t\t\tthis.guarded({ type: 'replica-remove', label }, () => void this.#replicaFlow?.remove())\n\t\t\t\t},\n\t\t\t\tthis.t('backups.replica.remove')\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate replicaPicker(snap: ReplicaSnapshot): HTMLElement {\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card replica-picker', style: 'display:block' },\n\t\t\th('div', { part: 'title' }, this.t('backups.replica.title')),\n\t\t\th('div', { part: 'sub', style: 'margin:0.2rem 0 0.6rem' }, this.t('backups.replica.intro')),\n\t\t\t...snap.kinds.map((kind: ConnectKind) =>\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'button replica-dest',\n\t\t\t\t\t\tstyle: 'display:block;width:100%;text-align:left;margin-bottom:0.4rem',\n\t\t\t\t\t\t'data-kind': kind,\n\t\t\t\t\t\tdisabled: snap.busy,\n\t\t\t\t\t\tonclick: () => this.#replicaFlow?.pick(kind)\n\t\t\t\t\t},\n\t\t\t\t\tthis.t(`backups.replica.dest.${kind}`)\n\t\t\t\t)\n\t\t\t),\n\t\t\tsnap.error ? h('div', { part: 'error-note' }, this.t('error.generic')) : null,\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{\n\t\t\t\t\tpart: 'button',\n\t\t\t\t\t'data-action': 'replica-cancel',\n\t\t\t\t\tdisabled: snap.busy,\n\t\t\t\t\tonclick: () => this.#replicaFlow?.cancel()\n\t\t\t\t},\n\t\t\t\tthis.t('backups.cancel')\n\t\t\t)\n\t\t);\n\t}\n\n\t/** A config field: mutates state on input, no repaint (validated on submit). */\n\tprivate replicaField(\n\t\tkey: string,\n\t\ttype: string,\n\t\tvalue: string,\n\t\toninput: (v: string) => void\n\t): HTMLElement {\n\t\treturn h('input', {\n\t\t\tpart: 'input',\n\t\t\tstyle: 'display:block;width:100%;margin-bottom:0.4rem',\n\t\t\ttype,\n\t\t\tplaceholder: this.t(key),\n\t\t\t'aria-label': this.t(key),\n\t\t\tvalue,\n\t\t\toninput: (e: Event) => oninput((e.target as HTMLInputElement).value)\n\t\t});\n\t}\n\n\tprivate replicaWebdavForm(snap: ReplicaSnapshot): HTMLElement {\n\t\tconst c = this.#repWebdav;\n\t\tconst submit = (): void => {\n\t\t\tif (!c.url.trim()) return;\n\t\t\tthis.#replicaFlow?.submitWebdav({\n\t\t\t\turl: c.url.trim(),\n\t\t\t\tusername: c.username.trim(),\n\t\t\t\tpassword: c.password\n\t\t\t});\n\t\t};\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card replica-form', style: 'display:block' },\n\t\t\th('div', { part: 'title', style: 'margin-bottom:0.3rem' }, this.t('backups.replica.title')),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'sub', style: 'margin-bottom:0.6rem' },\n\t\t\t\tthis.t('backups.replica.webdav.help')\n\t\t\t),\n\t\t\tthis.replicaField('backups.replica.webdav.url', 'url', c.url, (v) => (c.url = v)),\n\t\t\tthis.replicaField('backups.replica.webdav.user', 'text', c.username, (v) => (c.username = v)),\n\t\t\tthis.replicaField(\n\t\t\t\t'backups.replica.webdav.password',\n\t\t\t\t'password',\n\t\t\t\tc.password,\n\t\t\t\t(v) => (c.password = v)\n\t\t\t),\n\t\t\tsnap.error ? h('div', { part: 'error-note' }, this.t('error.generic')) : null,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t'data-action': 'replica-webdav',\n\t\t\t\t\t\tdisabled: snap.busy,\n\t\t\t\t\t\tonclick: submit\n\t\t\t\t\t},\n\t\t\t\t\tthis.t('backups.replica.save')\n\t\t\t\t),\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'button', disabled: snap.busy, onclick: () => this.#replicaFlow?.cancel() },\n\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate replicaS3Form(snap: ReplicaSnapshot): HTMLElement {\n\t\tconst c = this.#repS3;\n\t\tconst submit = (): void => {\n\t\t\tconst config: S3Config = {\n\t\t\t\tendpoint: c.endpoint.trim(),\n\t\t\t\tregion: c.region.trim(),\n\t\t\t\tbucket: c.bucket.trim(),\n\t\t\t\tkey: c.key.trim(),\n\t\t\t\taccessKeyId: c.accessKeyId.trim(),\n\t\t\t\tsecretAccessKey: c.secretAccessKey\n\t\t\t};\n\t\t\tif (!config.endpoint || !config.region || !config.bucket || !config.key) return;\n\t\t\tif (!config.accessKeyId || !config.secretAccessKey) return;\n\t\t\tthis.#replicaFlow?.submitS3(config);\n\t\t};\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card replica-form', style: 'display:block' },\n\t\t\th('div', { part: 'title', style: 'margin-bottom:0.5rem' }, this.t('backups.replica.title')),\n\t\t\tthis.replicaField('backups.replica.s3.endpoint', 'url', c.endpoint, (v) => (c.endpoint = v)),\n\t\t\tthis.replicaField('backups.replica.s3.region', 'text', c.region, (v) => (c.region = v)),\n\t\t\tthis.replicaField('backups.replica.s3.bucket', 'text', c.bucket, (v) => (c.bucket = v)),\n\t\t\tthis.replicaField('backups.replica.s3.key', 'text', c.key, (v) => (c.key = v)),\n\t\t\tthis.replicaField(\n\t\t\t\t'backups.replica.s3.accessKeyId',\n\t\t\t\t'text',\n\t\t\t\tc.accessKeyId,\n\t\t\t\t(v) => (c.accessKeyId = v)\n\t\t\t),\n\t\t\tthis.replicaField(\n\t\t\t\t'backups.replica.s3.secret',\n\t\t\t\t'password',\n\t\t\t\tc.secretAccessKey,\n\t\t\t\t(v) => (c.secretAccessKey = v)\n\t\t\t),\n\t\t\tsnap.error ? h('div', { part: 'error-note' }, this.t('error.generic')) : null,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t'data-action': 'replica-s3',\n\t\t\t\t\t\tdisabled: snap.busy,\n\t\t\t\t\t\tonclick: submit\n\t\t\t\t\t},\n\t\t\t\t\tthis.t('backups.replica.save')\n\t\t\t\t),\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'button', disabled: snap.busy, onclick: () => this.#replicaFlow?.cancel() },\n\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\t// --- Menu -----------------------------------------------------------------\n\n\tprivate menuButton(key: string): HTMLElement {\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{\n\t\t\t\tpart: 'button menu-button',\n\t\t\t\t'aria-label': this.t('backups.menu'),\n\t\t\t\t'aria-haspopup': 'menu',\n\t\t\t\t'aria-expanded': this.#menuFor === key ? 'true' : 'false',\n\t\t\t\t'data-action': 'menu',\n\t\t\t\t'data-menu-key': key,\n\t\t\t\tdisabled: this.#busy,\n\t\t\t\tonclick: () => {\n\t\t\t\t\tthis.#menuFor = this.#menuFor === key ? null : key;\n\t\t\t\t\tthis.rerender();\n\t\t\t\t\t(this.root.querySelector('[part~=\"menu\"]') as HTMLElement | null)?.focus();\n\t\t\t\t}\n\t\t\t},\n\t\t\t'⋯'\n\t\t);\n\t}\n\n\t/** The open overflow menu: a backdrop closes it on any outside click or\n\t * tap, Escape closes it and hands focus back to its trigger. The panel is\n\t * a dropdown over the trigger's corner on wide screens and a bottom sheet\n\t * on phones - both styled in the base sheet. */\n\tprivate menu(...items: (HTMLElement | null)[]): HTMLElement {\n\t\tconst key = this.#menuFor;\n\t\tconst close = (): void => {\n\t\t\tthis.#menuFor = null;\n\t\t\tthis.rerender();\n\t\t\t(this.root.querySelector(`[data-menu-key=\"${key}\"]`) as HTMLElement | null)?.focus();\n\t\t};\n\t\treturn h(\n\t\t\t'div',\n\t\t\t{ part: 'menu-layer' },\n\t\t\th('div', { part: 'menu-backdrop', 'data-action': 'menu-close', onclick: close }),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\tpart: 'menu',\n\t\t\t\t\trole: 'menu',\n\t\t\t\t\ttabindex: '-1',\n\t\t\t\t\tonkeydown: (e: Event) => {\n\t\t\t\t\t\tif ((e as KeyboardEvent).key === 'Escape') close();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t...items.filter((i): i is HTMLElement => i !== null)\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate menuItem(action: string, text: string, danger: boolean, run: () => void): HTMLElement {\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{\n\t\t\t\tpart: danger ? 'menu-item menu-item-danger' : 'menu-item',\n\t\t\t\ttype: 'button',\n\t\t\t\trole: 'menuitem',\n\t\t\t\t'data-action': action,\n\t\t\t\tonclick: () => {\n\t\t\t\t\tthis.#menuFor = null;\n\t\t\t\t\trun();\n\t\t\t\t}\n\t\t\t},\n\t\t\ttext\n\t\t);\n\t}\n\n\tprivate eye(): HTMLElement {\n\t\tconst btn = h('button', {\n\t\t\tpart: 'eye',\n\t\t\ttype: 'button',\n\t\t\t'aria-label': this.t(this.#pwShown ? 'backups.pwHide' : 'backups.pwShow'),\n\t\t\tonclick: () => {\n\t\t\t\tthis.#pwShown = !this.#pwShown;\n\t\t\t\tthis.rerender();\n\t\t\t}\n\t\t});\n\t\tbtn.innerHTML = this.#pwShown ? EYE_SHUT : EYE_OPEN;\n\t\treturn btn;\n\t}\n\n\t// --- Gestures --------------------------------------------------------------\n\n\tprivate nameTaken(label: string, exceptFileId: string | null): boolean {\n\t\tconst clean = label.trim().toLowerCase();\n\t\tif (!clean || this.#busy) return false;\n\t\treturn (this.#rows ?? []).some(\n\t\t\t(r) => r.fileId !== exceptFileId && r.label !== null && r.label.trim().toLowerCase() === clean\n\t\t);\n\t}\n\n\t/** Run a destructive action through the host's veto (default: proceed).\n\t * A throwing hook reads as \"no\": destruction needs a clear yes. */\n\tprivate guarded(action: BackupsAction, run: () => void): void {\n\t\tconst gate = this.#confirmAction;\n\t\tif (!gate) {\n\t\t\trun();\n\t\t\treturn;\n\t\t}\n\t\tvoid Promise.resolve()\n\t\t\t.then(() => gate(action))\n\t\t\t.then((ok) => {\n\t\t\t\tif (ok) run();\n\t\t\t})\n\t\t\t.catch(() => undefined);\n\t}\n\n\t/** Open a row programmatically - the same gesture as tapping it, password\n\t * card included. Lets a host chain \"open this backup, then act on it\"\n\t * (its own sub-views) without re-implementing the passphrase step. */\n\tasync open(fileId: string, passphrase?: string): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.#openBusy = fileId;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tconst r = await manager.openBackup(fileId, passphrase ?? null);\n\t\t\tif (r === 'encrypted') {\n\t\t\t\tthis.#pwFor = fileId;\n\t\t\t\tif (passphrase) this.emit('selfstore-backups-wrong-password', { fileId });\n\t\t\t} else if (r === 'ok') {\n\t\t\t\tthis.closePw();\n\t\t\t\tthis.emit('selfstore-backups-opened', { fileId });\n\t\t\t\tvoid this.loadRows();\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t\tvoid this.loadRows(); // a GONE file was pruned: repaint truthfully\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.#openBusy = null;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async create(): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tconst label = this.#createLabel.trim();\n\t\tif (!manager || !label || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tconst r = await manager.createNamed(label);\n\t\t\tif (r === 'ok') {\n\t\t\t\tthis.#createOpen = false;\n\t\t\t\tthis.#createLabel = '';\n\t\t\t\tthis.emit('selfstore-backups-created', { label });\n\t\t\t\tvoid this.loadRows();\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async rename(row: BackupRow): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tconst label = this.#renameLabel.trim();\n\t\tif (!manager || !label || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tconst r = await manager.renameBackup(row.fileId, label);\n\t\t\tif (r === 'ok') {\n\t\t\t\tthis.#renameFor = null;\n\t\t\t\tthis.emit('selfstore-backups-renamed', { fileId: row.fileId, label });\n\t\t\t\tvoid this.loadRows();\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async deleteRow(fileId: string): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tif (await manager.deleteBackup(fileId)) {\n\t\t\t\tthis.#rows = (this.#rows ?? []).filter((r) => r.fileId !== fileId);\n\t\t\t\tthis.emit('selfstore-backups-deleted', { fileId });\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async forget(fileId: string): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager) return;\n\t\tawait manager.forgetShared(fileId);\n\t\tthis.emit('selfstore-backups-forgotten', { fileId });\n\t\tthis.rerender();\n\t}\n\n\tprivate closePw(): void {\n\t\tthis.#pwFor = null;\n\t\tthis.#pw = '';\n\t\tthis.#pwShown = false;\n\t}\n}\n\nconst pillStyle =\n\t'display:inline-block;font-size:0.72em;font-weight:600;line-height:1.6;padding:0 0.55em;border-radius:999px;border:1px solid var(--_border)';\n","// selfstore/widgets - the connect / share / join / backups journeys as\n// drop-in custom elements, skins over the headless flows. Framework-free:\n// plain HTML, Svelte, Vue and React all take them as-is.\n//\n// import { defineSelfstoreWidgets } from 'selfstore/widgets';\n// defineSelfstoreWidgets();\n//\n// Customization is layered, never a fork: --selfstore-* CSS custom\n// properties, ::part() on every node, a `labels` map merged over the EN\n// defaults (also the localization story), per-widget attributes with the\n// full journey as the default, and bubbling composed `selfstore-*` events.\n// The full knob and event list lives in the README.\n\nexport { SelfstoreConnectElement, type WebdavPreset } from '../widgets/connect';\nexport { SelfstoreShareElement, type ShareAction } from '../widgets/share';\nexport { SelfstoreJoinElement } from '../widgets/join';\nexport { SelfstoreStatusElement } from '../widgets/status';\nexport { SelfstoreBackupsElement, type BackupsAction } from '../widgets/backups';\nexport { FlowWidget, type WidgetLabels } from '../widgets/base';\n\nimport { SelfstoreConnectElement } from '../widgets/connect';\nimport { SelfstoreShareElement } from '../widgets/share';\nimport { SelfstoreJoinElement } from '../widgets/join';\nimport { SelfstoreStatusElement } from '../widgets/status';\nimport { SelfstoreBackupsElement } from '../widgets/backups';\n\n/** Register the elements as <PREFIX-connect>, <PREFIX-share>, <PREFIX-join>,\n * <PREFIX-status> and <PREFIX-backups> (default prefix 'selfstore'). Safe to\n * call twice; throws in environments without custom elements (browser code\n * only). */\nexport function defineSelfstoreWidgets(prefix = 'selfstore'): void {\n\tconst define = (name: string, ctor: CustomElementConstructor): void => {\n\t\tif (!customElements.get(name)) customElements.define(name, ctor);\n\t};\n\tdefine(`${prefix}-connect`, SelfstoreConnectElement);\n\tdefine(`${prefix}-share`, SelfstoreShareElement);\n\tdefine(`${prefix}-join`, SelfstoreJoinElement);\n\tdefine(`${prefix}-status`, SelfstoreStatusElement);\n\tdefine(`${prefix}-backups`, SelfstoreBackupsElement);\n}\n"]}