@ai-matrx/vault 0.1.42 → 0.1.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.42
3
+ ## 0.1.44
4
4
 
5
5
  UNVERIFIED: this release has no Unreleased entry and the source comparison could not be made (the caller supplied no source comparison). Whether source changed is unknown; consumer action is unknown.
6
6
  Check the package's gitHead on npm against this version's gitHead: `git diff <previous gitHead> <this gitHead> -- apps/shared/vault/src`.
@@ -299,6 +299,8 @@ Changed shipped source files (8):
299
299
  ## 0.1.7
300
300
  ### Unreleased
301
301
 
302
+ - **Narrow-container fixes from the 360px / 22.5rem playground walk** (2026-10-23): an Authenticator list row measures its OWN width, so below 26rem the code drops onto a second line under the name (the name keeps the row, the code is never squeezed) and above it everything stays on one line; the camera notes in Add authenticator wrap to a second line instead of being cut by Dismiss, and the setup-key hint is "Setup key or otpauth link" (`SETUP_KEY_PLACEHOLDER`); same-named organizations get the shortest id fragment that differs inside their group (`organizationHints`, a suffix when whole ids collide) instead of an identical first 8 characters; the item header measures its pane, not the window (the star and Share step into the "..." menu, the title wraps to two lines, the owner badge wraps below instead of clipping), and the one-time password row hides its separate copy button below 24rem so the ring never sits on it ("Copy code" is in its menu; the code itself still copies). Proof: `src/container-responsive-layout.test.tsx`, `src/narrow-setup-notes.test.tsx`, `src/organization-hints-distinct.test.ts`. Consumer action: none.
303
+
302
304
  - Host-held lock: `host.lock` (`VaultLock`: `locked`, `subscribe`, `unlock`, optional `lock` and
303
305
  `unlockLabel`). While locked the vault shows only "Vault locked" with Unlock, and every port call
304
306
  (areas included) is refused at call time (`guardPort`, `VaultLockedError`). "Lock" joins the
package/dist/index.cjs CHANGED
@@ -1593,7 +1593,7 @@ function HistoryRow({ item, port, page, entry, label, onRestored, onConflict, on
1593
1593
  var import_react13 = require("react");
1594
1594
  var import_controls9 = require("@ai-matrx/design-system/controls");
1595
1595
  var import_design_system10 = require("@ai-matrx/design-system");
1596
- var import_icons5 = require("@ai-matrx/design-system/icons");
1596
+ var import_icons6 = require("@ai-matrx/design-system/icons");
1597
1597
 
1598
1598
  // src/ItemIcon.tsx
1599
1599
  var import_design_system7 = require("@ai-matrx/design-system");
@@ -1928,6 +1928,7 @@ function useCanScan() {
1928
1928
  }, []);
1929
1929
  return ok;
1930
1930
  }
1931
+ var SETUP_KEY_PLACEHOLDER = "Setup key or otpauth link";
1931
1932
  var CAMERA_NOTES = {
1932
1933
  blocked: "Camera blocked. Paste the key or choose a QR image.",
1933
1934
  missing: "No camera. Paste the key or choose a QR image.",
@@ -1988,7 +1989,7 @@ function QrScanInline({ onResult, onClose }) {
1988
1989
  if (error) {
1989
1990
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { className: "flex items-center gap-2 px-1 pt-1 text-xs text-muted-foreground", role: "status", "data-camera-note": "", children: [
1990
1991
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CameraGlyph, { className: "size-3.5 shrink-0", "aria-hidden": true }),
1991
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "min-w-0 flex-1 truncate", children: error }),
1992
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "min-w-0 flex-1 break-words", children: error }),
1992
1993
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_controls6.Button, { variant: "quiet", onClick: onClose, children: "Dismiss" })
1993
1994
  ] });
1994
1995
  }
@@ -2003,7 +2004,7 @@ function QrScanInline({ onResult, onClose }) {
2003
2004
  ] })
2004
2005
  ] });
2005
2006
  }
2006
- function OtpSetupRow({ value, onChange, label = "Authenticator", placeholder = "Paste setup key or otpauth link", disabled = false, autoFocus = false, onImage, onRecognized, status, autoStartCamera = false }) {
2007
+ function OtpSetupRow({ value, onChange, label = "Authenticator", placeholder = SETUP_KEY_PLACEHOLDER, disabled = false, autoFocus = false, onImage, onRecognized, status, autoStartCamera = false }) {
2007
2008
  const file = (0, import_react10.useRef)(null);
2008
2009
  const canScan = useCanScan();
2009
2010
  const [scanning, setScanning] = (0, import_react10.useState)(false);
@@ -2140,6 +2141,7 @@ var import_react11 = require("react");
2140
2141
  var import_controls7 = require("@ai-matrx/design-system/controls");
2141
2142
  var import_design_system9 = require("@ai-matrx/design-system");
2142
2143
  var import_confirm_opener2 = require("@ai-matrx/kit/confirm-opener");
2144
+ var import_icons5 = require("@ai-matrx/design-system/icons");
2143
2145
 
2144
2146
  // src/authenticator/port.ts
2145
2147
  var OTP_SEED_KEY = "totp_seed";
@@ -2204,11 +2206,16 @@ function useOtpActions(port, item, onChanged) {
2204
2206
  function TotpRow({ port, item, onChanged }) {
2205
2207
  const a = useOtpActions(port, item, onChanged);
2206
2208
  const live = useLiveCode(port, item, a.enabled && !a.removed);
2209
+ const { copy } = useCopied();
2207
2210
  const canManage = item.capabilities.canManage || item.capabilities.canEdit;
2208
2211
  if (a.removed || !item.authenticator) return null;
2209
2212
  const menu = canManage ? /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_design_system9.DropdownMenu, { children: [
2210
2213
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_design_system9.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_controls7.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(MoreGlyph, {}), "aria-label": "Authenticator options", disabled: a.busy }) }),
2211
2214
  /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_design_system9.DropdownMenuContent, { align: "end", className: "min-w-44", children: [
2215
+ a.enabled && live.code ? /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_design_system9.DropdownMenuItem, { onSelect: () => live.code && void copy(live.code), children: [
2216
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_icons5.CopyIcon, { className: "size-4" }),
2217
+ "Copy code"
2218
+ ] }) : null,
2212
2219
  /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_design_system9.DropdownMenuItem, { onSelect: () => void a.setEnabled(!a.enabled), children: [
2213
2220
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(PowerGlyph, { className: "size-4" }),
2214
2221
  a.enabled ? "Turn off" : "Turn on"
@@ -2220,12 +2227,12 @@ function TotpRow({ port, item, onChanged }) {
2220
2227
  ] })
2221
2228
  ] })
