@ai-matrx/vault 0.1.0 → 0.1.2

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/dist/index.js CHANGED
@@ -103,7 +103,7 @@ var init_keepass_xml_worker_client = __esm({
103
103
  // src/VaultApp.tsx
104
104
  import { useCallback as useCallback5, useEffect as useEffect22, useMemo as useMemo6, useRef as useRef19, useState as useState39 } from "react";
105
105
  import { DropdownMenu as DropdownMenu6, DropdownMenuContent as DropdownMenuContent6, DropdownMenuItem as DropdownMenuItem5, DropdownMenuTrigger as DropdownMenuTrigger6 } from "@ai-matrx/design-system";
106
- import { Button as Button33, SearchField as SearchField4, Select as Select12 } from "@ai-matrx/design-system/controls";
106
+ import { Button as Button33, SearchField as SearchField4, Select as Select11 } from "@ai-matrx/design-system/controls";
107
107
  import { confirm as confirm13 } from "@ai-matrx/kit/confirm-opener";
108
108
 
109
109
  // src/notice.tsx
@@ -3784,6 +3784,7 @@ function countLines(lines, selected) {
3784
3784
  }
3785
3785
 
3786
3786
  // src/io/import-source.ts
3787
+ import { BlobReader, ZipReader } from "@zip.js/zip.js";
3787
3788
  var STRUCTURED = ["bitwarden_json", "1password_1pux", "proton_pass", "keepass_xml"];
3788
3789
  var isStructuredSource = (s) => STRUCTURED.includes(s);
3789
3790
  var SOURCE_OPTIONS = [
@@ -3854,8 +3855,7 @@ function sniffZip(names) {
3854
3855
  return names.some((n) => !n.includes("/") && n.toLowerCase().endsWith(".csv")) ? "dashlane" : "proton_pass";
3855
3856
  }
3856
3857
  async function zipNames(file) {
3857
- const { BlobReader: BlobReader2, ZipReader: ZipReader2 } = await import("@zip.js/zip.js");
3858
- const reader = new ZipReader2(new BlobReader2(file));
3858
+ const reader = new ZipReader(new BlobReader(file));
3859
3859
  try {
3860
3860
  return (await reader.getEntries()).map((e) => e.filename);
3861
3861
  } finally {
@@ -3905,7 +3905,7 @@ function closesQuote(rest, quote) {
3905
3905
  }
3906
3906
 
3907
3907
  // src/io/bounded-zip.ts
3908
- import { BlobReader, ZipReader } from "@zip.js/zip.js";
3908
+ import { BlobReader as BlobReader2, ZipReader as ZipReader2 } from "@zip.js/zip.js";
3909
3909
  var safe = (value) => Number.isSafeInteger(value) && value >= 0;
3910
3910
  var unsafeName = (name) => /[\\\0-\x1F\x7F-\x9F]/.test(name);
3911
3911
  function stopIfCancelled(signal) {
@@ -3949,7 +3949,7 @@ async function directoryRange(entry, signal) {
3949
3949
  async function openBoundedZip(file, limits, signal) {
3950
3950
  if (file.size > limits.maxFileBytes)
3951
3951
  throw new Error("The archive exceeds the organization size limit.");
3952
- const reader = new ZipReader(new BlobReader(file), {
3952
+ const reader = new ZipReader2(new BlobReader2(file), {
3953
3953
  strictness: "strict",
3954
3954
  filenameValidation: "strict",
3955
3955
  checkAmbiguity: true
@@ -4560,7 +4560,7 @@ function ItemIcon({ definitionKey, family, site, size = "md", inverted = false }
4560
4560
  import { useEffect as useEffect15, useMemo as useMemo3, useRef as useRef14, useState as useState25 } from "react";
4561
4561
  import { DropdownMenu as DropdownMenu3, DropdownMenuContent as DropdownMenuContent3, DropdownMenuItem as DropdownMenuItem3, DropdownMenuSeparator as DropdownMenuSeparator3, DropdownMenuTrigger as DropdownMenuTrigger3 } from "@ai-matrx/design-system";
4562
4562
  import { cn as cn12 } from "@ai-matrx/design-system";
4563
- import { Button as Button21, CONTROLS_CONTAINER_CLASS, Select as Select9, Switch as Switch5 } from "@ai-matrx/design-system/controls";
4563
+ import { Badge as Badge7, Button as Button21, CONTROLS_CONTAINER_CLASS, OptionCombobox, Switch as Switch5 } from "@ai-matrx/design-system/controls";
4564
4564
  import { confirm as confirm9 } from "@ai-matrx/kit/confirm-opener";
4565
4565
 
4566
4566
  // src/activity/FilesSection.tsx
@@ -5612,7 +5612,7 @@ function ItemPane(props) {
5612
5612
  const viewCustom = (item?.custom ?? []).filter((c) => !declaredKeys.has(c.key) && c.key !== MFA_METHOD_KEY && !isAuthenticatorStorage(c.key));
5613
5613
  const isLogin = (item?.definitionKey ?? definition?.key) === "website_login" || (item?.definitionKey ?? definition?.key) === "username_password";
5614
5614
  const typeLabel = definition?.label ?? item?.definitionLabel ?? "";
5615
- const ownerLabel = item && item.owner.kind !== "me" ? item.owner.label : null;
5615
+ const shownOwner = mode === "new" ? owner === "me" ? { label: "Personal", glyph: /* @__PURE__ */ jsx26(PersonGlyph, {}) } : owner === "person" ? { label: "Someone else", glyph: /* @__PURE__ */ jsx26(SendGlyph, {}) } : { label: organizations.find((o) => o.id === owner)?.name ?? "Organization", glyph: /* @__PURE__ */ jsx26(BuildingGlyph, {}) } : item ? { label: item.owner.label, glyph: item.owner.kind === "me" ? /* @__PURE__ */ jsx26(PersonGlyph, {}) : item.owner.kind === "organization" ? /* @__PURE__ */ jsx26(BuildingGlyph, {}) : /* @__PURE__ */ jsx26(UsersGlyph, {}) } : null;
5616
5616
  const tagsVisible = showTags || draft.tags.length > 0 || tagsText !== "";
5617
5617
  const descriptionVisible = showDescription || draft.description !== "";
5618
5618
  const header = /* @__PURE__ */ jsxs24("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: [
@@ -5621,7 +5621,8 @@ function ItemPane(props) {
5621
5621
  /* @__PURE__ */ jsxs24("div", { className: "flex min-w-0 flex-1 flex-col", children: [
5622
5622
  /* @__PURE__ */ jsx26("h2", { className: "truncate text-base font-semibold leading-tight", children: editing ? draft.name || (mode === "new" ? `New ${typeLabel.toLowerCase()}` : item?.name) : item?.name }),
5623
5623
  /* @__PURE__ */ jsxs24("span", { className: "flex min-w-0 items-center gap-1 text-xs text-muted-foreground", children: [
5624
- /* @__PURE__ */ jsx26("span", { className: "truncate", children: [typeLabel, ownerLabel].filter(Boolean).join(" \xB7 ") }),
5624
+ typeLabel ? /* @__PURE__ */ jsx26("span", { className: "truncate", children: typeLabel }) : null,
5625
+ shownOwner ? /* @__PURE__ */ jsx26(Badge7, { className: "shrink-0", icon: shownOwner.glyph, "aria-label": `Saved in ${shownOwner.label}`, children: shownOwner.label }) : null,
5625
5626
  item && !editing ? /* @__PURE__ */ jsx26(SharingSummary, { item, port, className: "hidden truncate before:mr-1 before:content-['\xB7'] sm:inline" }, `${item.updatedAt}-${refreshKey ?? ""}`) : null
5626
5627
  ] })
5627
5628
  ] }),
@@ -5697,8 +5698,25 @@ function ItemPane(props) {
5697
5698
  notice && !editing ? /* @__PURE__ */ jsx26("div", { role: "status", className: "border-b border-border bg-muted px-5 py-2 text-sm text-warning", children: notice }) : null,
5698
5699
  /* @__PURE__ */ jsx26("div", { className: "min-h-0 flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx26("div", { className: "mx-auto flex w-full max-w-3xl flex-col gap-5 px-3 py-4 sm:px-6 sm:py-6", children: editing ? /* @__PURE__ */ jsxs24(Fragment15, { children: [
5699
5700
  /* @__PURE__ */ jsxs24(Section, { children: [
5701
+ mode === "new" ? /* @__PURE__ */ jsx26(Row, { label: "Save to", children: /* @__PURE__ */ jsx26(
5702
+ OptionCombobox,
5703
+ {
5704
+ value: owner,
5705
+ onChange: setOwner,
5706
+ ariaLabel: "Save to",
5707
+ searchable: organizations.length > 6,
5708
+ searchPlaceholder: "Find an organization",
5709
+ groups: [
5710
+ { heading: "Just you", options: ["me"] },
5711
+ ...organizations.length > 0 ? [{ heading: "Organizations", options: organizations.map((o) => o.id) }] : [],
5712
+ { heading: "Send", options: ["person"] }
5713
+ ],
5714
+ getLabel: (v) => v === "me" ? "Personal" : v === "person" ? "Someone else" : organizations.find((o) => o.id === v)?.name ?? v,
5715
+ getHint: (v) => v === "me" ? "Only you" : v === "person" ? "Sent by email" : null,
5716
+ renderIcon: (v) => v === "me" ? /* @__PURE__ */ jsx26(PersonGlyph, { className: "size-4" }) : v === "person" ? /* @__PURE__ */ jsx26(SendGlyph, { className: "size-4" }) : /* @__PURE__ */ jsx26(BuildingGlyph, { className: "size-4" })
5717
+ }
5718
+ ) }) : null,
5700
5719
  /* @__PURE__ */ jsx26(EditRow, { label: "Name", value: draft.name, onChange: (v) => patch({ name: v }), placeholder: "Name", autoFocus: mode === "new" }),
5701
- mode === "new" ? /* @__PURE__ */ jsx26(Row, { label: "Save to", children: /* @__PURE__ */ jsx26(Select9, { value: owner, onValueChange: setOwner, "aria-label": "Save to", options: [{ value: "me", label: "Personal" }, ...organizations.map((o) => ({ value: o.id, label: o.name })), { value: "person", label: "Someone else" }] }) }) : null,
5702
5720
  mode === "new" && owner === "person" ? /* @__PURE__ */ jsxs24(Fragment15, { children: [
5703
5721
  /* @__PURE__ */ jsx26(EditRow, { label: "Their email", value: recipient, placeholder: "name@company.com", inputMode: "email", onChange: setRecipient }),
5704
5722
  declared.some((f) => f.storage === "encrypted" && f.kind === "secret") ? /* @__PURE__ */ jsx26(Row, { label: "Password", hint: "You never see it", children: /* @__PURE__ */ jsx26(Switch5, { checked: generatePrivately, onCheckedChange: setGeneratePrivately, "aria-label": "Generate the password privately" }) }) : null
@@ -5848,8 +5866,9 @@ var SORTS2 = [
5848
5866
  { value: "updated", label: "Recently changed" },
5849
5867
  { value: "created", label: "Recently added" }
5850
5868
  ];
5851
- function subtitleOf(item) {
5852
- return siteOf(item) || item.definitionLabel;
5869
+ function subtitleOf(item, withOwner) {
5870
+ const what = siteOf(item) || item.definitionLabel;
5871
+ return withOwner ? `${what} \xB7 ${item.owner.label}` : what;
5853
5872
  }
5854
5873
  function ItemList({ title, items, definitions, port, selectedId, onSelect, query, onQuery, sort, onSort, onNew, matchingIds, header }) {
5855
5874
  const pinned = matchingIds ? items.filter((i) => matchingIds.has(i.id)) : [];
@@ -5870,7 +5889,8 @@ function ItemList({ title, items, definitions, port, selectedId, onSelect, query
5870
5889
  listRef.current?.querySelector(`[data-item="${next.id}"]`)?.scrollIntoView({ block: "nearest" });
5871
5890
  }
5872
5891
  };
5873
- const row = (i) => /* @__PURE__ */ jsx27(ListRow, { item: i, family: familyOf2(i.definitionKey), port, on: i.id === selectedId, onSelect }, i.id);
5892
+ const mixedOwners = new Set(items.map((i) => i.owner.organizationId ?? i.owner.kind)).size > 1;
5893
+ const row = (i) => /* @__PURE__ */ jsx27(ListRow, { item: i, family: familyOf2(i.definitionKey), port, on: i.id === selectedId, onSelect, withOwner: mixedOwners }, i.id);
5874
5894
  const sortLabel = SORTS2.find((s) => s.value === sort)?.label ?? "Name";
5875
5895
  return /* @__PURE__ */ jsxs25("section", { "aria-label": title, className: "flex h-full min-h-0 flex-col border-r border-border bg-background", children: [
5876
5896
  /* @__PURE__ */ jsxs25("div", { className: "flex flex-col gap-2 px-3 pb-2 pt-3", children: [
@@ -5902,7 +5922,7 @@ function ItemList({ title, items, definitions, port, selectedId, onSelect, query
5902
5922
  ] }) })
5903
5923
  ] });
5904
5924
  }
5905
- function ListRow({ item, family, port, on, onSelect }) {
5925
+ function ListRow({ item, family, port, on, onSelect, withOwner }) {
5906
5926
  const confirmed = useConfirmed();
5907
5927
  const copy = useCopy();
5908
5928
  const notify = useNotify();
@@ -5933,7 +5953,7 @@ function ListRow({ item, family, port, on, onSelect }) {
5933
5953
  /* @__PURE__ */ jsx27(ItemIcon, { definitionKey: item.definitionKey, family, site: siteOf(item), inverted: on }),
5934
5954
  /* @__PURE__ */ jsxs25("span", { className: "flex min-w-0 flex-1 flex-col leading-tight", children: [
5935
5955
  /* @__PURE__ */ jsx27("span", { className: "truncate text-sm font-medium", children: item.name }),
5936
- /* @__PURE__ */ jsx27("span", { className: "truncate text-xs text-muted-foreground", children: subtitleOf(item) })
5956
+ /* @__PURE__ */ jsx27("span", { className: "truncate text-xs text-muted-foreground", children: subtitleOf(item, withOwner) })
5937
5957
  ] })
5938
5958
  ]
5939
5959
  }
@@ -6201,7 +6221,7 @@ function NewItemFlow({ definitions, url, onUrl, onChoose, onCancel }) {
6201
6221
  import { useEffect as useEffect18, useRef as useRef16, useState as useState30 } from "react";
6202
6222
  import { confirm as confirm10 } from "@ai-matrx/kit/confirm-opener";
6203
6223
  import { Checkbox as Checkbox2 } from "@ai-matrx/design-system";
6204
- import { Badge as Badge7, Button as Button26, Field as Field11, RegionSkeleton as RegionSkeleton2, SegmentedControl as SegmentedControl5, Textarea as Textarea4 } from "@ai-matrx/design-system/controls";
6224
+ import { Badge as Badge8, Button as Button26, Field as Field11, RegionSkeleton as RegionSkeleton2, SegmentedControl as SegmentedControl5, Textarea as Textarea4 } from "@ai-matrx/design-system/controls";
6205
6225
 
6206
6226
  // src/sharing/secure-link-logic.ts
6207
6227
  import { formatDurationMinutes } from "@ai-matrx/kit/format";
@@ -6406,7 +6426,7 @@ function SecureLinkPanel({ item, port, onClose }) {
6406
6426
  onClose,
6407
6427
  footer: /* @__PURE__ */ jsxs29("div", { className: "flex w-full flex-wrap items-center gap-2", children: [
6408
6428
  /* @__PURE__ */ jsx31("div", { className: "w-full sm:w-auto sm:min-w-0 sm:flex-1", children: /* @__PURE__ */ jsx31(StatusLine, { error, notice }) }),
6409
- sameChannelSent && !error ? /* @__PURE__ */ jsx31(Badge7, { tone: "warning", children: "Both by email" }) : null,
6429
+ sameChannelSent && !error ? /* @__PURE__ */ jsx31(Badge8, { tone: "warning", children: "Both by email" }) : null,
6410
6430
  /* @__PURE__ */ jsx31(Button26, { variant: "quiet", className: "ml-auto", onClick: onClose, children: "Close" }),
6411
6431
  /* @__PURE__ */ jsx31(Button26, { variant: "primary", disabled: !canSend, onClick: () => void send(), children: busy === "send" ? "Sending\u2026" : "Send link" })
6412
6432
  ] }),
@@ -6463,7 +6483,7 @@ function SecureLinkPanel({ item, port, onClose }) {
6463
6483
  ] }) })
6464
6484
  ] }) : null,
6465
6485
  sharing.sentSecureLinks ? /* @__PURE__ */ jsx31(Section, { title: "Sent links", children: sentError ? /* @__PURE__ */ jsx31(Empty, { children: /* @__PURE__ */ jsx31("span", { className: "text-destructive", children: sentError }) }) : !sent ? /* @__PURE__ */ jsx31(RegionSkeleton2, { shape: "rows", count: 2, "aria-label": "Loading sent links", className: "px-3 sm:px-4" }) : sent.length === 0 ? /* @__PURE__ */ jsx31(Empty, { children: "None yet" }) : sent.map((row) => /* @__PURE__ */ jsxs29(AccessLine, { glyph: row.status === "pending" ? ClockGlyph : row.fieldKeys.length ? LockGlyph : ShareGlyph, who: recipientOf(row), meta: sentMeta(row, options), children: [
6466
- /* @__PURE__ */ jsx31(Badge7, { tone: STATUS_TONE[row.status] ?? "neutral", children: statusWord(row.status) }),
6486
+ /* @__PURE__ */ jsx31(Badge8, { tone: STATUS_TONE[row.status] ?? "neutral", children: statusWord(row.status) }),
6467
6487
  row.status === "pending" ? /* @__PURE__ */ jsx31(Button26, { variant: "quiet", disabled: busy !== null, onClick: () => void turnOff(row), children: "Turn off" }) : null
6468
6488
  ] }, row.id)) }) : null
6469
6489
  ]
@@ -6738,7 +6758,7 @@ function ApprovePanel({ port, host, onClose, approvalKey, label, kind = "browser
6738
6758
  // src/native/NativeImportPanel.tsx
6739
6759
  import { useEffect as useEffect21, useMemo as useMemo5, useState as useState33 } from "react";
6740
6760
  import { confirm as confirm12 } from "@ai-matrx/kit/confirm-opener";
6741
- import { Badge as Badge8, Button as Button28, Select as Select10 } from "@ai-matrx/design-system/controls";
6761
+ import { Badge as Badge9, Button as Button28, Select as Select9 } from "@ai-matrx/design-system/controls";
6742
6762
 
6743
6763
  // src/native/logic.ts
6744
6764
  var ACTIVE_PHASES = /* @__PURE__ */ new Set(["authorizing", "importing"]);
@@ -7057,7 +7077,7 @@ function Importer({ bridge, readLimits, activeOrganizationId, organizations, onC
7057
7077
  ] }) : /* @__PURE__ */ jsx33(Button28, { variant: "quiet", onClick: onClose, children: "Close" });
7058
7078
  return /* @__PURE__ */ jsxs31(Panel, { title: "Import passkeys", size: "lg", onClose, footer, children: [
7059
7079
  screen.kind === "idle" ? /* @__PURE__ */ jsxs31(Section, { children: [
7060
- /* @__PURE__ */ jsx33(Row, { label: "Save to", children: /* @__PURE__ */ jsx33(Select10, { value: organizationId, options, "aria-label": "Save to", disabled: busy, onValueChange: setOrganizationId }) }),
7080
+ /* @__PURE__ */ jsx33(Row, { label: "Save to", children: /* @__PURE__ */ jsx33(Select9, { value: organizationId, options, "aria-label": "Save to", disabled: busy, onValueChange: setOrganizationId }) }),
7061
7081
  /* @__PURE__ */ jsx33(Row, { label: "File", hint: limits ? `Up to ${plural2(limits.maxItems, "passkey")}` : "A passkey exchange file", children: /* @__PURE__ */ jsx33(Button28, { variant: "outline", icon: /* @__PURE__ */ jsx33(ImportGlyph, { className: "size-4" }), disabled: busy || !organizationId || limitError !== null, onClick: () => void flow.begin(organizationId), children: busy ? "Opening\u2026" : "Choose file" }) }),
7062
7082
  /* @__PURE__ */ jsx33(Row, { label: "Interrupted", hint: "Finish or clear an earlier import", children: /* @__PURE__ */ jsx33(Button28, { variant: "quiet", disabled: busy, onClick: () => void flow.recover(), children: "Recover" }) })
7063
7083
  ] }) : null,
@@ -7065,7 +7085,7 @@ function Importer({ bridge, readLimits, activeOrganizationId, organizations, onC
7065
7085
  Windowed,
7066
7086
  {
7067
7087
  items: preview.slots,
7068
- render: (slot) => /* @__PURE__ */ jsx33(Row, { label: /* @__PURE__ */ jsx33(Badge8, { tone: TONE[slot.disposition], children: dispositionLabel(slot.disposition) }), hint: void 0, children: /* @__PURE__ */ jsx33("span", { className: "block truncate text-foreground", title: slot.reason ?? void 0, children: slot.title ?? "Unnamed passkey" }) }, slot.slot_id)
7088
+ render: (slot) => /* @__PURE__ */ jsx33(Row, { label: /* @__PURE__ */ jsx33(Badge9, { tone: TONE[slot.disposition], children: dispositionLabel(slot.disposition) }), hint: void 0, children: /* @__PURE__ */ jsx33("span", { className: "block truncate text-foreground", title: slot.reason ?? void 0, children: slot.title ?? "Unnamed passkey" }) }, slot.slot_id)
7069
7089
  }
7070
7090
  ) }) : null,
7071
7091
  status && !preview ? /* @__PURE__ */ jsxs31(Section, { title: `${accounted(status)} of ${status.total} done`, children: [
@@ -7432,7 +7452,7 @@ function MatchRow({ itemId, item, tag, family, port, busy, running, onOpen, onFi
7432
7452
  // src/Sidebar.tsx
7433
7453
  import { useState as useState38 } from "react";
7434
7454
  import { cn as cn15 } from "@ai-matrx/design-system";
7435
- import { Select as Select11 } from "@ai-matrx/design-system/controls";
7455
+ import { Select as Select10 } from "@ai-matrx/design-system/controls";
7436
7456
  import { jsx as jsx38, jsxs as jsxs36 } from "react/jsx-runtime";
7437
7457
  function vaultChoices(items, organizations, current) {
7438
7458
  const n = (f) => items.filter(f).length;
@@ -7446,7 +7466,7 @@ function vaultChoices(items, organizations, current) {
7446
7466
  ];
7447
7467
  }
7448
7468
  function VaultSelect({ value, choices, onChange }) {
7449
- return /* @__PURE__ */ jsx38(Select11, { value, onValueChange: onChange, "aria-label": "Vault", options: choices.map((c) => ({ value: c.value, label: c.label, meta: String(c.count) })) });
7469
+ return /* @__PURE__ */ jsx38(Select10, { value, onValueChange: onChange, "aria-label": "Vault", options: choices.map((c) => ({ value: c.value, label: c.label, meta: String(c.count) })) });
7450
7470
  }
7451
7471
  var CATEGORY_GLYPHS = { logins: GlobeGlyph, passkeys: ShieldGlyph, api: KeyGlyph, oauth: PlugGlyph, infra: DatabaseGlyph, env: TerminalGlyph, files: FileGlyph, other: NoteGlyph };
7452
7472
  var familyOf = (key, definitions) => definitions.find((d) => d.key === key)?.family ?? "generic";
@@ -7717,7 +7737,7 @@ function Workspace({ port, host = NO_HOST, layout = "auto", location, onLocation
7717
7737
  const title = loc.vault === "all" && loc.view === "all" ? "All items" : viewLabel(loc.view, views);
7718
7738
  const compactHeader = mode === "full" ? void 0 : /* @__PURE__ */ jsxs37("div", { className: "grid grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto] gap-2", children: [
7719
7739
  /* @__PURE__ */ jsx39(VaultSelect, { value: loc.vault, choices, onChange: (vault) => go({ vault, itemId: null, panel: null }) }),
7720
- /* @__PURE__ */ jsx39(Select12, { value: loc.view, onValueChange: (view) => go({ view, itemId: null, panel: null }), options: viewOptions(views, inThisVault.length, deleted.length, hasFavorites, port.lists.recents !== void 0, host.page !== void 0), "aria-label": "Show" }),
7740
+ /* @__PURE__ */ jsx39(Select11, { value: loc.view, onValueChange: (view) => go({ view, itemId: null, panel: null }), options: viewOptions(views, inThisVault.length, deleted.length, hasFavorites, port.lists.recents !== void 0, host.page !== void 0), "aria-label": "Show" }),
7721
7741
  /* @__PURE__ */ jsxs37(DropdownMenu6, { children: [
7722
7742
  /* @__PURE__ */ jsx39(DropdownMenuTrigger6, { asChild: true, children: /* @__PURE__ */ jsx39(Button33, { variant: "quiet", icon: /* @__PURE__ */ jsx39(MoreGlyph, {}), "aria-label": "Vault actions" }) }),
7723
7743
  /* @__PURE__ */ jsxs37(DropdownMenuContent6, { align: "end", children: [