@ai-matrx/vault 0.1.16 → 0.1.18

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,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.18
4
+
5
+ - The Authenticator list keeps the code and its countdown ring apart at every width (the code column never squeezes), the list header lines up with the list on wide screens, and the Add authenticator panel's camera button is icon-only so the setup-key box has room on a phone. Consumer action: none.
6
+
7
+ ## 0.1.17
8
+
9
+ - The new/edit Authenticator box reads "Paste setup key or otpauth link", and a declared Recovery codes box reads "Backup codes, one per line" (the live `website_login` and `username_password` types now declare `recovery_codes`). Consumer action: none.
10
+
3
11
  ## 0.1.16
4
12
 
5
13
  - **The Authenticator is back as a first-class destination.** The codes view is named **Authenticator** everywhere (sidebar, view picker, title, empty state "Add authenticator"), and below the three-pane width (the floating window, tablets, phones) the compact header carries an **Authenticator** button beside the view picker, so it is one press away at every width. Searching "authenticator", "2fa", "totp" or "two-factor" finds every login with a code (`AUTHENTICATOR_WORDS`). Each code row shows the site's letter and, when the host gives `openItemInNewTab`, **Open in new tab**. Guard: `src/authenticator-restore.test.tsx`. **Consumer action:** web app: pass `host.openItemInNewTab` (opens `/vault/<id>` in a new tab). Extension and desktop: none.
package/dist/index.cjs CHANGED
@@ -1774,7 +1774,7 @@ function CodeButton({ live, digits, size = "md", label }) {
1774
1774
  onClick: () => live.code && void copy(live.code),
1775
1775
  "aria-label": live.code ? `Copy ${label} code` : `Getting ${label} code`,
1776
1776
  title: live.code ? "Copy" : void 0,
1777
- className: (0, import_design_system8.cn)("group -mx-1.5 inline-flex max-w-full items-center gap-2.5 rounded-md px-1.5 py-1 text-left transition-colors hover:bg-accent focus-visible:bg-accent focus-visible:outline-none", size === "lg" && "gap-3"),
1777
+ className: (0, import_design_system8.cn)("group -mx-1.5 inline-flex max-w-full shrink-0 items-center gap-3 rounded-md px-1.5 py-1 text-left transition-colors hover:bg-accent focus-visible:bg-accent focus-visible:outline-none", size === "lg" && "gap-4"),
1778
1778
  children: [
1779
1779
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: (0, import_design_system8.cn)("whitespace-nowrap font-mono font-medium tabular-nums tracking-[0.08em]", size === "lg" ? "text-2xl" : "text-[1.0625rem]", live.code ? "text-foreground" : "text-disabled-foreground"), children: shown }),
1780
1780
  copied ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "inline-flex size-6 items-center justify-center text-success", role: "status", "aria-label": "Copied", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(CheckGlyph, { className: "size-4" }) }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(CountdownRing, { remaining: live.remaining, period: live.period, loading: !live.code })
@@ -2042,7 +2042,7 @@ function OtpSetupRow({ value, onChange, label = "Authenticator", placeholder = "
2042
2042
  label,
2043
2043
  actions: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
2044
2044
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_controls6.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(QrGlyph, {}), "aria-label": "Choose QR image", title: "Choose or drop a QR image", disabled: disabled || reading, onClick: () => file.current?.click() }),
2045
- canScan ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_controls6.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CameraGlyph, {}), "aria-label": "Scan QR code with camera", title: "Scan the site's QR code with the camera", disabled, onClick: () => setScanning(true), children: "Scan" }) : null
2045
+ canScan ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_controls6.Button, { variant: "quiet", icon: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CameraGlyph, {}), "aria-label": "Scan QR code with camera", title: "Scan the site's QR code with the camera", disabled, onClick: () => setScanning(true) }) : null
2046
2046
  ] }),
2047
2047
  children: [
2048
2048
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
@@ -2230,7 +2230,7 @@ function TotpEditRow({ value, onChange, hasExisting, item, port, onEnrolled, onR
2230
2230
  setStatus(null);
2231
2231
  onChange(v);
2232
2232
  },
2233
- placeholder: hasExisting ? "Paste a new key to replace" : "Setup key or otpauth link",
2233
+ placeholder: hasExisting ? "Paste a new key to replace" : "Paste setup key or otpauth link",
2234
2234
  status,
2235
2235
  ...uploadImage ? { onImage: (f) => void uploadImage(f) } : {},
2236
2236
  ...onRecognized ? { onRecognized } : {}
@@ -2472,7 +2472,7 @@ function AuthenticatorView({ port, host, items, definitions, query, onOpen, onCh
2472
2472
  const familyOf2 = (key) => definitions.find((d) => d.key === key)?.family ?? "generic";
2473
2473
  return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("section", { "aria-label": "Authenticator", className: "flex h-full min-h-0 flex-col bg-background", children: [
2474
2474
  header ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "mx-auto w-full max-w-3xl px-3 pt-3 sm:px-4", children: header }) : null,
2475
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex min-h-12 items-center justify-between gap-2 px-4 pb-1 pt-3", children: [
2475
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "mx-auto flex min-h-12 w-full max-w-3xl items-center justify-between gap-2 px-4 pb-1 pt-3 sm:px-5", children: [
2476
2476
  /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex min-w-0 items-baseline gap-2", children: [
2477
2477
  /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("h2", { className: "truncate text-sm font-semibold text-foreground", children: "Authenticator" }),
2478
2478
  total > 0 ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "text-xs tabular-nums text-muted-foreground", children: total }) : null
@@ -2562,7 +2562,7 @@ function OtpListRow({ port, item, family, entry, onOpen, onOpenInNewTab, onRenam
2562
2562
  /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: (0, import_design_system10.cn)("max-w-full truncate text-sm font-medium", a.enabled ? "text-foreground" : "text-muted-foreground"), children: item.name }),
2563
2563
  sub ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: (0, import_design_system10.cn)("max-w-full truncate text-xs", a.error ? "text-destructive" : "text-muted-foreground"), title: sub, children: sub }) : null
2564
2564
  ] }),
2565
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "flex min-w-0 justify-end", children: !a.enabled ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1.5", children: [
2565
+ /* @__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: [
2566
2566
  /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "text-sm text-disabled-foreground", children: "Off" }),
2567
2567
  canManage ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_controls9.Button, { variant: "quiet", disabled: a.busy, onClick: () => void a.setEnabled(true), children: "Turn on" }) : null
2568
2568
  ] }) : live.error ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1.5", children: [
@@ -6233,7 +6233,7 @@ function ItemPane(props) {
6233
6233
  {
6234
6234
  label: f.label,
6235
6235
  value,
6236
- placeholder: hidden ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" : f.required ? "Required" : "",
6236
+ placeholder: hidden ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" : f.required ? "Required" : isRecoveryCodesField(f) ? "Backup codes, one per line" : "",
6237
6237
  secret: secretKind,
6238
6238
  multiline: f.kind === "multiline",
6239
6239
  inputMode: f.kind === "url" ? "url" : USERNAME_KEYS.test(f.key) ? "email" : "text",