2222
2229
  ] }) : null;
2223
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2230
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "@container/otprow", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2224
2231
  VaultRow,
2225
2232
  {
2226
2233
  label: "Authenticator",
2227
2234
  actions: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
2228
- a.enabled ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(CopyCodeButton, { live, label: item.name }) : null,
2235
+ a.enabled ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "hidden @[24rem]/otprow:contents", "data-copy-code-button": "", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(CopyCodeButton, { live, label: item.name }) }) : null,
2229
2236
  menu
2230
2237
  ] }),
2231
2238
  children: a.error ? /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: "flex items-center gap-2", children: [
@@ -2239,7 +2246,7 @@ function TotpRow({ port, item, onChanged }) {
2239
2246
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_controls7.Button, { variant: "quiet", onClick: live.retry, children: "Retry" })
2240
2247
  ] }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(CodeButton, { live, digits: item.authenticator.digits, label: item.name })
2241
2248
  }
2242
- );
2249
+ ) });
2243
2250
  }
2244
2251
  function TotpEditRow({ value, onChange, hasExisting, item, port, onEnrolled, onRecognized }) {
2245
2252
  const confirmed = useConfirmed();
@@ -2263,7 +2270,7 @@ function TotpEditRow({ value, onChange, hasExisting, item, port, onEnrolled, onR
2263
2270
  setStatus(null);
2264
2271
  onChange(v);
2265
2272
  },
2266
- placeholder: hasExisting ? "Paste a new key to replace" : "Paste setup key or otpauth link",
2273
+ placeholder: hasExisting ? "Paste a new key to replace" : SETUP_KEY_PLACEHOLDER,
2267
2274
  status,
2268
2275
  ...uploadImage ? { onImage: (f) => void uploadImage(f) } : {},
2269
2276
  ...onRecognized ? { onRecognized } : {}
@@ -2608,78 +2615,83 @@ function OtpListRow({ port, item, family, entry, onOpen, onOpenInNewTab, onRenam
2608
2615
  const canManage = item.capabilities.canManage || item.capabilities.canEdit;
2609
2616
  if (a.removed) return null;
2610
2617
  const sub = a.error ?? [entry?.account, loginSiteOf(item) || entry?.issuer].filter((v, i, all) => Boolean(v) && all.indexOf(v) === i).join(" \xB7 ");
2611
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "grid min-h-14 grid-cols-[2rem_minmax(0,1fr)_auto_auto] items-center gap-x-1 rounded-lg px-2 py-1.5 transition-colors hover:bg-accent/50", children: [
2612
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2613
- import_controls9.Button,
2614
- {
2615
- type: "button",
2616
- variant: "quiet",
2617
- icon: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ItemIcon, { definitionKey: item.definitionKey, family, site: loginSiteOf(item) || (entry?.issuer ?? "") }),
2618
- "aria-label": `Open ${item.name}`,
2619
- tabIndex: -1,
2620
- className: "shrink-0",
2621
- onClick: onOpen
2622
- }
2623
- ),
2624
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2625
- import_controls9.Tile,
2626
- {
2627
- type: "button",
2628
- variant: "quiet",
2629
- onClick: onOpen,
2630
- title: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: a.enabled ? "text-foreground" : "text-muted-foreground", children: item.name }),
2631
- line: sub ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: a.error ? "text-destructive" : "text-muted-foreground", title: sub, children: sub }) : void 0,
2632
- oneLine: true,
2633
- className: "min-w-0"
2634
- }
2635
- ),
2636
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "flex shrink-0 justify-end", children: !a.enabled ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1.5", children: [
2637
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "text-sm text-disabled-foreground", children: "Off" }),
2638
- canManage ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_controls9.Button, { variant: "quiet", disabled: a.busy, onClick: () => void a.setEnabled(true), children: "Turn on" }) : null
2639
- ] }) : live.error ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1.5", children: [
2640
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "max-w-40 truncate text-xs text-destructive", title: live.error, children: live.error }),
2641
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_controls9.Button, { variant: "quiet", onClick: live.retry, children: "Retry" })
2642
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(CodeButton, { live, digits: item.authenticator?.digits ?? 6, label: item.name }) }),
2643
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenu, { children: [
2644
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_design_system10.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_controls9.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(MoreGlyph, {}), "aria-label": `${item.name} options`, disabled: a.busy }) }),
2645
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenuContent, { align: "end", className: "min-w-44", children: [
2646
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenuItem, { onSelect: onOpen, children: [
2647
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ExternalGlyph, { className: "size-4" }),
2648
- "Open login"
2649
- ] }),
2650
- onOpenInNewTab ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenuItem, { onSelect: onOpenInNewTab, children: [
2651
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ExternalGlyph, { className: "size-4" }),
2652
- "Open in new tab"
2653
- ] }) : null,
2654
- live.code ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenuItem, { onSelect: () => live.code && void copy(live.code), children: [
2655
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_icons5.CopyIcon, { className: "size-4" }),
2656
- "Copy code"
2657
- ] }) : null,
2658
- canManage ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
2659
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenuItem, { onSelect: onRename, children: [
2660
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(PencilGlyph, { className: "size-4" }),
2661
- "Rename"
2662
- ] }),
2663
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenuItem, { onSelect: () => void a.setEnabled(!a.enabled), children: [
2664
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(PowerGlyph, { className: "size-4" }),
2665
- a.enabled ? "Turn off" : "Turn on"
2618
+ return (
2619
+ // A container, not the window, decides: below 26rem of row width the code drops onto its own line
2620
+ // under the name (the name keeps the whole row's width, the code is never squeezed); above it
2621
+ // everything sits on one line. The side panel and the 22.5rem frame are narrow at any window size.
2622
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "@container/otp", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "grid min-h-14 grid-cols-[2rem_minmax(0,1fr)_auto] items-center gap-x-1 gap-y-0.5 rounded-lg px-2 py-1.5 transition-colors hover:bg-accent/50 @[26rem]/otp:grid-cols-[2rem_minmax(0,1fr)_auto_auto]", children: [
2623
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2624
+ import_controls9.Button,
2625
+ {
2626
+ type: "button",
2627
+ variant: "quiet",
2628
+ icon: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ItemIcon, { definitionKey: item.definitionKey, family, site: loginSiteOf(item) || (entry?.issuer ?? "") }),
2629
+ "aria-label": `Open ${item.name}`,
2630
+ tabIndex: -1,
2631
+ className: "col-start-1 row-start-1 shrink-0",
2632
+ onClick: onOpen
2633
+ }
2634
+ ),
2635
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2636
+ import_controls9.Tile,
2637
+ {
2638
+ type: "button",
2639
+ variant: "quiet",
2640
+ onClick: onOpen,
2641
+ title: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: a.enabled ? "text-foreground" : "text-muted-foreground", children: item.name }),
2642
+ line: sub ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: a.error ? "text-destructive" : "text-muted-foreground", title: sub, children: sub }) : void 0,
2643
+ oneLine: true,
2644
+ className: "col-start-2 row-start-1 min-w-0"
2645
+ }
2646
+ ),
2647
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "col-start-2 row-start-2 flex min-w-0 justify-start @[26rem]/otp:col-start-3 @[26rem]/otp:row-start-1 @[26rem]/otp:shrink-0 @[26rem]/otp:justify-end", children: !a.enabled ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1.5", children: [
2648
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "text-sm text-disabled-foreground", children: "Off" }),
2649
+ canManage ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_controls9.Button, { variant: "quiet", disabled: a.busy, onClick: () => void a.setEnabled(true), children: "Turn on" }) : null
2650
+ ] }) : live.error ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1.5", children: [
2651
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "max-w-40 truncate text-xs text-destructive", title: live.error, children: live.error }),
2652
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_controls9.Button, { variant: "quiet", onClick: live.retry, children: "Retry" })
2653
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(CodeButton, { live, digits: item.authenticator?.digits ?? 6, label: item.name }) }),
2654
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenu, { children: [
2655
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_design_system10.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_controls9.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(MoreGlyph, {}), "aria-label": `${item.name} options`, disabled: a.busy, className: "col-start-3 row-start-1 @[26rem]/otp:col-start-4" }) }),
2656
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenuContent, { align: "end", className: "min-w-44", children: [
2657
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenuItem, { onSelect: onOpen, children: [
2658
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ExternalGlyph, { className: "size-4" }),
2659
+ "Open login"
2666
2660
  ] }),
