@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 +3 -1
- package/dist/index.cjs +119 -107
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +99 -87
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
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
|
|
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
|
|
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 =
|
|
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" :
|
|
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
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
|
|
2621
|
-
|
|
2622
|
-
|
|
2623
|
-
|
|
2624
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
2627
|
-
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
|
|
2634
|
-
|
|
2635
|
-
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
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.
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
|
|
2672
|
-
|
|
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
|
|
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)(
|
|
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
|
|
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)(
|
|
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
|
|
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
|
|
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)(
|
|
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)(
|
|
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
|
|
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)(
|
|
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
|
|
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
|
|
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:
|
|
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)(
|
|
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
|
|
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: "
|
|
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: "
|
|
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']
|
|
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
|
|
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
|
|
6413
|
-
canManage ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "hidden
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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
|
|
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)(
|
|
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
|
|
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
|
|
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)(
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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,
|