@ai-matrx/design-system 0.86.332 → 0.86.334

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/CHANGELOG.md +28 -2
  2. package/dist/auth-gate-dialog.js +4 -4
  3. package/dist/carousel.js +18 -18
  4. package/dist/{chunk-MVGMI6UZ.js → chunk-3MQMVPKO.js} +5 -5
  5. package/dist/{chunk-2WL2SGKL.js → chunk-677JS6TX.js} +24 -10
  6. package/dist/chunk-677JS6TX.js.map +1 -0
  7. package/dist/{chunk-TBDMTCRW.js → chunk-6YZMGSQY.js} +10 -10
  8. package/dist/{chunk-OFJ5LGBU.js → chunk-7NEVJKDZ.js} +8 -8
  9. package/dist/{chunk-XTNAKJSH.js → chunk-B3LDW3IQ.js} +2 -2
  10. package/dist/{chunk-VTJWQPYR.js → chunk-BM2YYBUO.js} +5 -5
  11. package/dist/{chunk-FTZCPGTH.js → chunk-CFCWQDGC.js} +4 -4
  12. package/dist/{chunk-CN7C4KQB.js → chunk-CH2NWSES.js} +2 -2
  13. package/dist/{chunk-CJCUD62M.js → chunk-CSSD6NS4.js} +5 -5
  14. package/dist/{chunk-W3QSRJ3O.js → chunk-E4GS5QH7.js} +7 -7
  15. package/dist/{chunk-O4KANICE.js → chunk-FRJ4PPA2.js} +5 -5
  16. package/dist/{chunk-4PCLJAW2.js → chunk-FXT7PZAF.js} +5 -14
  17. package/dist/chunk-FXT7PZAF.js.map +1 -0
  18. package/dist/{chunk-D45XDOJS.js → chunk-GHPUO3O7.js} +2 -2
  19. package/dist/{chunk-RPUC5MNH.js → chunk-GLZJ7WZK.js} +3 -3
  20. package/dist/{chunk-VKWQTSB6.js → chunk-HEFTQUJ5.js} +6 -6
  21. package/dist/{chunk-KWBYKUKP.js → chunk-J6637L6D.js} +4 -4
  22. package/dist/chunk-KGW373MK.js +21 -0
  23. package/dist/chunk-KGW373MK.js.map +1 -0
  24. package/dist/{chunk-5LT34PFX.js → chunk-MEJVHDYJ.js} +18 -18
  25. package/dist/{chunk-PPB52S7F.js → chunk-MFUNGDHO.js} +7 -7
  26. package/dist/{chunk-LCPHFONA.js → chunk-MIJMP4WI.js} +5 -5
  27. package/dist/{chunk-XREKZXAL.js → chunk-SMJGESH7.js} +6 -6
  28. package/dist/{chunk-SNHCBHBE.js → chunk-U24MOJWK.js} +4 -4
  29. package/dist/{chunk-DO6G4EKJ.js → chunk-UWTODOMD.js} +2 -2
  30. package/dist/{chunk-BQR4N24F.js → chunk-VLLUUOYJ.js} +4 -4
  31. package/dist/{chunk-FD6V6JBN.js → chunk-VV6WZTH5.js} +8 -8
  32. package/dist/{chunk-LVM7XZRJ.js → chunk-WQ2QCMMA.js} +4 -4
  33. package/dist/{chunk-57OD2WTY.js → chunk-X6ZRHJQP.js} +6 -6
  34. package/dist/{chunk-PLFWDUJW.js → chunk-XEXSZBXV.js} +3 -3
  35. package/dist/{chunk-JSXNITMG.js → chunk-YC5GAO35.js} +2 -2
  36. package/dist/{chunk-5TF2AFDM.js → chunk-ZCRPESQX.js} +4 -4
  37. package/dist/{chunk-5IKQ6RU4.js → chunk-ZOQ2XKXF.js} +9 -9
  38. package/dist/clipboard-fallback-dialog.js +10 -10
  39. package/dist/controls.js +15 -15
  40. package/dist/data-table/data-row-inspector.js +15 -14
  41. package/dist/data-table/data-row-window.js +20 -19
  42. package/dist/data-table/index.cjs +16 -12
  43. package/dist/data-table/index.cjs.map +1 -1
  44. package/dist/data-table/index.js +37 -36
  45. package/dist/data-table/index.js.map +1 -1
  46. package/dist/data-table/layered-filter-builder.js +4 -4
  47. package/dist/data-table/pagination.js +8 -8
  48. package/dist/data-table/uuid-cell.js +8 -8
  49. package/dist/desktop.js +22 -22
  50. package/dist/email-input-dialog.js +7 -7
  51. package/dist/index.cjs +590 -397
  52. package/dist/index.cjs.map +1 -1
  53. package/dist/index.d.cts +120 -10
  54. package/dist/index.d.ts +120 -10
  55. package/dist/index.js +519 -348
  56. package/dist/index.js.map +1 -1
  57. package/dist/intro-stage.js +3 -3
  58. package/dist/item.cjs +33 -17
  59. package/dist/item.cjs.map +1 -1
  60. package/dist/item.d.cts +7 -1
  61. package/dist/item.d.ts +7 -1
  62. package/dist/item.js +32 -30
  63. package/dist/item.js.map +1 -1
  64. package/dist/lite-table.js +10 -10
  65. package/dist/menu-look.js +3 -3
  66. package/dist/record-list.cjs +16 -2
  67. package/dist/record-list.cjs.map +1 -1
  68. package/dist/record-list.d.cts +7 -1
  69. package/dist/record-list.d.ts +7 -1
  70. package/dist/record-list.js +13 -13
  71. package/dist/sandbox-gate-dialog.js +8 -8
  72. package/dist/scope-mismatch-dialog.js +7 -7
  73. package/dist/settings.cjs +16 -12
  74. package/dist/settings.cjs.map +1 -1
  75. package/dist/settings.js +20 -19
  76. package/dist/settings.js.map +1 -1
  77. package/dist/site-icon.js +2 -2
  78. package/dist/swipe-deck.js +1 -1
  79. package/dist/tap-shortcut.cjs +40 -0
  80. package/dist/tap-shortcut.cjs.map +1 -0
  81. package/dist/tap-shortcut.d.cts +13 -0
  82. package/dist/tap-shortcut.d.ts +13 -0
  83. package/dist/tap-shortcut.js +10 -0
  84. package/dist/tap-shortcut.js.map +1 -0
  85. package/dist/tap-target/ai-buttons.cjs +16 -12
  86. package/dist/tap-target/ai-buttons.cjs.map +1 -1
  87. package/dist/tap-target/ai-buttons.js +4 -3
  88. package/dist/tap-target/ai-buttons.js.map +1 -1
  89. package/dist/tap-target/buttons.cjs +16 -12
  90. package/dist/tap-target/buttons.cjs.map +1 -1
  91. package/dist/tap-target/buttons.d.cts +3 -5
  92. package/dist/tap-target/buttons.d.ts +3 -5
  93. package/dist/tap-target/buttons.js +4 -3
  94. package/dist/tap-target.cjs +16 -12
  95. package/dist/tap-target.cjs.map +1 -1
  96. package/dist/tap-target.d.cts +5 -7
  97. package/dist/tap-target.d.ts +5 -7
  98. package/dist/tap-target.js +6 -4
  99. package/dist/text-input-dialog.js +10 -10
  100. package/dist/thumbnail-grid.js +2 -2
  101. package/dist/transcript-scroll-nav.cjs +16 -12
  102. package/dist/transcript-scroll-nav.cjs.map +1 -1
  103. package/dist/transcript-scroll-nav.js +2 -1
  104. package/dist/transcript-scroll-nav.js.map +1 -1
  105. package/dist/value-prompts-dialog.js +5 -5
  106. package/dist/writing-field.cjs +16 -12
  107. package/dist/writing-field.cjs.map +1 -1
  108. package/dist/writing-field.js +21 -20
  109. package/dist/writing-field.js.map +1 -1
  110. package/package.json +12 -2
  111. package/dist/chunk-2WL2SGKL.js.map +0 -1
  112. package/dist/chunk-4PCLJAW2.js.map +0 -1
  113. /package/dist/{chunk-MVGMI6UZ.js.map → chunk-3MQMVPKO.js.map} +0 -0
  114. /package/dist/{chunk-TBDMTCRW.js.map → chunk-6YZMGSQY.js.map} +0 -0
  115. /package/dist/{chunk-OFJ5LGBU.js.map → chunk-7NEVJKDZ.js.map} +0 -0
  116. /package/dist/{chunk-XTNAKJSH.js.map → chunk-B3LDW3IQ.js.map} +0 -0
  117. /package/dist/{chunk-VTJWQPYR.js.map → chunk-BM2YYBUO.js.map} +0 -0
  118. /package/dist/{chunk-FTZCPGTH.js.map → chunk-CFCWQDGC.js.map} +0 -0
  119. /package/dist/{chunk-CN7C4KQB.js.map → chunk-CH2NWSES.js.map} +0 -0
  120. /package/dist/{chunk-CJCUD62M.js.map → chunk-CSSD6NS4.js.map} +0 -0
  121. /package/dist/{chunk-W3QSRJ3O.js.map → chunk-E4GS5QH7.js.map} +0 -0
  122. /package/dist/{chunk-O4KANICE.js.map → chunk-FRJ4PPA2.js.map} +0 -0
  123. /package/dist/{chunk-D45XDOJS.js.map → chunk-GHPUO3O7.js.map} +0 -0
  124. /package/dist/{chunk-RPUC5MNH.js.map → chunk-GLZJ7WZK.js.map} +0 -0
  125. /package/dist/{chunk-VKWQTSB6.js.map → chunk-HEFTQUJ5.js.map} +0 -0
  126. /package/dist/{chunk-KWBYKUKP.js.map → chunk-J6637L6D.js.map} +0 -0
  127. /package/dist/{chunk-5LT34PFX.js.map → chunk-MEJVHDYJ.js.map} +0 -0
  128. /package/dist/{chunk-PPB52S7F.js.map → chunk-MFUNGDHO.js.map} +0 -0
  129. /package/dist/{chunk-LCPHFONA.js.map → chunk-MIJMP4WI.js.map} +0 -0
  130. /package/dist/{chunk-XREKZXAL.js.map → chunk-SMJGESH7.js.map} +0 -0
  131. /package/dist/{chunk-SNHCBHBE.js.map → chunk-U24MOJWK.js.map} +0 -0
  132. /package/dist/{chunk-DO6G4EKJ.js.map → chunk-UWTODOMD.js.map} +0 -0
  133. /package/dist/{chunk-BQR4N24F.js.map → chunk-VLLUUOYJ.js.map} +0 -0
  134. /package/dist/{chunk-FD6V6JBN.js.map → chunk-VV6WZTH5.js.map} +0 -0
  135. /package/dist/{chunk-LVM7XZRJ.js.map → chunk-WQ2QCMMA.js.map} +0 -0
  136. /package/dist/{chunk-57OD2WTY.js.map → chunk-X6ZRHJQP.js.map} +0 -0
  137. /package/dist/{chunk-PLFWDUJW.js.map → chunk-XEXSZBXV.js.map} +0 -0
  138. /package/dist/{chunk-JSXNITMG.js.map → chunk-YC5GAO35.js.map} +0 -0
  139. /package/dist/{chunk-5TF2AFDM.js.map → chunk-ZCRPESQX.js.map} +0 -0
  140. /package/dist/{chunk-5IKQ6RU4.js.map → chunk-ZOQ2XKXF.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/settings/host.tsx","../src/settings/searchIdentity.ts","../src/settings/SettingsDesignProvider.tsx","../src/settings/SettingsNavigationRow.tsx","../src/settings/SettingsPage.tsx","../src/settings/SettingsRow.tsx","../src/settings/SettingsSectionContext.tsx","../src/settings/layout/SettingsCallout.tsx","../src/settings/layout/SettingsGrid.tsx","../src/settings/layout/SettingsReadOnlyValue.tsx","../src/settings/layout/SettingsSection.tsx","../src/settings/layout/SettingsSubHeader.tsx","../src/settings/navigation/SettingsFlatNavigation.tsx","../src/settings/primitives/SettingsButton.tsx","../src/settings/primitives/SettingsCheckbox.tsx","../src/settings/primitives/SettingsColorPicker.tsx","../src/settings/primitives/SettingsDeviceSelect.tsx","../src/settings/primitives/SettingsKeybinding.tsx","../src/settings/primitives/SettingsLink.tsx","../src/settings/primitives/SettingsMultiSelect.tsx","../src/settings/primitives/SettingsNumberInput.tsx","../src/settings/primitives/SettingsRadioGroup.tsx","../src/settings/primitives/SettingsSegmented.tsx","../src/settings/primitives/SettingsSelect.tsx","../src/settings/primitives/SettingsSlider.tsx","../src/settings/primitives/SettingsSwitch.tsx","../src/settings/primitives/SettingsTextInput.tsx","../src/settings/tree/types.ts","../src/settings/tree/SettingsBreadcrumb.tsx","../src/settings/tree/SettingsDrawerNav.tsx","../src/settings/tree/SettingsTree.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * src/settings/host.tsx — THE SETTINGS HOST: what the settings blocks need from the app that draws them.\n *\n * Settings rows are drawn inside routes, windows and drawers, far from any provider, so — like\n * the entity-ref host — this one is bound ONCE per page through `configureSettings(...)` (a\n * module-level slot on `globalThis`, so every module-graph copy of the package reads one binding).\n *\n * Each port has a default that ANNOUNCES ITSELF instead of pretending:\n *\n * Link the app's router link (basePath/deployment aware). Default: the registered tap-target\n * link component, else a plain <a>.\n * ErrorMenu the actions drawn beside a KNOWN refusal. Default: none.\n * Anchor wraps one control so a deep link (`?control=` / `#id`) can reveal and focus it.\n * Default: a plain div carrying the ids, with no reveal behaviour.\n * useNavigate a HOOK returning the presentation-aware navigate function (a settings window\n * closes itself after the push). Default: a full-page navigation.\n * copyNotify where a copy's outcome is told. Default: silent (kit's useClipboard contract).\n *\n * Unconfigured, the default anchor carries `data-settings-host=\"unconfigured\"` and the first draw\n * warns once in the console, naming `configureSettings`. The host MUST be configured before the first\n * render: `useNavigate` is a hook, and a component's hook count cannot change between renders.\n */\n\nimport type { ComponentType, MouseEvent as ReactMouseEvent, ReactNode, Ref } from \"react\";\nimport { globalSlot } from \"@ai-matrx/kit/global-slot\";\nimport { HostLink } from \"../host-link\";\n\nexport interface SettingsLinkAnchorProps {\n href: string;\n id?: string | undefined;\n className?: string | undefined;\n onClick?: ((event: ReactMouseEvent<HTMLAnchorElement>) => void) | undefined;\n children?: ReactNode;\n ref?: Ref<HTMLAnchorElement> | undefined;\n}\n\nexport type SettingsNavigateFn = (\n href: string,\n event?: ReactMouseEvent | MouseEvent | null,\n) => void;\n\nexport interface SettingsHost {\n Link?: ComponentType<SettingsLinkAnchorProps> | undefined;\n ErrorMenu?: ComponentType<{ error: unknown }> | undefined;\n Anchor?: ComponentType<{ id: string; children: ReactNode }> | undefined;\n useNavigate?: (() => SettingsNavigateFn) | undefined;\n copyNotify?: ((message: string, kind: \"success\" | \"error\") => void) | undefined;\n}\n\nconst bound = globalSlot(\"ai-matrx.design-system.settings-host\", () => ({ host: null as SettingsHost | null }));\n\n/** Bind the app's settings host. Call once, at module load, before anything renders. */\nexport function configureSettings(host: SettingsHost | null): void {\n bound.host = host;\n}\n\n/** True once a host has been bound. */\nexport function settingsConfigured(): boolean {\n return Boolean(bound.host);\n}\n\nlet warned = false;\nfunction announceUnconfigured(): void {\n if (warned) return;\n warned = true;\n if (typeof console !== \"undefined\") {\n console.warn(\n \"[@ai-matrx/design-system/settings] no host configured: settings links navigate with full page loads, \" +\n \"controls cannot be deep-linked and refusals show no actions. Call configureSettings(...) once before the first render.\",\n );\n }\n}\n\nfunction DefaultAnchor({ id, children }: { id: string; children: ReactNode }) {\n announceUnconfigured();\n return (\n <div\n id={id}\n data-setting-control={id}\n data-setting-search-key={id}\n data-settings-host=\"unconfigured\"\n tabIndex={-1}\n className=\"@container/settings scroll-mt-20 outline-none\"\n >\n {children}\n </div>\n );\n}\n\n// No settings-specific Link: the one internal-link seam is HostLink (the registered tap-target link).\nfunction DefaultLink({ ref, ...rest }: SettingsLinkAnchorProps) {\n return <HostLink ref={ref as Ref<HTMLAnchorElement> | undefined} {...rest} />;\n}\n\nfunction useDefaultNavigate(): SettingsNavigateFn {\n announceUnconfigured();\n return (href, event) => {\n if (event && \"preventDefault\" in event) event.preventDefault();\n if (typeof window !== \"undefined\") window.location.assign(href);\n };\n}\n\n/** The Link the settings blocks draw. */\nexport function SettingsHostLink(props: SettingsLinkAnchorProps) {\n const Link = bound.host?.Link ?? DefaultLink;\n return <Link {...props} />;\n}\n\n/** The actions beside a known refusal; nothing until the host binds one. */\nexport function SettingsHostErrorMenu({ error }: { error: unknown }) {\n const Menu = bound.host?.ErrorMenu;\n return Menu ? <Menu error={error} /> : null;\n}\n\n/** Wraps one control so a deep link can reveal it. */\nexport function SettingsHostAnchor(props: { id: string; children: ReactNode }) {\n const Anchor = bound.host?.Anchor ?? DefaultAnchor;\n return <Anchor {...props} />;\n}\n\n/** The presentation-aware navigate function (a HOOK — see the header). */\nexport function useSettingsHostNavigate(): SettingsNavigateFn {\n const hook = bound.host?.useNavigate ?? useDefaultNavigate;\n return hook();\n}\n\n/** The copy notifier the host bound, if any. */\nexport function settingsCopyNotify(): ((message: string, kind: \"success\" | \"error\") => void) | undefined {\n return bound.host?.copyNotify;\n}\n","/**\n * Stable deep-link identity for an authored setting. This is deliberately\n * separate from the React input id: controls remount, while setting doors and\n * bookmarked search results must keep resolving to the same row.\n */\nexport function settingsControlSearchId(sectionTitle: string, label: string): string {\n const slug = (value: string) =>\n value\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\") || \"setting\";\n return `settings-control-${slug(sectionTitle)}-${slug(label)}`;\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\n\nexport type SettingsDesignVariant = \"standard\" | \"compact\";\nexport type SettingsDesignProviderProps = {\n children: ReactNode;\n variant?: SettingsDesignVariant;\n};\n\nconst SettingsDesignContext = createContext<SettingsDesignVariant>(\"standard\");\n\n/**\n * Applies a presentation density to the local settings primitive family.\n * Omit it for existing embeddings, which retain the standard presentation.\n */\nexport function SettingsDesignProvider({\n children,\n variant = \"standard\",\n}: SettingsDesignProviderProps) {\n return (\n <SettingsDesignContext.Provider value={variant}>\n {children}\n </SettingsDesignContext.Provider>\n );\n}\n\nexport function useSettingsDesign() {\n return { variant: useContext(SettingsDesignContext) } as const;\n}\n","\"use client\";\n\nimport { CircleAlertIcon as AlertCircle, AlertTriangleIcon as AlertTriangle, ChevronRightIcon as ChevronRight, Loader2Icon as LoaderCircle } from \"../icons\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../cn\";\nimport { SettingsHostLink as AppLink } from \"./host\";\nimport type { SettingsBadge, SettingsCommonProps } from \"./types\";\nimport { SettingsHostErrorMenu as ErrorAlchemyMenu } from \"./host\";\nimport { Tile } from \"../controls/surfaces\";\n\nexport type SettingsNavigationRowProps = SettingsCommonProps & {\n value?: ReactNode;\n loading?: boolean;\n last?: boolean;\n} & (\n | { href: string; onNavigate?: never }\n | { href?: never; onNavigate: () => void }\n );\n\n/** A settings row with exactly one navigation action. */\nexport function SettingsNavigationRow({\n href,\n onNavigate,\n value,\n loading = false,\n last,\n disabled,\n label,\n description,\n warning,\n error,\n badge,\n icon: Icon,\n modified,\n id,\n}: SettingsNavigationRowProps) {\n const rowClass = cn(\n \"flex min-h-11 w-full items-center gap-3 px-4 py-2.5 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring sm:min-h-9\",\n !disabled && !loading && \"hover:bg-accent/60\",\n (disabled || loading) && \"cursor-default text-disabled-foreground\",\n !last && \"border-b border-border/40\",\n );\n const content = (\n <>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n {modified && (\n <span\n aria-label=\"Modified from default\"\n className=\"h-1.5 w-1.5 shrink-0 rounded-full bg-primary\"\n />\n )}\n {Icon && (\n <Icon\n className=\"h-4 w-4 shrink-0 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n )}\n <span className=\"truncate type-title text-foreground\">\n {label}\n </span>\n {badge && <Badge badge={badge} />}\n </span>\n {description && (\n <span className=\"mt-0.5 block type-secondary leading-snug text-muted-foreground sm:truncate\">\n {description}\n </span>\n )}\n {warning && (\n <span className=\"mt-1 flex items-start gap-1.5 type-secondary leading-snug text-amber-600 dark:text-amber-400\">\n <AlertTriangle\n className=\"mt-0.5 h-3.5 w-3.5 shrink-0\"\n aria-hidden=\"true\"\n />\n <span className=\"break-words\">{warning}</span>\n </span>\n )}\n {error && (\n <span className=\"mt-1 flex items-start gap-1.5 type-secondary leading-snug text-red-600 dark:text-red-400\">\n <AlertCircle\n className=\"mt-0.5 h-3.5 w-3.5 shrink-0\"\n aria-hidden=\"true\"\n />\n <span className=\"break-words\">{error}</span>\n <ErrorAlchemyMenu error={error} />\n </span>\n )}\n </span>\n {value && (\n <span className=\"min-w-0 max-w-40 truncate type-body text-muted-foreground\">\n {value}\n </span>\n )}\n {loading ? (\n <LoaderCircle\n className=\"h-4 w-4 shrink-0 animate-spin text-muted-foreground\"\n aria-hidden=\"true\"\n />\n ) : (\n <ChevronRight\n className=\"h-4 w-4 shrink-0 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n )}\n </>\n );\n\n if (disabled || loading) {\n return (\n <div\n id={id}\n className={rowClass}\n aria-disabled=\"true\"\n aria-busy={loading || undefined}\n >\n {content}\n </div>\n );\n }\n if (href) {\n return (\n <AppLink id={id} className={rowClass} href={href}>\n {content}\n </AppLink>\n );\n }\n return (\n <Tile id={id} className={rowClass} type=\"button\" onClick={onNavigate} dense variant=\"quiet\" title={content} />\n );\n}\n\nfunction Badge({ badge }: { badge: SettingsBadge }) {\n return (\n <span className=\"rounded border border-border bg-muted px-1.5 py-0 type-meta font-semibold uppercase tracking-wide text-muted-foreground\">\n {badge.label}\n </span>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport type SettingsPageProps = { children: ReactNode };\n\n/**\n * Content canvas for a settings route or overlay. The surrounding shell owns\n * scrolling so this component never creates a nested scroll region.\n * `matrx-touch-targets` gives every control inside a 44px floor on touch and\n * below `lg`; desktop density is untouched.\n */\nexport function SettingsPage({ children }: SettingsPageProps) {\n return (\n <div className=\"matrx-touch-targets mx-auto min-h-full w-full max-w-5xl px-4 py-5 sm:px-6 sm:py-7 lg:px-8\">\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport { AlertTriangleIcon as AlertTriangle, CircleAlertIcon as AlertCircle, CircleHelpIcon as HelpCircle } from \"../icons\";\nimport * as Popover from \"@radix-ui/react-popover\";\nimport { useId, useRef, useState } from \"react\";\nimport { cn } from \"../cn\";\nimport type {\n SettingsCommonProps,\n SettingsRowVariant,\n SettingsRowDensity,\n SettingsBadge,\n} from \"./types\";\nimport { useSettingsDesign } from \"./SettingsDesignProvider\";\nimport { useSettingsSectionTitle } from \"./SettingsSectionContext\";\nimport { SettingsHostAnchor as SettingAnchor } from \"./host\";\nimport { settingsControlSearchId } from \"./searchIdentity\";\nimport { SettingsHostErrorMenu as ErrorAlchemyMenu } from \"./host\";\nimport { ResetTapButton } from \"../tap-target/buttons\";\nimport { Button } from \"../controls/controls\";\nimport { Tile } from \"../controls/surfaces\";\n\ntype SettingsRowProps = SettingsCommonProps & {\n /** Layout variant. Defaults to \"inline\". */\n variant?: SettingsRowVariant | undefined;\n /** Row density. Defaults to \"default\". */\n density?: SettingsRowDensity | undefined;\n /** The control (switch, input, slider, etc.) rendered on the right or below. */\n children: React.ReactNode;\n /** Whether this row is the last in a section. Removes trailing border. */\n last?: boolean | undefined;\n /** Wide controls stack below their label on narrow screens. */\n controlLayout?: \"compact\" | \"wide\" | undefined;\n /** Stable row anchor used by settings search and deep links. */\n anchorId?: string | undefined;\n /** Override the label target; pass null when the row exposes a labeled group. */\n labelFor?: string | null;\n};\n\nconst densityStyles: Record<SettingsRowDensity, string> = {\n compact: \"py-2.5\",\n default: \"py-3.5\",\n comfortable: \"py-4.5\",\n};\n\nconst badgeStyles: Record<SettingsBadge[\"variant\"], string> = {\n default: \"bg-muted text-muted-foreground border border-border\",\n new: \"bg-blue-500/10 text-blue-600 dark:text-blue-400 border border-blue-500/20\",\n beta: \"bg-purple-500/10 text-purple-600 dark:text-purple-400 border border-purple-500/20\",\n experimental:\n \"bg-amber-500/10 text-amber-600 dark:text-amber-400 border border-amber-500/20\",\n deprecated:\n \"bg-red-500/10 text-red-600 dark:text-red-400 border border-red-500/20\",\n admin:\n \"bg-foreground text-background border border-border\",\n};\n\nfunction BadgePill({ badge }: { badge: SettingsBadge }) {\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded px-1.5 py-0 type-meta font-semibold uppercase tracking-wide leading-4\",\n badgeStyles[badge.variant],\n )}\n >\n {badge.label}\n </span>\n );\n}\n\n/**\n * SettingsRow — base layout for every settings control.\n *\n * Rarely used directly by tab authors. Each primitive (SettingsSwitch,\n * SettingsSelect, etc.) composes this internally and exposes a flat prop API.\n *\n * Variants handle layout differences; NEVER accept a className.\n */\nexport function SettingsRow({\n label,\n description,\n meta,\n warning,\n error,\n badge,\n icon: Icon,\n disabled,\n modified,\n id,\n helpText,\n variant = \"inline\",\n density = \"default\",\n children,\n last,\n controlLayout = \"compact\",\n anchorId,\n labelFor,\n onReset,\n resetLabel,\n}: SettingsRowProps) {\n const { variant: designVariant } = useSettingsDesign();\n const sectionTitle = useSettingsSectionTitle();\n const reactId = useId().replace(/:/g, \"\");\n // Input ids are React-instance ids. Search/deep-link ids intentionally use\n // only the authored section + label, so they survive remounts and markup.\n const inputId = id ?? `settings-input-${reactId}`;\n const labelId = `${inputId}-label`;\n const controlId = settingsControlSearchId(sectionTitle ?? \"Settings\", label);\n const rowAnchorId = anchorId ?? controlId;\n\n // One reset door, only when there is something to reset. A row that CAN\n // reset always reserves the slot (the same 36px as a ladder row's History\n // button), so every control on a screen ends at one edge instead of\n // shifting when a value changes.\n const resetButton = onReset ? (\n // The slot is the tap button's own box (never a fixed-size wrapper, which\n // squeezed the button off its geometry); hidden, not removed, so the slot\n // stays reserved and `visibility: hidden` drops it from the tab order.\n <span\n className={cn(\"inline-flex shrink-0\", !(modified && !disabled) && \"invisible\")}\n aria-hidden={modified && !disabled ? undefined : true}\n >\n <ResetTapButton\n variant=\"transparent\"\n ariaLabel={resetLabel ?? `Reset ${label.toLowerCase()} to default`}\n onClick={onReset}\n />\n </span>\n ) : null;\n\n const labelBlock = (\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-1.5\">\n {modified && (\n <span\n role=\"img\"\n aria-label=\"Changed from the default\"\n title=\"Changed from the default\"\n className=\"h-1.5 w-1.5 rounded-full bg-primary shrink-0\"\n />\n )}\n {Icon && (\n <Icon className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n )}\n {labelFor === null ? (\n <span\n id={labelId}\n className={cn(\n \"min-w-0 break-words type-title leading-snug text-foreground\",\n disabled && \"text-disabled-foreground\",\n )}\n >\n {label}\n </span>\n ) : (\n <label\n id={labelId}\n htmlFor={labelFor ?? inputId}\n className={cn(\n \"min-w-0 break-words text-sm font-medium leading-snug text-foreground\",\n disabled && \"text-disabled-foreground\",\n )}\n >\n {label}\n </label>\n )}\n {badge && <BadgePill badge={badge} />}\n {/* The description is printed in full under the label; the help\n popover holds only the extra help, never a repeat of it. One\n popover for every design variant: a hover tooltip never opens on a\n phone, and its contents (a copy button) could not be reached. */}\n {helpText && <CompactHelpPopover label={label} helpText={helpText} />}\n </div>\n {meta ? (\n <div\n className={cn(\n \"mt-0.5 flex flex-wrap items-center gap-x-1.5 gap-y-0.5 break-words type-meta leading-snug text-muted-foreground [overflow-wrap:anywhere]\",\n disabled && \"text-disabled-foreground\",\n )}\n >\n {meta}\n </div>\n ) : null}\n {description ? (\n <TruncatedDescription description={description} disabled={disabled} />\n ) : null}\n {warning && (\n <div className=\"mt-1 flex items-start gap-1.5 type-secondary text-amber-600 dark:text-amber-400\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0 mt-0.5\" />\n <span className=\"break-words leading-snug\">{warning}</span>\n </div>\n )}\n {error && (\n <div className=\"mt-1 flex items-start gap-1.5 type-secondary text-red-600 dark:text-red-400\">\n <AlertCircle className=\"h-3.5 w-3.5 shrink-0 mt-0.5\" />\n <span className=\"break-words leading-snug\">{error}</span>\n <ErrorAlchemyMenu error={error} />\n </div>\n )}\n </div>\n );\n\n if (variant === \"block\") {\n return (\n <SettingAnchor id={rowAnchorId}>\n <div\n className={cn(\n \"px-4 border-b border-border/40\",\n densityStyles[\n designVariant === \"compact\" && density === \"default\"\n ? \"compact\"\n : density\n ],\n last && \"border-b-0\",\n )}\n >\n {children}\n </div>\n </SettingAnchor>\n );\n }\n\n if (variant === \"stacked\") {\n return (\n <SettingAnchor id={rowAnchorId}>\n <div\n className={cn(\n \"px-4 border-b border-border/40\",\n densityStyles[\n designVariant === \"compact\" && density === \"default\"\n ? \"compact\"\n : density\n ],\n last && \"border-b-0\",\n )}\n >\n <div className=\"mb-2.5\">{labelBlock}</div>\n <div className={cn(\"flex items-center gap-2\", disabled && \"text-disabled-foreground\")}>\n <div className=\"min-w-0 flex-1\">{children}</div>\n {resetButton}\n </div>\n </div>\n </SettingAnchor>\n );\n }\n\n return (\n <SettingAnchor id={rowAnchorId}>\n <div\n className={cn(\n controlLayout === \"wide\"\n ? \"flex flex-col items-stretch gap-2 border-b border-border/40 px-4 @[40rem]/settings:flex-row @[40rem]/settings:items-center @[40rem]/settings:gap-4\"\n : \"flex items-center gap-4 px-4 border-b border-border/40\",\n densityStyles[\n designVariant === \"compact\" && density === \"default\"\n ? \"compact\"\n : density\n ],\n last && \"border-b-0\",\n )}\n >\n {labelBlock}\n <div\n className={cn(\n controlLayout === \"wide\"\n ? \"w-full min-w-0 max-w-full [&_button]:max-w-full [&_input]:max-w-full @[40rem]/settings:w-auto @[40rem]/settings:shrink-0\"\n : \"w-auto min-w-0 max-w-full shrink-0 [&_button]:max-w-full [&_input]:max-w-full\",\n resetButton && \"flex items-center gap-1\",\n disabled && \"text-disabled-foreground\",\n )}\n >\n {/* The reset sits beside its control on every width, never on a\n line of its own under it. */}\n {resetButton ? <div className=\"min-w-0 flex-1\">{children}</div> : children}\n {resetButton}\n </div>\n </div>\n </SettingAnchor>\n );\n}\n\n/**\n * One line, truncated. When the text does not fit (a phone), a press opens the\n * full text in a popover; when it fits, the line is plain text and never opens.\n */\nfunction TruncatedDescription({\n description,\n disabled,\n}: Pick<SettingsCommonProps, \"description\" | \"disabled\">) {\n const lineRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n // Rich content (links, controls) cannot sit inside a button; it keeps wrapping.\n if (typeof description !== \"string\") {\n return (\n <div\n className={cn(\n \"mt-0.5 break-words type-secondary leading-snug text-muted-foreground\",\n disabled && \"text-disabled-foreground\",\n )}\n >\n {description}\n </div>\n );\n }\n return (\n <Popover.Root\n open={open}\n onOpenChange={(next) => {\n const el = lineRef.current;\n setOpen(next && !!el && el.scrollWidth > el.clientWidth);\n }}\n >\n <Popover.Trigger asChild>\n <Tile\n ref={lineRef}\n type=\"button\"\n dense\n variant=\"quiet\"\n title={description}\n className=\"mt-0.5 w-full min-w-0\"\n data-touch-exempt\n disabled={disabled}\n >\n </Tile>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n side=\"bottom\"\n align=\"start\"\n sideOffset={6}\n className=\"z-50 w-72 max-w-[calc(100vw-2rem)] break-words rounded-md border border-border bg-popover p-3 type-secondary leading-snug text-popover-foreground shadow-md [overflow-wrap:anywhere]\"\n >\n {description}\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n}\n\nexport function CompactHelpPopover({\n label,\n description,\n helpText,\n}: Pick<SettingsCommonProps, \"label\" | \"description\" | \"helpText\">) {\n return (\n <Popover.Root>\n <Popover.Trigger asChild>\n {/* Icon-sized so it never makes the label line taller (on a phone a\n 44px-tall help button pushed the description a blank line down);\n `matrx-tap-area` gives it the 44px finger ring without growing it. */}\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={`About ${label}`}\n icon={<HelpCircle className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />}\n data-touch-exempt\n className=\"shrink-0\"\n />\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n side=\"bottom\"\n align=\"start\"\n sideOffset={6}\n className=\"z-50 w-72 max-w-[calc(100vw-2rem)] break-words rounded-md border border-border bg-popover p-3 type-secondary leading-snug text-popover-foreground shadow-md [overflow-wrap:anywhere]\"\n >\n {description && <div>{description}</div>}\n {helpText && (\n <div className={cn(description && \"mt-2\")}>{helpText}</div>\n )}\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\n\nconst SettingsSectionContext = createContext<string | undefined>(undefined);\n\n/** The nearest section title gives static controls a stable deep-link scope. */\nexport function SettingsSectionProvider({\n title,\n children,\n}: {\n title: string;\n children: ReactNode;\n}) {\n return (\n <SettingsSectionContext.Provider value={title}>\n {children}\n </SettingsSectionContext.Provider>\n );\n}\n\nexport function useSettingsSectionTitle(): string | undefined {\n return useContext(SettingsSectionContext);\n}\n","\"use client\";\n\nimport { InfoIcon as Info, AlertTriangleIcon as AlertTriangle, CircleAlertIcon as AlertCircle, CircleCheckIcon as CheckCircle } from \"../../icons\";\nimport { cn } from \"../../cn\";\n\ntype Tone = \"info\" | \"warning\" | \"error\" | \"success\";\n\nconst toneStyles: Record<\n Tone,\n { container: string; icon: string; Icon: React.ComponentType<{ className?: string }> }\n> = {\n info: {\n container:\n \"border-blue-500/30 bg-blue-500/5 text-blue-900 dark:text-blue-100\",\n icon: \"text-blue-600 dark:text-blue-400\",\n Icon: Info,\n },\n warning: {\n container:\n \"border-amber-500/30 bg-amber-500/5 text-amber-900 dark:text-amber-100\",\n icon: \"text-amber-600 dark:text-amber-400\",\n Icon: AlertTriangle,\n },\n error: {\n container:\n \"border-red-500/30 bg-red-500/5 text-red-900 dark:text-red-100\",\n icon: \"text-red-600 dark:text-red-400\",\n Icon: AlertCircle,\n },\n success: {\n container:\n \"border-emerald-500/30 bg-emerald-500/5 text-emerald-900 dark:text-emerald-100\",\n icon: \"text-emerald-600 dark:text-emerald-400\",\n Icon: CheckCircle,\n },\n};\n\nexport type SettingsCalloutProps = {\n tone: Tone;\n title?: string;\n children: React.ReactNode;\n /** Optional action node rendered in the footer row of the callout. */\n action?: React.ReactNode;\n};\n\nexport function SettingsCallout({\n tone,\n title,\n children,\n action,\n}: SettingsCalloutProps) {\n const { container, icon, Icon } = toneStyles[tone];\n return (\n <div\n className={cn(\n \"mx-4 mb-4 flex items-start gap-2.5 rounded-md border px-3 py-2.5\",\n container,\n )}\n >\n <Icon className={cn(\"h-4 w-4 shrink-0 mt-0.5\", icon)} />\n <div className=\"flex-1 min-w-0 type-secondary leading-relaxed\">\n {title && <div className=\"font-semibold mb-0.5\">{title}</div>}\n <div>{children}</div>\n {action && <div className=\"mt-2\">{action}</div>}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { cn } from \"../../cn\";\n\nexport type SettingsGridProps = {\n /** Desktop column count. Defaults to 2. */\n columns?: 2 | 3;\n /** Gap size between cells. */\n gap?: \"sm\" | \"md\" | \"lg\";\n children: React.ReactNode;\n};\n\nconst gapClass = {\n sm: \"gap-2\",\n md: \"gap-3\",\n lg: \"gap-4\",\n};\n\nconst columnsClass = {\n 2: \"@[40rem]/settings-grid:grid-cols-2\",\n 3: \"@[40rem]/settings-grid:grid-cols-2 @[56rem]/settings-grid:grid-cols-3\",\n};\n\n/**\n * Grid container for dense dashboards — e.g. 2-up stat cards, side-by-side pickers.\n * On mobile always stacks to a single column to keep controls readable.\n */\nexport function SettingsGrid({\n columns = 2,\n gap = \"md\",\n children,\n}: SettingsGridProps) {\n return (\n <div\n className={cn(\n \"@container/settings-grid grid grid-cols-1 px-4 mb-4 [&>*]:min-w-0\",\n columnsClass[columns],\n gapClass[gap],\n )}\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport { useClipboard } from \"@ai-matrx/kit/clipboard\";\nimport { settingsCopyNotify } from \"../host\";\nimport { CheckIcon as Check, CopyIcon as Copy } from \"../../icons\";\nimport { useId, useState } from \"react\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { cn } from \"../../cn\";\nimport { Button } from \"../../controls/controls\";\nimport type { SettingsCommonProps } from \"../types\";\n\nexport type SettingsReadOnlyValueProps = Omit<\n SettingsCommonProps,\n \"disabled\" | \"modified\"\n> & {\n value: string;\n /** When true, shows a copy-to-clipboard button. */\n copyable?: boolean;\n /** Renders the value in a monospace font (for IDs, hashes, URLs). */\n mono?: boolean;\n last?: boolean;\n};\n\n/**\n * Informational row — no user control, just a key/value display.\n * Examples: \"App version: 0.3.217\", \"Build: abc123\", \"User ID: uuid-...\".\n */\nexport function SettingsReadOnlyValue({\n value,\n copyable,\n mono,\n last,\n ...rowProps\n}: SettingsReadOnlyValueProps) {\n const notify = settingsCopyNotify();\n const { copyText } = useClipboard(notify ? { notify } : {});\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n if (!(await copyText(value))) return;\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n };\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant=\"inline\"\n controlLayout=\"wide\"\n last={last}\n >\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span\n className={cn(\n \"min-w-0 max-w-full type-secondary text-muted-foreground truncate @[40rem]/settings:max-w-64\",\n mono && \"font-mono tabular-nums\",\n )}\n title={value}\n >\n {value}\n </span>\n {copyable && (\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={copied ? \"Copied\" : \"Copy to clipboard\"}\n icon={copied ? <Check className=\"h-3 w-3 text-emerald-500\" /> : <Copy className=\"h-3 w-3\" />}\n onClick={handleCopy}\n className=\"shrink-0\"\n />\n )}\n </div>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId, useState } from \"react\";\nimport { ChevronDownIcon as ChevronDown } from \"../../icons\";\nimport type { SettingsIconType as LucideIcon } from \"../icon-type\";\nimport { cn } from \"../../cn\";\nimport { Tile } from \"../../controls/surfaces\";\nimport { useSettingsDesign } from \"../SettingsDesignProvider\";\nimport { SettingsSectionProvider } from \"../SettingsSectionContext\";\n\nexport type SettingsSectionProps = {\n title: string;\n description?: string;\n icon?: LucideIcon;\n /** Makes the section expand/collapse with a chevron header. */\n collapsible?: boolean;\n /** When collapsible, controls initial state. Defaults to expanded. */\n defaultOpen?: boolean;\n /** Section header emphasis. Defaults to \"default\". */\n emphasis?: \"subtle\" | \"default\" | \"strong\";\n /** Optional action node rendered to the right of the title (e.g. reset button). */\n action?: React.ReactNode;\n children: React.ReactNode;\n};\n\nexport type SettingsGroupProps = SettingsSectionProps;\n\nconst emphasisTitleClass = {\n subtle: \"text-xs font-semibold uppercase tracking-wide text-muted-foreground\",\n default: \"text-sm font-semibold text-foreground\",\n strong: \"text-base font-semibold text-foreground\",\n};\n\n/**\n * SettingsSection groups related rows under a common header.\n * Sections are the primary organizing unit inside a settings tab.\n */\nexport function SettingsSection({\n title,\n description,\n icon: Icon,\n collapsible,\n defaultOpen = true,\n emphasis = \"default\",\n action,\n children,\n}: SettingsSectionProps) {\n const { variant } = useSettingsDesign();\n const [open, setOpen] = useState(defaultOpen);\n const contentId = useId().replace(/:/g, \"\");\n const isOpen = collapsible ? open : true;\n\n return (\n <section className={cn(variant === \"compact\" ? \"mb-4\" : \"mb-6\")}>\n <header className=\"flex flex-wrap items-center gap-2 px-4 mb-2\">\n {collapsible ? (\n <Tile\n type=\"button\"\n dense\n variant=\"quiet\"\n title={\n <span className=\"flex min-w-0 items-center gap-2\">\n <ChevronDown\n className={cn(\"h-3.5 w-3.5 shrink-0 text-muted-foreground transition-transform\", !isOpen && \"-rotate-90\")}\n aria-hidden=\"true\"\n />\n {Icon ? <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" /> : null}\n <span className={cn(emphasisTitleClass[emphasis], \"min-w-0 break-words\")}>{title}</span>\n </span>\n }\n className=\"-mx-2 flex min-w-0 flex-1 items-center gap-2 rounded px-2 py-1 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-expanded={isOpen}\n aria-controls={contentId}\n onClick={() => setOpen((value) => !value)}\n />\n ) : (\n <>\n {Icon && (\n <Icon\n className=\"h-4 w-4 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n )}\n <h3\n className={cn(\n emphasisTitleClass[emphasis],\n \"min-w-0 flex-1 break-words\",\n )}\n >\n {title}\n </h3>\n </>\n )}\n {action && <div className=\"ml-auto max-w-full shrink-0\">{action}</div>}\n </header>\n {description && isOpen && (\n <p className=\"px-4 type-secondary text-muted-foreground mb-2 leading-snug\">\n {description}\n </p>\n )}\n {isOpen && (\n <div\n id={contentId}\n className={cn(\n \"border border-border/40 bg-card/30\",\n variant === \"compact\" ? \"rounded-md\" : \"rounded-lg\",\n )}\n >\n <SettingsSectionProvider title={title}>\n {children}\n </SettingsSectionProvider>\n </div>\n )}\n </section>\n );\n}\n\n/** A named reusable settings group with the exact SettingsSection contract. */\nexport function SettingsGroup(props: SettingsGroupProps) {\n return <SettingsSection {...props} />;\n}\n","\"use client\";\n\nimport type { SettingsIconType as LucideIcon } from \"../icon-type\";\nimport { cn } from \"../../cn\";\nimport { useSettingsDesign } from \"../SettingsDesignProvider\";\nimport { CompactHelpPopover } from \"../SettingsRow\";\n\nexport type SettingsSubHeaderProps = {\n title: string;\n description?: string;\n icon?: LucideIcon;\n /** Renders a bottom border as a divider. Defaults to true. */\n divider?: boolean;\n};\n\n/**\n * Page-level header for a settings tab. The `description` opens from a help\n * icon beside the title rather than sitting under it.\n * Render once at the top of each tab component — above any SettingsSection.\n */\nexport function SettingsSubHeader({\n title,\n description,\n icon: Icon,\n divider = true,\n}: SettingsSubHeaderProps) {\n const { variant } = useSettingsDesign();\n return (\n <div\n data-settings-subheader=\"\"\n className={cn(\n \"px-4\",\n variant === \"compact\" ? \"pb-3 mb-3\" : \"pb-4 mb-4\",\n divider && \"border-b border-border/40\",\n )}\n >\n <div className=\"flex items-center gap-2\">\n {Icon && <Icon className=\"h-5 w-5 text-foreground\" />}\n <h2 className={cn(\"font-semibold text-foreground leading-tight\", variant === \"compact\" ? \"text-base\" : \"text-lg\")}>\n {title}\n </h2>\n {/* The title stands alone (page-pass core 3): what the tab is for is\n one tap away, never a sentence parked under every heading. */}\n {description && <CompactHelpPopover label={title} description={description} />}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type { ReactNode, Ref } from \"react\";\nimport { XIcon as X } from \"../../icons\";\nimport type { SettingsTreeNode } from \"../tree/types\";\nimport { cn } from \"../../cn\";\nimport { Button, SearchField } from \"../../controls/controls\";\n\nexport function SettingsNavigationSearch({\n value,\n onValueChange,\n label = \"Search settings\",\n inputRef,\n}: {\n value: string;\n onValueChange: (value: string) => void;\n label?: string;\n inputRef?: Ref<HTMLInputElement>;\n}) {\n return (\n // A solid band with a rule under it: the sidebar itself is transparent\n // over the textured shell, so a bare input let scrolled items show\n // through around it (page-pass 2026-09-27).\n <div className=\"sticky top-0 z-10 mb-1 border-b border-border/60 bg-textured pb-1.5 pt-1\" role=\"search\">\n <div className=\"relative\">\n <SearchField\n ref={inputRef}\n type=\"search\"\n value={value}\n onChange={(event) => onValueChange(event.target.value)}\n placeholder={label}\n aria-label={label}\n end={value ? <span aria-hidden=\"true\" className=\"w-7 shrink-0\" /> : undefined}\n className=\"w-full\"\n />\n {value ? <Button type=\"button\" variant=\"quiet\" className=\"absolute right-1.5 top-1/2 -translate-y-1/2\" onClick={() => onValueChange(\"\")} aria-label=\"Clear search\" icon={<X aria-hidden />} /> : null}\n </div>\n </div>\n );\n}\n\nexport type SettingsNavigationItem = {\n id: string;\n label: string;\n location: string;\n node: SettingsTreeNode;\n};\n\nexport type SettingsNavigationSection = {\n id: string;\n /** Omit when adjacent root links do not have a meaningful shared heading. */\n label?: string;\n items: SettingsNavigationItem[];\n};\n\n/**\n * Converts a settings tree into Notion-style, non-recursive sections. Desktop\n * navigation intentionally has no expandable state: headings orient people and\n * every destination stays visible as a flat link.\n */\nexport function settingsNavigationSections(\n nodes: SettingsTreeNode[],\n): SettingsNavigationSection[] {\n const sections: SettingsNavigationSection[] = [];\n for (const root of nodes) {\n if (!root.children?.length) {\n const last = sections.at(-1);\n if (last && !last.label) {\n last.items.push(asItem(root, \"Settings\"));\n } else {\n sections.push({ id: `unsectioned:${root.id}`, items: [asItem(root, \"Settings\")] });\n }\n continue;\n }\n\n // Registry folders are headings. Configuration domains use their routable\n // Overview child while keeping the domain's human name in the flat list.\n const items: SettingsNavigationItem[] = [];\n if (root.navigable) {\n items.push(asItem({ ...root, label: root.navigationLabel ?? root.label }, \"Settings\"));\n }\n const collect = (node: SettingsTreeNode, path: string[]): void => {\n if (!node.children?.length) {\n items.push(asItem(node, path.join(\" / \")));\n return;\n }\n\n const overview = node.children.find((child) => child.label === \"Overview\");\n if (overview) {\n // The domain's own icon travels with its name; the Overview leaf has\n // none, which drew the same fallback gear on every domain row.\n items.push(\n asItem(\n { ...overview, label: node.label, icon: overview.icon ?? node.icon },\n [...path, node.label].join(\" / \"),\n ),\n );\n return;\n }\n for (const child of node.children) collect(child, [...path, node.label]);\n };\n for (const child of root.children) collect(child, [root.label]);\n if (items.length) sections.push({ id: root.id, label: root.label, items });\n }\n return sections;\n}\n\nfunction asItem(node: SettingsTreeNode, location: string): SettingsNavigationItem {\n return { id: node.id, label: node.label, location, node };\n}\n\nexport function filterSettingsNavigationSections(\n sections: SettingsNavigationSection[],\n query: string,\n): SettingsNavigationSection[] {\n const needle = query.trim().toLocaleLowerCase();\n if (!needle) return sections;\n return sections.flatMap((section) => {\n const items = section.items.filter((item) =>\n [item.label, item.location, item.node.description, ...(item.node.searchKeywords ?? [])]\n .filter((value): value is string => Boolean(value))\n .join(\" \")\n .toLocaleLowerCase()\n .includes(needle),\n );\n return items.length ? [{ ...section, items }] : [];\n });\n}\n\nexport function SettingsFlatNavigation({\n sections,\n activeId,\n renderItem,\n empty,\n}: {\n sections: SettingsNavigationSection[];\n activeId: string | null;\n /** Return one native interactive root (`a` or `button`); this primitive owns its row styling. */\n renderItem: (item: SettingsNavigationItem, active: boolean) => ReactNode;\n empty?: ReactNode;\n}) {\n if (sections.length === 0) {\n return <div className=\"px-3 py-6 type-body text-muted-foreground\">{empty ?? \"No settings match.\"}</div>;\n }\n return (\n <div className=\"flex flex-col gap-3 py-1\">\n {sections.map((section) => (\n <section key={section.id} className=\"flex flex-col gap-0.5\" aria-label={section.label ?? \"Settings\"}>\n {section.label ? <h2 className={cn(\"m-0 px-2 py-1 type-secondary font-medium leading-5 text-muted-foreground\", section.id === activeId && \"rounded bg-muted text-foreground\")}>{section.label}</h2> : null}\n <div className=\"flex flex-col gap-px\">\n {section.items.map((item) => (\n <div\n key={item.id}\n className={cn(\n \"[&>a]:flex [&>a]:min-h-[1.875rem] [&>a]:w-full [&>a]:items-center [&>a]:rounded-sm [&>a]:pl-2 [&>a]:text-[0.8125rem] [&>button]:flex [&>button]:min-h-[1.875rem] [&>button]:w-full [&>button]:items-center [&>button]:rounded-sm [&>button]:pl-2 [&>button]:text-[0.8125rem]\",\n item.id === activeId && \"[&>a]:bg-muted [&>a]:text-foreground [&>button]:bg-muted [&>button]:text-foreground\",\n )}\n >\n {renderItem(item, item.id === activeId)}\n </div>\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport type { SettingsIconType as LucideIcon } from \"../icon-type\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { cn } from \"../../cn\";\nimport type { SettingsCommonProps, SettingsControlSize } from \"../types\";\nimport { Button } from \"../../controls/controls\";\n\ntype ButtonKind = \"default\" | \"outline\" | \"ghost\" | \"destructive\";\n\nexport type SettingsButtonProps = SettingsCommonProps & {\n /** Action label shown on the button itself. */\n actionLabel: string;\n onClick: () => void;\n kind?: ButtonKind;\n size?: SettingsControlSize;\n actionIcon?: LucideIcon;\n /** Stacks the button below the label. Use when the action label is long. */\n stacked?: boolean;\n last?: boolean;\n /** Shows a confirmation spinner / loading state. */\n loading?: boolean;\n};\n\n/**\n * Renders a settings row whose control is an action button.\n * Good for: \"Reset to defaults\", \"Clear cache\", \"Sign out\", \"Open in browser\".\n */\nexport function SettingsButton({\n actionLabel,\n onClick,\n kind = \"outline\",\n size = \"md\",\n actionIcon: ActionIcon,\n stacked,\n loading,\n last,\n ...rowProps\n}: SettingsButtonProps) {\n // Retain the API field for callers; canonical Button owns its geometry.\n void size;\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant={stacked ? \"stacked\" : \"inline\"}\n last={last}\n >\n <Button\n id={id}\n type=\"button\"\n variant={kind === \"default\" ? \"primary\" : kind === \"ghost\" ? \"quiet\" : kind === \"destructive\" ? \"danger\" : \"outline\"}\n icon={ActionIcon ? <ActionIcon className=\"h-3.5 w-3.5 shrink-0\" /> : undefined}\n onClick={onClick}\n disabled={rowProps.disabled || loading}\n className={cn(stacked && \"w-full\", loading && \"animate-pulse\")}\n >\n <span>{loading ? \"Working…\" : actionLabel}</span>\n </Button>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport { Checkbox } from \"../../checkbox\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport type { SettingsCommonProps } from \"../types\";\n\nexport type SettingsCheckboxProps = SettingsCommonProps & {\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n last?: boolean;\n};\n\n/**\n * Use for opt-in / consent / \"tick to enable\" flows.\n * For app-level feature toggles, prefer SettingsSwitch.\n */\nexport function SettingsCheckbox({\n checked,\n onCheckedChange,\n last,\n ...rowProps\n}: SettingsCheckboxProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n return (\n <SettingsRow {...rowProps} id={id} variant=\"inline\" last={last}>\n <Checkbox\n id={id}\n checked={checked}\n onCheckedChange={(v) => onCheckedChange(Boolean(v))}\n disabled={rowProps.disabled}\n />\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useId } from \"react\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { Field } from \"../../controls/controls\";\nimport { Button } from \"../../controls/controls\";\nimport type { SettingsCommonProps } from \"../types\";\n\nexport type SettingsColorPickerProps = SettingsCommonProps & {\n value: string;\n onValueChange: (value: string) => void;\n /** Small palette of preset swatches shown alongside the picker. */\n presets?: string[];\n last?: boolean;\n};\n\nfunction isValidHex(value: string): boolean {\n return /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(value);\n}\n\nexport function SettingsColorPicker({\n value,\n onValueChange,\n presets,\n last,\n ...rowProps\n}: SettingsColorPickerProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n const [draft, setDraft] = useState(value);\n\n useEffect(() => {\n setDraft(value);\n }, [value]);\n\n const commit = (raw: string) => {\n const candidate = raw.startsWith(\"#\") ? raw : `#${raw}`;\n if (isValidHex(candidate)) {\n onValueChange(candidate.toLowerCase());\n setDraft(candidate.toLowerCase());\n } else {\n setDraft(value);\n }\n };\n\n return (\n <SettingsRow {...rowProps} id={id} variant=\"inline\" controlLayout=\"wide\" last={last}>\n <div className=\"flex max-w-full flex-wrap items-center gap-1.5\">\n {presets && presets.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1 mr-1.5\">\n {presets.map((p) => (\n <Button\n key={p}\n type=\"button\"\n variant=\"quiet\"\n aria-label={`Set to ${p}`}\n icon={<span className=\"size-3.5 rounded-sm\" style={{ backgroundColor: p }} aria-hidden />}\n onClick={() => onValueChange(p)}\n disabled={rowProps.disabled}\n />\n ))}\n </div>\n )}\n <Field\n id={id}\n type=\"color\"\n value={isValidHex(value) ? value : \"#000000\"}\n disabled={rowProps.disabled}\n onChange={(e) => onValueChange(e.target.value)}\n aria-label={`${rowProps.label} color`}\n className=\"w-16 shrink-0\"\n />\n <Field\n type=\"text\"\n value={draft}\n placeholder=\"#000000\"\n maxLength={7}\n disabled={rowProps.disabled}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={(e) => commit(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") (e.currentTarget as HTMLInputElement).blur();\n }}\n aria-label={`${rowProps.label} hex color`}\n width=\"xs\"\n />\n </div>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../select\";\nimport { SettingsRow } from \"../SettingsRow\";\n/** A device as the host lists it (structurally the media-devices manager descriptor). */\nexport interface MediaDeviceDescriptor {\n deviceId: string;\n label: string;\n groupId: string;\n}\nimport type { SettingsCommonProps, SettingsControlSize } from \"../types\";\n\ntype Width = \"auto\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n\nconst widthClass: Record<Width, string> = {\n auto: \"w-full max-w-full @[40rem]/settings:w-auto @[40rem]/settings:min-w-32\",\n sm: \"w-32 max-w-full min-w-0\",\n md: \"w-44 max-w-full min-w-0\",\n lg: \"w-64 max-w-full min-w-0\",\n full: \"w-full\",\n};\n\n/** Sentinel for the \"no explicit choice\" option — never a real deviceId. */\nconst DEFAULT_SENTINEL = \"__system_default__\";\n\nexport type SettingsDeviceSelectProps = SettingsCommonProps & {\n /** Live device list from the media-device manager snapshot. */\n devices: MediaDeviceDescriptor[];\n /** Resolved live deviceId of the current choice (\"\" = default/auto). */\n selectedId: string;\n /** Fired with BOTH the deviceId and its label (\"\" + \"\" = default/auto) —\n * labels are persisted alongside ids because iOS Safari regenerates\n * deviceIds per page load (resolve is id → label → default). */\n onSelect: (deviceId: string, label: string) => void;\n /** Label for the \"no explicit choice\" option (default \"System default\"). */\n defaultOptionLabel?: string;\n /** Fallback label prefix for devices whose label is blank (pre-grant),\n * e.g. \"Microphone\" → \"Microphone (a1b2c3)\". */\n deviceKindLabel: string;\n size?: SettingsControlSize;\n width?: Width;\n /** Renders as a stacked layout. Use when the select should span full width. */\n stacked?: boolean;\n last?: boolean;\n};\n\n/**\n * A settings row whose control is a LIVE media-device picker (microphone,\n * speaker, or camera). Unlike `SettingsSelect`, its options come from a live\n * `enumerateDevices` snapshot and its change event carries the (id, label)\n * PAIR the device-preference model persists. Blank labels (permission not yet\n * granted) fall back to `deviceKindLabel (idPrefix)`.\n */\nexport function SettingsDeviceSelect({\n devices,\n selectedId,\n onSelect,\n defaultOptionLabel = \"System default\",\n deviceKindLabel,\n size = \"md\",\n width = \"md\",\n stacked,\n last,\n ...rowProps\n}: SettingsDeviceSelectProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n const variant = stacked ? \"stacked\" : \"inline\";\n const effectiveWidth: Width = stacked ? \"full\" : width;\n\n const optionLabel = (d: MediaDeviceDescriptor): string => {\n if (d.label) return d.label;\n const short = d.deviceId ? d.deviceId.slice(0, 6) : \"unknown\";\n return `${deviceKindLabel} (${short})`;\n };\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant={variant}\n controlLayout=\"wide\"\n last={last}\n >\n <Select\n value={selectedId || DEFAULT_SENTINEL}\n onValueChange={(v) => {\n if (v === DEFAULT_SENTINEL) {\n onSelect(\"\", \"\");\n return;\n }\n const dev = devices.find((d) => d.deviceId === v);\n onSelect(v, dev?.label ?? \"\");\n }}\n disabled={rowProps.disabled ?? false}\n >\n <SelectTrigger\n id={id}\n className={widthClass[effectiveWidth]}\n >\n <SelectValue placeholder={defaultOptionLabel} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={DEFAULT_SENTINEL}>{defaultOptionLabel}</SelectItem>\n {devices.map((d) => (\n <SelectItem key={d.deviceId || \"default-device\"} value={d.deviceId}>\n {optionLabel(d)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId, useState } from \"react\";\nimport { XIcon as X } from \"../../icons\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { cn } from \"../../cn\";\nimport { Button } from \"../../controls/controls\";\nimport type { SettingsCommonProps } from \"../types\";\n\nexport type KeybindingValue = {\n /** Key code from KeyboardEvent.code (e.g., \"KeyK\", \"Digit1\"). */\n key: string;\n /** Display string ready to render (e.g., \"⌘K\", \"Ctrl+Shift+P\"). */\n display: string;\n ctrl?: boolean;\n alt?: boolean;\n shift?: boolean;\n meta?: boolean;\n};\n\nexport type SettingsKeybindingProps = SettingsCommonProps & {\n value: KeybindingValue | null;\n onValueChange: (value: KeybindingValue | null) => void;\n /** Allow clearing the binding. */\n clearable?: boolean;\n last?: boolean;\n};\n\nconst NON_BINDING_KEYS = new Set([\n \"Escape\",\n \"Tab\",\n \"Meta\",\n \"Control\",\n \"Shift\",\n \"Alt\",\n \"ContextMenu\",\n \"CapsLock\",\n]);\n\nfunction formatEventAsBinding(\n e: React.KeyboardEvent<HTMLButtonElement>,\n): KeybindingValue | null {\n if (NON_BINDING_KEYS.has(e.key)) return null;\n const isMac =\n typeof navigator !== \"undefined\" &&\n /Mac|iPhone|iPad/.test(navigator.platform);\n const parts: string[] = [];\n if (e.ctrlKey) parts.push(isMac ? \"⌃\" : \"Ctrl\");\n if (e.altKey) parts.push(isMac ? \"⌥\" : \"Alt\");\n if (e.shiftKey) parts.push(isMac ? \"⇧\" : \"Shift\");\n if (e.metaKey) parts.push(isMac ? \"⌘\" : \"Meta\");\n const keyDisplay =\n e.key.length === 1\n ? e.key.toUpperCase()\n : e.key.replace(/^(Arrow|Digit)/, \"\");\n parts.push(keyDisplay);\n return {\n key: e.code,\n display: parts.join(isMac ? \"\" : \"+\"),\n ctrl: e.ctrlKey,\n alt: e.altKey,\n shift: e.shiftKey,\n meta: e.metaKey,\n };\n}\n\nexport function SettingsKeybinding({\n value,\n onValueChange,\n clearable = true,\n last,\n ...rowProps\n}: SettingsKeybindingProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n const [recording, setRecording] = useState(false);\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant=\"inline\"\n controlLayout=\"wide\"\n last={last}\n >\n <div className=\"flex max-w-full flex-wrap items-center gap-1.5\">\n <Button\n id={id}\n type=\"button\"\n variant={recording ? \"primary\" : \"outline\"}\n onClick={() => setRecording(true)}\n onBlur={() => setRecording(false)}\n onKeyDown={(e) => {\n if (!recording) return;\n if (e.key === \"Escape\") {\n setRecording(false);\n return;\n }\n e.preventDefault();\n const next = formatEventAsBinding(e);\n if (next) {\n onValueChange(next);\n setRecording(false);\n }\n }}\n disabled={rowProps.disabled}\n className={cn(\"min-w-0 flex-1 font-mono tabular-nums @[40rem]/settings:min-w-32\", recording && \"animate-pulse\")}\n >\n {recording\n ? \"Press keys…\"\n : value\n ? value.display\n : \"Click to record\"}\n </Button>\n {clearable && value && !rowProps.disabled && (\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label=\"Clear keybinding\"\n icon={<X className=\"h-3.5 w-3.5\" />}\n onClick={() => onValueChange(null)}\n />\n )}\n </div>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport { SettingsHostLink as AppLink } from \"../host\";\nimport { ArrowRightIcon as ArrowRight, ExternalLinkIcon as ExternalLink } from \"../../icons\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { cn } from \"../../cn\";\nimport { useSettingsHostNavigate as useSettingsNavigate } from \"../host\";\nimport type { SettingsCommonProps } from \"../types\";\nimport { OutboundLink } from \"@ai-matrx/kit/outbound-react\";\n\nexport type SettingsLinkProps = SettingsCommonProps & {\n /** Internal route (href starting with \"/\") or external URL. */\n href: string;\n /** Action label shown on the link button. */\n actionLabel?: string;\n /** Forces external-link behavior even for relative hrefs. */\n external?: boolean;\n last?: boolean;\n};\n\nexport function SettingsLink({\n href,\n actionLabel,\n external,\n last,\n ...rowProps\n}: SettingsLinkProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n const isExternal = external ?? /^https?:\\/\\//i.test(href);\n const Icon = isExternal ? ExternalLink : ArrowRight;\n const labelText = actionLabel ?? (isExternal ? \"Open\" : \"View\");\n\n const anchorClasses = cn(\n \"inline-flex min-h-11 items-center gap-1.5 rounded-md border border-border bg-card px-3 text-sm font-medium text-foreground shadow-sm transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring sm:min-h-8\",\n rowProps.disabled && \"pointer-events-none text-disabled-foreground\",\n );\n\n // Presentation-aware navigation: inside the settings window/drawer\n // this dismisses the shell *before* pushing, so the user lands on the\n // target page instead of seeing the window blink out. Cmd/Ctrl/middle\n // click still opens the link in a new tab (shell stays open).\n const navigate = useSettingsNavigate();\n\n return (\n <SettingsRow {...rowProps} id={id} variant=\"inline\" last={last}>\n {isExternal ? (\n <OutboundLink\n href={href}\n className={anchorClasses}\n >\n <span>{labelText}</span>\n <Icon className=\"h-3.5 w-3.5\" />\n </OutboundLink>\n ) : (\n <AppLink\n href={href}\n className={anchorClasses}\n onClick={(e) => {\n if (rowProps.disabled) {\n e.preventDefault();\n return;\n }\n navigate(href, e);\n }}\n >\n <span>{labelText}</span>\n <Icon className=\"h-3.5 w-3.5\" />\n </AppLink>\n )}\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId, useState } from \"react\";\nimport { CheckIcon as Check, ChevronDownIcon as ChevronDown, XIcon as X } from \"../../icons\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { cn } from \"../../cn\";\nimport { Button } from \"../../controls/controls\";\nimport { Tile } from \"../../controls/surfaces\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../../popover\";\nimport type { SettingsCommonProps, SettingsOption } from \"../types\";\n\nexport type SettingsMultiSelectProps<T extends string = string> =\n SettingsCommonProps & {\n value: T[];\n onValueChange: (value: T[]) => void;\n options: SettingsOption<T>[];\n placeholder?: string;\n /** Maximum selected items. Extra selection attempts are ignored. */\n max?: number;\n /** Hide the selected tags display, show just a count (\"3 selected\"). */\n countOnly?: boolean;\n last?: boolean;\n };\n\nexport function SettingsMultiSelect<T extends string = string>({\n value,\n onValueChange,\n options,\n placeholder = \"Select…\",\n max,\n countOnly,\n last,\n ...rowProps\n}: SettingsMultiSelectProps<T>) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n const [open, setOpen] = useState(false);\n\n const selectedSet = new Set(value);\n const selectedOptions = options.filter((o) => selectedSet.has(o.value));\n\n const toggle = (v: T) => {\n if (selectedSet.has(v)) {\n onValueChange(value.filter((x) => x !== v));\n } else {\n if (max !== undefined && value.length >= max) return;\n onValueChange([...value, v]);\n }\n };\n\n const clearOne = (v: T) => onValueChange(value.filter((x) => x !== v));\n\n const summary = countOnly\n ? value.length === 0\n ? placeholder\n : `${value.length} selected`\n : null;\n\n return (\n <SettingsRow {...rowProps} id={id} variant=\"stacked\" last={last}>\n <div className=\"space-y-2\">\n {!countOnly && selectedOptions.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {selectedOptions.map((opt) => (\n <span\n key={opt.value}\n className=\"inline-flex max-w-full items-center gap-1 rounded-md border border-border bg-muted px-2 py-0.5 type-secondary text-foreground\"\n >\n {opt.icon && <opt.icon className=\"h-3 w-3\" />}\n <span className=\"min-w-0 truncate\">{opt.label}</span>\n {!rowProps.disabled && (\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={`Remove ${opt.label}`}\n icon={<X className=\"h-3 w-3\" />}\n onClick={() => clearOne(opt.value)}\n className=\"ml-0.5\"\n />\n )}\n </span>\n ))}\n </div>\n )}\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n id={id}\n type=\"button\"\n variant=\"outline\"\n iconEnd={<ChevronDown className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n disabled={rowProps.disabled}\n className=\"w-full\"\n >\n <span\n className={cn(\n \"min-w-0 flex-1 truncate\",\n value.length === 0 && \"text-muted-foreground\",\n )}\n >\n {countOnly\n ? summary\n : value.length === 0\n ? placeholder\n : `${value.length} selected`}\n </span>\n </Button>\n </PopoverTrigger>\n <PopoverContent\n sizing=\"content\"\n align=\"start\"\n className=\"p-1\"\n >\n <div className=\"max-h-64 overflow-y-auto\">\n {options.map((opt) => {\n const isSelected = selectedSet.has(opt.value);\n const isDisabled =\n opt.disabled ||\n (!isSelected && max !== undefined && value.length >= max);\n return (\n <Tile\n key={opt.value}\n type=\"button\"\n dense\n variant=\"quiet\"\n selected={isSelected}\n disabled={isDisabled}\n onClick={() => toggle(opt.value)}\n icon={opt.icon ? <opt.icon className=\"h-3.5 w-3.5\" /> : <Check className=\"h-3.5 w-3.5\" />}\n title={opt.label}\n className=\"w-full\"\n />\n );\n })}\n </div>\n </PopoverContent>\n </Popover>\n </div>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useId } from \"react\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { Field } from \"../../controls/controls\";\nimport type { SettingsCommonProps, SettingsControlSize } from \"../types\";\n\nexport type SettingsNumberInputProps = SettingsCommonProps & {\n value: number;\n onValueChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n /** When true, integers only. */\n integer?: boolean;\n unit?: string;\n size?: SettingsControlSize;\n width?: \"sm\" | \"md\" | \"lg\";\n last?: boolean;\n};\n\nconst widthClass = {\n sm: \"w-20 max-w-full min-w-0\",\n md: \"w-24 max-w-full min-w-0\",\n lg: \"w-32 max-w-full min-w-0\",\n};\n\nexport function SettingsNumberInput({\n value,\n onValueChange,\n min,\n max,\n step = 1,\n integer,\n unit,\n size: _size,\n width = \"sm\",\n last,\n ...rowProps\n}: SettingsNumberInputProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n const [draft, setDraft] = useState(String(value));\n\n useEffect(() => {\n setDraft(String(value));\n }, [value]);\n\n const commit = (raw: string) => {\n const parsed = integer ? parseInt(raw, 10) : parseFloat(raw);\n if (Number.isNaN(parsed)) {\n setDraft(String(value));\n return;\n }\n let next = parsed;\n if (min !== undefined) next = Math.max(min, next);\n if (max !== undefined) next = Math.min(max, next);\n onValueChange(next);\n setDraft(String(next));\n };\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant=\"inline\"\n controlLayout=\"wide\"\n last={last}\n >\n <div className=\"flex max-w-full flex-wrap items-center gap-1.5\">\n <Field\n id={id}\n type=\"number\"\n inputMode={integer ? \"numeric\" : \"decimal\"}\n value={draft}\n min={min}\n max={max}\n step={step}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={(e) => commit(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") (e.currentTarget as HTMLInputElement).blur();\n }}\n disabled={rowProps.disabled}\n className={widthClass[width]}\n />\n {unit && (\n <span className=\"type-secondary text-muted-foreground tabular-nums\">\n {unit}\n </span>\n )}\n </div>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { cn } from \"../../cn\";\nimport { Tile } from \"../../controls/surfaces\";\nimport type { SettingsCommonProps, SettingsOption } from \"../types\";\n\nexport type SettingsRadioGroupProps<T extends string = string> =\n SettingsCommonProps & {\n value: T;\n onValueChange: (value: T) => void;\n options: SettingsOption<T>[];\n /** How the radio options are arranged. Defaults to \"stacked\" which is readable on mobile. */\n orientation?: \"horizontal\" | \"stacked\";\n last?: boolean;\n };\n\nexport function SettingsRadioGroup<T extends string = string>({\n value,\n onValueChange,\n options,\n orientation = \"stacked\",\n last,\n ...rowProps\n}: SettingsRadioGroupProps<T>) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n return (\n <SettingsRow {...rowProps} id={id} variant=\"stacked\" last={last}>\n <div\n role=\"radiogroup\"\n aria-labelledby={id}\n className={cn(\n orientation === \"stacked\" ? \"flex flex-col gap-1.5\" : \"flex flex-wrap gap-2\",\n )}\n >\n {options.map((opt) => {\n const isSelected = opt.value === value;\n return (\n <Tile\n key={opt.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n disabled={opt.disabled || rowProps.disabled}\n onClick={() => onValueChange(opt.value)}\n variant=\"outline\"\n className={orientation === \"horizontal\" ? \"min-w-[120px] flex-1\" : \"w-full\"}\n icon={<span aria-hidden className={cn(\"size-4 rounded-full border-2 flex items-center justify-center\", isSelected ? \"border-primary\" : \"border-muted-foreground/40\")}>{isSelected ? <span className=\"size-2 rounded-full bg-primary\" /> : null}</span>}\n title={<span><span className=\"flex items-center gap-1.5\">{opt.icon ? <opt.icon className=\"h-3.5 w-3.5\" /> : null}<span className=\"type-title text-foreground\">{opt.label}</span></span>{opt.description ? <span className=\"mt-0.5 block type-secondary text-muted-foreground\">{opt.description}</span> : null}</span>}\n />\n );\n })}\n </div>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { Tabs } from \"../../controls/controls\";\nimport type {\n SettingsCommonProps,\n SettingsOption,\n SettingsControlSize,\n} from \"../types\";\n\nexport type SettingsSegmentedProps<T extends string = string> =\n SettingsCommonProps & {\n value: T;\n onValueChange: (value: T) => void;\n /** Read-only: shared vocabularies (agent-writable-settings) are `as const`. */\n options: readonly SettingsOption<T>[];\n size?: SettingsControlSize;\n /** Takes the full row width (stacks on mobile). */\n fullWidth?: boolean;\n last?: boolean;\n };\n\nexport function SettingsSegmented<T extends string = string>({\n value,\n onValueChange,\n options,\n fullWidth,\n last,\n // `size` is retired: the control has one geometry.\n size: _size,\n ...rowProps\n}: SettingsSegmentedProps<T>) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant={fullWidth ? \"stacked\" : \"inline\"}\n controlLayout=\"wide\"\n last={last}\n >\n <Tabs\n variant=\"capsule\"\n aria-label={rowProps.label}\n value={value}\n onValueChange={onValueChange}\n data={options.map((opt) => ({\n value: opt.value,\n label: opt.icon ? (\n <>\n <opt.icon />\n {opt.label}\n </>\n ) : (\n opt.label\n ),\n disabled: Boolean(opt.disabled || rowProps.disabled),\n }))}\n />\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId, useState } from \"react\";\nimport { CheckIcon as Check } from \"../../icons\";\nimport { SelectChevron } from \"../../select\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../../command\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../../popover\";\nimport { cn } from \"../../cn\";\nimport { Button } from \"../../controls/controls\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../select\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport type {\n SettingsCommonProps,\n SettingsOption,\n SettingsControlSize,\n} from \"../types\";\n\ntype Width = \"auto\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nconst widthClass: Record<Width, string> = {\n auto: \"w-full max-w-full @[40rem]/settings:w-auto @[40rem]/settings:min-w-32\",\n sm: \"w-32 max-w-full min-w-0\",\n md: \"w-44 max-w-full min-w-0\",\n lg: \"w-64 max-w-full min-w-0\",\n // The width of the ladder rows' model/voice pickers, so a screen mixing\n // both lines every control up on one edge.\n xl: \"w-80 max-w-full min-w-0\",\n full: \"w-full\",\n};\n\nconst triggerSize: Record<SettingsControlSize, \"sm\" | \"default\" | \"lg\"> = {\n sm: \"sm\",\n md: \"default\",\n lg: \"lg\",\n};\n\nconst triggerMinHeight: Record<SettingsControlSize, string> = {\n // 44px under touch or below lg — the same condition as the\n // matrx-touch-targets floor, which a min-h utility here would otherwise beat.\n sm: \"min-h-7 max-lg:min-h-11 pointer-coarse:min-h-11\",\n md: \"min-h-9 max-lg:min-h-11 pointer-coarse:min-h-11\",\n lg: \"min-h-10\",\n};\n\nexport type SettingsSelectProps<T extends string = string> =\n SettingsCommonProps & {\n value: T;\n onValueChange: (value: T) => void;\n /** Read-only: shared vocabularies (agent-writable-settings) are `as const`. */\n options: readonly SettingsOption<T>[];\n placeholder?: string;\n size?: SettingsControlSize;\n width?: Width;\n /** Renders as a stacked layout. Use when the select should span full width. */\n stacked?: boolean;\n last?: boolean;\n /** Long lists: a search box that filters by label and value (case-insensitive contains). */\n searchable?: boolean;\n searchPlaceholder?: string;\n };\n\n/** Case-insensitive contains over the label and the raw value; \"/\" and \"_\" read as spaces. */\nexport function matchesSettingsOption(\n query: string,\n option: { label: string; value: string },\n): boolean {\n const norm = (t: string) => t.toLowerCase().replace(/[_/]/g, \" \");\n const q = norm(query).trim();\n if (!q) return true;\n return norm(option.label).includes(q) || norm(option.value).includes(q);\n}\n\n/**\n * Radix Select reads a value of \"\" as \"nothing selected\" and shows a blank\n * trigger, so an option whose value IS \"\" (a \"None\" choice — e.g. voice\n * emotion) looked unset even while it was the saved choice. Every settings\n * select maps \"\" to this token on the way in and back to \"\" on the way out.\n */\nconst EMPTY_OPTION_VALUE = \"__settings-empty-option__\";\n\nexport function SettingsSelect<T extends string = string>({\n value,\n onValueChange,\n options,\n placeholder,\n size = \"md\",\n width = \"md\",\n stacked,\n last,\n searchable,\n searchPlaceholder = \"Search\",\n ...rowProps\n}: SettingsSelectProps<T>) {\n const [open, setOpen] = useState(false);\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n const variant = stacked ? \"stacked\" : \"inline\";\n const effectiveWidth: Width = stacked ? \"full\" : width;\n // Only a select that OFFERS \"\" as a choice maps it; elsewhere \"\" still\n // means \"not chosen yet\" and the placeholder shows.\n const hasEmptyOption = options.some((opt) => opt.value === \"\");\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant={variant}\n controlLayout=\"wide\"\n last={last}\n >\n {searchable ? (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n id={id}\n role=\"combobox\"\n aria-expanded={open}\n iconEnd={<SelectChevron size=\"sm\" />}\n disabled={rowProps.disabled ?? false}\n className={widthClass[effectiveWidth]}\n >\n <span className=\"truncate\">\n {options.find((o) => o.value === value)?.label ??\n placeholder ??\n value}\n </span>\n </Button>\n </PopoverTrigger>\n <PopoverContent sizing=\"content\" className=\"p-0\" align=\"end\">\n <Command\n filter={(itemValue, search) => {\n const opt = options.find((o) => o.value === itemValue);\n return opt ? (matchesSettingsOption(search, opt) ? 1 : 0) : 0;\n }}\n >\n <CommandInput\n placeholder={searchPlaceholder}\n className=\"h-9 text-sm\"\n />\n <CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup className=\"max-h-72 overflow-auto\">\n {options.map((opt) => (\n <CommandItem\n key={opt.value}\n value={opt.value}\n disabled={opt.disabled ?? false}\n onSelect={() => {\n onValueChange(opt.value as T);\n setOpen(false);\n }}\n >\n <Check\n className={cn(\n \"mr-2 h-3.5 w-3.5\",\n opt.value === value ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n {opt.label}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n ) : (\n <Select\n value={value === \"\" && hasEmptyOption ? EMPTY_OPTION_VALUE : value}\n onValueChange={(v) =>\n onValueChange((v === EMPTY_OPTION_VALUE ? \"\" : v) as T)\n }\n disabled={rowProps.disabled ?? false}\n >\n <SelectTrigger\n id={id}\n size={triggerSize[size]}\n className={`${widthClass[effectiveWidth]} h-auto ${triggerMinHeight[size]} whitespace-normal text-left [&>span]:line-clamp-none [&>span]:whitespace-normal`}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((opt) => (\n <SelectItem\n key={opt.value}\n value={opt.value === \"\" ? EMPTY_OPTION_VALUE : opt.value}\n disabled={opt.disabled ?? false}\n // Outside ItemText via the prop — a description passed as a\n // child ends up inside the closed trigger and gets clipped.\n {...(opt.description === undefined ? {} : { description: opt.description })}\n >\n <span className=\"flex items-center gap-2\">\n {opt.icon && <opt.icon className=\"h-3.5 w-3.5\" />}\n <span>{opt.label}</span>\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport { Slider } from \"../../slider\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport type { SettingsCommonProps } from \"../types\";\n\nexport type SettingsSliderProps = SettingsCommonProps & {\n value: number;\n onValueChange: (value: number) => void;\n /**\n * Fires once when the drag ends (Radix onValueCommit). Use it when each\n * write is a network/database round-trip: track the drag with local state\n * via `onValueChange`, persist here.\n */\n onValueCommit?: (value: number) => void;\n min: number;\n max: number;\n step?: number;\n /** Label shown on the low end (e.g. \"Slow\"). */\n minLabel?: string;\n /** Label shown in the middle (e.g. \"Balanced\"). */\n midLabel?: string;\n /** Label shown on the high end (e.g. \"Fast\"). */\n maxLabel?: string;\n /** Fixed decimal places for the numeric display. Defaults to 0 for ints, 2 for floats. */\n precision?: number;\n /** Optional unit string shown next to value (e.g. \"px\", \"%\"). */\n unit?: string;\n last?: boolean;\n};\n\nexport function SettingsSlider({\n value,\n onValueChange,\n onValueCommit,\n min,\n max,\n step = 1,\n minLabel,\n midLabel,\n maxLabel,\n precision,\n unit,\n last,\n ...rowProps\n}: SettingsSliderProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n const effectivePrecision =\n precision !== undefined\n ? precision\n : step >= 1 || Number.isInteger(step)\n ? 0\n : 2;\n const display = value.toFixed(effectivePrecision);\n\n return (\n <SettingsRow {...rowProps} id={id} variant=\"stacked\" last={last}>\n <div className=\"space-y-2\">\n <div className=\"flex min-w-0 items-center justify-between gap-2\">\n <span className=\"min-w-0 break-words type-secondary text-muted-foreground tabular-nums\">\n {display}\n {unit}\n </span>\n <span className=\"min-w-0 break-words text-right type-secondary text-muted-foreground tabular-nums\">\n {min} – {max}\n </span>\n </div>\n <Slider\n id={id}\n min={min}\n max={max}\n step={step}\n value={[value]}\n onValueChange={(v) => onValueChange(v[0] ?? min)}\n {...(onValueCommit ? { onValueCommit: (v: number[]) => onValueCommit(v[0] ?? min) } : {})}\n disabled={rowProps.disabled ?? false}\n />\n {(minLabel || midLabel || maxLabel) && (\n <div className=\"flex min-w-0 justify-between gap-2 type-meta text-muted-foreground\">\n <span className=\"min-w-0 break-words\">{minLabel}</span>\n <span className=\"hidden sm:inline\">{midLabel}</span>\n <span className=\"min-w-0 break-words text-right\">{maxLabel}</span>\n </div>\n )}\n </div>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport { Switch } from \"../../controls/controls\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport type { SettingsCommonProps } from \"../types\";\n\nexport type SettingsSwitchProps = SettingsCommonProps & {\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n /** Controls whether the row renders a border underneath. */\n last?: boolean;\n};\n\nexport function SettingsSwitch({\n checked,\n onCheckedChange,\n last,\n ...rowProps\n}: SettingsSwitchProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n return (\n <SettingsRow {...rowProps} id={id} variant=\"inline\" last={last}>\n {/* The switch stays its painted size; its label carries the 44px\n touch ring (matrx-tap-area) so a finger can hit it on a phone. */}\n <label htmlFor={id} className=\"matrx-tap-area inline-flex\">\n <Switch\n id={id}\n checked={checked}\n onCheckedChange={onCheckedChange}\n disabled={rowProps.disabled}\n />\n </label>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId, useState } from \"react\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { Field } from \"../../controls/controls\";\nimport type { SettingsCommonProps, SettingsControlSize } from \"../types\";\n\nconst widthClass = {\n sm: \"w-32 max-w-full min-w-0\",\n md: \"w-48 max-w-full min-w-0\",\n lg: \"w-72 max-w-full min-w-0\",\n full: \"w-full\",\n};\n\nexport type SettingsTextInputProps = SettingsCommonProps & {\n value: string;\n onValueChange: (value: string) => void;\n placeholder?: string;\n type?: \"text\" | \"email\" | \"url\" | \"password\" | \"tel\";\n inputMode?: \"text\" | \"email\" | \"url\" | \"tel\" | \"numeric\" | \"decimal\";\n /** Commit on blur/enter instead of every keystroke. Useful for expensive writes. */\n commitOnBlur?: boolean;\n maxLength?: number;\n size?: SettingsControlSize;\n width?: \"sm\" | \"md\" | \"lg\" | \"full\";\n /** Renders as a stacked layout so the input can be full-width. */\n stacked?: boolean;\n last?: boolean;\n};\n\nexport function SettingsTextInput({\n value,\n onValueChange,\n placeholder,\n type = \"text\",\n inputMode,\n commitOnBlur,\n maxLength,\n size: _size,\n width = \"md\",\n stacked,\n last,\n ...rowProps\n}: SettingsTextInputProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n const [draft, setDraft] = useState(value);\n const [lastCommittedValue, setLastCommittedValue] = useState(value);\n\n if (commitOnBlur && value !== lastCommittedValue) {\n setLastCommittedValue(value);\n setDraft(value);\n }\n\n const effective = commitOnBlur ? draft : value;\n const effectiveWidth = stacked ? \"full\" : width;\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant={stacked ? \"stacked\" : \"inline\"}\n controlLayout=\"wide\"\n last={last}\n >\n <Field\n id={id}\n type={type}\n inputMode={inputMode}\n value={effective}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={rowProps.disabled}\n onChange={(e) => {\n if (commitOnBlur) setDraft(e.target.value);\n else onValueChange(e.target.value);\n }}\n onBlur={() => {\n if (commitOnBlur && draft !== value) {\n onValueChange(draft);\n }\n }}\n onKeyDown={(e) => {\n if (commitOnBlur && e.key === \"Enter\")\n (e.currentTarget as HTMLInputElement).blur();\n }}\n className={widthClass[effectiveWidth]}\n />\n </SettingsRow>\n );\n}\n","import type { SettingsIconType as LucideIcon } from \"../icon-type\";\nimport type { SettingsBadge } from \"../types\";\n\n/**\n * A node in the settings hierarchy.\n * - Has children: renders as a category (expandable on desktop, push-nav on mobile)\n * - No children: renders as a leaf (clicking activates the tab)\n */\nexport type SettingsTreeNode = {\n id: string;\n label: string;\n icon?: LucideIcon | undefined;\n /** Short summary shown under the label in mobile drawer and tree hover. */\n description?: string | undefined;\n /** When provided, the node is a category with sub-nodes. */\n children?: SettingsTreeNode[] | undefined;\n /** The folder itself has a page in addition to its children. */\n navigable?: boolean | undefined;\n navigationLabel?: string | undefined;\n /** Inline badge: built-in variants from SettingsBadge, or the special \"unsaved\" string for a dot indicator. */\n badge?: SettingsBadge | \"unsaved\" | undefined;\n /** Disabled leaves/categories can't be activated/expanded. */\n disabled?: boolean | undefined;\n /** Free-text keywords searched alongside label/description. */\n searchKeywords?: string[] | undefined;\n};\n\n/** Flatten the tree into every destination, including folders with their own page. */\nexport function flattenLeaves(nodes: SettingsTreeNode[]): SettingsTreeNode[] {\n const out: SettingsTreeNode[] = [];\n const walk = (arr: SettingsTreeNode[]) => {\n for (const n of arr) {\n if (n.navigable || !n.children?.length) out.push(n);\n if (n.children?.length) walk(n.children);\n }\n };\n walk(nodes);\n return out;\n}\n\n/** Returns the ancestor id path for a target node id (excluding the target itself). */\nexport function findAncestorPath(\n nodes: SettingsTreeNode[],\n targetId: string,\n): string[] {\n const path: string[] = [];\n const visit = (arr: SettingsTreeNode[], trail: string[]): boolean => {\n for (const n of arr) {\n if (n.id === targetId) {\n path.push(...trail);\n return true;\n }\n if (n.children && visit(n.children, [...trail, n.id])) return true;\n }\n return false;\n };\n visit(nodes, []);\n return path;\n}\n\n/**\n * Build the mobile drawer stack for an externally selected setting.\n *\n * Deep links activate a leaf before the drawer mounts. The drawer must start\n * on that leaf, including every ancestor screen, rather than discarding the\n * active id and showing its root list.\n */\nexport function getDrawerPathForActiveId(\n nodes: SettingsTreeNode[],\n activeId: string | null,\n): string[] {\n if (!activeId || !findNodeById(nodes, activeId)) return [];\n return [...findAncestorPath(nodes, activeId), activeId];\n}\n\n/** Find a single node by id anywhere in the tree. */\nexport function findNodeById(\n nodes: SettingsTreeNode[],\n id: string,\n): SettingsTreeNode | null {\n for (const n of nodes) {\n if (n.id === id) return n;\n if (n.children) {\n const found = findNodeById(n.children, id);\n if (found) return found;\n }\n }\n return null;\n}\n\n/**\n * Returns an array of [id, matchScore] pairs ranked by relevance.\n * Matches label (highest), keywords, description. Case-insensitive.\n */\nexport function searchTree(\n nodes: SettingsTreeNode[],\n query: string,\n): Set<string> {\n const matches = new Set<string>();\n const q = query.trim().toLowerCase();\n if (!q) return matches;\n const walk = (arr: SettingsTreeNode[]) => {\n for (const n of arr) {\n const haystack = [\n n.label,\n n.description ?? \"\",\n ...(n.searchKeywords ?? []),\n ]\n .join(\" \")\n .toLowerCase();\n if (haystack.includes(q)) matches.add(n.id);\n if (n.children) walk(n.children);\n }\n };\n walk(nodes);\n return matches;\n}\n\n/**\n * Given a set of matching node ids, returns a set of every id that should be\n * visible — matching ids plus all their ancestors — so that the tree can keep\n * path structure when filtering.\n */\nexport function withAncestors(\n nodes: SettingsTreeNode[],\n ids: Set<string>,\n): Set<string> {\n const visible = new Set(ids);\n for (const id of ids) {\n for (const anc of findAncestorPath(nodes, id)) visible.add(anc);\n }\n return visible;\n}\n","\"use client\";\n\nimport { Loader2Icon as Loader2 } from \"../../icons\";\n\n/** lucide `slash` — the breadcrumb separator. */\nfunction Slash({ className }: { className?: string }) {\n return (\n <svg aria-hidden xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M22 2 2 22\" />\n </svg>\n );\n}\nimport { type SettingsTreeNode, findAncestorPath, findNodeById } from \"./types\";\n\nimport { Button } from \"../../controls/controls\";\ntype SettingsBreadcrumbProps = {\n nodes: SettingsTreeNode[];\n activeId: string | null;\n /** Root label shown as the first crumb. */\n rootLabel?: string;\n /** Click handler for crumbs — usually navigates via the registry. */\n onNavigate?: (id: string | null) => void;\n /** Disables duplicate navigation and announces the active route change. */\n navigationPending?: boolean;\n};\n\n/**\n * Renders a compact breadcrumb trail for the active settings path:\n * \"Settings / Appearance / Theme\"\n */\nexport function SettingsBreadcrumb({\n nodes,\n activeId,\n rootLabel = \"Settings\",\n onNavigate,\n navigationPending = false,\n}: SettingsBreadcrumbProps) {\n const ancestors = activeId ? findAncestorPath(nodes, activeId) : [];\n const active = activeId ? findNodeById(nodes, activeId) : null;\n\n return (\n <nav\n aria-label=\"Breadcrumb\"\n aria-busy={navigationPending}\n className=\"flex min-w-0 items-center gap-1 overflow-x-auto type-secondary text-muted-foreground\"\n >\n <Crumb\n label={rootLabel}\n onClick={onNavigate ? () => onNavigate(null) : undefined}\n interactive\n disabled={navigationPending}\n />\n {ancestors.map((id) => {\n const node = findNodeById(nodes, id);\n if (!node) return null;\n return (\n <span key={id} className=\"flex min-w-0 items-center gap-1\">\n <Slash className=\"h-3 w-3 text-muted-foreground\" />\n <Crumb\n label={node.label}\n onClick={onNavigate ? () => onNavigate(id) : undefined}\n interactive\n disabled={navigationPending}\n />\n </span>\n );\n })}\n {active && (\n <span className=\"flex min-w-0 items-center gap-1\">\n <Slash className=\"h-3 w-3 text-muted-foreground\" />\n <span className=\"truncate font-medium text-foreground\">\n {active.label}\n </span>\n </span>\n )}\n {navigationPending ? (\n <Loader2\n className=\"ml-1 h-3.5 w-3.5 shrink-0 animate-spin\"\n aria-label=\"Opening settings section\"\n />\n ) : null}\n </nav>\n );\n}\n\nfunction Crumb({\n label,\n onClick,\n interactive,\n disabled,\n}: {\n label: string;\n onClick?: (() => void) | undefined;\n interactive?: boolean | undefined;\n disabled?: boolean | undefined;\n}) {\n if (interactive && onClick) {\n return (\n <Button variant=\"quiet\" onClick={onClick} disabled={disabled}>{label}</Button>\n );\n }\n return <span>{label}</span>;\n}\n","\"use client\";\n\nimport { useState, useMemo } from \"react\";\nimport { ChevronLeftIcon as ChevronLeft, ChevronRightIcon as ChevronRight, SettingsIcon as SettingsIcon, XIcon as X } from \"../../icons\";\nimport { Drawer, DrawerContent, DrawerTitle } from \"../../drawer\";\nimport { Button, SearchField } from \"../../controls/controls\";\nimport { Tile } from \"../../controls/surfaces\";\nimport {\n type SettingsTreeNode,\n findNodeById,\n getDrawerPathForActiveId,\n searchTree,\n flattenLeaves,\n} from \"./types\";\n\ntype SettingsDrawerNavProps = {\n nodes: SettingsTreeNode[];\n activeId: string | null;\n onActivate: (id: string) => void;\n /** Render the tab body for the active leaf node. */\n renderTab: (node: SettingsTreeNode) => React.ReactNode;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Title shown on the root screen header. */\n title?: string;\n unsavedIds?: Set<string> | undefined;\n};\n\n/**\n * iOS-style hierarchical push-nav inside a bottom drawer.\n *\n * Three screens:\n * 1. Root category/leaf list\n * 2. Sub-category list (slides in from right when category tapped)\n * 3. Leaf tab content (slides in from right when leaf tapped)\n *\n * Back button pops the stack. Closing the drawer resets the stack.\n */\nexport function SettingsDrawerNav({\n nodes,\n activeId,\n onActivate,\n renderTab,\n open,\n onOpenChange,\n title = \"Settings\",\n unsavedIds,\n}: SettingsDrawerNavProps) {\n // Path: list of node ids representing the current navigation stack.\n // - [] = root list\n // - [catId] = sub-list of catId (which must be a folder)\n // - [..., leafId] = leaf content (last is leaf)\n const [path, setPath] = useState<string[]>(() =>\n getDrawerPathForActiveId(nodes, activeId),\n );\n const [folderTabId, setFolderTabId] = useState<string | null>(() =>\n activeId && findNodeById(nodes, activeId)?.navigable ? activeId : null,\n );\n const [query, setQuery] = useState(\"\");\n\n const handleOpenChange = (next: boolean) => {\n if (!next) {\n setPath([]);\n setFolderTabId(null);\n setQuery(\"\");\n }\n onOpenChange(next);\n };\n\n const pushId = (id: string) => setPath((p) => [...p, id]);\n const popOne = () => {\n if (folderTabId) setFolderTabId(null);\n else setPath((p) => p.slice(0, -1));\n };\n\n const currentId = path[path.length - 1] ?? null;\n const currentNode = currentId ? findNodeById(nodes, currentId) : null;\n const isLeaf = Boolean(\n currentNode && (!currentNode.children?.length || folderTabId === currentId),\n );\n\n // The list-of-nodes shown in the current screen (root or category)\n const listNodes = useMemo<SettingsTreeNode[]>(() => {\n if (!currentNode || isLeaf) return nodes;\n return currentNode.children ?? [];\n }, [currentNode, isLeaf, nodes]);\n\n // Search only applies at the root screen for simplicity — gives a flat result\n const searchMatches = useMemo(() => {\n if (!query.trim()) return null;\n const matched = searchTree(nodes, query);\n return flattenLeaves(nodes).filter((l) => matched.has(l.id));\n }, [nodes, query]);\n\n const handleItemTap = (node: SettingsTreeNode) => {\n if (node.disabled) return;\n if (node.children && node.children.length > 0) {\n pushId(node.id);\n setQuery(\"\");\n } else {\n onActivate(node.id);\n pushId(node.id);\n setQuery(\"\");\n }\n };\n\n const headerTitle = isLeaf\n ? currentNode?.label\n : currentNode\n ? currentNode.label\n : title;\n const backLabel = folderTabId\n ? (currentNode?.label ?? title)\n : path.length > 1\n ? (findNodeById(nodes, path[path.length - 2] ?? \"\")?.label ?? title)\n : title;\n\n return (\n <Drawer open={open} onOpenChange={handleOpenChange}>\n <DrawerContent className=\"h-[85dvh] flex flex-col\">\n <DrawerTitle className=\"sr-only\">{title}</DrawerTitle>\n\n {/* Header */}\n <div className=\"flex items-center justify-between gap-2 px-3 py-2.5 border-b border-border shrink-0\">\n {path.length === 0 ? (\n <div className=\"flex items-center gap-2 min-w-0\">\n <SettingsIcon className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"type-title truncate\">{title}</span>\n </div>\n ) : (\n <Button\n type=\"button\"\n variant=\"quiet\"\n icon={<ChevronLeft className=\"h-4 w-4\" />}\n onClick={popOne}\n className=\"min-w-0 max-w-[calc(100%-5rem)] -ml-2\"\n >\n {backLabel}\n </Button>\n )}\n <div className=\"flex-1 flex items-center justify-center min-w-0 px-2\">\n {path.length > 0 && (\n <span className=\"type-title truncate\">\n {headerTitle}\n </span>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label=\"Close\"\n icon={<X className=\"h-4 w-4\" />}\n onClick={() => handleOpenChange(false)}\n />\n </div>\n\n {/* Screen stack: only the current screen is rendered, with slide animation */}\n <div className=\"flex-1 min-h-0 overflow-hidden relative\">\n <div\n key={path.join(\"/\") || \"root\"}\n className=\"absolute inset-0 overflow-y-auto overscroll-contain\"\n style={path.length > 0 ? { animation: \"drawerPush 180ms cubic-bezier(0.4, 0, 0.2, 1) both\" } : undefined}\n >\n {isLeaf && currentNode ? (\n <div className=\"pb-safe\">{renderTab(currentNode)}</div>\n ) : (\n <>\n {/* Search bar only on the root screen */}\n {path.length === 0 && (\n <div className=\"relative px-3 py-2 border-b border-border sticky top-0 bg-background z-10\">\n <SearchField\n placeholder=\"Search settings\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n end={query ? <span aria-hidden=\"true\" className=\"w-7 shrink-0\" /> : undefined}\n className=\"w-full\"\n />\n {query && (\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label=\"Clear search\"\n icon={<X className=\"h-4 w-4\" />}\n onClick={() => setQuery(\"\")}\n className=\"absolute right-5 top-1/2 -translate-y-1/2\"\n />\n )}\n </div>\n )}\n\n {searchMatches ? (\n <div className=\"pb-safe\">\n {searchMatches.length === 0 ? (\n <div className=\"px-4 py-8 text-center type-body text-muted-foreground\">\n No settings match \"{query}\".\n </div>\n ) : (\n searchMatches.map((n) => (\n <DrawerRow\n key={n.id}\n node={n}\n activeId={activeId}\n hasChevron\n onTap={handleItemTap}\n unsavedIds={unsavedIds}\n />\n ))\n )}\n </div>\n ) : (\n <div className=\"pb-safe\">\n {currentNode?.navigable ? (\n <DrawerRow\n node={{\n ...currentNode,\n label:\n currentNode.navigationLabel ?? currentNode.label,\n children: undefined,\n }}\n activeId={activeId}\n hasChevron\n onTap={() => {\n onActivate(currentNode.id);\n setFolderTabId(currentNode.id);\n }}\n unsavedIds={unsavedIds}\n />\n ) : null}\n {listNodes.map((n) => (\n <DrawerRow\n key={n.id}\n node={n}\n activeId={activeId}\n hasChevron\n onTap={handleItemTap}\n unsavedIds={unsavedIds}\n />\n ))}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n\n <style>{`\n @keyframes drawerPush {\n from {\n transform: translateX(24%);\n opacity: 0;\n }\n to {\n transform: translateX(0%);\n opacity: 1;\n }\n }\n `}</style>\n </DrawerContent>\n </Drawer>\n );\n}\n\ntype DrawerRowProps = {\n node: SettingsTreeNode;\n activeId: string | null;\n hasChevron: boolean;\n onTap: (node: SettingsTreeNode) => void;\n unsavedIds?: Set<string> | undefined;\n};\n\nfunction DrawerRow({\n node,\n activeId,\n hasChevron,\n onTap,\n unsavedIds,\n}: DrawerRowProps) {\n const isActive = node.id === activeId;\n const hasUnsaved = unsavedIds?.has(node.id) ?? node.badge === \"unsaved\";\n\n return (\n <Tile\n type=\"button\"\n onClick={() => onTap(node)}\n disabled={node.disabled}\n variant=\"quiet\"\n selected={isActive}\n className=\"w-full\"\n icon={node.icon ? <node.icon className=\"h-4 w-4\" /> : undefined}\n title={<span className=\"flex items-center gap-1.5\">{node.label}{hasUnsaved ? <span aria-label=\"Unsaved changes\" className=\"h-1.5 w-1.5 rounded-full bg-primary shrink-0\" /> : null}</span>}\n line={node.description}\n end={hasChevron ? <ChevronRight className=\"h-4 w-4 text-muted-foreground shrink-0\" /> : undefined}\n />\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport {\n filterSettingsNavigationSections,\n SettingsFlatNavigation,\n SettingsNavigationSearch,\n settingsNavigationSections,\n} from \"../navigation/SettingsFlatNavigation\";\nimport { Tile } from \"../../controls/surfaces\";\nimport type { SettingsTreeNode } from \"./types\";\n\ntype SettingsTreeProps = {\n nodes: SettingsTreeNode[];\n activeId: string | null;\n onActivate: (id: string) => void;\n unsavedIds?: Set<string>;\n searchable?: boolean;\n query?: string;\n onQueryChange?: (query: string) => void;\n searchResults?: ReactNode;\n hasSearchResults?: boolean;\n};\n\n/**\n * The overlay's settings navigation shares the route menu's flat section model.\n * Folder state is deliberately absent: headings provide orientation and every\n * available setting remains reachable without an accordion interaction.\n */\nexport function SettingsTree({\n nodes,\n activeId,\n onActivate,\n unsavedIds,\n searchable = true,\n query: controlledQuery,\n onQueryChange,\n searchResults,\n hasSearchResults = false,\n}: SettingsTreeProps) {\n const [internalQuery, setInternalQuery] = useState(\"\");\n const query = controlledQuery ?? internalQuery;\n const setQuery = onQueryChange ?? setInternalQuery;\n const searchRef = useRef<HTMLInputElement | null>(null);\n const treeRef = useRef<HTMLDivElement | null>(null);\n const sections = filterSettingsNavigationSections(settingsNavigationSections(nodes), query);\n\n useEffect(() => {\n const element = treeRef.current;\n if (!element) return undefined;\n const onKey = (event: KeyboardEvent) => {\n if (event.key === \"/\" && document.activeElement !== searchRef.current) {\n event.preventDefault();\n searchRef.current?.focus();\n }\n };\n element.addEventListener(\"keydown\", onKey);\n return () => element.removeEventListener(\"keydown\", onKey);\n }, []);\n\n return (\n <div ref={treeRef} className=\"flex h-full flex-col border-r border-border bg-card/20\" aria-label=\"Settings navigation\">\n {searchable ? <div className=\"shrink-0 border-b border-border px-2 py-2\"><SettingsNavigationSearch value={query} onValueChange={setQuery} inputRef={searchRef} /></div> : null}\n <div className=\"flex-1 overflow-y-auto py-1\">\n {searchResults}\n {sections.length > 0 ? <SettingsFlatNavigation\n sections={sections}\n activeId={activeId}\n renderItem={(item, active) => {\n const unsaved = unsavedIds?.has(item.id) ?? item.node.badge === \"unsaved\";\n return <Tile id={`settings-nav-${item.id}`} type=\"button\" disabled={item.node.disabled} onClick={() => !item.node.disabled && onActivate(item.id)} dense variant=\"quiet\" selected={active} className=\"w-full\" icon={item.node.icon ? <item.node.icon className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" /> : undefined} title={item.label} end={unsaved ? <span aria-label=\"Unsaved changes\" className=\"h-1.5 w-1.5 shrink-0 rounded-full bg-primary\" /> : undefined} aria-current={active ? \"page\" : undefined} />;\n }}\n /> : !hasSearchResults ? <p className=\"px-3 py-6 type-body text-muted-foreground\">{query ? `No settings match \"${query}\".` : \"No settings available.\"}</p> : null}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["jsx","jsx","jsx","Popover","createContext","useContext","jsx","jsx","jsxs","jsx","jsxs","jsx","useId","useState","jsx","jsxs","useId","useState","useId","useState","Fragment","jsx","jsxs","useState","useId","jsx","jsxs","jsx","jsxs","useId","jsx","useId","useId","jsx","useId","useState","useId","jsx","jsxs","useId","useState","useId","jsx","jsxs","useId","useId","useState","jsx","jsxs","useId","useState","useId","jsx","jsxs","useId","useId","useState","jsx","jsxs","useId","useState","useState","useEffect","useId","jsx","jsxs","widthClass","useId","useState","useEffect","useId","jsx","jsxs","useId","useId","Fragment","jsx","jsxs","useId","useId","useState","jsx","jsxs","widthClass","useState","useId","useId","jsx","jsxs","useId","useId","jsx","useId","useId","useState","jsx","widthClass","useId","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect"]}
1
+ {"version":3,"sources":["../src/settings/host.tsx","../src/settings/searchIdentity.ts","../src/settings/SettingsDesignProvider.tsx","../src/settings/SettingsNavigationRow.tsx","../src/settings/SettingsPage.tsx","../src/settings/SettingsRow.tsx","../src/settings/SettingsSectionContext.tsx","../src/settings/layout/SettingsCallout.tsx","../src/settings/layout/SettingsGrid.tsx","../src/settings/layout/SettingsReadOnlyValue.tsx","../src/settings/layout/SettingsSection.tsx","../src/settings/layout/SettingsSubHeader.tsx","../src/settings/navigation/SettingsFlatNavigation.tsx","../src/settings/primitives/SettingsButton.tsx","../src/settings/primitives/SettingsCheckbox.tsx","../src/settings/primitives/SettingsColorPicker.tsx","../src/settings/primitives/SettingsDeviceSelect.tsx","../src/settings/primitives/SettingsKeybinding.tsx","../src/settings/primitives/SettingsLink.tsx","../src/settings/primitives/SettingsMultiSelect.tsx","../src/settings/primitives/SettingsNumberInput.tsx","../src/settings/primitives/SettingsRadioGroup.tsx","../src/settings/primitives/SettingsSegmented.tsx","../src/settings/primitives/SettingsSelect.tsx","../src/settings/primitives/SettingsSlider.tsx","../src/settings/primitives/SettingsSwitch.tsx","../src/settings/primitives/SettingsTextInput.tsx","../src/settings/tree/types.ts","../src/settings/tree/SettingsBreadcrumb.tsx","../src/settings/tree/SettingsDrawerNav.tsx","../src/settings/tree/SettingsTree.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * src/settings/host.tsx — THE SETTINGS HOST: what the settings blocks need from the app that draws them.\n *\n * Settings rows are drawn inside routes, windows and drawers, far from any provider, so — like\n * the entity-ref host — this one is bound ONCE per page through `configureSettings(...)` (a\n * module-level slot on `globalThis`, so every module-graph copy of the package reads one binding).\n *\n * Each port has a default that ANNOUNCES ITSELF instead of pretending:\n *\n * Link the app's router link (basePath/deployment aware). Default: the registered tap-target\n * link component, else a plain <a>.\n * ErrorMenu the actions drawn beside a KNOWN refusal. Default: none.\n * Anchor wraps one control so a deep link (`?control=` / `#id`) can reveal and focus it.\n * Default: a plain div carrying the ids, with no reveal behaviour.\n * useNavigate a HOOK returning the presentation-aware navigate function (a settings window\n * closes itself after the push). Default: a full-page navigation.\n * copyNotify where a copy's outcome is told. Default: silent (kit's useClipboard contract).\n *\n * Unconfigured, the default anchor carries `data-settings-host=\"unconfigured\"` and the first draw\n * warns once in the console, naming `configureSettings`. The host MUST be configured before the first\n * render: `useNavigate` is a hook, and a component's hook count cannot change between renders.\n */\n\nimport type { ComponentType, MouseEvent as ReactMouseEvent, ReactNode, Ref } from \"react\";\nimport { globalSlot } from \"@ai-matrx/kit/global-slot\";\nimport { HostLink } from \"../host-link\";\n\nexport interface SettingsLinkAnchorProps {\n href: string;\n id?: string | undefined;\n className?: string | undefined;\n onClick?: ((event: ReactMouseEvent<HTMLAnchorElement>) => void) | undefined;\n children?: ReactNode;\n ref?: Ref<HTMLAnchorElement> | undefined;\n}\n\nexport type SettingsNavigateFn = (\n href: string,\n event?: ReactMouseEvent | MouseEvent | null,\n) => void;\n\nexport interface SettingsHost {\n Link?: ComponentType<SettingsLinkAnchorProps> | undefined;\n ErrorMenu?: ComponentType<{ error: unknown }> | undefined;\n Anchor?: ComponentType<{ id: string; children: ReactNode }> | undefined;\n useNavigate?: (() => SettingsNavigateFn) | undefined;\n copyNotify?: ((message: string, kind: \"success\" | \"error\") => void) | undefined;\n}\n\nconst bound = globalSlot(\"ai-matrx.design-system.settings-host\", () => ({ host: null as SettingsHost | null }));\n\n/** Bind the app's settings host. Call once, at module load, before anything renders. */\nexport function configureSettings(host: SettingsHost | null): void {\n bound.host = host;\n}\n\n/** True once a host has been bound. */\nexport function settingsConfigured(): boolean {\n return Boolean(bound.host);\n}\n\nlet warned = false;\nfunction announceUnconfigured(): void {\n if (warned) return;\n warned = true;\n if (typeof console !== \"undefined\") {\n console.warn(\n \"[@ai-matrx/design-system/settings] no host configured: settings links navigate with full page loads, \" +\n \"controls cannot be deep-linked and refusals show no actions. Call configureSettings(...) once before the first render.\",\n );\n }\n}\n\nfunction DefaultAnchor({ id, children }: { id: string; children: ReactNode }) {\n announceUnconfigured();\n return (\n <div\n id={id}\n data-setting-control={id}\n data-setting-search-key={id}\n data-settings-host=\"unconfigured\"\n tabIndex={-1}\n className=\"@container/settings scroll-mt-20 outline-none\"\n >\n {children}\n </div>\n );\n}\n\n// No settings-specific Link: the one internal-link seam is HostLink (the registered tap-target link).\nfunction DefaultLink({ ref, ...rest }: SettingsLinkAnchorProps) {\n return <HostLink ref={ref as Ref<HTMLAnchorElement> | undefined} {...rest} />;\n}\n\nfunction useDefaultNavigate(): SettingsNavigateFn {\n announceUnconfigured();\n return (href, event) => {\n if (event && \"preventDefault\" in event) event.preventDefault();\n if (typeof window !== \"undefined\") window.location.assign(href);\n };\n}\n\n/** The Link the settings blocks draw. */\nexport function SettingsHostLink(props: SettingsLinkAnchorProps) {\n const Link = bound.host?.Link ?? DefaultLink;\n return <Link {...props} />;\n}\n\n/** The actions beside a known refusal; nothing until the host binds one. */\nexport function SettingsHostErrorMenu({ error }: { error: unknown }) {\n const Menu = bound.host?.ErrorMenu;\n return Menu ? <Menu error={error} /> : null;\n}\n\n/** Wraps one control so a deep link can reveal it. */\nexport function SettingsHostAnchor(props: { id: string; children: ReactNode }) {\n const Anchor = bound.host?.Anchor ?? DefaultAnchor;\n return <Anchor {...props} />;\n}\n\n/** The presentation-aware navigate function (a HOOK — see the header). */\nexport function useSettingsHostNavigate(): SettingsNavigateFn {\n const hook = bound.host?.useNavigate ?? useDefaultNavigate;\n return hook();\n}\n\n/** The copy notifier the host bound, if any. */\nexport function settingsCopyNotify(): ((message: string, kind: \"success\" | \"error\") => void) | undefined {\n return bound.host?.copyNotify;\n}\n","/**\n * Stable deep-link identity for an authored setting. This is deliberately\n * separate from the React input id: controls remount, while setting doors and\n * bookmarked search results must keep resolving to the same row.\n */\nexport function settingsControlSearchId(sectionTitle: string, label: string): string {\n const slug = (value: string) =>\n value\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\") || \"setting\";\n return `settings-control-${slug(sectionTitle)}-${slug(label)}`;\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\n\nexport type SettingsDesignVariant = \"standard\" | \"compact\";\nexport type SettingsDesignProviderProps = {\n children: ReactNode;\n variant?: SettingsDesignVariant;\n};\n\nconst SettingsDesignContext = createContext<SettingsDesignVariant>(\"standard\");\n\n/**\n * Applies a presentation density to the local settings primitive family.\n * Omit it for existing embeddings, which retain the standard presentation.\n */\nexport function SettingsDesignProvider({\n children,\n variant = \"standard\",\n}: SettingsDesignProviderProps) {\n return (\n <SettingsDesignContext.Provider value={variant}>\n {children}\n </SettingsDesignContext.Provider>\n );\n}\n\nexport function useSettingsDesign() {\n return { variant: useContext(SettingsDesignContext) } as const;\n}\n","\"use client\";\n\nimport { CircleAlertIcon as AlertCircle, AlertTriangleIcon as AlertTriangle, ChevronRightIcon as ChevronRight, Loader2Icon as LoaderCircle } from \"../icons\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../cn\";\nimport { SettingsHostLink as AppLink } from \"./host\";\nimport type { SettingsBadge, SettingsCommonProps } from \"./types\";\nimport { SettingsHostErrorMenu as ErrorAlchemyMenu } from \"./host\";\nimport { Tile } from \"../controls/surfaces\";\n\nexport type SettingsNavigationRowProps = SettingsCommonProps & {\n value?: ReactNode;\n loading?: boolean;\n last?: boolean;\n} & (\n | { href: string; onNavigate?: never }\n | { href?: never; onNavigate: () => void }\n );\n\n/** A settings row with exactly one navigation action. */\nexport function SettingsNavigationRow({\n href,\n onNavigate,\n value,\n loading = false,\n last,\n disabled,\n label,\n description,\n warning,\n error,\n badge,\n icon: Icon,\n modified,\n id,\n}: SettingsNavigationRowProps) {\n const rowClass = cn(\n \"flex min-h-11 w-full items-center gap-3 px-4 py-2.5 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring sm:min-h-9\",\n !disabled && !loading && \"hover:bg-accent/60\",\n (disabled || loading) && \"cursor-default text-disabled-foreground\",\n !last && \"border-b border-border/40\",\n );\n const content = (\n <>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n {modified && (\n <span\n aria-label=\"Modified from default\"\n className=\"h-1.5 w-1.5 shrink-0 rounded-full bg-primary\"\n />\n )}\n {Icon && (\n <Icon\n className=\"h-4 w-4 shrink-0 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n )}\n <span className=\"truncate type-title text-foreground\">\n {label}\n </span>\n {badge && <Badge badge={badge} />}\n </span>\n {description && (\n <span className=\"mt-0.5 block type-secondary leading-snug text-muted-foreground sm:truncate\">\n {description}\n </span>\n )}\n {warning && (\n <span className=\"mt-1 flex items-start gap-1.5 type-secondary leading-snug text-amber-600 dark:text-amber-400\">\n <AlertTriangle\n className=\"mt-0.5 h-3.5 w-3.5 shrink-0\"\n aria-hidden=\"true\"\n />\n <span className=\"break-words\">{warning}</span>\n </span>\n )}\n {error && (\n <span className=\"mt-1 flex items-start gap-1.5 type-secondary leading-snug text-red-600 dark:text-red-400\">\n <AlertCircle\n className=\"mt-0.5 h-3.5 w-3.5 shrink-0\"\n aria-hidden=\"true\"\n />\n <span className=\"break-words\">{error}</span>\n <ErrorAlchemyMenu error={error} />\n </span>\n )}\n </span>\n {value && (\n <span className=\"min-w-0 max-w-40 truncate type-body text-muted-foreground\">\n {value}\n </span>\n )}\n {loading ? (\n <LoaderCircle\n className=\"h-4 w-4 shrink-0 animate-spin text-muted-foreground\"\n aria-hidden=\"true\"\n />\n ) : (\n <ChevronRight\n className=\"h-4 w-4 shrink-0 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n )}\n </>\n );\n\n if (disabled || loading) {\n return (\n <div\n id={id}\n className={rowClass}\n aria-disabled=\"true\"\n aria-busy={loading || undefined}\n >\n {content}\n </div>\n );\n }\n if (href) {\n return (\n <AppLink id={id} className={rowClass} href={href}>\n {content}\n </AppLink>\n );\n }\n return (\n <Tile id={id} className={rowClass} type=\"button\" onClick={onNavigate} dense variant=\"quiet\" title={content} />\n );\n}\n\nfunction Badge({ badge }: { badge: SettingsBadge }) {\n return (\n <span className=\"rounded border border-border bg-muted px-1.5 py-0 type-meta font-semibold uppercase tracking-wide text-muted-foreground\">\n {badge.label}\n </span>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport type SettingsPageProps = { children: ReactNode };\n\n/**\n * Content canvas for a settings route or overlay. The surrounding shell owns\n * scrolling so this component never creates a nested scroll region.\n * `matrx-touch-targets` gives every control inside a 44px floor on touch and\n * below `lg`; desktop density is untouched.\n */\nexport function SettingsPage({ children }: SettingsPageProps) {\n return (\n <div className=\"matrx-touch-targets mx-auto min-h-full w-full max-w-5xl px-4 py-5 sm:px-6 sm:py-7 lg:px-8\">\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport { AlertTriangleIcon as AlertTriangle, CircleAlertIcon as AlertCircle, CircleHelpIcon as HelpCircle } from \"../icons\";\nimport * as Popover from \"@radix-ui/react-popover\";\nimport { useId, useRef, useState } from \"react\";\nimport { cn } from \"../cn\";\nimport type {\n SettingsCommonProps,\n SettingsRowVariant,\n SettingsRowDensity,\n SettingsBadge,\n} from \"./types\";\nimport { useSettingsDesign } from \"./SettingsDesignProvider\";\nimport { useSettingsSectionTitle } from \"./SettingsSectionContext\";\nimport { SettingsHostAnchor as SettingAnchor } from \"./host\";\nimport { settingsControlSearchId } from \"./searchIdentity\";\nimport { SettingsHostErrorMenu as ErrorAlchemyMenu } from \"./host\";\nimport { ResetTapButton } from \"../tap-target/buttons\";\nimport { Button } from \"../controls/controls\";\nimport { Tile } from \"../controls/surfaces\";\n\ntype SettingsRowProps = SettingsCommonProps & {\n /** Layout variant. Defaults to \"inline\". */\n variant?: SettingsRowVariant | undefined;\n /** Row density. Defaults to \"default\". */\n density?: SettingsRowDensity | undefined;\n /** The control (switch, input, slider, etc.) rendered on the right or below. */\n children: React.ReactNode;\n /** Whether this row is the last in a section. Removes trailing border. */\n last?: boolean | undefined;\n /** Wide controls stack below their label on narrow screens. */\n controlLayout?: \"compact\" | \"wide\" | undefined;\n /** Stable row anchor used by settings search and deep links. */\n anchorId?: string | undefined;\n /** Override the label target; pass null when the row exposes a labeled group. */\n labelFor?: string | null;\n};\n\nconst densityStyles: Record<SettingsRowDensity, string> = {\n compact: \"py-2.5\",\n default: \"py-3.5\",\n comfortable: \"py-4.5\",\n};\n\nconst badgeStyles: Record<SettingsBadge[\"variant\"], string> = {\n default: \"bg-muted text-muted-foreground border border-border\",\n new: \"bg-blue-500/10 text-blue-600 dark:text-blue-400 border border-blue-500/20\",\n beta: \"bg-purple-500/10 text-purple-600 dark:text-purple-400 border border-purple-500/20\",\n experimental:\n \"bg-amber-500/10 text-amber-600 dark:text-amber-400 border border-amber-500/20\",\n deprecated:\n \"bg-red-500/10 text-red-600 dark:text-red-400 border border-red-500/20\",\n admin:\n \"bg-foreground text-background border border-border\",\n};\n\nfunction BadgePill({ badge }: { badge: SettingsBadge }) {\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded px-1.5 py-0 type-meta font-semibold uppercase tracking-wide leading-4\",\n badgeStyles[badge.variant],\n )}\n >\n {badge.label}\n </span>\n );\n}\n\n/**\n * SettingsRow — base layout for every settings control.\n *\n * Rarely used directly by tab authors. Each primitive (SettingsSwitch,\n * SettingsSelect, etc.) composes this internally and exposes a flat prop API.\n *\n * Variants handle layout differences; NEVER accept a className.\n */\nexport function SettingsRow({\n label,\n description,\n meta,\n warning,\n error,\n badge,\n icon: Icon,\n disabled,\n modified,\n id,\n helpText,\n variant = \"inline\",\n density = \"default\",\n children,\n last,\n controlLayout = \"compact\",\n anchorId,\n labelFor,\n onReset,\n resetLabel,\n}: SettingsRowProps) {\n const { variant: designVariant } = useSettingsDesign();\n const sectionTitle = useSettingsSectionTitle();\n const reactId = useId().replace(/:/g, \"\");\n // Input ids are React-instance ids. Search/deep-link ids intentionally use\n // only the authored section + label, so they survive remounts and markup.\n const inputId = id ?? `settings-input-${reactId}`;\n const labelId = `${inputId}-label`;\n const controlId = settingsControlSearchId(sectionTitle ?? \"Settings\", label);\n const rowAnchorId = anchorId ?? controlId;\n\n // One reset door, only when there is something to reset. A row that CAN\n // reset always reserves the slot (the same 36px as a ladder row's History\n // button), so every control on a screen ends at one edge instead of\n // shifting when a value changes.\n const resetButton = onReset ? (\n // The slot is the tap button's own box (never a fixed-size wrapper, which\n // squeezed the button off its geometry); hidden, not removed, so the slot\n // stays reserved and `visibility: hidden` drops it from the tab order.\n <span\n className={cn(\"inline-flex shrink-0\", !(modified && !disabled) && \"invisible\")}\n aria-hidden={modified && !disabled ? undefined : true}\n >\n <ResetTapButton\n variant=\"transparent\"\n ariaLabel={resetLabel ?? `Reset ${label.toLowerCase()} to default`}\n onClick={onReset}\n />\n </span>\n ) : null;\n\n const labelBlock = (\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-1.5\">\n {modified && (\n <span\n role=\"img\"\n aria-label=\"Changed from the default\"\n title=\"Changed from the default\"\n className=\"h-1.5 w-1.5 rounded-full bg-primary shrink-0\"\n />\n )}\n {Icon && (\n <Icon className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n )}\n {labelFor === null ? (\n <span\n id={labelId}\n className={cn(\n \"min-w-0 break-words type-title leading-snug text-foreground\",\n disabled && \"text-disabled-foreground\",\n )}\n >\n {label}\n </span>\n ) : (\n <label\n id={labelId}\n htmlFor={labelFor ?? inputId}\n className={cn(\n \"min-w-0 break-words text-sm font-medium leading-snug text-foreground\",\n disabled && \"text-disabled-foreground\",\n )}\n >\n {label}\n </label>\n )}\n {badge && <BadgePill badge={badge} />}\n {/* The description is printed in full under the label; the help\n popover holds only the extra help, never a repeat of it. One\n popover for every design variant: a hover tooltip never opens on a\n phone, and its contents (a copy button) could not be reached. */}\n {helpText && <CompactHelpPopover label={label} helpText={helpText} />}\n </div>\n {meta ? (\n <div\n className={cn(\n \"mt-0.5 flex flex-wrap items-center gap-x-1.5 gap-y-0.5 break-words type-meta leading-snug text-muted-foreground [overflow-wrap:anywhere]\",\n disabled && \"text-disabled-foreground\",\n )}\n >\n {meta}\n </div>\n ) : null}\n {description ? (\n <TruncatedDescription description={description} disabled={disabled} />\n ) : null}\n {warning && (\n <div className=\"mt-1 flex items-start gap-1.5 type-secondary text-amber-600 dark:text-amber-400\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0 mt-0.5\" />\n <span className=\"break-words leading-snug\">{warning}</span>\n </div>\n )}\n {error && (\n <div className=\"mt-1 flex items-start gap-1.5 type-secondary text-red-600 dark:text-red-400\">\n <AlertCircle className=\"h-3.5 w-3.5 shrink-0 mt-0.5\" />\n <span className=\"break-words leading-snug\">{error}</span>\n <ErrorAlchemyMenu error={error} />\n </div>\n )}\n </div>\n );\n\n if (variant === \"block\") {\n return (\n <SettingAnchor id={rowAnchorId}>\n <div\n className={cn(\n \"px-4 border-b border-border/40\",\n densityStyles[\n designVariant === \"compact\" && density === \"default\"\n ? \"compact\"\n : density\n ],\n last && \"border-b-0\",\n )}\n >\n {children}\n </div>\n </SettingAnchor>\n );\n }\n\n if (variant === \"stacked\") {\n return (\n <SettingAnchor id={rowAnchorId}>\n <div\n className={cn(\n \"px-4 border-b border-border/40\",\n densityStyles[\n designVariant === \"compact\" && density === \"default\"\n ? \"compact\"\n : density\n ],\n last && \"border-b-0\",\n )}\n >\n <div className=\"mb-2.5\">{labelBlock}</div>\n <div className={cn(\"flex items-center gap-2\", disabled && \"text-disabled-foreground\")}>\n <div className=\"min-w-0 flex-1\">{children}</div>\n {resetButton}\n </div>\n </div>\n </SettingAnchor>\n );\n }\n\n return (\n <SettingAnchor id={rowAnchorId}>\n <div\n className={cn(\n controlLayout === \"wide\"\n ? \"flex flex-col items-stretch gap-2 border-b border-border/40 px-4 @[40rem]/settings:flex-row @[40rem]/settings:items-center @[40rem]/settings:gap-4\"\n : \"flex items-center gap-4 px-4 border-b border-border/40\",\n densityStyles[\n designVariant === \"compact\" && density === \"default\"\n ? \"compact\"\n : density\n ],\n last && \"border-b-0\",\n )}\n >\n {labelBlock}\n <div\n className={cn(\n controlLayout === \"wide\"\n ? \"w-full min-w-0 max-w-full [&_button]:max-w-full [&_input]:max-w-full @[40rem]/settings:w-auto @[40rem]/settings:shrink-0\"\n : \"w-auto min-w-0 max-w-full shrink-0 [&_button]:max-w-full [&_input]:max-w-full\",\n resetButton && \"flex items-center gap-1\",\n disabled && \"text-disabled-foreground\",\n )}\n >\n {/* The reset sits beside its control on every width, never on a\n line of its own under it. */}\n {resetButton ? <div className=\"min-w-0 flex-1\">{children}</div> : children}\n {resetButton}\n </div>\n </div>\n </SettingAnchor>\n );\n}\n\n/**\n * One line, truncated. When the text does not fit (a phone), a press opens the\n * full text in a popover; when it fits, the line is plain text and never opens.\n */\nfunction TruncatedDescription({\n description,\n disabled,\n}: Pick<SettingsCommonProps, \"description\" | \"disabled\">) {\n const lineRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n // Rich content (links, controls) cannot sit inside a button; it keeps wrapping.\n if (typeof description !== \"string\") {\n return (\n <div\n className={cn(\n \"mt-0.5 break-words type-secondary leading-snug text-muted-foreground\",\n disabled && \"text-disabled-foreground\",\n )}\n >\n {description}\n </div>\n );\n }\n return (\n <Popover.Root\n open={open}\n onOpenChange={(next) => {\n const el = lineRef.current;\n setOpen(next && !!el && el.scrollWidth > el.clientWidth);\n }}\n >\n <Popover.Trigger asChild>\n <Tile\n ref={lineRef}\n type=\"button\"\n dense\n variant=\"quiet\"\n title={description}\n className=\"mt-0.5 w-full min-w-0\"\n data-touch-exempt\n disabled={disabled}\n >\n </Tile>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n side=\"bottom\"\n align=\"start\"\n sideOffset={6}\n className=\"z-50 w-72 max-w-[calc(100vw-2rem)] break-words rounded-md border border-border bg-popover p-3 type-secondary leading-snug text-popover-foreground shadow-md [overflow-wrap:anywhere]\"\n >\n {description}\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n}\n\nexport function CompactHelpPopover({\n label,\n description,\n helpText,\n}: Pick<SettingsCommonProps, \"label\" | \"description\" | \"helpText\">) {\n return (\n <Popover.Root>\n <Popover.Trigger asChild>\n {/* Icon-sized so it never makes the label line taller (on a phone a\n 44px-tall help button pushed the description a blank line down);\n `matrx-tap-area` gives it the 44px finger ring without growing it. */}\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={`About ${label}`}\n icon={<HelpCircle className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />}\n data-touch-exempt\n className=\"shrink-0\"\n />\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n side=\"bottom\"\n align=\"start\"\n sideOffset={6}\n className=\"z-50 w-72 max-w-[calc(100vw-2rem)] break-words rounded-md border border-border bg-popover p-3 type-secondary leading-snug text-popover-foreground shadow-md [overflow-wrap:anywhere]\"\n >\n {description && <div>{description}</div>}\n {helpText && (\n <div className={cn(description && \"mt-2\")}>{helpText}</div>\n )}\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\n\nconst SettingsSectionContext = createContext<string | undefined>(undefined);\n\n/** The nearest section title gives static controls a stable deep-link scope. */\nexport function SettingsSectionProvider({\n title,\n children,\n}: {\n title: string;\n children: ReactNode;\n}) {\n return (\n <SettingsSectionContext.Provider value={title}>\n {children}\n </SettingsSectionContext.Provider>\n );\n}\n\nexport function useSettingsSectionTitle(): string | undefined {\n return useContext(SettingsSectionContext);\n}\n","\"use client\";\n\nimport { InfoIcon as Info, AlertTriangleIcon as AlertTriangle, CircleAlertIcon as AlertCircle, CircleCheckIcon as CheckCircle } from \"../../icons\";\nimport { cn } from \"../../cn\";\n\ntype Tone = \"info\" | \"warning\" | \"error\" | \"success\";\n\nconst toneStyles: Record<\n Tone,\n { container: string; icon: string; Icon: React.ComponentType<{ className?: string }> }\n> = {\n info: {\n container:\n \"border-blue-500/30 bg-blue-500/5 text-blue-900 dark:text-blue-100\",\n icon: \"text-blue-600 dark:text-blue-400\",\n Icon: Info,\n },\n warning: {\n container:\n \"border-amber-500/30 bg-amber-500/5 text-amber-900 dark:text-amber-100\",\n icon: \"text-amber-600 dark:text-amber-400\",\n Icon: AlertTriangle,\n },\n error: {\n container:\n \"border-red-500/30 bg-red-500/5 text-red-900 dark:text-red-100\",\n icon: \"text-red-600 dark:text-red-400\",\n Icon: AlertCircle,\n },\n success: {\n container:\n \"border-emerald-500/30 bg-emerald-500/5 text-emerald-900 dark:text-emerald-100\",\n icon: \"text-emerald-600 dark:text-emerald-400\",\n Icon: CheckCircle,\n },\n};\n\nexport type SettingsCalloutProps = {\n tone: Tone;\n title?: string;\n children: React.ReactNode;\n /** Optional action node rendered in the footer row of the callout. */\n action?: React.ReactNode;\n};\n\nexport function SettingsCallout({\n tone,\n title,\n children,\n action,\n}: SettingsCalloutProps) {\n const { container, icon, Icon } = toneStyles[tone];\n return (\n <div\n className={cn(\n \"mx-4 mb-4 flex items-start gap-2.5 rounded-md border px-3 py-2.5\",\n container,\n )}\n >\n <Icon className={cn(\"h-4 w-4 shrink-0 mt-0.5\", icon)} />\n <div className=\"flex-1 min-w-0 type-secondary leading-relaxed\">\n {title && <div className=\"font-semibold mb-0.5\">{title}</div>}\n <div>{children}</div>\n {action && <div className=\"mt-2\">{action}</div>}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { cn } from \"../../cn\";\n\nexport type SettingsGridProps = {\n /** Desktop column count. Defaults to 2. */\n columns?: 2 | 3;\n /** Gap size between cells. */\n gap?: \"sm\" | \"md\" | \"lg\";\n children: React.ReactNode;\n};\n\nconst gapClass = {\n sm: \"gap-2\",\n md: \"gap-3\",\n lg: \"gap-4\",\n};\n\nconst columnsClass = {\n 2: \"@[40rem]/settings-grid:grid-cols-2\",\n 3: \"@[40rem]/settings-grid:grid-cols-2 @[56rem]/settings-grid:grid-cols-3\",\n};\n\n/**\n * Grid container for dense dashboards — e.g. 2-up stat cards, side-by-side pickers.\n * On mobile always stacks to a single column to keep controls readable.\n */\nexport function SettingsGrid({\n columns = 2,\n gap = \"md\",\n children,\n}: SettingsGridProps) {\n return (\n <div\n className={cn(\n \"@container/settings-grid grid grid-cols-1 px-4 mb-4 [&>*]:min-w-0\",\n columnsClass[columns],\n gapClass[gap],\n )}\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport { useClipboard } from \"@ai-matrx/kit/clipboard\";\nimport { settingsCopyNotify } from \"../host\";\nimport { CheckIcon as Check, CopyIcon as Copy } from \"../../icons\";\nimport { useId, useState } from \"react\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { cn } from \"../../cn\";\nimport { Button } from \"../../controls/controls\";\nimport type { SettingsCommonProps } from \"../types\";\n\nexport type SettingsReadOnlyValueProps = Omit<\n SettingsCommonProps,\n \"disabled\" | \"modified\"\n> & {\n value: string;\n /** When true, shows a copy-to-clipboard button. */\n copyable?: boolean;\n /** Renders the value in a monospace font (for IDs, hashes, URLs). */\n mono?: boolean;\n last?: boolean;\n};\n\n/**\n * Informational row — no user control, just a key/value display.\n * Examples: \"App version: 0.3.217\", \"Build: abc123\", \"User ID: uuid-...\".\n */\nexport function SettingsReadOnlyValue({\n value,\n copyable,\n mono,\n last,\n ...rowProps\n}: SettingsReadOnlyValueProps) {\n const notify = settingsCopyNotify();\n const { copyText } = useClipboard(notify ? { notify } : {});\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n if (!(await copyText(value))) return;\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n };\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant=\"inline\"\n controlLayout=\"wide\"\n last={last}\n >\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span\n className={cn(\n \"min-w-0 max-w-full type-secondary text-muted-foreground truncate @[40rem]/settings:max-w-64\",\n mono && \"font-mono tabular-nums\",\n )}\n title={value}\n >\n {value}\n </span>\n {copyable && (\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={copied ? \"Copied\" : \"Copy to clipboard\"}\n icon={copied ? <Check className=\"h-3 w-3 text-emerald-500\" /> : <Copy className=\"h-3 w-3\" />}\n onClick={handleCopy}\n className=\"shrink-0\"\n />\n )}\n </div>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId, useState } from \"react\";\nimport { ChevronDownIcon as ChevronDown } from \"../../icons\";\nimport type { SettingsIconType as LucideIcon } from \"../icon-type\";\nimport { cn } from \"../../cn\";\nimport { Tile } from \"../../controls/surfaces\";\nimport { useSettingsDesign } from \"../SettingsDesignProvider\";\nimport { SettingsSectionProvider } from \"../SettingsSectionContext\";\n\nexport type SettingsSectionProps = {\n title: string;\n description?: string;\n icon?: LucideIcon;\n /** Makes the section expand/collapse with a chevron header. */\n collapsible?: boolean;\n /** When collapsible, controls initial state. Defaults to expanded. */\n defaultOpen?: boolean;\n /** Section header emphasis. Defaults to \"default\". */\n emphasis?: \"subtle\" | \"default\" | \"strong\";\n /** Optional action node rendered to the right of the title (e.g. reset button). */\n action?: React.ReactNode;\n children: React.ReactNode;\n};\n\nexport type SettingsGroupProps = SettingsSectionProps;\n\nconst emphasisTitleClass = {\n subtle: \"text-xs font-semibold uppercase tracking-wide text-muted-foreground\",\n default: \"text-sm font-semibold text-foreground\",\n strong: \"text-base font-semibold text-foreground\",\n};\n\n/**\n * SettingsSection groups related rows under a common header.\n * Sections are the primary organizing unit inside a settings tab.\n */\nexport function SettingsSection({\n title,\n description,\n icon: Icon,\n collapsible,\n defaultOpen = true,\n emphasis = \"default\",\n action,\n children,\n}: SettingsSectionProps) {\n const { variant } = useSettingsDesign();\n const [open, setOpen] = useState(defaultOpen);\n const contentId = useId().replace(/:/g, \"\");\n const isOpen = collapsible ? open : true;\n\n return (\n <section className={cn(variant === \"compact\" ? \"mb-4\" : \"mb-6\")}>\n <header className=\"flex flex-wrap items-center gap-2 px-4 mb-2\">\n {collapsible ? (\n <Tile\n type=\"button\"\n dense\n variant=\"quiet\"\n title={\n <span className=\"flex min-w-0 items-center gap-2\">\n <ChevronDown\n className={cn(\"h-3.5 w-3.5 shrink-0 text-muted-foreground transition-transform\", !isOpen && \"-rotate-90\")}\n aria-hidden=\"true\"\n />\n {Icon ? <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" /> : null}\n <span className={cn(emphasisTitleClass[emphasis], \"min-w-0 break-words\")}>{title}</span>\n </span>\n }\n className=\"-mx-2 flex min-w-0 flex-1 items-center gap-2 rounded px-2 py-1 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-expanded={isOpen}\n aria-controls={contentId}\n onClick={() => setOpen((value) => !value)}\n />\n ) : (\n <>\n {Icon && (\n <Icon\n className=\"h-4 w-4 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n )}\n <h3\n className={cn(\n emphasisTitleClass[emphasis],\n \"min-w-0 flex-1 break-words\",\n )}\n >\n {title}\n </h3>\n </>\n )}\n {action && <div className=\"ml-auto max-w-full shrink-0\">{action}</div>}\n </header>\n {description && isOpen && (\n <p className=\"px-4 type-secondary text-muted-foreground mb-2 leading-snug\">\n {description}\n </p>\n )}\n {isOpen && (\n <div\n id={contentId}\n className={cn(\n \"border border-border/40 bg-card/30\",\n variant === \"compact\" ? \"rounded-md\" : \"rounded-lg\",\n )}\n >\n <SettingsSectionProvider title={title}>\n {children}\n </SettingsSectionProvider>\n </div>\n )}\n </section>\n );\n}\n\n/** A named reusable settings group with the exact SettingsSection contract. */\nexport function SettingsGroup(props: SettingsGroupProps) {\n return <SettingsSection {...props} />;\n}\n","\"use client\";\n\nimport type { SettingsIconType as LucideIcon } from \"../icon-type\";\nimport { cn } from \"../../cn\";\nimport { useSettingsDesign } from \"../SettingsDesignProvider\";\nimport { CompactHelpPopover } from \"../SettingsRow\";\n\nexport type SettingsSubHeaderProps = {\n title: string;\n description?: string;\n icon?: LucideIcon;\n /** Renders a bottom border as a divider. Defaults to true. */\n divider?: boolean;\n};\n\n/**\n * Page-level header for a settings tab. The `description` opens from a help\n * icon beside the title rather than sitting under it.\n * Render once at the top of each tab component — above any SettingsSection.\n */\nexport function SettingsSubHeader({\n title,\n description,\n icon: Icon,\n divider = true,\n}: SettingsSubHeaderProps) {\n const { variant } = useSettingsDesign();\n return (\n <div\n data-settings-subheader=\"\"\n className={cn(\n \"px-4\",\n variant === \"compact\" ? \"pb-3 mb-3\" : \"pb-4 mb-4\",\n divider && \"border-b border-border/40\",\n )}\n >\n <div className=\"flex items-center gap-2\">\n {Icon && <Icon className=\"h-5 w-5 text-foreground\" />}\n <h2 className={cn(\"font-semibold text-foreground leading-tight\", variant === \"compact\" ? \"text-base\" : \"text-lg\")}>\n {title}\n </h2>\n {/* The title stands alone (page-pass core 3): what the tab is for is\n one tap away, never a sentence parked under every heading. */}\n {description && <CompactHelpPopover label={title} description={description} />}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type { ReactNode, Ref } from \"react\";\nimport { XIcon as X } from \"../../icons\";\nimport type { SettingsTreeNode } from \"../tree/types\";\nimport { cn } from \"../../cn\";\nimport { Button, SearchField } from \"../../controls/controls\";\n\nexport function SettingsNavigationSearch({\n value,\n onValueChange,\n label = \"Search settings\",\n inputRef,\n}: {\n value: string;\n onValueChange: (value: string) => void;\n label?: string;\n inputRef?: Ref<HTMLInputElement>;\n}) {\n return (\n // A solid band with a rule under it: the sidebar itself is transparent\n // over the textured shell, so a bare input let scrolled items show\n // through around it (page-pass 2026-09-27).\n <div className=\"sticky top-0 z-10 mb-1 border-b border-border/60 bg-textured pb-1.5 pt-1\" role=\"search\">\n <div className=\"relative\">\n <SearchField\n ref={inputRef}\n type=\"search\"\n value={value}\n onChange={(event) => onValueChange(event.target.value)}\n placeholder={label}\n aria-label={label}\n end={value ? <span aria-hidden=\"true\" className=\"w-7 shrink-0\" /> : undefined}\n className=\"w-full\"\n />\n {value ? <Button type=\"button\" variant=\"quiet\" className=\"absolute right-1.5 top-1/2 -translate-y-1/2\" onClick={() => onValueChange(\"\")} aria-label=\"Clear search\" icon={<X aria-hidden />} /> : null}\n </div>\n </div>\n );\n}\n\nexport type SettingsNavigationItem = {\n id: string;\n label: string;\n location: string;\n node: SettingsTreeNode;\n};\n\nexport type SettingsNavigationSection = {\n id: string;\n /** Omit when adjacent root links do not have a meaningful shared heading. */\n label?: string;\n items: SettingsNavigationItem[];\n};\n\n/**\n * Converts a settings tree into Notion-style, non-recursive sections. Desktop\n * navigation intentionally has no expandable state: headings orient people and\n * every destination stays visible as a flat link.\n */\nexport function settingsNavigationSections(\n nodes: SettingsTreeNode[],\n): SettingsNavigationSection[] {\n const sections: SettingsNavigationSection[] = [];\n for (const root of nodes) {\n if (!root.children?.length) {\n const last = sections.at(-1);\n if (last && !last.label) {\n last.items.push(asItem(root, \"Settings\"));\n } else {\n sections.push({ id: `unsectioned:${root.id}`, items: [asItem(root, \"Settings\")] });\n }\n continue;\n }\n\n // Registry folders are headings. Configuration domains use their routable\n // Overview child while keeping the domain's human name in the flat list.\n const items: SettingsNavigationItem[] = [];\n if (root.navigable) {\n items.push(asItem({ ...root, label: root.navigationLabel ?? root.label }, \"Settings\"));\n }\n const collect = (node: SettingsTreeNode, path: string[]): void => {\n if (!node.children?.length) {\n items.push(asItem(node, path.join(\" / \")));\n return;\n }\n\n const overview = node.children.find((child) => child.label === \"Overview\");\n if (overview) {\n // The domain's own icon travels with its name; the Overview leaf has\n // none, which drew the same fallback gear on every domain row.\n items.push(\n asItem(\n { ...overview, label: node.label, icon: overview.icon ?? node.icon },\n [...path, node.label].join(\" / \"),\n ),\n );\n return;\n }\n for (const child of node.children) collect(child, [...path, node.label]);\n };\n for (const child of root.children) collect(child, [root.label]);\n if (items.length) sections.push({ id: root.id, label: root.label, items });\n }\n return sections;\n}\n\nfunction asItem(node: SettingsTreeNode, location: string): SettingsNavigationItem {\n return { id: node.id, label: node.label, location, node };\n}\n\nexport function filterSettingsNavigationSections(\n sections: SettingsNavigationSection[],\n query: string,\n): SettingsNavigationSection[] {\n const needle = query.trim().toLocaleLowerCase();\n if (!needle) return sections;\n return sections.flatMap((section) => {\n const items = section.items.filter((item) =>\n [item.label, item.location, item.node.description, ...(item.node.searchKeywords ?? [])]\n .filter((value): value is string => Boolean(value))\n .join(\" \")\n .toLocaleLowerCase()\n .includes(needle),\n );\n return items.length ? [{ ...section, items }] : [];\n });\n}\n\nexport function SettingsFlatNavigation({\n sections,\n activeId,\n renderItem,\n empty,\n}: {\n sections: SettingsNavigationSection[];\n activeId: string | null;\n /** Return one native interactive root (`a` or `button`); this primitive owns its row styling. */\n renderItem: (item: SettingsNavigationItem, active: boolean) => ReactNode;\n empty?: ReactNode;\n}) {\n if (sections.length === 0) {\n return <div className=\"px-3 py-6 type-body text-muted-foreground\">{empty ?? \"No settings match.\"}</div>;\n }\n return (\n <div className=\"flex flex-col gap-3 py-1\">\n {sections.map((section) => (\n <section key={section.id} className=\"flex flex-col gap-0.5\" aria-label={section.label ?? \"Settings\"}>\n {section.label ? <h2 className={cn(\"m-0 px-2 py-1 type-secondary font-medium leading-5 text-muted-foreground\", section.id === activeId && \"rounded bg-muted text-foreground\")}>{section.label}</h2> : null}\n <div className=\"flex flex-col gap-px\">\n {section.items.map((item) => (\n <div\n key={item.id}\n className={cn(\n \"[&>a]:flex [&>a]:min-h-[1.875rem] [&>a]:w-full [&>a]:items-center [&>a]:rounded-sm [&>a]:pl-2 [&>a]:text-[0.8125rem] [&>button]:flex [&>button]:min-h-[1.875rem] [&>button]:w-full [&>button]:items-center [&>button]:rounded-sm [&>button]:pl-2 [&>button]:text-[0.8125rem]\",\n item.id === activeId && \"[&>a]:bg-muted [&>a]:text-foreground [&>button]:bg-muted [&>button]:text-foreground\",\n )}\n >\n {renderItem(item, item.id === activeId)}\n </div>\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport type { SettingsIconType as LucideIcon } from \"../icon-type\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { cn } from \"../../cn\";\nimport type { SettingsCommonProps, SettingsControlSize } from \"../types\";\nimport { Button } from \"../../controls/controls\";\n\ntype ButtonKind = \"default\" | \"outline\" | \"ghost\" | \"destructive\";\n\nexport type SettingsButtonProps = SettingsCommonProps & {\n /** Action label shown on the button itself. */\n actionLabel: string;\n onClick: () => void;\n kind?: ButtonKind;\n size?: SettingsControlSize;\n actionIcon?: LucideIcon;\n /** Stacks the button below the label. Use when the action label is long. */\n stacked?: boolean;\n last?: boolean;\n /** Shows a confirmation spinner / loading state. */\n loading?: boolean;\n};\n\n/**\n * Renders a settings row whose control is an action button.\n * Good for: \"Reset to defaults\", \"Clear cache\", \"Sign out\", \"Open in browser\".\n */\nexport function SettingsButton({\n actionLabel,\n onClick,\n kind = \"outline\",\n size = \"md\",\n actionIcon: ActionIcon,\n stacked,\n loading,\n last,\n ...rowProps\n}: SettingsButtonProps) {\n // Retain the API field for callers; canonical Button owns its geometry.\n void size;\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant={stacked ? \"stacked\" : \"inline\"}\n last={last}\n >\n <Button\n id={id}\n type=\"button\"\n variant={kind === \"default\" ? \"primary\" : kind === \"ghost\" ? \"quiet\" : kind === \"destructive\" ? \"danger\" : \"outline\"}\n icon={ActionIcon ? <ActionIcon className=\"h-3.5 w-3.5 shrink-0\" /> : undefined}\n onClick={onClick}\n disabled={rowProps.disabled || loading}\n className={cn(stacked && \"w-full\", loading && \"animate-pulse\")}\n >\n <span>{loading ? \"Working…\" : actionLabel}</span>\n </Button>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport { Checkbox } from \"../../checkbox\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport type { SettingsCommonProps } from \"../types\";\n\nexport type SettingsCheckboxProps = SettingsCommonProps & {\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n last?: boolean;\n};\n\n/**\n * Use for opt-in / consent / \"tick to enable\" flows.\n * For app-level feature toggles, prefer SettingsSwitch.\n */\nexport function SettingsCheckbox({\n checked,\n onCheckedChange,\n last,\n ...rowProps\n}: SettingsCheckboxProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n return (\n <SettingsRow {...rowProps} id={id} variant=\"inline\" last={last}>\n <Checkbox\n id={id}\n checked={checked}\n onCheckedChange={(v) => onCheckedChange(Boolean(v))}\n disabled={rowProps.disabled}\n />\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useId } from \"react\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { Field } from \"../../controls/controls\";\nimport { Button } from \"../../controls/controls\";\nimport type { SettingsCommonProps } from \"../types\";\n\nexport type SettingsColorPickerProps = SettingsCommonProps & {\n value: string;\n onValueChange: (value: string) => void;\n /** Small palette of preset swatches shown alongside the picker. */\n presets?: string[];\n last?: boolean;\n};\n\nfunction isValidHex(value: string): boolean {\n return /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(value);\n}\n\nexport function SettingsColorPicker({\n value,\n onValueChange,\n presets,\n last,\n ...rowProps\n}: SettingsColorPickerProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n const [draft, setDraft] = useState(value);\n\n useEffect(() => {\n setDraft(value);\n }, [value]);\n\n const commit = (raw: string) => {\n const candidate = raw.startsWith(\"#\") ? raw : `#${raw}`;\n if (isValidHex(candidate)) {\n onValueChange(candidate.toLowerCase());\n setDraft(candidate.toLowerCase());\n } else {\n setDraft(value);\n }\n };\n\n return (\n <SettingsRow {...rowProps} id={id} variant=\"inline\" controlLayout=\"wide\" last={last}>\n <div className=\"flex max-w-full flex-wrap items-center gap-1.5\">\n {presets && presets.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1 mr-1.5\">\n {presets.map((p) => (\n <Button\n key={p}\n type=\"button\"\n variant=\"quiet\"\n aria-label={`Set to ${p}`}\n icon={<span className=\"size-3.5 rounded-sm\" style={{ backgroundColor: p }} aria-hidden />}\n onClick={() => onValueChange(p)}\n disabled={rowProps.disabled}\n />\n ))}\n </div>\n )}\n <Field\n id={id}\n type=\"color\"\n value={isValidHex(value) ? value : \"#000000\"}\n disabled={rowProps.disabled}\n onChange={(e) => onValueChange(e.target.value)}\n aria-label={`${rowProps.label} color`}\n className=\"w-16 shrink-0\"\n />\n <Field\n type=\"text\"\n value={draft}\n placeholder=\"#000000\"\n maxLength={7}\n disabled={rowProps.disabled}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={(e) => commit(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") (e.currentTarget as HTMLInputElement).blur();\n }}\n aria-label={`${rowProps.label} hex color`}\n width=\"xs\"\n />\n </div>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../select\";\nimport { SettingsRow } from \"../SettingsRow\";\n/** A device as the host lists it (structurally the media-devices manager descriptor). */\nexport interface MediaDeviceDescriptor {\n deviceId: string;\n label: string;\n groupId: string;\n}\nimport type { SettingsCommonProps, SettingsControlSize } from \"../types\";\n\ntype Width = \"auto\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n\nconst widthClass: Record<Width, string> = {\n auto: \"w-full max-w-full @[40rem]/settings:w-auto @[40rem]/settings:min-w-32\",\n sm: \"w-32 max-w-full min-w-0\",\n md: \"w-44 max-w-full min-w-0\",\n lg: \"w-64 max-w-full min-w-0\",\n full: \"w-full\",\n};\n\n/** Sentinel for the \"no explicit choice\" option — never a real deviceId. */\nconst DEFAULT_SENTINEL = \"__system_default__\";\n\nexport type SettingsDeviceSelectProps = SettingsCommonProps & {\n /** Live device list from the media-device manager snapshot. */\n devices: MediaDeviceDescriptor[];\n /** Resolved live deviceId of the current choice (\"\" = default/auto). */\n selectedId: string;\n /** Fired with BOTH the deviceId and its label (\"\" + \"\" = default/auto) —\n * labels are persisted alongside ids because iOS Safari regenerates\n * deviceIds per page load (resolve is id → label → default). */\n onSelect: (deviceId: string, label: string) => void;\n /** Label for the \"no explicit choice\" option (default \"System default\"). */\n defaultOptionLabel?: string;\n /** Fallback label prefix for devices whose label is blank (pre-grant),\n * e.g. \"Microphone\" → \"Microphone (a1b2c3)\". */\n deviceKindLabel: string;\n size?: SettingsControlSize;\n width?: Width;\n /** Renders as a stacked layout. Use when the select should span full width. */\n stacked?: boolean;\n last?: boolean;\n};\n\n/**\n * A settings row whose control is a LIVE media-device picker (microphone,\n * speaker, or camera). Unlike `SettingsSelect`, its options come from a live\n * `enumerateDevices` snapshot and its change event carries the (id, label)\n * PAIR the device-preference model persists. Blank labels (permission not yet\n * granted) fall back to `deviceKindLabel (idPrefix)`.\n */\nexport function SettingsDeviceSelect({\n devices,\n selectedId,\n onSelect,\n defaultOptionLabel = \"System default\",\n deviceKindLabel,\n size = \"md\",\n width = \"md\",\n stacked,\n last,\n ...rowProps\n}: SettingsDeviceSelectProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n const variant = stacked ? \"stacked\" : \"inline\";\n const effectiveWidth: Width = stacked ? \"full\" : width;\n\n const optionLabel = (d: MediaDeviceDescriptor): string => {\n if (d.label) return d.label;\n const short = d.deviceId ? d.deviceId.slice(0, 6) : \"unknown\";\n return `${deviceKindLabel} (${short})`;\n };\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant={variant}\n controlLayout=\"wide\"\n last={last}\n >\n <Select\n value={selectedId || DEFAULT_SENTINEL}\n onValueChange={(v) => {\n if (v === DEFAULT_SENTINEL) {\n onSelect(\"\", \"\");\n return;\n }\n const dev = devices.find((d) => d.deviceId === v);\n onSelect(v, dev?.label ?? \"\");\n }}\n disabled={rowProps.disabled ?? false}\n >\n <SelectTrigger\n id={id}\n className={widthClass[effectiveWidth]}\n >\n <SelectValue placeholder={defaultOptionLabel} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={DEFAULT_SENTINEL}>{defaultOptionLabel}</SelectItem>\n {devices.map((d) => (\n <SelectItem key={d.deviceId || \"default-device\"} value={d.deviceId}>\n {optionLabel(d)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId, useState } from \"react\";\nimport { XIcon as X } from \"../../icons\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { cn } from \"../../cn\";\nimport { Button } from \"../../controls/controls\";\nimport type { SettingsCommonProps } from \"../types\";\n\nexport type KeybindingValue = {\n /** Key code from KeyboardEvent.code (e.g., \"KeyK\", \"Digit1\"). */\n key: string;\n /** Display string ready to render (e.g., \"⌘K\", \"Ctrl+Shift+P\"). */\n display: string;\n ctrl?: boolean;\n alt?: boolean;\n shift?: boolean;\n meta?: boolean;\n};\n\nexport type SettingsKeybindingProps = SettingsCommonProps & {\n value: KeybindingValue | null;\n onValueChange: (value: KeybindingValue | null) => void;\n /** Allow clearing the binding. */\n clearable?: boolean;\n last?: boolean;\n};\n\nconst NON_BINDING_KEYS = new Set([\n \"Escape\",\n \"Tab\",\n \"Meta\",\n \"Control\",\n \"Shift\",\n \"Alt\",\n \"ContextMenu\",\n \"CapsLock\",\n]);\n\nfunction formatEventAsBinding(\n e: React.KeyboardEvent<HTMLButtonElement>,\n): KeybindingValue | null {\n if (NON_BINDING_KEYS.has(e.key)) return null;\n const isMac =\n typeof navigator !== \"undefined\" &&\n /Mac|iPhone|iPad/.test(navigator.platform);\n const parts: string[] = [];\n if (e.ctrlKey) parts.push(isMac ? \"⌃\" : \"Ctrl\");\n if (e.altKey) parts.push(isMac ? \"⌥\" : \"Alt\");\n if (e.shiftKey) parts.push(isMac ? \"⇧\" : \"Shift\");\n if (e.metaKey) parts.push(isMac ? \"⌘\" : \"Meta\");\n const keyDisplay =\n e.key.length === 1\n ? e.key.toUpperCase()\n : e.key.replace(/^(Arrow|Digit)/, \"\");\n parts.push(keyDisplay);\n return {\n key: e.code,\n display: parts.join(isMac ? \"\" : \"+\"),\n ctrl: e.ctrlKey,\n alt: e.altKey,\n shift: e.shiftKey,\n meta: e.metaKey,\n };\n}\n\nexport function SettingsKeybinding({\n value,\n onValueChange,\n clearable = true,\n last,\n ...rowProps\n}: SettingsKeybindingProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n const [recording, setRecording] = useState(false);\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant=\"inline\"\n controlLayout=\"wide\"\n last={last}\n >\n <div className=\"flex max-w-full flex-wrap items-center gap-1.5\">\n <Button\n id={id}\n type=\"button\"\n variant={recording ? \"primary\" : \"outline\"}\n onClick={() => setRecording(true)}\n onBlur={() => setRecording(false)}\n onKeyDown={(e) => {\n if (!recording) return;\n if (e.key === \"Escape\") {\n setRecording(false);\n return;\n }\n e.preventDefault();\n const next = formatEventAsBinding(e);\n if (next) {\n onValueChange(next);\n setRecording(false);\n }\n }}\n disabled={rowProps.disabled}\n className={cn(\"min-w-0 flex-1 font-mono tabular-nums @[40rem]/settings:min-w-32\", recording && \"animate-pulse\")}\n >\n {recording\n ? \"Press keys…\"\n : value\n ? value.display\n : \"Click to record\"}\n </Button>\n {clearable && value && !rowProps.disabled && (\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label=\"Clear keybinding\"\n icon={<X className=\"h-3.5 w-3.5\" />}\n onClick={() => onValueChange(null)}\n />\n )}\n </div>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport { SettingsHostLink as AppLink } from \"../host\";\nimport { ArrowRightIcon as ArrowRight, ExternalLinkIcon as ExternalLink } from \"../../icons\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { cn } from \"../../cn\";\nimport { useSettingsHostNavigate as useSettingsNavigate } from \"../host\";\nimport type { SettingsCommonProps } from \"../types\";\nimport { OutboundLink } from \"@ai-matrx/kit/outbound-react\";\n\nexport type SettingsLinkProps = SettingsCommonProps & {\n /** Internal route (href starting with \"/\") or external URL. */\n href: string;\n /** Action label shown on the link button. */\n actionLabel?: string;\n /** Forces external-link behavior even for relative hrefs. */\n external?: boolean;\n last?: boolean;\n};\n\nexport function SettingsLink({\n href,\n actionLabel,\n external,\n last,\n ...rowProps\n}: SettingsLinkProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n const isExternal = external ?? /^https?:\\/\\//i.test(href);\n const Icon = isExternal ? ExternalLink : ArrowRight;\n const labelText = actionLabel ?? (isExternal ? \"Open\" : \"View\");\n\n const anchorClasses = cn(\n \"inline-flex min-h-11 items-center gap-1.5 rounded-md border border-border bg-card px-3 text-sm font-medium text-foreground shadow-sm transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring sm:min-h-8\",\n rowProps.disabled && \"pointer-events-none text-disabled-foreground\",\n );\n\n // Presentation-aware navigation: inside the settings window/drawer\n // this dismisses the shell *before* pushing, so the user lands on the\n // target page instead of seeing the window blink out. Cmd/Ctrl/middle\n // click still opens the link in a new tab (shell stays open).\n const navigate = useSettingsNavigate();\n\n return (\n <SettingsRow {...rowProps} id={id} variant=\"inline\" last={last}>\n {isExternal ? (\n <OutboundLink\n href={href}\n className={anchorClasses}\n >\n <span>{labelText}</span>\n <Icon className=\"h-3.5 w-3.5\" />\n </OutboundLink>\n ) : (\n <AppLink\n href={href}\n className={anchorClasses}\n onClick={(e) => {\n if (rowProps.disabled) {\n e.preventDefault();\n return;\n }\n navigate(href, e);\n }}\n >\n <span>{labelText}</span>\n <Icon className=\"h-3.5 w-3.5\" />\n </AppLink>\n )}\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId, useState } from \"react\";\nimport { CheckIcon as Check, ChevronDownIcon as ChevronDown, XIcon as X } from \"../../icons\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { cn } from \"../../cn\";\nimport { Button } from \"../../controls/controls\";\nimport { Tile } from \"../../controls/surfaces\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../../popover\";\nimport type { SettingsCommonProps, SettingsOption } from \"../types\";\n\nexport type SettingsMultiSelectProps<T extends string = string> =\n SettingsCommonProps & {\n value: T[];\n onValueChange: (value: T[]) => void;\n options: SettingsOption<T>[];\n placeholder?: string;\n /** Maximum selected items. Extra selection attempts are ignored. */\n max?: number;\n /** Hide the selected tags display, show just a count (\"3 selected\"). */\n countOnly?: boolean;\n last?: boolean;\n };\n\nexport function SettingsMultiSelect<T extends string = string>({\n value,\n onValueChange,\n options,\n placeholder = \"Select…\",\n max,\n countOnly,\n last,\n ...rowProps\n}: SettingsMultiSelectProps<T>) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n const [open, setOpen] = useState(false);\n\n const selectedSet = new Set(value);\n const selectedOptions = options.filter((o) => selectedSet.has(o.value));\n\n const toggle = (v: T) => {\n if (selectedSet.has(v)) {\n onValueChange(value.filter((x) => x !== v));\n } else {\n if (max !== undefined && value.length >= max) return;\n onValueChange([...value, v]);\n }\n };\n\n const clearOne = (v: T) => onValueChange(value.filter((x) => x !== v));\n\n const summary = countOnly\n ? value.length === 0\n ? placeholder\n : `${value.length} selected`\n : null;\n\n return (\n <SettingsRow {...rowProps} id={id} variant=\"stacked\" last={last}>\n <div className=\"space-y-2\">\n {!countOnly && selectedOptions.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {selectedOptions.map((opt) => (\n <span\n key={opt.value}\n className=\"inline-flex max-w-full items-center gap-1 rounded-md border border-border bg-muted px-2 py-0.5 type-secondary text-foreground\"\n >\n {opt.icon && <opt.icon className=\"h-3 w-3\" />}\n <span className=\"min-w-0 truncate\">{opt.label}</span>\n {!rowProps.disabled && (\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={`Remove ${opt.label}`}\n icon={<X className=\"h-3 w-3\" />}\n onClick={() => clearOne(opt.value)}\n className=\"ml-0.5\"\n />\n )}\n </span>\n ))}\n </div>\n )}\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n id={id}\n type=\"button\"\n variant=\"outline\"\n iconEnd={<ChevronDown className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n disabled={rowProps.disabled}\n className=\"w-full\"\n >\n <span\n className={cn(\n \"min-w-0 flex-1 truncate\",\n value.length === 0 && \"text-muted-foreground\",\n )}\n >\n {countOnly\n ? summary\n : value.length === 0\n ? placeholder\n : `${value.length} selected`}\n </span>\n </Button>\n </PopoverTrigger>\n <PopoverContent\n sizing=\"content\"\n align=\"start\"\n className=\"p-1\"\n >\n <div className=\"max-h-64 overflow-y-auto\">\n {options.map((opt) => {\n const isSelected = selectedSet.has(opt.value);\n const isDisabled =\n opt.disabled ||\n (!isSelected && max !== undefined && value.length >= max);\n return (\n <Tile\n key={opt.value}\n type=\"button\"\n dense\n variant=\"quiet\"\n selected={isSelected}\n disabled={isDisabled}\n onClick={() => toggle(opt.value)}\n icon={opt.icon ? <opt.icon className=\"h-3.5 w-3.5\" /> : <Check className=\"h-3.5 w-3.5\" />}\n title={opt.label}\n className=\"w-full\"\n />\n );\n })}\n </div>\n </PopoverContent>\n </Popover>\n </div>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useId } from \"react\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { Field } from \"../../controls/controls\";\nimport type { SettingsCommonProps, SettingsControlSize } from \"../types\";\n\nexport type SettingsNumberInputProps = SettingsCommonProps & {\n value: number;\n onValueChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n /** When true, integers only. */\n integer?: boolean;\n unit?: string;\n size?: SettingsControlSize;\n width?: \"sm\" | \"md\" | \"lg\";\n last?: boolean;\n};\n\nconst widthClass = {\n sm: \"w-20 max-w-full min-w-0\",\n md: \"w-24 max-w-full min-w-0\",\n lg: \"w-32 max-w-full min-w-0\",\n};\n\nexport function SettingsNumberInput({\n value,\n onValueChange,\n min,\n max,\n step = 1,\n integer,\n unit,\n size: _size,\n width = \"sm\",\n last,\n ...rowProps\n}: SettingsNumberInputProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n const [draft, setDraft] = useState(String(value));\n\n useEffect(() => {\n setDraft(String(value));\n }, [value]);\n\n const commit = (raw: string) => {\n const parsed = integer ? parseInt(raw, 10) : parseFloat(raw);\n if (Number.isNaN(parsed)) {\n setDraft(String(value));\n return;\n }\n let next = parsed;\n if (min !== undefined) next = Math.max(min, next);\n if (max !== undefined) next = Math.min(max, next);\n onValueChange(next);\n setDraft(String(next));\n };\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant=\"inline\"\n controlLayout=\"wide\"\n last={last}\n >\n <div className=\"flex max-w-full flex-wrap items-center gap-1.5\">\n <Field\n id={id}\n type=\"number\"\n inputMode={integer ? \"numeric\" : \"decimal\"}\n value={draft}\n min={min}\n max={max}\n step={step}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={(e) => commit(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") (e.currentTarget as HTMLInputElement).blur();\n }}\n disabled={rowProps.disabled}\n className={widthClass[width]}\n />\n {unit && (\n <span className=\"type-secondary text-muted-foreground tabular-nums\">\n {unit}\n </span>\n )}\n </div>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { cn } from \"../../cn\";\nimport { Tile } from \"../../controls/surfaces\";\nimport type { SettingsCommonProps, SettingsOption } from \"../types\";\n\nexport type SettingsRadioGroupProps<T extends string = string> =\n SettingsCommonProps & {\n value: T;\n onValueChange: (value: T) => void;\n options: SettingsOption<T>[];\n /** How the radio options are arranged. Defaults to \"stacked\" which is readable on mobile. */\n orientation?: \"horizontal\" | \"stacked\";\n last?: boolean;\n };\n\nexport function SettingsRadioGroup<T extends string = string>({\n value,\n onValueChange,\n options,\n orientation = \"stacked\",\n last,\n ...rowProps\n}: SettingsRadioGroupProps<T>) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n return (\n <SettingsRow {...rowProps} id={id} variant=\"stacked\" last={last}>\n <div\n role=\"radiogroup\"\n aria-labelledby={id}\n className={cn(\n orientation === \"stacked\" ? \"flex flex-col gap-1.5\" : \"flex flex-wrap gap-2\",\n )}\n >\n {options.map((opt) => {\n const isSelected = opt.value === value;\n return (\n <Tile\n key={opt.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n disabled={opt.disabled || rowProps.disabled}\n onClick={() => onValueChange(opt.value)}\n variant=\"outline\"\n className={orientation === \"horizontal\" ? \"min-w-[120px] flex-1\" : \"w-full\"}\n icon={<span aria-hidden className={cn(\"size-4 rounded-full border-2 flex items-center justify-center\", isSelected ? \"border-primary\" : \"border-muted-foreground/40\")}>{isSelected ? <span className=\"size-2 rounded-full bg-primary\" /> : null}</span>}\n title={<span><span className=\"flex items-center gap-1.5\">{opt.icon ? <opt.icon className=\"h-3.5 w-3.5\" /> : null}<span className=\"type-title text-foreground\">{opt.label}</span></span>{opt.description ? <span className=\"mt-0.5 block type-secondary text-muted-foreground\">{opt.description}</span> : null}</span>}\n />\n );\n })}\n </div>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { Tabs } from \"../../controls/controls\";\nimport type {\n SettingsCommonProps,\n SettingsOption,\n SettingsControlSize,\n} from \"../types\";\n\nexport type SettingsSegmentedProps<T extends string = string> =\n SettingsCommonProps & {\n value: T;\n onValueChange: (value: T) => void;\n /** Read-only: shared vocabularies (agent-writable-settings) are `as const`. */\n options: readonly SettingsOption<T>[];\n size?: SettingsControlSize;\n /** Takes the full row width (stacks on mobile). */\n fullWidth?: boolean;\n last?: boolean;\n };\n\nexport function SettingsSegmented<T extends string = string>({\n value,\n onValueChange,\n options,\n fullWidth,\n last,\n // `size` is retired: the control has one geometry.\n size: _size,\n ...rowProps\n}: SettingsSegmentedProps<T>) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant={fullWidth ? \"stacked\" : \"inline\"}\n controlLayout=\"wide\"\n last={last}\n >\n <Tabs\n variant=\"capsule\"\n aria-label={rowProps.label}\n value={value}\n onValueChange={onValueChange}\n data={options.map((opt) => ({\n value: opt.value,\n label: opt.icon ? (\n <>\n <opt.icon />\n {opt.label}\n </>\n ) : (\n opt.label\n ),\n disabled: Boolean(opt.disabled || rowProps.disabled),\n }))}\n />\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId, useState } from \"react\";\nimport { CheckIcon as Check } from \"../../icons\";\nimport { SelectChevron } from \"../../select\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../../command\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../../popover\";\nimport { cn } from \"../../cn\";\nimport { Button } from \"../../controls/controls\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../select\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport type {\n SettingsCommonProps,\n SettingsOption,\n SettingsControlSize,\n} from \"../types\";\n\ntype Width = \"auto\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nconst widthClass: Record<Width, string> = {\n auto: \"w-full max-w-full @[40rem]/settings:w-auto @[40rem]/settings:min-w-32\",\n sm: \"w-32 max-w-full min-w-0\",\n md: \"w-44 max-w-full min-w-0\",\n lg: \"w-64 max-w-full min-w-0\",\n // The width of the ladder rows' model/voice pickers, so a screen mixing\n // both lines every control up on one edge.\n xl: \"w-80 max-w-full min-w-0\",\n full: \"w-full\",\n};\n\nconst triggerSize: Record<SettingsControlSize, \"sm\" | \"default\" | \"lg\"> = {\n sm: \"sm\",\n md: \"default\",\n lg: \"lg\",\n};\n\nconst triggerMinHeight: Record<SettingsControlSize, string> = {\n // 44px under touch or below lg — the same condition as the\n // matrx-touch-targets floor, which a min-h utility here would otherwise beat.\n sm: \"min-h-7 max-lg:min-h-11 pointer-coarse:min-h-11\",\n md: \"min-h-9 max-lg:min-h-11 pointer-coarse:min-h-11\",\n lg: \"min-h-10\",\n};\n\nexport type SettingsSelectProps<T extends string = string> =\n SettingsCommonProps & {\n value: T;\n onValueChange: (value: T) => void;\n /** Read-only: shared vocabularies (agent-writable-settings) are `as const`. */\n options: readonly SettingsOption<T>[];\n placeholder?: string;\n size?: SettingsControlSize;\n width?: Width;\n /** Renders as a stacked layout. Use when the select should span full width. */\n stacked?: boolean;\n last?: boolean;\n /** Long lists: a search box that filters by label and value (case-insensitive contains). */\n searchable?: boolean;\n searchPlaceholder?: string;\n };\n\n/** Case-insensitive contains over the label and the raw value; \"/\" and \"_\" read as spaces. */\nexport function matchesSettingsOption(\n query: string,\n option: { label: string; value: string },\n): boolean {\n const norm = (t: string) => t.toLowerCase().replace(/[_/]/g, \" \");\n const q = norm(query).trim();\n if (!q) return true;\n return norm(option.label).includes(q) || norm(option.value).includes(q);\n}\n\n/**\n * Radix Select reads a value of \"\" as \"nothing selected\" and shows a blank\n * trigger, so an option whose value IS \"\" (a \"None\" choice — e.g. voice\n * emotion) looked unset even while it was the saved choice. Every settings\n * select maps \"\" to this token on the way in and back to \"\" on the way out.\n */\nconst EMPTY_OPTION_VALUE = \"__settings-empty-option__\";\n\nexport function SettingsSelect<T extends string = string>({\n value,\n onValueChange,\n options,\n placeholder,\n size = \"md\",\n width = \"md\",\n stacked,\n last,\n searchable,\n searchPlaceholder = \"Search\",\n ...rowProps\n}: SettingsSelectProps<T>) {\n const [open, setOpen] = useState(false);\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n const variant = stacked ? \"stacked\" : \"inline\";\n const effectiveWidth: Width = stacked ? \"full\" : width;\n // Only a select that OFFERS \"\" as a choice maps it; elsewhere \"\" still\n // means \"not chosen yet\" and the placeholder shows.\n const hasEmptyOption = options.some((opt) => opt.value === \"\");\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant={variant}\n controlLayout=\"wide\"\n last={last}\n >\n {searchable ? (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n id={id}\n role=\"combobox\"\n aria-expanded={open}\n iconEnd={<SelectChevron size=\"sm\" />}\n disabled={rowProps.disabled ?? false}\n className={widthClass[effectiveWidth]}\n >\n <span className=\"truncate\">\n {options.find((o) => o.value === value)?.label ??\n placeholder ??\n value}\n </span>\n </Button>\n </PopoverTrigger>\n <PopoverContent sizing=\"content\" className=\"p-0\" align=\"end\">\n <Command\n filter={(itemValue, search) => {\n const opt = options.find((o) => o.value === itemValue);\n return opt ? (matchesSettingsOption(search, opt) ? 1 : 0) : 0;\n }}\n >\n <CommandInput\n placeholder={searchPlaceholder}\n className=\"h-9 text-sm\"\n />\n <CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup className=\"max-h-72 overflow-auto\">\n {options.map((opt) => (\n <CommandItem\n key={opt.value}\n value={opt.value}\n disabled={opt.disabled ?? false}\n onSelect={() => {\n onValueChange(opt.value as T);\n setOpen(false);\n }}\n >\n <Check\n className={cn(\n \"mr-2 h-3.5 w-3.5\",\n opt.value === value ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n {opt.label}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n ) : (\n <Select\n value={value === \"\" && hasEmptyOption ? EMPTY_OPTION_VALUE : value}\n onValueChange={(v) =>\n onValueChange((v === EMPTY_OPTION_VALUE ? \"\" : v) as T)\n }\n disabled={rowProps.disabled ?? false}\n >\n <SelectTrigger\n id={id}\n size={triggerSize[size]}\n className={`${widthClass[effectiveWidth]} h-auto ${triggerMinHeight[size]} whitespace-normal text-left [&>span]:line-clamp-none [&>span]:whitespace-normal`}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((opt) => (\n <SelectItem\n key={opt.value}\n value={opt.value === \"\" ? EMPTY_OPTION_VALUE : opt.value}\n disabled={opt.disabled ?? false}\n // Outside ItemText via the prop — a description passed as a\n // child ends up inside the closed trigger and gets clipped.\n {...(opt.description === undefined ? {} : { description: opt.description })}\n >\n <span className=\"flex items-center gap-2\">\n {opt.icon && <opt.icon className=\"h-3.5 w-3.5\" />}\n <span>{opt.label}</span>\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport { Slider } from \"../../slider\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport type { SettingsCommonProps } from \"../types\";\n\nexport type SettingsSliderProps = SettingsCommonProps & {\n value: number;\n onValueChange: (value: number) => void;\n /**\n * Fires once when the drag ends (Radix onValueCommit). Use it when each\n * write is a network/database round-trip: track the drag with local state\n * via `onValueChange`, persist here.\n */\n onValueCommit?: (value: number) => void;\n min: number;\n max: number;\n step?: number;\n /** Label shown on the low end (e.g. \"Slow\"). */\n minLabel?: string;\n /** Label shown in the middle (e.g. \"Balanced\"). */\n midLabel?: string;\n /** Label shown on the high end (e.g. \"Fast\"). */\n maxLabel?: string;\n /** Fixed decimal places for the numeric display. Defaults to 0 for ints, 2 for floats. */\n precision?: number;\n /** Optional unit string shown next to value (e.g. \"px\", \"%\"). */\n unit?: string;\n last?: boolean;\n};\n\nexport function SettingsSlider({\n value,\n onValueChange,\n onValueCommit,\n min,\n max,\n step = 1,\n minLabel,\n midLabel,\n maxLabel,\n precision,\n unit,\n last,\n ...rowProps\n}: SettingsSliderProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n const effectivePrecision =\n precision !== undefined\n ? precision\n : step >= 1 || Number.isInteger(step)\n ? 0\n : 2;\n const display = value.toFixed(effectivePrecision);\n\n return (\n <SettingsRow {...rowProps} id={id} variant=\"stacked\" last={last}>\n <div className=\"space-y-2\">\n <div className=\"flex min-w-0 items-center justify-between gap-2\">\n <span className=\"min-w-0 break-words type-secondary text-muted-foreground tabular-nums\">\n {display}\n {unit}\n </span>\n <span className=\"min-w-0 break-words text-right type-secondary text-muted-foreground tabular-nums\">\n {min} – {max}\n </span>\n </div>\n <Slider\n id={id}\n min={min}\n max={max}\n step={step}\n value={[value]}\n onValueChange={(v) => onValueChange(v[0] ?? min)}\n {...(onValueCommit ? { onValueCommit: (v: number[]) => onValueCommit(v[0] ?? min) } : {})}\n disabled={rowProps.disabled ?? false}\n />\n {(minLabel || midLabel || maxLabel) && (\n <div className=\"flex min-w-0 justify-between gap-2 type-meta text-muted-foreground\">\n <span className=\"min-w-0 break-words\">{minLabel}</span>\n <span className=\"hidden sm:inline\">{midLabel}</span>\n <span className=\"min-w-0 break-words text-right\">{maxLabel}</span>\n </div>\n )}\n </div>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId } from \"react\";\nimport { Switch } from \"../../controls/controls\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport type { SettingsCommonProps } from \"../types\";\n\nexport type SettingsSwitchProps = SettingsCommonProps & {\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n /** Controls whether the row renders a border underneath. */\n last?: boolean;\n};\n\nexport function SettingsSwitch({\n checked,\n onCheckedChange,\n last,\n ...rowProps\n}: SettingsSwitchProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n return (\n <SettingsRow {...rowProps} id={id} variant=\"inline\" last={last}>\n {/* The switch stays its painted size; its label carries the 44px\n touch ring (matrx-tap-area) so a finger can hit it on a phone. */}\n <label htmlFor={id} className=\"matrx-tap-area inline-flex\">\n <Switch\n id={id}\n checked={checked}\n onCheckedChange={onCheckedChange}\n disabled={rowProps.disabled}\n />\n </label>\n </SettingsRow>\n );\n}\n","\"use client\";\n\nimport { useId, useState } from \"react\";\nimport { SettingsRow } from \"../SettingsRow\";\nimport { Field } from \"../../controls/controls\";\nimport type { SettingsCommonProps, SettingsControlSize } from \"../types\";\n\nconst widthClass = {\n sm: \"w-32 max-w-full min-w-0\",\n md: \"w-48 max-w-full min-w-0\",\n lg: \"w-72 max-w-full min-w-0\",\n full: \"w-full\",\n};\n\nexport type SettingsTextInputProps = SettingsCommonProps & {\n value: string;\n onValueChange: (value: string) => void;\n placeholder?: string;\n type?: \"text\" | \"email\" | \"url\" | \"password\" | \"tel\";\n inputMode?: \"text\" | \"email\" | \"url\" | \"tel\" | \"numeric\" | \"decimal\";\n /** Commit on blur/enter instead of every keystroke. Useful for expensive writes. */\n commitOnBlur?: boolean;\n maxLength?: number;\n size?: SettingsControlSize;\n width?: \"sm\" | \"md\" | \"lg\" | \"full\";\n /** Renders as a stacked layout so the input can be full-width. */\n stacked?: boolean;\n last?: boolean;\n};\n\nexport function SettingsTextInput({\n value,\n onValueChange,\n placeholder,\n type = \"text\",\n inputMode,\n commitOnBlur,\n maxLength,\n size: _size,\n width = \"md\",\n stacked,\n last,\n ...rowProps\n}: SettingsTextInputProps) {\n const generatedId = useId().replace(/:/g, \"\");\n const id = rowProps.id ?? `settings-${generatedId}`;\n\n const [draft, setDraft] = useState(value);\n const [lastCommittedValue, setLastCommittedValue] = useState(value);\n\n if (commitOnBlur && value !== lastCommittedValue) {\n setLastCommittedValue(value);\n setDraft(value);\n }\n\n const effective = commitOnBlur ? draft : value;\n const effectiveWidth = stacked ? \"full\" : width;\n\n return (\n <SettingsRow\n {...rowProps}\n id={id}\n variant={stacked ? \"stacked\" : \"inline\"}\n controlLayout=\"wide\"\n last={last}\n >\n <Field\n id={id}\n type={type}\n inputMode={inputMode}\n value={effective}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={rowProps.disabled}\n onChange={(e) => {\n if (commitOnBlur) setDraft(e.target.value);\n else onValueChange(e.target.value);\n }}\n onBlur={() => {\n if (commitOnBlur && draft !== value) {\n onValueChange(draft);\n }\n }}\n onKeyDown={(e) => {\n if (commitOnBlur && e.key === \"Enter\")\n (e.currentTarget as HTMLInputElement).blur();\n }}\n className={widthClass[effectiveWidth]}\n />\n </SettingsRow>\n );\n}\n","import type { SettingsIconType as LucideIcon } from \"../icon-type\";\nimport type { SettingsBadge } from \"../types\";\n\n/**\n * A node in the settings hierarchy.\n * - Has children: renders as a category (expandable on desktop, push-nav on mobile)\n * - No children: renders as a leaf (clicking activates the tab)\n */\nexport type SettingsTreeNode = {\n id: string;\n label: string;\n icon?: LucideIcon | undefined;\n /** Short summary shown under the label in mobile drawer and tree hover. */\n description?: string | undefined;\n /** When provided, the node is a category with sub-nodes. */\n children?: SettingsTreeNode[] | undefined;\n /** The folder itself has a page in addition to its children. */\n navigable?: boolean | undefined;\n navigationLabel?: string | undefined;\n /** Inline badge: built-in variants from SettingsBadge, or the special \"unsaved\" string for a dot indicator. */\n badge?: SettingsBadge | \"unsaved\" | undefined;\n /** Disabled leaves/categories can't be activated/expanded. */\n disabled?: boolean | undefined;\n /** Free-text keywords searched alongside label/description. */\n searchKeywords?: string[] | undefined;\n};\n\n/** Flatten the tree into every destination, including folders with their own page. */\nexport function flattenLeaves(nodes: SettingsTreeNode[]): SettingsTreeNode[] {\n const out: SettingsTreeNode[] = [];\n const walk = (arr: SettingsTreeNode[]) => {\n for (const n of arr) {\n if (n.navigable || !n.children?.length) out.push(n);\n if (n.children?.length) walk(n.children);\n }\n };\n walk(nodes);\n return out;\n}\n\n/** Returns the ancestor id path for a target node id (excluding the target itself). */\nexport function findAncestorPath(\n nodes: SettingsTreeNode[],\n targetId: string,\n): string[] {\n const path: string[] = [];\n const visit = (arr: SettingsTreeNode[], trail: string[]): boolean => {\n for (const n of arr) {\n if (n.id === targetId) {\n path.push(...trail);\n return true;\n }\n if (n.children && visit(n.children, [...trail, n.id])) return true;\n }\n return false;\n };\n visit(nodes, []);\n return path;\n}\n\n/**\n * Build the mobile drawer stack for an externally selected setting.\n *\n * Deep links activate a leaf before the drawer mounts. The drawer must start\n * on that leaf, including every ancestor screen, rather than discarding the\n * active id and showing its root list.\n */\nexport function getDrawerPathForActiveId(\n nodes: SettingsTreeNode[],\n activeId: string | null,\n): string[] {\n if (!activeId || !findNodeById(nodes, activeId)) return [];\n return [...findAncestorPath(nodes, activeId), activeId];\n}\n\n/** Find a single node by id anywhere in the tree. */\nexport function findNodeById(\n nodes: SettingsTreeNode[],\n id: string,\n): SettingsTreeNode | null {\n for (const n of nodes) {\n if (n.id === id) return n;\n if (n.children) {\n const found = findNodeById(n.children, id);\n if (found) return found;\n }\n }\n return null;\n}\n\n/**\n * Returns an array of [id, matchScore] pairs ranked by relevance.\n * Matches label (highest), keywords, description. Case-insensitive.\n */\nexport function searchTree(\n nodes: SettingsTreeNode[],\n query: string,\n): Set<string> {\n const matches = new Set<string>();\n const q = query.trim().toLowerCase();\n if (!q) return matches;\n const walk = (arr: SettingsTreeNode[]) => {\n for (const n of arr) {\n const haystack = [\n n.label,\n n.description ?? \"\",\n ...(n.searchKeywords ?? []),\n ]\n .join(\" \")\n .toLowerCase();\n if (haystack.includes(q)) matches.add(n.id);\n if (n.children) walk(n.children);\n }\n };\n walk(nodes);\n return matches;\n}\n\n/**\n * Given a set of matching node ids, returns a set of every id that should be\n * visible — matching ids plus all their ancestors — so that the tree can keep\n * path structure when filtering.\n */\nexport function withAncestors(\n nodes: SettingsTreeNode[],\n ids: Set<string>,\n): Set<string> {\n const visible = new Set(ids);\n for (const id of ids) {\n for (const anc of findAncestorPath(nodes, id)) visible.add(anc);\n }\n return visible;\n}\n","\"use client\";\n\nimport { Loader2Icon as Loader2 } from \"../../icons\";\n\n/** lucide `slash` — the breadcrumb separator. */\nfunction Slash({ className }: { className?: string }) {\n return (\n <svg aria-hidden xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M22 2 2 22\" />\n </svg>\n );\n}\nimport { type SettingsTreeNode, findAncestorPath, findNodeById } from \"./types\";\n\nimport { Button } from \"../../controls/controls\";\ntype SettingsBreadcrumbProps = {\n nodes: SettingsTreeNode[];\n activeId: string | null;\n /** Root label shown as the first crumb. */\n rootLabel?: string;\n /** Click handler for crumbs — usually navigates via the registry. */\n onNavigate?: (id: string | null) => void;\n /** Disables duplicate navigation and announces the active route change. */\n navigationPending?: boolean;\n};\n\n/**\n * Renders a compact breadcrumb trail for the active settings path:\n * \"Settings / Appearance / Theme\"\n */\nexport function SettingsBreadcrumb({\n nodes,\n activeId,\n rootLabel = \"Settings\",\n onNavigate,\n navigationPending = false,\n}: SettingsBreadcrumbProps) {\n const ancestors = activeId ? findAncestorPath(nodes, activeId) : [];\n const active = activeId ? findNodeById(nodes, activeId) : null;\n\n return (\n <nav\n aria-label=\"Breadcrumb\"\n aria-busy={navigationPending}\n className=\"flex min-w-0 items-center gap-1 overflow-x-auto type-secondary text-muted-foreground\"\n >\n <Crumb\n label={rootLabel}\n onClick={onNavigate ? () => onNavigate(null) : undefined}\n interactive\n disabled={navigationPending}\n />\n {ancestors.map((id) => {\n const node = findNodeById(nodes, id);\n if (!node) return null;\n return (\n <span key={id} className=\"flex min-w-0 items-center gap-1\">\n <Slash className=\"h-3 w-3 text-muted-foreground\" />\n <Crumb\n label={node.label}\n onClick={onNavigate ? () => onNavigate(id) : undefined}\n interactive\n disabled={navigationPending}\n />\n </span>\n );\n })}\n {active && (\n <span className=\"flex min-w-0 items-center gap-1\">\n <Slash className=\"h-3 w-3 text-muted-foreground\" />\n <span className=\"truncate font-medium text-foreground\">\n {active.label}\n </span>\n </span>\n )}\n {navigationPending ? (\n <Loader2\n className=\"ml-1 h-3.5 w-3.5 shrink-0 animate-spin\"\n aria-label=\"Opening settings section\"\n />\n ) : null}\n </nav>\n );\n}\n\nfunction Crumb({\n label,\n onClick,\n interactive,\n disabled,\n}: {\n label: string;\n onClick?: (() => void) | undefined;\n interactive?: boolean | undefined;\n disabled?: boolean | undefined;\n}) {\n if (interactive && onClick) {\n return (\n <Button variant=\"quiet\" onClick={onClick} disabled={disabled}>{label}</Button>\n );\n }\n return <span>{label}</span>;\n}\n","\"use client\";\n\nimport { useState, useMemo } from \"react\";\nimport { ChevronLeftIcon as ChevronLeft, ChevronRightIcon as ChevronRight, SettingsIcon as SettingsIcon, XIcon as X } from \"../../icons\";\nimport { Drawer, DrawerContent, DrawerTitle } from \"../../drawer\";\nimport { Button, SearchField } from \"../../controls/controls\";\nimport { Tile } from \"../../controls/surfaces\";\nimport {\n type SettingsTreeNode,\n findNodeById,\n getDrawerPathForActiveId,\n searchTree,\n flattenLeaves,\n} from \"./types\";\n\ntype SettingsDrawerNavProps = {\n nodes: SettingsTreeNode[];\n activeId: string | null;\n onActivate: (id: string) => void;\n /** Render the tab body for the active leaf node. */\n renderTab: (node: SettingsTreeNode) => React.ReactNode;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Title shown on the root screen header. */\n title?: string;\n unsavedIds?: Set<string> | undefined;\n};\n\n/**\n * iOS-style hierarchical push-nav inside a bottom drawer.\n *\n * Three screens:\n * 1. Root category/leaf list\n * 2. Sub-category list (slides in from right when category tapped)\n * 3. Leaf tab content (slides in from right when leaf tapped)\n *\n * Back button pops the stack. Closing the drawer resets the stack.\n */\nexport function SettingsDrawerNav({\n nodes,\n activeId,\n onActivate,\n renderTab,\n open,\n onOpenChange,\n title = \"Settings\",\n unsavedIds,\n}: SettingsDrawerNavProps) {\n // Path: list of node ids representing the current navigation stack.\n // - [] = root list\n // - [catId] = sub-list of catId (which must be a folder)\n // - [..., leafId] = leaf content (last is leaf)\n const [path, setPath] = useState<string[]>(() =>\n getDrawerPathForActiveId(nodes, activeId),\n );\n const [folderTabId, setFolderTabId] = useState<string | null>(() =>\n activeId && findNodeById(nodes, activeId)?.navigable ? activeId : null,\n );\n const [query, setQuery] = useState(\"\");\n\n const handleOpenChange = (next: boolean) => {\n if (!next) {\n setPath([]);\n setFolderTabId(null);\n setQuery(\"\");\n }\n onOpenChange(next);\n };\n\n const pushId = (id: string) => setPath((p) => [...p, id]);\n const popOne = () => {\n if (folderTabId) setFolderTabId(null);\n else setPath((p) => p.slice(0, -1));\n };\n\n const currentId = path[path.length - 1] ?? null;\n const currentNode = currentId ? findNodeById(nodes, currentId) : null;\n const isLeaf = Boolean(\n currentNode && (!currentNode.children?.length || folderTabId === currentId),\n );\n\n // The list-of-nodes shown in the current screen (root or category)\n const listNodes = useMemo<SettingsTreeNode[]>(() => {\n if (!currentNode || isLeaf) return nodes;\n return currentNode.children ?? [];\n }, [currentNode, isLeaf, nodes]);\n\n // Search only applies at the root screen for simplicity — gives a flat result\n const searchMatches = useMemo(() => {\n if (!query.trim()) return null;\n const matched = searchTree(nodes, query);\n return flattenLeaves(nodes).filter((l) => matched.has(l.id));\n }, [nodes, query]);\n\n const handleItemTap = (node: SettingsTreeNode) => {\n if (node.disabled) return;\n if (node.children && node.children.length > 0) {\n pushId(node.id);\n setQuery(\"\");\n } else {\n onActivate(node.id);\n pushId(node.id);\n setQuery(\"\");\n }\n };\n\n const headerTitle = isLeaf\n ? currentNode?.label\n : currentNode\n ? currentNode.label\n : title;\n const backLabel = folderTabId\n ? (currentNode?.label ?? title)\n : path.length > 1\n ? (findNodeById(nodes, path[path.length - 2] ?? \"\")?.label ?? title)\n : title;\n\n return (\n <Drawer open={open} onOpenChange={handleOpenChange}>\n <DrawerContent className=\"h-[85dvh] flex flex-col\">\n <DrawerTitle className=\"sr-only\">{title}</DrawerTitle>\n\n {/* Header */}\n <div className=\"flex items-center justify-between gap-2 px-3 py-2.5 border-b border-border shrink-0\">\n {path.length === 0 ? (\n <div className=\"flex items-center gap-2 min-w-0\">\n <SettingsIcon className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"type-title truncate\">{title}</span>\n </div>\n ) : (\n <Button\n type=\"button\"\n variant=\"quiet\"\n icon={<ChevronLeft className=\"h-4 w-4\" />}\n onClick={popOne}\n className=\"min-w-0 max-w-[calc(100%-5rem)] -ml-2\"\n >\n {backLabel}\n </Button>\n )}\n <div className=\"flex-1 flex items-center justify-center min-w-0 px-2\">\n {path.length > 0 && (\n <span className=\"type-title truncate\">\n {headerTitle}\n </span>\n )}\n </div>\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label=\"Close\"\n icon={<X className=\"h-4 w-4\" />}\n onClick={() => handleOpenChange(false)}\n />\n </div>\n\n {/* Screen stack: only the current screen is rendered, with slide animation */}\n <div className=\"flex-1 min-h-0 overflow-hidden relative\">\n <div\n key={path.join(\"/\") || \"root\"}\n className=\"absolute inset-0 overflow-y-auto overscroll-contain\"\n style={path.length > 0 ? { animation: \"drawerPush 180ms cubic-bezier(0.4, 0, 0.2, 1) both\" } : undefined}\n >\n {isLeaf && currentNode ? (\n <div className=\"pb-safe\">{renderTab(currentNode)}</div>\n ) : (\n <>\n {/* Search bar only on the root screen */}\n {path.length === 0 && (\n <div className=\"relative px-3 py-2 border-b border-border sticky top-0 bg-background z-10\">\n <SearchField\n placeholder=\"Search settings\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n end={query ? <span aria-hidden=\"true\" className=\"w-7 shrink-0\" /> : undefined}\n className=\"w-full\"\n />\n {query && (\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label=\"Clear search\"\n icon={<X className=\"h-4 w-4\" />}\n onClick={() => setQuery(\"\")}\n className=\"absolute right-5 top-1/2 -translate-y-1/2\"\n />\n )}\n </div>\n )}\n\n {searchMatches ? (\n <div className=\"pb-safe\">\n {searchMatches.length === 0 ? (\n <div className=\"px-4 py-8 text-center type-body text-muted-foreground\">\n No settings match \"{query}\".\n </div>\n ) : (\n searchMatches.map((n) => (\n <DrawerRow\n key={n.id}\n node={n}\n activeId={activeId}\n hasChevron\n onTap={handleItemTap}\n unsavedIds={unsavedIds}\n />\n ))\n )}\n </div>\n ) : (\n <div className=\"pb-safe\">\n {currentNode?.navigable ? (\n <DrawerRow\n node={{\n ...currentNode,\n label:\n currentNode.navigationLabel ?? currentNode.label,\n children: undefined,\n }}\n activeId={activeId}\n hasChevron\n onTap={() => {\n onActivate(currentNode.id);\n setFolderTabId(currentNode.id);\n }}\n unsavedIds={unsavedIds}\n />\n ) : null}\n {listNodes.map((n) => (\n <DrawerRow\n key={n.id}\n node={n}\n activeId={activeId}\n hasChevron\n onTap={handleItemTap}\n unsavedIds={unsavedIds}\n />\n ))}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n\n <style>{`\n @keyframes drawerPush {\n from {\n transform: translateX(24%);\n opacity: 0;\n }\n to {\n transform: translateX(0%);\n opacity: 1;\n }\n }\n `}</style>\n </DrawerContent>\n </Drawer>\n );\n}\n\ntype DrawerRowProps = {\n node: SettingsTreeNode;\n activeId: string | null;\n hasChevron: boolean;\n onTap: (node: SettingsTreeNode) => void;\n unsavedIds?: Set<string> | undefined;\n};\n\nfunction DrawerRow({\n node,\n activeId,\n hasChevron,\n onTap,\n unsavedIds,\n}: DrawerRowProps) {\n const isActive = node.id === activeId;\n const hasUnsaved = unsavedIds?.has(node.id) ?? node.badge === \"unsaved\";\n\n return (\n <Tile\n type=\"button\"\n onClick={() => onTap(node)}\n disabled={node.disabled}\n variant=\"quiet\"\n selected={isActive}\n className=\"w-full\"\n icon={node.icon ? <node.icon className=\"h-4 w-4\" /> : undefined}\n title={<span className=\"flex items-center gap-1.5\">{node.label}{hasUnsaved ? <span aria-label=\"Unsaved changes\" className=\"h-1.5 w-1.5 rounded-full bg-primary shrink-0\" /> : null}</span>}\n line={node.description}\n end={hasChevron ? <ChevronRight className=\"h-4 w-4 text-muted-foreground shrink-0\" /> : undefined}\n />\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport {\n filterSettingsNavigationSections,\n SettingsFlatNavigation,\n SettingsNavigationSearch,\n settingsNavigationSections,\n} from \"../navigation/SettingsFlatNavigation\";\nimport { Tile } from \"../../controls/surfaces\";\nimport type { SettingsTreeNode } from \"./types\";\n\ntype SettingsTreeProps = {\n nodes: SettingsTreeNode[];\n activeId: string | null;\n onActivate: (id: string) => void;\n unsavedIds?: Set<string>;\n searchable?: boolean;\n query?: string;\n onQueryChange?: (query: string) => void;\n searchResults?: ReactNode;\n hasSearchResults?: boolean;\n};\n\n/**\n * The overlay's settings navigation shares the route menu's flat section model.\n * Folder state is deliberately absent: headings provide orientation and every\n * available setting remains reachable without an accordion interaction.\n */\nexport function SettingsTree({\n nodes,\n activeId,\n onActivate,\n unsavedIds,\n searchable = true,\n query: controlledQuery,\n onQueryChange,\n searchResults,\n hasSearchResults = false,\n}: SettingsTreeProps) {\n const [internalQuery, setInternalQuery] = useState(\"\");\n const query = controlledQuery ?? internalQuery;\n const setQuery = onQueryChange ?? setInternalQuery;\n const searchRef = useRef<HTMLInputElement | null>(null);\n const treeRef = useRef<HTMLDivElement | null>(null);\n const sections = filterSettingsNavigationSections(settingsNavigationSections(nodes), query);\n\n useEffect(() => {\n const element = treeRef.current;\n if (!element) return undefined;\n const onKey = (event: KeyboardEvent) => {\n if (event.key === \"/\" && document.activeElement !== searchRef.current) {\n event.preventDefault();\n searchRef.current?.focus();\n }\n };\n element.addEventListener(\"keydown\", onKey);\n return () => element.removeEventListener(\"keydown\", onKey);\n }, []);\n\n return (\n <div ref={treeRef} className=\"flex h-full flex-col border-r border-border bg-card/20\" aria-label=\"Settings navigation\">\n {searchable ? <div className=\"shrink-0 border-b border-border px-2 py-2\"><SettingsNavigationSearch value={query} onValueChange={setQuery} inputRef={searchRef} /></div> : null}\n <div className=\"flex-1 overflow-y-auto py-1\">\n {searchResults}\n {sections.length > 0 ? <SettingsFlatNavigation\n sections={sections}\n activeId={activeId}\n renderItem={(item, active) => {\n const unsaved = unsavedIds?.has(item.id) ?? item.node.badge === \"unsaved\";\n return <Tile id={`settings-nav-${item.id}`} type=\"button\" disabled={item.node.disabled} onClick={() => !item.node.disabled && onActivate(item.id)} dense variant=\"quiet\" selected={active} className=\"w-full\" icon={item.node.icon ? <item.node.icon className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" /> : undefined} title={item.label} end={unsaved ? <span aria-label=\"Unsaved changes\" className=\"h-1.5 w-1.5 shrink-0 rounded-full bg-primary\" /> : undefined} aria-current={active ? \"page\" : undefined} />;\n }}\n /> : !hasSearchResults ? <p className=\"px-3 py-6 type-body text-muted-foreground\">{query ? `No settings match \"${query}\".` : \"No settings available.\"}</p> : null}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["jsx","jsx","jsx","Popover","createContext","useContext","jsx","jsx","jsxs","jsx","jsxs","jsx","useId","useState","jsx","jsxs","useId","useState","useId","useState","Fragment","jsx","jsxs","useState","useId","jsx","jsxs","jsx","jsxs","useId","jsx","useId","useId","jsx","useId","useState","useId","jsx","jsxs","useId","useState","useId","jsx","jsxs","useId","useId","useState","jsx","jsxs","useId","useState","useId","jsx","jsxs","useId","useId","useState","jsx","jsxs","useId","useState","useState","useEffect","useId","jsx","jsxs","widthClass","useId","useState","useEffect","useId","jsx","jsxs","useId","useId","Fragment","jsx","jsxs","useId","useId","useState","jsx","jsxs","widthClass","useState","useId","useId","jsx","jsxs","useId","useId","jsx","useId","useId","useState","jsx","widthClass","useId","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect"]}