2667
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_design_system10.DropdownMenuSeparator, {}),
2668
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenuItem, { className: "text-destructive focus:text-destructive", onSelect: () => void a.remove(), children: [
2669
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TrashGlyph, { className: "size-4" }),
2670
- "Remove"
2671
- ] })
2672
- ] }) : null
2661
+ onOpenInNewTab ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenuItem, { onSelect: onOpenInNewTab, children: [
2662
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ExternalGlyph, { className: "size-4" }),
2663
+ "Open in new tab"
2664
+ ] }) : null,
2665
+ live.code ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenuItem, { onSelect: () => live.code && void copy(live.code), children: [
2666
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_icons6.CopyIcon, { className: "size-4" }),
2667
+ "Copy code"
2668
+ ] }) : null,
2669
+ canManage ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
2670
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenuItem, { onSelect: onRename, children: [
2671
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(PencilGlyph, { className: "size-4" }),
2672
+ "Rename"
2673
+ ] }),
2674
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenuItem, { onSelect: () => void a.setEnabled(!a.enabled), children: [
2675
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(PowerGlyph, { className: "size-4" }),
2676
+ a.enabled ? "Turn off" : "Turn on"
2677
+ ] }),
2678
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_design_system10.DropdownMenuSeparator, {}),
2679
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_design_system10.DropdownMenuItem, { className: "text-destructive focus:text-destructive", onSelect: () => void a.remove(), children: [
2680
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TrashGlyph, { className: "size-4" }),
2681
+ "Remove"
2682
+ ] })
2683
+ ] }) : null
2684
+ ] })
2673
2685
  ] })
2674
- ] })
2675
- ] });
2686
+ ] }) })
2687
+ );
2676
2688
  }
2677
2689
 
2678
2690
  // src/fields/SettingsPanels.tsx
2679
2691
  var import_react14 = require("react");
2680
2692
  var import_controls10 = require("@ai-matrx/design-system/controls");
2681
2693
  var import_confirm_opener3 = require("@ai-matrx/kit/confirm-opener");
2682
- var import_icons6 = require("@ai-matrx/design-system/icons");
2694
+ var import_icons7 = require("@ai-matrx/design-system/icons");
2683
2695
 
2684
2696
  // src/fields/rules.ts
2685
2697
  var ENV_KEY_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
@@ -2942,7 +2954,7 @@ function ItemSettingsPanel({ item, port, onClose, onChanged, onPanel }) {
2942
2954
  {
2943
2955
  label: f.label,
2944
2956
  hint: quietHint("Encrypted, so the browser can\u2019t match it"),
2945
- actions: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_controls10.Button, { variant: "outline", icon: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_icons6.GlobeIcon, {}), disabled: locked, onClick: () => void promote(f), children: "Use as website" }),
2957
+ actions: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_controls10.Button, { variant: "outline", icon: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_icons7.GlobeIcon, {}), disabled: locked, onClick: () => void promote(f), children: "Use as website" }),
2946
2958
  children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "text-muted-foreground", children: "Not a website yet" })
2947
2959
  },
2948
2960
  f.id
@@ -2976,7 +2988,7 @@ function ItemSettingsPanel({ item, port, onClose, onChanged, onPanel }) {
2976
2988
  var import_react15 = require("react");
2977
2989
  var import_design_system11 = require("@ai-matrx/design-system");
2978
2990
  var import_controls11 = require("@ai-matrx/design-system/controls");
2979
- var import_icons7 = require("@ai-matrx/design-system/icons");
2991
+ var import_icons8 = require("@ai-matrx/design-system/icons");
2980
2992
 
2981
2993
  // src/generator/generate.ts
2982
2994
  var import_credential_generator = require("@ai-matrx/kit/credential-generator");
@@ -3131,7 +3143,7 @@ function PasswordGenerator({ limits: source, onUse, useLabel = "Use" }) {
3131
3143
  /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex min-h-7 items-start gap-1", children: [
3132
3144
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("code", { className: (0, import_design_system11.cn)("min-w-0 flex-1 break-all py-1 font-mono text-sm", candidate ? "text-foreground" : "text-muted-foreground"), "data-testid": "generated-value", children: candidate ? revealed ? candidate.value : MASK3 : "\u2014" }),
3133
3145
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_controls11.Button, { variant: "quiet", icon: revealed ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(EyeOffGlyph, {}) : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(EyeGlyph, {}), "aria-label": revealed ? "Hide" : "Reveal", disabled: !candidate, onClick: () => setRevealed((r) => !r) }),
3134
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_controls11.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_icons7.CopyIcon, {}), "aria-label": "Copy", disabled: !candidate, onClick: () => void copy() }),
3146
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_controls11.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_icons8.CopyIcon, {}), "aria-label": "Copy", disabled: !candidate, onClick: () => void copy() }),
3135
3147
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_controls11.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(RefreshGlyph, {}), "aria-label": "Generate another", onClick: () => change(settings) })
3136
3148
  ] }),
3137
3149
  strength && candidate ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("p", { className: "text-xs", children: [
@@ -5017,7 +5029,7 @@ var import_react30 = require("react");
5017
5029
  var import_design_system19 = require("@ai-matrx/design-system");
5018
5030
  var import_design_system20 = require("@ai-matrx/design-system");
5019
5031
  var import_controls23 = require("@ai-matrx/design-system/controls");
5020
- var import_icons12 = require("@ai-matrx/design-system/icons");
5032
+ var import_icons13 = require("@ai-matrx/design-system/icons");
5021
5033
 
5022
5034
  // src/ItemPane.tsx
5023
5035
  var import_react29 = require("react");
@@ -5033,7 +5045,7 @@ var import_controls16 = require("@ai-matrx/design-system/controls");
5033
5045
  var import_design_system13 = require("@ai-matrx/design-system");
5034
5046
  var import_confirm_opener6 = require("@ai-matrx/kit/confirm-opener");
5035
5047
  var import_download3 = require("@ai-matrx/kit/download");
5036
- var import_icons8 = require("@ai-matrx/design-system/icons");
5048
+ var import_icons9 = require("@ai-matrx/design-system/icons");
5037
5049
  var import_jsx_runtime20 = require("react/jsx-runtime");
5038
5050
  var messageOf2 = (e, fallback) => wasCancelled(e) ? null : e instanceof Error ? e.message : fallback;
5039
5051
  var TOO_BIG = "Files over 25 MB can't be stored.";
@@ -5109,7 +5121,7 @@ function FilesSection({ item, port, editing, onChanged }) {
5109
5121
  {
5110
5122
  label: a.label,
5111
5123
  hint: a.description || void 0,
5112
- actions: a.handling === "sealed" ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_controls16.Badge, { icon: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(LockGlyph, {}), children: "Never shown" }) : canDownload(item, a) ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_controls16.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_icons8.DownloadIcon, {}), "aria-label": `Download ${a.fileName}`, disabled: busy !== null, onClick: () => void download(a) }) : null,
5124
+ actions: a.handling === "sealed" ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_controls16.Badge, { icon: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(LockGlyph, {}), children: "Never shown" }) : canDownload(item, a) ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_controls16.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_icons9.DownloadIcon, {}), "aria-label": `Download ${a.fileName}`, disabled: busy !== null, onClick: () => void download(a) }) : null,
5113
5125
  children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(FileName, { file: a })
5114
5126
  },
5115
5127
  a.id
@@ -5140,7 +5152,7 @@ function EditableFile({ port, item: it, file: a, busy: b, run: go, onDownload, o
5140
5152
  label: a.label,
5141
5153
  hint: a.description || void 0,
5142
5154
  actions: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
5143
- canDownload(it, a) ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_controls16.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_icons8.DownloadIcon, {}), "aria-label": `Download ${a.fileName}`, disabled: b !== null, onClick: onDownload }) : null,
5155
+ canDownload(it, a) ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_controls16.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_icons9.DownloadIcon, {}), "aria-label": `Download ${a.fileName}`, disabled: b !== null, onClick: onDownload }) : null,
5144
5156
  /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_controls16.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(PencilGlyph, {}), "aria-label": `Edit ${a.label}`, pressed: open, disabled: b !== null, onClick: () => setOpen((o) => !o) }),
5145
5157
  /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_controls16.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(UploadGlyph, {}), "aria-label": `Replace ${a.fileName}`, disabled: b !== null, onClick: () => replacer.current?.click() }),
5146
5158
  /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_controls16.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(TrashGlyph, {}), "aria-label": `Delete ${a.label}`, disabled: b !== null, onClick: () => void remove() }),
@@ -5291,7 +5303,7 @@ function DraftFilesSection({ files, onFiles }) {
5291
5303
  // src/fields/RecoveryCodesRow.tsx
5292
5304
  var import_react23 = require("react");
5293
5305
  var import_controls17 = require("@ai-matrx/design-system/controls");
5294
- var import_icons9 = require("@ai-matrx/design-system/icons");
5306
+ var import_icons10 = require("@ai-matrx/design-system/icons");
5295
5307
  var import_jsx_runtime21 = require("react/jsx-runtime");
5296
5308
  var MASK4 = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
5297
5309
  var say2 = (e, fallback) => e instanceof Error && e.message ? e.message : fallback;
@@ -5386,7 +5398,7 @@ function RecoveryCodesRow({ item, field, port, onChanged }) {
5386
5398
  children: sealed ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_controls17.Badge, { icon: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(LockGlyph, {}), children: "Never shown" }) : codes ? /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("ul", { className: "flex flex-col gap-0.5", "aria-label": "Recovery codes", children: [
5387
5399
  codes.map((code, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("li", { className: "flex min-h-7 items-center gap-1", children: [
5388
5400
  /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("code", { className: "min-w-0 flex-1 break-all font-mono text-sm text-foreground", children: code }),
5389
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_controls17.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_icons9.CopyIcon, {}), "aria-label": `Copy code ${i + 1}`, onClick: () => void copyValue2(code, "Recovery code") }),
5401
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_controls17.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_icons10.CopyIcon, {}), "aria-label": `Copy code ${i + 1}`, onClick: () => void copyValue2(code, "Recovery code") }),
5390
5402
  canEdit ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_controls17.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(CheckGlyph, {}), disabled: busy, onClick: () => void markUsed(i), children: "Mark used" }) : null
5391
5403
  ] }, `${i}-${code}`)),
5392
5404
  error ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("li", { role: "alert", className: "text-xs text-destructive", children: error }) : null
@@ -5567,7 +5579,7 @@ function turnedOnSentence(done) {
5567
5579
  }
5568
5580
 
5569
5581
  // src/ItemPane.tsx
5570
- var import_icons11 = require("@ai-matrx/design-system/icons");
5582
+ var import_icons12 = require("@ai-matrx/design-system/icons");
5571
5583
  var import_drafts = require("@ai-matrx/kit/drafts");
5572
5584
 
5573
5585
  // src/draft-keep.ts
@@ -5723,7 +5735,7 @@ var import_react28 = require("react");
5723
5735
  var import_confirm_opener9 = require("@ai-matrx/kit/confirm-opener");
5724
5736
  var import_controls21 = require("@ai-matrx/design-system/controls");
5725
5737
  var import_design_system16 = require("@ai-matrx/design-system");
5726
- var import_icons10 = require("@ai-matrx/design-system/icons");
5738
+ var import_icons11 = require("@ai-matrx/design-system/icons");
5727
5739
 
5728
5740
  // src/sharing/logic.ts
5729
5741
  var LEVEL_OPTIONS = [
@@ -6006,7 +6018,7 @@ function SharePanel({ item, port, organizations, onClose, onChanged }) {
6006
6018
  children: [
6007
6019
  /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(VaultSection, { title: "Who has access", children: [
6008
6020
  isOrg ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(AccessLine, { glyph: BuildingGlyph, who: `${orgName} admins`, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "px-2 text-sm text-muted-foreground", children: "Full access" }) }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(AccessLine, { glyph: PersonGlyph, who: "You", meta: "Owner", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "px-2 text-sm text-muted-foreground", children: "Full access" }) }),
6009
- isOrg ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(AccessLine, { glyph: import_icons10.UsersIcon, who: `${orgName} members`, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
6021
+ isOrg ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(AccessLine, { glyph: import_icons11.UsersIcon, who: `${orgName} members`, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
6010
6022
  import_controls21.Select,
6011
6023
  {
6012
6024
  variant: "inline",
@@ -6370,27 +6382,27 @@ function ItemPane(props) {
6370
6382
  const recoveryExtra = extraFields.some(isRecoveryCodesField);
6371
6383
  const offerRecovery = isLogin || Boolean(item?.authenticator) || draft.authenticator.trim() !== "";
6372
6384
  const recoveryEditing = !recoveryDeclared && !recoveryExtra && (showRecovery || (draft.values[RECOVERY_CODES_KEY] ?? "") !== "");
6373
- const shownOwner = mode === "new" ? owner === "me" ? { label: "Personal", glyph: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(PersonGlyph, {}) } : owner === "person" ? { label: "Someone else", glyph: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SendGlyph, {}) } : { label: organizations.find((o) => o.id === owner)?.name ?? "Organization", glyph: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(BuildingGlyph, {}) } : item ? { label: item.owner.label, glyph: item.owner.kind === "me" ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(PersonGlyph, {}) : item.owner.kind === "organization" ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(BuildingGlyph, {}) : /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_icons11.UsersIcon, {}) } : null;
6385
+ const shownOwner = mode === "new" ? owner === "me" ? { label: "Personal", glyph: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(PersonGlyph, {}) } : owner === "person" ? { label: "Someone else", glyph: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SendGlyph, {}) } : { label: organizations.find((o) => o.id === owner)?.name ?? "Organization", glyph: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(BuildingGlyph, {}) } : item ? { label: item.owner.label, glyph: item.owner.kind === "me" ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(PersonGlyph, {}) : item.owner.kind === "organization" ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(BuildingGlyph, {}) : /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_icons12.UsersIcon, {}) } : null;
6374
6386
  const sameNamed = (id) => {
6375
6387
  const name = organizations.find((o) => o.id === id)?.name.trim().toLowerCase();
6376
6388
  return Boolean(name) && organizations.filter((o) => o.name.trim().toLowerCase() === name).length > 1;
6377
6389
  };
6378
6390
  const tagsVisible = showTags || draft.tags.length > 0 || tagsText !== "";
6379
6391
  const descriptionVisible = showDescription || draft.description !== "";
6380
- const header = /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("header", { className: "flex min-h-14 items-center gap-2 border-b border-border px-3 py-2 sm:gap-3 sm:px-5", children: [
6392
+ const header = /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "@container/vhead", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("header", { className: "flex min-h-14 items-center gap-2 border-b border-border px-3 py-2 @[30rem]/vhead:gap-3 @[30rem]/vhead:px-5", children: [
6381
6393
  onBack ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_controls22.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ChevronLeftGlyph, {}), "aria-label": "Back", onClick: mode === "new" ? onCancelNew : onBack }) : null,
6382
6394
  /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ItemIcon, { definitionKey: definition?.key ?? item?.definitionKey ?? "custom", family: definition?.family ?? "generic", site: item ? loginSiteOf(item) : loginSiteOf({ loginUrls: draft.loginUrls }), size: "lg" }),
6383
6395
  /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "flex min-w-0 flex-1 flex-col", children: [
6384
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("h2", { className: "truncate text-base font-semibold leading-tight", children: editing ? draft.name || (mode === "new" ? `New ${typeLabel.toLowerCase()}` : item?.name) : item?.name }),
6385
- /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("span", { className: "flex min-w-0 items-center gap-1 text-xs text-muted-foreground", children: [
6386
- typeLabel ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "truncate", children: typeLabel }) : null,
6396
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("h2", { className: "line-clamp-2 break-words text-base font-semibold leading-tight", children: editing ? draft.name || (mode === "new" ? `New ${typeLabel.toLowerCase()}` : item?.name) : item?.name }),
6397
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("span", { className: "flex min-w-0 flex-wrap items-center gap-x-1 text-xs text-muted-foreground", children: [
6398
+ typeLabel ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "break-words", children: typeLabel }) : null,
6387
6399
  shownOwner ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_controls22.Badge, { className: "shrink-0", icon: shownOwner.glyph, "aria-label": `Saved in ${shownOwner.label}`, title: item && mode !== "new" ? ownerDetail(item.owner) : void 0, children: shownOwner.label }) : null,
6388
6400
  item && mode !== "new" && item.owner.memberShared ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "shrink-0", "data-member-shared": "", children: "\xB7 A member\u2019s own" }) : null,
6389
- item && !editing ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SharingSummary, { item, port, className: "hidden truncate before:mr-1 before:content-['\xB7'] sm:inline" }, `${item.updatedAt}-${refreshKey ?? ""}`) : null
6401
+ item && !editing ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SharingSummary, { item, port, className: "hidden truncate before:mr-1 before:content-['\xB7'] @[30rem]/vhead:inline" }, `${item.updatedAt}-${refreshKey ?? ""}`) : null
6390
6402
  ] })
6391
6403
  ] }),
6392
6404
  editing ? /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "flex shrink-0 items-center gap-2", children: [
6393
- dirty ? /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("span", { className: "hidden items-center gap-1.5 text-xs text-muted-foreground sm:flex", role: "status", children: [
6405
+ dirty ? /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("span", { className: "hidden items-center gap-1.5 text-xs text-muted-foreground @[30rem]/vhead:flex", role: "status", children: [
6394
6406
  /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "size-1.5 rounded-full bg-warning", "aria-hidden": true }),
6395
6407
  "Unsaved"
6396
6408
  ] }) : null,
@@ -6409,8 +6421,8 @@ function ItemPane(props) {
6409
6421
  children: "Fill"
6410
6422
  }
6411
6423
  ) : null,
6412
- favorite ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "hidden sm:contents", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_controls22.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(StarGlyph, { className: favorite.on ? "fill-current text-warning" : "size-4" }), "aria-label": favorite.on ? "Remove from favorites" : "Add to favorites", pressed: favorite.on, onClick: favorite.toggle }) }) : null,
6413
- canManage ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "hidden sm:contents", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_controls22.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ShareGlyph, {}), "aria-label": "Share", onClick: () => onPanel("share") }) }) : null,
6424
+ favorite ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "hidden @[30rem]/vhead:contents", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_controls22.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(StarGlyph, { className: favorite.on ? "fill-current text-warning" : "size-4" }), "aria-label": favorite.on ? "Remove from favorites" : "Add to favorites", pressed: favorite.on, onClick: favorite.toggle }) }) : null,
6425
+ canManage ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "hidden @[30rem]/vhead:contents", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_controls22.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ShareGlyph, {}), "aria-label": "Share", onClick: () => onPanel("share") }) }) : null,
6414
6426
  canEdit ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_controls22.Button, { variant: "outline", icon: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(PencilGlyph, {}), collapse: "container", "aria-label": "Edit", onClick: () => onMode("edit"), children: "Edit" }) : null,
6415
6427
  /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_design_system17.DropdownMenu, { children: [
6416
6428
  /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_design_system17.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_controls22.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(MoreGlyph, {}), "aria-label": "More actions" }) }),
@@ -6432,7 +6444,7 @@ function ItemPane(props) {
6432
6444
  "Send securely"
6433
6445
  ] }) : null,
6434
6446
  /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_design_system17.DropdownMenuItem, { onSelect: () => onPanel("history"), children: [
6435
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_icons11.HistoryIcon, { className: "size-4" }),
6447
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_icons12.HistoryIcon, { className: "size-4" }),
6436
6448
  "Password history"
6437
6449
  ] }),
6438
6450
  /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_design_system17.DropdownMenuItem, { onSelect: () => onPanel("activity"), children: [
@@ -6440,7 +6452,7 @@ function ItemPane(props) {
6440
6452
  "Activity"
6441
6453
  ] }),
6442
6454
  canEdit ? /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_design_system17.DropdownMenuItem, { onSelect: () => onPanel("settings"), children: [
6443
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_icons11.SettingsIcon, { className: "size-4" }),
6455
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_icons12.SettingsIcon, { className: "size-4" }),
6444
6456
  "Settings"
6445
6457
  ] }) : null,
6446
6458
  canManage ? /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
@@ -6464,7 +6476,7 @@ function ItemPane(props) {
6464
6476
  ] })
6465
6477
  ] })
6466
6478
  ] }) : null
6467
- ] });
6479
+ ] }) });
6468
6480
  const filesProps = item ? { item, port, host, definition, organizations, arg: null, onClose: () => void 0, onChanged, onPanel } : null;
6469
6481
  return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(RoomProvider, { value: room, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("article", { ref: paneRef, "aria-label": item?.name ?? "New item", className: (0, import_design_system18.cn)(import_controls22.CONTROLS_CONTAINER_CLASS, "flex h-full min-h-0 flex-col bg-background"), children: [
6470
6482
  header,
@@ -6520,7 +6532,7 @@ function ItemPane(props) {
6520
6532
  actions: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
6521
6533
  hidden && existing?.handling === "revealable" && item?.capabilities.canReveal ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_controls22.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(EyeGlyph, {}), "aria-label": `Show current ${f.label}`, onClick: () => void loadForEdit(f.key) }) : null,
6522
6534
  secretKind ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(GenerateButton, { onUse: (v) => setValue(f.key, v) }) : null,
6523
- existing ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_controls22.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_icons11.SettingsIcon, {}), "aria-label": `${f.label} settings`, onClick: () => onPanel(`field:${existing.id}`) }) : null,
6535
+ existing ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_controls22.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_icons12.SettingsIcon, {}), "aria-label": `${f.label} settings`, onClick: () => onPanel(`field:${existing.id}`) }) : null,
6524
6536
  newSecret ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_controls22.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(SlidersGlyph, {}), "aria-label": `${f.label} settings`, pressed: open, onClick: () => toggleSettings(f.key) }) : null
6525
6537
  ] })
6526
6538
  }
@@ -6541,7 +6553,7 @@ function ItemPane(props) {
6541
6553
  removeLabel: `Delete ${f.label}`,
6542
6554
  actions: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
6543
6555
  f.handling === "revealable" && !(f.key in loaded) && item?.capabilities.canReveal ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_controls22.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(EyeGlyph, {}), "aria-label": `Show current ${f.label}`, onClick: () => void loadForEdit(f.key) }) : null,
6544
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_controls22.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_icons11.SettingsIcon, {}), "aria-label": `${f.label} settings`, onClick: () => onPanel(`field:${f.id}`) })
6556
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_controls22.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_icons12.SettingsIcon, {}), "aria-label": `${f.label} settings`, onClick: () => onPanel(`field:${f.id}`) })
6545
6557
  ] })
6546
6558
  },
6547
6559
  f.id
@@ -6834,7 +6846,7 @@ function ListRow({ item, family, port, on, onSelect, withOwner, ownContextMenu,
6834
6846
  ];
6835
6847
  const entriesRef = (0, import_react30.useRef)(entries);
6836
6848
  entriesRef.current = entries;
6837
- const glyphOf = (e) => e.id === "copy:username" ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(UserGlyph, { className: "size-4" }) : e.id === "copy:password" ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(KeyGlyph, { className: "size-4" }) : e.id === "copy:code" ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ClockGlyph, { className: "size-4" }) : e.kind === "favorite" ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(StarGlyph, { className: (0, import_design_system20.cn)("size-4", favorite?.on && "fill-current text-warning") }) : e.kind === "open" ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ChevronRightGlyph, { className: "size-4" }) : e.kind === "host" || e.kind === "manage" ? null : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_icons12.CopyIcon, { className: "size-4" });
6849
+ const glyphOf = (e) => e.id === "copy:username" ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(UserGlyph, { className: "size-4" }) : e.id === "copy:password" ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(KeyGlyph, { className: "size-4" }) : e.id === "copy:code" ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ClockGlyph, { className: "size-4" }) : e.kind === "favorite" ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(StarGlyph, { className: (0, import_design_system20.cn)("size-4", favorite?.on && "fill-current text-warning") }) : e.kind === "open" ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ChevronRightGlyph, { className: "size-4" }) : e.kind === "host" || e.kind === "manage" ? null : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_icons13.CopyIcon, { className: "size-4" });
6838
6850
  const menuItem = (e) => /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_design_system19.DropdownMenuItem, { disabled: e.disabled ?? false, onSelect: e.onSelect, children: [
6839
6851
  glyphOf(e),
6840
6852
  e.label
@@ -7162,7 +7174,7 @@ function TrashView({ port, deleted, query, header, onChanged }) {
7162
7174
  // src/NewItemFlow.tsx
7163
7175
  var import_react33 = require("react");
7164
7176
  var import_controls26 = require("@ai-matrx/design-system/controls");
7165
- var import_icons13 = require("@ai-matrx/design-system/icons");
7177
+ var import_icons14 = require("@ai-matrx/design-system/icons");
7166
7178
  var import_jsx_runtime31 = require("react/jsx-runtime");
7167
7179
  function NewItemFlow({ definitions, url, onUrl, onChoose, onCancel }) {
7168
7180
  const [search, setSearch] = (0, import_react33.useState)("");
@@ -7197,7 +7209,7 @@ function NewItemFlow({ definitions, url, onUrl, onChoose, onCancel }) {
7197
7209
  "aria-label": "Website address",
7198
7210
  inputMode: "url",
7199
7211
  autoFocus: true,
7200
- icon: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_icons13.GlobeIcon, {})
7212
+ icon: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_icons14.GlobeIcon, {})
7201
7213
  }
7202
7214
  ),
7203
7215
  guess && login ? /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "flex flex-col gap-2 rounded-xl border border-border bg-card p-3", children: [
@@ -8127,7 +8139,7 @@ function Importer({ bridge, readLimits, activeOrganizationId, organizations, onC
8127
8139
  var import_react41 = require("react");
8128
8140
  var import_design_system23 = require("@ai-matrx/design-system");
8129
8141
  var import_controls33 = require("@ai-matrx/design-system/controls");
8130
- var import_icons15 = require("@ai-matrx/design-system/icons");
8142
+ var import_icons16 = require("@ai-matrx/design-system/icons");
8131
8143
 
8132
8144
  // src/extension/CaptureCard.tsx
8133
8145
  var import_react38 = require("react");
@@ -8270,7 +8282,7 @@ function FillSetupCard({ fillSetup }) {
8270
8282
  var import_react40 = require("react");
8271
8283
  var import_design_system22 = require("@ai-matrx/design-system");
8272
8284
  var import_controls32 = require("@ai-matrx/design-system/controls");
8273
- var import_icons14 = require("@ai-matrx/design-system/icons");
8285
+ var import_icons15 = require("@ai-matrx/design-system/icons");
8274
8286
  var import_jsx_runtime37 = require("react/jsx-runtime");
8275
8287
  var HOLD_MS = 6e4;
8276
8288
  function PageGenerator({ fields }) {
@@ -8328,7 +8340,7 @@ function PageGenerator({ fields }) {
8328
8340
  {
8329
8341
  label: "New password",
8330
8342
  actions: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_jsx_runtime37.Fragment, { children: [
8331
- value ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_controls32.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_icons14.CopyIcon, {}), "aria-label": "Copy password", onClick: () => void copy(value, "Password") }) : null,
8343
+ value ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_controls32.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_icons15.CopyIcon, {}), "aria-label": "Copy password", onClick: () => void copy(value, "Password") }) : null,
8332
8344
  /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_design_system22.Popover, { open, onOpenChange: setOpen, children: [
8333
8345
  /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_design_system22.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_controls32.Button, { variant: "outline", icon: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(KeyGlyph, {}), disabled: busy, children: "Generate" }) }),
8334
8346
  /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_design_system22.PopoverContent, { sizing: "content", align: "end", children: open ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(PasswordGenerator, { limits, useLabel: "Fill page", onUse: (v) => void onUse(v) }) : null })
@@ -8399,7 +8411,7 @@ function PageView({ port, page, fill, capture, fillSetup, newPasswordFields, ite
8399
8411
  return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "flex h-full min-h-0 flex-col overflow-y-auto bg-background text-foreground", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: "flex flex-col gap-3 px-3 pb-4 pt-3", children: [
8400
8412
  header,
8401
8413
  /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: "flex min-h-7 items-center gap-2 px-1", children: [
8402
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_design_system23.SiteIcon, { site: page.url, fallback: import_icons15.GlobeIcon, className: "size-4" }),
8414
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_design_system23.SiteIcon, { site: page.url, fallback: import_icons16.GlobeIcon, className: "size-4" }),
8403
8415
  /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "min-w-0 flex-1 truncate text-sm font-medium", title: page.url, children: site || "No page open" }),
8404
8416
  page.refresh ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_controls33.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(RefreshGlyph, {}), "aria-label": "Check again", onClick: page.refresh }) : null,
8405
8417
  onBrowse ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_controls33.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(ListGlyph, {}), onClick: onBrowse, children: "All items" }) : null
@@ -8470,7 +8482,7 @@ function MatchRow({ itemId, item, tag, family, port, busy, running, onOpen, onFi
8470
8482
  var import_react42 = require("react");
8471
8483
  var import_design_system24 = require("@ai-matrx/design-system");
8472
8484
  var import_controls34 = require("@ai-matrx/design-system/controls");
8473
- var import_icons16 = require("@ai-matrx/design-system/icons");
8485
+ var import_icons17 = require("@ai-matrx/design-system/icons");
8474
8486
  var import_jsx_runtime39 = require("react/jsx-runtime");
8475
8487
  var AUTHENTICATOR_LABEL = "Authenticator";
8476
8488
  function vaultChoices(items, organizations, _current) {
@@ -8490,7 +8502,7 @@ function vaultChoices(items, organizations, _current) {
8490
8502
  function VaultSelect({ value, choices, onChange, searchAt = ORGANIZATION_SEARCH_AT_UNREAD }) {
8491
8503
  return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_controls34.Select, { value, onValueChange: onChange, "aria-label": "Vault", searchAt, options: choices.map((c) => ({ value: c.value, label: c.label, meta: String(c.count), ...c.hint ? { hint: c.hint } : {} })) });
8492
8504
  }
8493
- var CATEGORY_GLYPHS = { logins: import_icons16.GlobeIcon, passkeys: ShieldGlyph, api: KeyGlyph, oauth: PlugGlyph, infra: DatabaseGlyph, env: TerminalGlyph, files: FileGlyph, other: NoteGlyph };
8505
+ var CATEGORY_GLYPHS = { logins: import_icons17.GlobeIcon, passkeys: ShieldGlyph, api: KeyGlyph, oauth: PlugGlyph, infra: DatabaseGlyph, env: TerminalGlyph, files: FileGlyph, other: NoteGlyph };
8494
8506
  var familyOf = (key, definitions) => definitions.find((d) => d.key === key)?.family ?? "generic";
8495
8507
  function itemFamily(item, definitions) {
8496
8508
  return familyOf(item.definitionKey, definitions);
@@ -8588,7 +8600,7 @@ function VaultSidebar({ vault, choices, onVault, organizationSearchAt, view, all
8588
8600
  ] }),
8589
8601
  /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: "flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-2 pb-3 pt-1", children: [
8590
8602
  /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: "flex flex-col gap-0.5", children: [
8591
- hasPage ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Entry, { on: view === "page", glyph: import_icons16.GlobeIcon, label: "This page", onClick: () => onView("page") }) : null,
8603
+ hasPage ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Entry, { on: view === "page", glyph: import_icons17.GlobeIcon, label: "This page", onClick: () => onView("page") }) : null,
8592
8604
  /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Entry, { on: view === "all", glyph: GridGlyph, label: "All items", count: allCount, onClick: () => onView("all") }),
8593
8605
  hasFavorites ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Entry, { on: view === "favorites", glyph: StarGlyph, label: "Favorites", count: views.favorites, onClick: () => onView("favorites") }) : null,
8594
8606
  hasRecents ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Entry, { on: view === "recent", glyph: ClockGlyph, label: "Recently opened", count: views.recent, onClick: () => onView("recent") }) : null,