@alfadocs/ui-kit-debug 0.82.0 → 0.84.0

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 (156) hide show
  1. package/dist/_chunks/{actions-cell-renderer-DLrcSTK_.js → actions-cell-renderer-DaL80uqL.js} +2 -2
  2. package/dist/_chunks/{actions-cell-renderer-DLrcSTK_.js.map → actions-cell-renderer-DaL80uqL.js.map} +1 -1
  3. package/dist/_chunks/chart-GFLv4cXm.js +609 -0
  4. package/dist/_chunks/chart-GFLv4cXm.js.map +1 -0
  5. package/dist/_chunks/dashboard-grid-D2dm0IRN.js +691 -0
  6. package/dist/_chunks/dashboard-grid-D2dm0IRN.js.map +1 -0
  7. package/dist/_chunks/{editable-currency-cell-renderer-GwfA9tTR.js → editable-currency-cell-renderer-Dus_sBvX.js} +2 -2
  8. package/dist/_chunks/{editable-currency-cell-renderer-GwfA9tTR.js.map → editable-currency-cell-renderer-Dus_sBvX.js.map} +1 -1
  9. package/dist/_chunks/{face-scheme-C0rk21gg.js → face-scheme-CjQAHvSP.js} +2 -2
  10. package/dist/_chunks/{face-scheme-C0rk21gg.js.map → face-scheme-CjQAHvSP.js.map} +1 -1
  11. package/dist/_chunks/{file-manager-DfTG7bxx.js → file-manager-DLJlinIO.js} +3 -3
  12. package/dist/_chunks/{file-manager-DfTG7bxx.js.map → file-manager-DLJlinIO.js.map} +1 -1
  13. package/dist/_chunks/{header-settings-DMfdx0Vq.js → header-settings-CLwFqMHI.js} +2 -2
  14. package/dist/_chunks/{header-settings-DMfdx0Vq.js.map → header-settings-CLwFqMHI.js.map} +1 -1
  15. package/dist/_chunks/{icon-button-group-C_lqXTAj.js → icon-button-group-BLHPN6jg.js} +178 -163
  16. package/dist/_chunks/icon-button-group-BLHPN6jg.js.map +1 -0
  17. package/dist/_chunks/{marketplace-app-shell-Bxq1PYAj.js → marketplace-app-shell-Br2yebEK.js} +2 -2
  18. package/dist/_chunks/{marketplace-app-shell-Bxq1PYAj.js.map → marketplace-app-shell-Br2yebEK.js.map} +1 -1
  19. package/dist/_chunks/{patient-table-DweKjiXg.js → patient-table-BHzmUbzu.js} +2 -2
  20. package/dist/_chunks/{patient-table-DweKjiXg.js.map → patient-table-BHzmUbzu.js.map} +1 -1
  21. package/dist/_chunks/{theme-toggle-BJCz_UOi.js → theme-toggle-B4mOrQX1.js} +2 -2
  22. package/dist/_chunks/{theme-toggle-BJCz_UOi.js.map → theme-toggle-B4mOrQX1.js.map} +1 -1
  23. package/dist/_chunks/widget-picker-DEmTVuFL.js +193 -0
  24. package/dist/_chunks/widget-picker-DEmTVuFL.js.map +1 -0
  25. package/dist/agent-catalog.json +238 -4
  26. package/dist/agent-i18n/en.json +27 -1
  27. package/dist/components/chart/chart.agent.d.ts.map +1 -1
  28. package/dist/components/chart/chart.d.ts +36 -1
  29. package/dist/components/chart/chart.d.ts.map +1 -1
  30. package/dist/components/chart/index.js +1 -1
  31. package/dist/components/dashboard-grid/dashboard-grid-engine.d.ts +37 -0
  32. package/dist/components/dashboard-grid/dashboard-grid-engine.d.ts.map +1 -0
  33. package/dist/components/dashboard-grid/dashboard-grid.agent.d.ts +4 -0
  34. package/dist/components/dashboard-grid/dashboard-grid.agent.d.ts.map +1 -0
  35. package/dist/components/dashboard-grid/dashboard-grid.d.ts +74 -0
  36. package/dist/components/dashboard-grid/dashboard-grid.d.ts.map +1 -0
  37. package/dist/components/dashboard-grid/index.d.ts +3 -0
  38. package/dist/components/dashboard-grid/index.d.ts.map +1 -0
  39. package/dist/components/dashboard-grid/index.js +6 -0
  40. package/dist/components/dashboard-grid/index.js.map +1 -0
  41. package/dist/components/data-table/index.js +2 -2
  42. package/dist/components/face-scheme/index.js +1 -1
  43. package/dist/components/file-manager/index.js +1 -1
  44. package/dist/components/header-settings/index.js +1 -1
  45. package/dist/components/icon-button-group/icon-button-group.d.ts.map +1 -1
  46. package/dist/components/icon-button-group/index.js +1 -1
  47. package/dist/components/index.d.ts +2 -0
  48. package/dist/components/index.d.ts.map +1 -1
  49. package/dist/components/patient-table/index.js +1 -1
  50. package/dist/components/theme-toggle/index.js +1 -1
  51. package/dist/components/widget-picker/index.d.ts +3 -0
  52. package/dist/components/widget-picker/index.d.ts.map +1 -0
  53. package/dist/components/widget-picker/index.js +6 -0
  54. package/dist/components/widget-picker/index.js.map +1 -0
  55. package/dist/components/widget-picker/widget-picker.agent.d.ts +4 -0
  56. package/dist/components/widget-picker/widget-picker.agent.d.ts.map +1 -0
  57. package/dist/components/widget-picker/widget-picker.d.ts +49 -0
  58. package/dist/components/widget-picker/widget-picker.d.ts.map +1 -0
  59. package/dist/i18n/locales/ar.d.ts +29 -0
  60. package/dist/i18n/locales/ar.d.ts.map +1 -1
  61. package/dist/i18n/locales/ar.js +29 -0
  62. package/dist/i18n/locales/ar.js.map +1 -1
  63. package/dist/i18n/locales/de.d.ts +29 -0
  64. package/dist/i18n/locales/de.d.ts.map +1 -1
  65. package/dist/i18n/locales/de.js +29 -0
  66. package/dist/i18n/locales/de.js.map +1 -1
  67. package/dist/i18n/locales/el.d.ts +29 -0
  68. package/dist/i18n/locales/el.d.ts.map +1 -1
  69. package/dist/i18n/locales/el.js +29 -0
  70. package/dist/i18n/locales/el.js.map +1 -1
  71. package/dist/i18n/locales/en.d.ts +29 -0
  72. package/dist/i18n/locales/en.d.ts.map +1 -1
  73. package/dist/i18n/locales/en.js +29 -0
  74. package/dist/i18n/locales/en.js.map +1 -1
  75. package/dist/i18n/locales/es.d.ts +29 -0
  76. package/dist/i18n/locales/es.d.ts.map +1 -1
  77. package/dist/i18n/locales/es.js +29 -0
  78. package/dist/i18n/locales/es.js.map +1 -1
  79. package/dist/i18n/locales/fr.d.ts +29 -0
  80. package/dist/i18n/locales/fr.d.ts.map +1 -1
  81. package/dist/i18n/locales/fr.js +29 -0
  82. package/dist/i18n/locales/fr.js.map +1 -1
  83. package/dist/i18n/locales/hi.d.ts +29 -0
  84. package/dist/i18n/locales/hi.d.ts.map +1 -1
  85. package/dist/i18n/locales/hi.js +29 -0
  86. package/dist/i18n/locales/hi.js.map +1 -1
  87. package/dist/i18n/locales/it.d.ts +29 -0
  88. package/dist/i18n/locales/it.d.ts.map +1 -1
  89. package/dist/i18n/locales/it.js +29 -0
  90. package/dist/i18n/locales/it.js.map +1 -1
  91. package/dist/i18n/locales/ja.d.ts +29 -0
  92. package/dist/i18n/locales/ja.d.ts.map +1 -1
  93. package/dist/i18n/locales/ja.js +29 -0
  94. package/dist/i18n/locales/ja.js.map +1 -1
  95. package/dist/i18n/locales/nl.d.ts +29 -0
  96. package/dist/i18n/locales/nl.d.ts.map +1 -1
  97. package/dist/i18n/locales/nl.js +29 -0
  98. package/dist/i18n/locales/nl.js.map +1 -1
  99. package/dist/i18n/locales/pl.d.ts +29 -0
  100. package/dist/i18n/locales/pl.d.ts.map +1 -1
  101. package/dist/i18n/locales/pl.js +29 -0
  102. package/dist/i18n/locales/pl.js.map +1 -1
  103. package/dist/i18n/locales/pt.d.ts +29 -0
  104. package/dist/i18n/locales/pt.d.ts.map +1 -1
  105. package/dist/i18n/locales/pt.js +29 -0
  106. package/dist/i18n/locales/pt.js.map +1 -1
  107. package/dist/i18n/locales/ro.d.ts +29 -0
  108. package/dist/i18n/locales/ro.d.ts.map +1 -1
  109. package/dist/i18n/locales/ro.js +29 -0
  110. package/dist/i18n/locales/ro.js.map +1 -1
  111. package/dist/i18n/locales/ru.d.ts +29 -0
  112. package/dist/i18n/locales/ru.d.ts.map +1 -1
  113. package/dist/i18n/locales/ru.js +29 -0
  114. package/dist/i18n/locales/ru.js.map +1 -1
  115. package/dist/i18n/locales/sq.d.ts +29 -0
  116. package/dist/i18n/locales/sq.d.ts.map +1 -1
  117. package/dist/i18n/locales/sq.js +29 -0
  118. package/dist/i18n/locales/sq.js.map +1 -1
  119. package/dist/i18n/locales/sv.d.ts +29 -0
  120. package/dist/i18n/locales/sv.d.ts.map +1 -1
  121. package/dist/i18n/locales/sv.js +29 -0
  122. package/dist/i18n/locales/sv.js.map +1 -1
  123. package/dist/i18n/locales/tr.d.ts +29 -0
  124. package/dist/i18n/locales/tr.d.ts.map +1 -1
  125. package/dist/i18n/locales/tr.js +29 -0
  126. package/dist/i18n/locales/tr.js.map +1 -1
  127. package/dist/i18n/locales/zh.d.ts +29 -0
  128. package/dist/i18n/locales/zh.d.ts.map +1 -1
  129. package/dist/i18n/locales/zh.js +29 -0
  130. package/dist/i18n/locales/zh.js.map +1 -1
  131. package/dist/index.js +82 -76
  132. package/dist/index.js.map +1 -1
  133. package/dist/locales/ar.json +29 -0
  134. package/dist/locales/de.json +29 -0
  135. package/dist/locales/el.json +29 -0
  136. package/dist/locales/en.json +29 -0
  137. package/dist/locales/es.json +29 -0
  138. package/dist/locales/fr.json +29 -0
  139. package/dist/locales/hi.json +29 -0
  140. package/dist/locales/it.json +29 -0
  141. package/dist/locales/ja.json +29 -0
  142. package/dist/locales/nl.json +29 -0
  143. package/dist/locales/pl.json +29 -0
  144. package/dist/locales/pt.json +29 -0
  145. package/dist/locales/ro.json +29 -0
  146. package/dist/locales/ru.json +29 -0
  147. package/dist/locales/sq.json +29 -0
  148. package/dist/locales/sv.json +29 -0
  149. package/dist/locales/tr.json +29 -0
  150. package/dist/locales/zh.json +29 -0
  151. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  152. package/dist/tokens.css +1 -1
  153. package/package.json +9 -1
  154. package/dist/_chunks/chart-CpkpA74k.js +0 -374
  155. package/dist/_chunks/chart-CpkpA74k.js.map +0 -1
  156. package/dist/_chunks/icon-button-group-C_lqXTAj.js.map +0 -1
@@ -3,7 +3,7 @@ import { forwardRef as M, useRef as k, useImperativeHandle as N, useMemo as _, u
3
3
  import { c as P } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as g } from "react-i18next";
5
5
  import { I as y } from "./icon-button-C_kbcd7I.js";
6
- import { I as j } from "./icon-button-group-C_lqXTAj.js";
6
+ import { I as j } from "./icon-button-group-BLHPN6jg.js";
7
7
  import { S as K } from "./switch-OILsBLWo.js";
8
8
  import { D as o } from "./dropdown-menu-DU-Hrf33.js";
9
9
  import { u as x } from "./use-theme-CAuo6EYT.js";
@@ -364,4 +364,4 @@ export {
364
364
  F as T,
365
365
  D as t
366
366
  };
367
- //# sourceMappingURL=theme-toggle-BJCz_UOi.js.map
367
+ //# sourceMappingURL=theme-toggle-B4mOrQX1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme-toggle-BJCz_UOi.js","sources":["../../src/components/theme-toggle/theme-toggle.agent.ts","../../src/components/theme-toggle/theme-toggle.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — ThemeToggle. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { ThemeToggleHandle } from './theme-toggle';\n\nexport const themeToggleAgent: AgentAdapter<ThemeToggleHandle> = {\n id: 'theme-toggle',\n capabilities: ['set_value'],\n state: {\n currentTheme: {\n type: 'ThemePreference',\n descriptionKey: 'ui.agent.themeToggle.state.currentTheme',\n description: 'Active theme preference: light, dark, or system.',\n read: (handle) => handle.getCurrentTheme(),\n },\n currentAccessibility: {\n type: 'AccessibilityPreference',\n descriptionKey: 'ui.agent.themeToggle.state.currentAccessibility',\n description: 'Active accessibility preference: default or accessible.',\n read: (handle) => handle.getCurrentAccessibility(),\n },\n },\n actions: {\n set_theme: {\n safety: 'write',\n argsType: '{ theme: \"light\" | \"dark\" | \"system\" }',\n argsSchema: {\n type: 'object',\n properties: { theme: { enum: ['light', 'dark', 'system'] } },\n required: ['theme'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.themeToggle.actions.setTheme',\n description: 'Switch the theme preference.',\n invoke: (handle, args: { theme: 'light' | 'dark' | 'system' }) => {\n handle.setTheme(args.theme);\n },\n },\n set_accessibility: {\n safety: 'write',\n argsType: '{ accessibility: \"default\" | \"accessible\" }',\n argsSchema: {\n type: 'object',\n properties: { accessibility: { enum: ['default', 'accessible'] } },\n required: ['accessibility'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.themeToggle.actions.setAccessibility',\n description: 'Switch the accessibility preference.',\n invoke: (handle, args: { accessibility: 'default' | 'accessible' }) => {\n handle.setAccessibility(args.accessibility);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'theme-toggle',\n description: 'Marks the ThemeToggle wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { IconButtonGroup } from '../icon-button-group/icon-button-group';\nimport { Switch } from '../switch/switch';\nimport { DropdownMenu } from '../dropdown-menu/dropdown-menu';\nimport {\n useTheme,\n type AccessibilityPreference,\n type ThemePreference,\n type UseThemeReturn,\n} from '../../hooks';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { themeToggleAgent } from './theme-toggle.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst wrapperVariants = cva('ds:inline-flex ds:items-center', {\n variants: {\n variant: {\n menu: '',\n compact: '',\n split: 'ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { variant: 'menu' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type ThemeToggleVariant = 'menu' | 'compact' | 'split';\n\ninterface ThemeToggleBaseProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>,\n VariantProps<typeof wrapperVariants> {\n /**\n * Visual form factor.\n * - `menu` (default) — single trigger that opens a dropdown with both\n * Appearance and Accessibility controls. Best for headers / nav rails.\n * - `compact` — segmented Appearance control only. Use when accessibility\n * lives on a separate settings surface.\n * - `split` — segmented Appearance control plus an inline Accessibility\n * switch. Best for full-width settings panels.\n */\n variant?: ThemeToggleVariant;\n /** Hide the accessibility control. Ignored on `compact`, which never renders it. */\n showAccessibility?: boolean;\n /**\n * Controlled escape hatch — when omitted the component reads/writes\n * `useTheme()` directly so it can drop into any header with no wiring.\n * Pass all four to opt into controlled mode.\n */\n theme?: ThemePreference;\n accessibility?: AccessibilityPreference;\n onThemeChange?: (next: ThemePreference) => void;\n onAccessibilityChange?: (next: AccessibilityPreference) => void;\n}\n\nexport type ThemeToggleProps = ThemeToggleBaseProps;\n\n/** Curated imperative handle for agent / external automation. */\nexport interface ThemeToggleHandle {\n getCurrentTheme: () => ThemePreference;\n getCurrentAccessibility: () => AccessibilityPreference;\n setTheme: (next: ThemePreference) => void;\n setAccessibility: (next: AccessibilityPreference) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Hook adapter */\n/* ------------------------------------------------------------------ */\n\n/**\n * Resolves controlled props against the store. When the consumer passes\n * `theme` / `onThemeChange` (etc.) we honour those; otherwise we fall\n * through to the singleton `useTheme()` hook so a bare `<ThemeToggle />`\n * works with zero wiring.\n */\nfunction useResolvedTheme(props: ThemeToggleBaseProps): UseThemeReturn {\n const {\n theme: themeProp,\n accessibility: accessibilityProp,\n onThemeChange,\n onAccessibilityChange,\n } = props;\n const store = useTheme();\n const theme = themeProp ?? store.theme;\n const accessibility = accessibilityProp ?? store.accessibility;\n\n const storeSetTheme = store.setTheme;\n const storeSetAccessibility = store.setAccessibility;\n\n const setTheme = useCallback(\n (next: ThemePreference) => {\n if (onThemeChange) {\n onThemeChange(next);\n return;\n }\n storeSetTheme(next);\n },\n [onThemeChange, storeSetTheme],\n );\n\n const setAccessibility = useCallback(\n (next: AccessibilityPreference) => {\n if (onAccessibilityChange) {\n onAccessibilityChange(next);\n return;\n }\n storeSetAccessibility(next);\n },\n [onAccessibilityChange, storeSetAccessibility],\n );\n\n return {\n theme,\n accessibility,\n resolvedTheme: store.resolvedTheme,\n setTheme,\n setAccessibility,\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Sub-pieces */\n/* ------------------------------------------------------------------ */\n\ninterface AppearanceSegmentProps {\n value: ThemePreference;\n onValueChange: (next: ThemePreference) => void;\n ariaLabel: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AppearanceSegment({\n value,\n onValueChange,\n ariaLabel,\n size = 'md',\n}: AppearanceSegmentProps) {\n const { t } = useTranslation();\n return (\n <IconButtonGroup\n aria-label={ariaLabel}\n role=\"radiogroup\"\n mode=\"toggle-single\"\n size={size}\n value={value}\n onValueChange={(next) => onValueChange(next as ThemePreference)}\n >\n <IconButton\n icon={<Sun aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.light')}\n value=\"light\"\n />\n <IconButton\n icon={<Moon aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.dark')}\n value=\"dark\"\n />\n <IconButton\n icon={<Monitor aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.system')}\n value=\"system\"\n />\n </IconButtonGroup>\n );\n}\n\ninterface AccessibilitySwitchProps {\n value: AccessibilityPreference;\n onValueChange: (next: AccessibilityPreference) => void;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AccessibilitySwitch({\n value,\n onValueChange,\n size = 'md',\n}: AccessibilitySwitchProps) {\n const { t } = useTranslation();\n // 'system' is treated as \"off\" visually — the OS preference flows through\n // automatically. Flipping the switch on creates an explicit override.\n const checked = value === 'accessible';\n return (\n <Switch\n label={t('navigation.themeToggle.accessibility.label')}\n labelSide=\"start\"\n size={size}\n checked={checked}\n onCheckedChange={(next) => onValueChange(next ? 'accessible' : 'default')}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Variants */\n/* ------------------------------------------------------------------ */\n\ninterface VariantRenderProps {\n state: UseThemeReturn;\n className?: string;\n rest: HTMLAttributes<HTMLDivElement>;\n forwardedRef: React.Ref<HTMLDivElement>;\n showAccessibility: boolean;\n}\n\nfunction MenuVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n const triggerIcon =\n state.resolvedTheme === 'dark' ||\n state.resolvedTheme === 'dark-accessible' ? (\n <Moon aria-hidden />\n ) : (\n <Sun aria-hidden />\n );\n\n const accessibleChecked = state.accessibility === 'accessible';\n\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'menu', className })}\n {...rest}\n >\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon={triggerIcon}\n aria-label={t('navigation.themeToggle.trigger')}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content align=\"end\" sideOffset={8}>\n <DropdownMenu.Label>\n {t('navigation.themeToggle.appearance.label')}\n </DropdownMenu.Label>\n <DropdownMenu.RadioGroup\n value={state.theme}\n onValueChange={(next) => state.setTheme(next as ThemePreference)}\n >\n <DropdownMenu.RadioItem value=\"light\">\n <Sun aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.light')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"dark\">\n <Moon aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.dark')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"system\">\n <Monitor aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.system')}\n </DropdownMenu.RadioItem>\n </DropdownMenu.RadioGroup>\n {showAccessibility ? (\n <>\n <DropdownMenu.Separator />\n {/* CheckboxItem keeps the accessibility toggle inside the\n Radix menu collection so ArrowDown reaches it and Space\n activates it; `onSelect={preventDefault}` prevents the\n menu from closing on toggle. */}\n <DropdownMenu.CheckboxItem\n checked={accessibleChecked}\n onCheckedChange={(next) =>\n state.setAccessibility(next ? 'accessible' : 'default')\n }\n onSelect={(event) => event.preventDefault()}\n >\n {t('navigation.themeToggle.accessibility.label')}\n </DropdownMenu.CheckboxItem>\n </>\n ) : null}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n );\n}\n\nfunction CompactVariant({\n state,\n className,\n rest,\n forwardedRef,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'compact', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('navigation.themeToggle.appearance.label')}\n />\n </div>\n );\n}\n\nfunction SplitVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'split', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('navigation.themeToggle.appearance.label')}\n />\n {showAccessibility ? (\n <AccessibilitySwitch\n value={state.accessibility}\n onValueChange={state.setAccessibility}\n />\n ) : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* ThemeToggle */\n/* ------------------------------------------------------------------ */\n\nexport const ThemeToggle = forwardRef<HTMLDivElement, ThemeToggleProps>(\n (props, ref) => {\n const {\n variant = 'menu',\n showAccessibility = true,\n className,\n id,\n // Strip controlled props from the spread — they are read by the\n // adapter, not by the DOM element.\n theme: _theme,\n accessibility: _accessibility,\n onThemeChange: _onThemeChange,\n onAccessibilityChange: _onAccessibilityChange,\n ...rest\n } = props as ThemeToggleProps & { id?: string };\n\n const state = useResolvedTheme(props);\n const stateRef = useRef(state);\n stateRef.current = state;\n\n // Internal variant wrappers attach refs to <div> elements; we forward that\n // DOM node as the public ref (Pattern B). The agent handle is registered\n // separately via useAgentRegistration.\n const forwardedRef = useRef<HTMLDivElement | null>(null);\n useImperativeHandle(ref, () => forwardedRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<ThemeToggleHandle>(\n () => ({\n getCurrentTheme: () => stateRef.current.theme,\n getCurrentAccessibility: () => stateRef.current.accessibility,\n setTheme: (next) => stateRef.current.setTheme(next),\n setAccessibility: (next) => stateRef.current.setAccessibility(next),\n }),\n [],\n );\n useAgentRegistration(themeToggleAgent, agentHandle, id);\n\n if (variant === 'compact') {\n return (\n <CompactVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n }\n if (variant === 'split') {\n return (\n <SplitVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n }\n return (\n <MenuVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n },\n);\n\nThemeToggle.displayName = 'ThemeToggle';\n"],"names":["themeToggleAgent","handle","args","wrapperVariants","cva","useResolvedTheme","props","themeProp","accessibilityProp","onThemeChange","onAccessibilityChange","store","useTheme","theme","accessibility","storeSetTheme","storeSetAccessibility","setTheme","useCallback","next","setAccessibility","AppearanceSegment","value","onValueChange","ariaLabel","size","t","useTranslation","jsxs","IconButtonGroup","jsx","IconButton","Sun","Moon","Monitor","AccessibilitySwitch","checked","Switch","MenuVariant","state","className","rest","forwardedRef","showAccessibility","triggerIcon","accessibleChecked","DropdownMenu","Fragment","event","CompactVariant","SplitVariant","ThemeToggle","forwardRef","ref","variant","id","_theme","_accessibility","_onThemeChange","_onAccessibilityChange","stateRef","useRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration"],"mappings":"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"}
1
+ {"version":3,"file":"theme-toggle-B4mOrQX1.js","sources":["../../src/components/theme-toggle/theme-toggle.agent.ts","../../src/components/theme-toggle/theme-toggle.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — ThemeToggle. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { ThemeToggleHandle } from './theme-toggle';\n\nexport const themeToggleAgent: AgentAdapter<ThemeToggleHandle> = {\n id: 'theme-toggle',\n capabilities: ['set_value'],\n state: {\n currentTheme: {\n type: 'ThemePreference',\n descriptionKey: 'ui.agent.themeToggle.state.currentTheme',\n description: 'Active theme preference: light, dark, or system.',\n read: (handle) => handle.getCurrentTheme(),\n },\n currentAccessibility: {\n type: 'AccessibilityPreference',\n descriptionKey: 'ui.agent.themeToggle.state.currentAccessibility',\n description: 'Active accessibility preference: default or accessible.',\n read: (handle) => handle.getCurrentAccessibility(),\n },\n },\n actions: {\n set_theme: {\n safety: 'write',\n argsType: '{ theme: \"light\" | \"dark\" | \"system\" }',\n argsSchema: {\n type: 'object',\n properties: { theme: { enum: ['light', 'dark', 'system'] } },\n required: ['theme'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.themeToggle.actions.setTheme',\n description: 'Switch the theme preference.',\n invoke: (handle, args: { theme: 'light' | 'dark' | 'system' }) => {\n handle.setTheme(args.theme);\n },\n },\n set_accessibility: {\n safety: 'write',\n argsType: '{ accessibility: \"default\" | \"accessible\" }',\n argsSchema: {\n type: 'object',\n properties: { accessibility: { enum: ['default', 'accessible'] } },\n required: ['accessibility'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.themeToggle.actions.setAccessibility',\n description: 'Switch the accessibility preference.',\n invoke: (handle, args: { accessibility: 'default' | 'accessible' }) => {\n handle.setAccessibility(args.accessibility);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'theme-toggle',\n description: 'Marks the ThemeToggle wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { IconButtonGroup } from '../icon-button-group/icon-button-group';\nimport { Switch } from '../switch/switch';\nimport { DropdownMenu } from '../dropdown-menu/dropdown-menu';\nimport {\n useTheme,\n type AccessibilityPreference,\n type ThemePreference,\n type UseThemeReturn,\n} from '../../hooks';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { themeToggleAgent } from './theme-toggle.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst wrapperVariants = cva('ds:inline-flex ds:items-center', {\n variants: {\n variant: {\n menu: '',\n compact: '',\n split: 'ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { variant: 'menu' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type ThemeToggleVariant = 'menu' | 'compact' | 'split';\n\ninterface ThemeToggleBaseProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>,\n VariantProps<typeof wrapperVariants> {\n /**\n * Visual form factor.\n * - `menu` (default) — single trigger that opens a dropdown with both\n * Appearance and Accessibility controls. Best for headers / nav rails.\n * - `compact` — segmented Appearance control only. Use when accessibility\n * lives on a separate settings surface.\n * - `split` — segmented Appearance control plus an inline Accessibility\n * switch. Best for full-width settings panels.\n */\n variant?: ThemeToggleVariant;\n /** Hide the accessibility control. Ignored on `compact`, which never renders it. */\n showAccessibility?: boolean;\n /**\n * Controlled escape hatch — when omitted the component reads/writes\n * `useTheme()` directly so it can drop into any header with no wiring.\n * Pass all four to opt into controlled mode.\n */\n theme?: ThemePreference;\n accessibility?: AccessibilityPreference;\n onThemeChange?: (next: ThemePreference) => void;\n onAccessibilityChange?: (next: AccessibilityPreference) => void;\n}\n\nexport type ThemeToggleProps = ThemeToggleBaseProps;\n\n/** Curated imperative handle for agent / external automation. */\nexport interface ThemeToggleHandle {\n getCurrentTheme: () => ThemePreference;\n getCurrentAccessibility: () => AccessibilityPreference;\n setTheme: (next: ThemePreference) => void;\n setAccessibility: (next: AccessibilityPreference) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Hook adapter */\n/* ------------------------------------------------------------------ */\n\n/**\n * Resolves controlled props against the store. When the consumer passes\n * `theme` / `onThemeChange` (etc.) we honour those; otherwise we fall\n * through to the singleton `useTheme()` hook so a bare `<ThemeToggle />`\n * works with zero wiring.\n */\nfunction useResolvedTheme(props: ThemeToggleBaseProps): UseThemeReturn {\n const {\n theme: themeProp,\n accessibility: accessibilityProp,\n onThemeChange,\n onAccessibilityChange,\n } = props;\n const store = useTheme();\n const theme = themeProp ?? store.theme;\n const accessibility = accessibilityProp ?? store.accessibility;\n\n const storeSetTheme = store.setTheme;\n const storeSetAccessibility = store.setAccessibility;\n\n const setTheme = useCallback(\n (next: ThemePreference) => {\n if (onThemeChange) {\n onThemeChange(next);\n return;\n }\n storeSetTheme(next);\n },\n [onThemeChange, storeSetTheme],\n );\n\n const setAccessibility = useCallback(\n (next: AccessibilityPreference) => {\n if (onAccessibilityChange) {\n onAccessibilityChange(next);\n return;\n }\n storeSetAccessibility(next);\n },\n [onAccessibilityChange, storeSetAccessibility],\n );\n\n return {\n theme,\n accessibility,\n resolvedTheme: store.resolvedTheme,\n setTheme,\n setAccessibility,\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Sub-pieces */\n/* ------------------------------------------------------------------ */\n\ninterface AppearanceSegmentProps {\n value: ThemePreference;\n onValueChange: (next: ThemePreference) => void;\n ariaLabel: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AppearanceSegment({\n value,\n onValueChange,\n ariaLabel,\n size = 'md',\n}: AppearanceSegmentProps) {\n const { t } = useTranslation();\n return (\n <IconButtonGroup\n aria-label={ariaLabel}\n role=\"radiogroup\"\n mode=\"toggle-single\"\n size={size}\n value={value}\n onValueChange={(next) => onValueChange(next as ThemePreference)}\n >\n <IconButton\n icon={<Sun aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.light')}\n value=\"light\"\n />\n <IconButton\n icon={<Moon aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.dark')}\n value=\"dark\"\n />\n <IconButton\n icon={<Monitor aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.system')}\n value=\"system\"\n />\n </IconButtonGroup>\n );\n}\n\ninterface AccessibilitySwitchProps {\n value: AccessibilityPreference;\n onValueChange: (next: AccessibilityPreference) => void;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AccessibilitySwitch({\n value,\n onValueChange,\n size = 'md',\n}: AccessibilitySwitchProps) {\n const { t } = useTranslation();\n // 'system' is treated as \"off\" visually — the OS preference flows through\n // automatically. Flipping the switch on creates an explicit override.\n const checked = value === 'accessible';\n return (\n <Switch\n label={t('navigation.themeToggle.accessibility.label')}\n labelSide=\"start\"\n size={size}\n checked={checked}\n onCheckedChange={(next) => onValueChange(next ? 'accessible' : 'default')}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Variants */\n/* ------------------------------------------------------------------ */\n\ninterface VariantRenderProps {\n state: UseThemeReturn;\n className?: string;\n rest: HTMLAttributes<HTMLDivElement>;\n forwardedRef: React.Ref<HTMLDivElement>;\n showAccessibility: boolean;\n}\n\nfunction MenuVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n const triggerIcon =\n state.resolvedTheme === 'dark' ||\n state.resolvedTheme === 'dark-accessible' ? (\n <Moon aria-hidden />\n ) : (\n <Sun aria-hidden />\n );\n\n const accessibleChecked = state.accessibility === 'accessible';\n\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'menu', className })}\n {...rest}\n >\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon={triggerIcon}\n aria-label={t('navigation.themeToggle.trigger')}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content align=\"end\" sideOffset={8}>\n <DropdownMenu.Label>\n {t('navigation.themeToggle.appearance.label')}\n </DropdownMenu.Label>\n <DropdownMenu.RadioGroup\n value={state.theme}\n onValueChange={(next) => state.setTheme(next as ThemePreference)}\n >\n <DropdownMenu.RadioItem value=\"light\">\n <Sun aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.light')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"dark\">\n <Moon aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.dark')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"system\">\n <Monitor aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.system')}\n </DropdownMenu.RadioItem>\n </DropdownMenu.RadioGroup>\n {showAccessibility ? (\n <>\n <DropdownMenu.Separator />\n {/* CheckboxItem keeps the accessibility toggle inside the\n Radix menu collection so ArrowDown reaches it and Space\n activates it; `onSelect={preventDefault}` prevents the\n menu from closing on toggle. */}\n <DropdownMenu.CheckboxItem\n checked={accessibleChecked}\n onCheckedChange={(next) =>\n state.setAccessibility(next ? 'accessible' : 'default')\n }\n onSelect={(event) => event.preventDefault()}\n >\n {t('navigation.themeToggle.accessibility.label')}\n </DropdownMenu.CheckboxItem>\n </>\n ) : null}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n );\n}\n\nfunction CompactVariant({\n state,\n className,\n rest,\n forwardedRef,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'compact', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('navigation.themeToggle.appearance.label')}\n />\n </div>\n );\n}\n\nfunction SplitVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'split', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('navigation.themeToggle.appearance.label')}\n />\n {showAccessibility ? (\n <AccessibilitySwitch\n value={state.accessibility}\n onValueChange={state.setAccessibility}\n />\n ) : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* ThemeToggle */\n/* ------------------------------------------------------------------ */\n\nexport const ThemeToggle = forwardRef<HTMLDivElement, ThemeToggleProps>(\n (props, ref) => {\n const {\n variant = 'menu',\n showAccessibility = true,\n className,\n id,\n // Strip controlled props from the spread — they are read by the\n // adapter, not by the DOM element.\n theme: _theme,\n accessibility: _accessibility,\n onThemeChange: _onThemeChange,\n onAccessibilityChange: _onAccessibilityChange,\n ...rest\n } = props as ThemeToggleProps & { id?: string };\n\n const state = useResolvedTheme(props);\n const stateRef = useRef(state);\n stateRef.current = state;\n\n // Internal variant wrappers attach refs to <div> elements; we forward that\n // DOM node as the public ref (Pattern B). The agent handle is registered\n // separately via useAgentRegistration.\n const forwardedRef = useRef<HTMLDivElement | null>(null);\n useImperativeHandle(ref, () => forwardedRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<ThemeToggleHandle>(\n () => ({\n getCurrentTheme: () => stateRef.current.theme,\n getCurrentAccessibility: () => stateRef.current.accessibility,\n setTheme: (next) => stateRef.current.setTheme(next),\n setAccessibility: (next) => stateRef.current.setAccessibility(next),\n }),\n [],\n );\n useAgentRegistration(themeToggleAgent, agentHandle, id);\n\n if (variant === 'compact') {\n return (\n <CompactVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n }\n if (variant === 'split') {\n return (\n <SplitVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n }\n return (\n <MenuVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n },\n);\n\nThemeToggle.displayName = 'ThemeToggle';\n"],"names":["themeToggleAgent","handle","args","wrapperVariants","cva","useResolvedTheme","props","themeProp","accessibilityProp","onThemeChange","onAccessibilityChange","store","useTheme","theme","accessibility","storeSetTheme","storeSetAccessibility","setTheme","useCallback","next","setAccessibility","AppearanceSegment","value","onValueChange","ariaLabel","size","t","useTranslation","jsxs","IconButtonGroup","jsx","IconButton","Sun","Moon","Monitor","AccessibilitySwitch","checked","Switch","MenuVariant","state","className","rest","forwardedRef","showAccessibility","triggerIcon","accessibleChecked","DropdownMenu","Fragment","event","CompactVariant","SplitVariant","ThemeToggle","forwardRef","ref","variant","id","_theme","_accessibility","_onThemeChange","_onAccessibilityChange","stateRef","useRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration"],"mappings":"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"}
@@ -0,0 +1,193 @@
1
+ import { jsx as t, jsxs as c } from "react/jsx-runtime";
2
+ import { forwardRef as P, useState as N, useEffect as S, useMemo as f, useCallback as T, useImperativeHandle as W } from "react";
3
+ import { c as _ } from "./index-D2ZczOXr.js";
4
+ import { useTranslation as j } from "react-i18next";
5
+ import { D as l } from "./dialog-UbKJCi1X.js";
6
+ import { T as z } from "./text-input-CUvCb6ST.js";
7
+ import { B as C } from "./badge-DCOqV9mI.js";
8
+ import { u as I } from "./registry-DvAUVLHh.js";
9
+ import { S as L } from "./search-QbWPlY5f.js";
10
+ const R = {
11
+ id: "widget-picker",
12
+ capabilities: ["pick"],
13
+ state: {
14
+ open: {
15
+ type: "boolean",
16
+ descriptionKey: "ui.agent.widgetPicker.state.open",
17
+ description: "Whether the picker dialog is currently open.",
18
+ read: (i) => i.getPickerState().open
19
+ },
20
+ items: {
21
+ type: "{ id: string, disabled: boolean }[]",
22
+ descriptionKey: "ui.agent.widgetPicker.state.items",
23
+ description: "Widget-type ids on offer and whether each is pickable. Ids only — titles are host-app strings.",
24
+ read: (i) => i.getPickerState().items
25
+ }
26
+ },
27
+ actions: {
28
+ pick_widget: {
29
+ // Picking adds a widget to the host dashboard — a write, reversible
30
+ // by removing the widget again.
31
+ safety: "write",
32
+ argsType: "id",
33
+ argsSchema: {
34
+ type: "object",
35
+ properties: {
36
+ id: {
37
+ type: "string",
38
+ description: "Widget-type id (see items state)."
39
+ }
40
+ },
41
+ required: ["id"]
42
+ },
43
+ returns: "boolean (accepted)",
44
+ returnsSchema: {
45
+ type: "boolean",
46
+ description: "True when the pick was applied; false when the picker is closed, the id is unknown, or the item is disabled."
47
+ },
48
+ idempotent: !1,
49
+ descriptionKey: "ui.agent.widgetPicker.actions.pickWidget",
50
+ description: "Pick a widget type from the open catalogue. The picker closes and the host adds the widget. Refused while the dialog is closed and for disabled items.",
51
+ invoke: (i, a) => i.pick(a.id)
52
+ }
53
+ },
54
+ domHooks: {
55
+ root: { attr: "data-component", value: "widget-picker" },
56
+ instanceId: {
57
+ attr: "data-component-id",
58
+ sourceProp: "id",
59
+ description: "Sourced from the id prop."
60
+ },
61
+ item: {
62
+ attr: "data-widget-type-id",
63
+ description: "Each option tile carries its widget-type id."
64
+ }
65
+ }
66
+ }, A = _(
67
+ [
68
+ "ds:flex ds:w-full ds:min-h-[var(--min-target-size)] ds:items-start ds:gap-[var(--spacing-sm)]",
69
+ "ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-[var(--card)]",
70
+ "ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:py-[var(--spacing-md)]",
71
+ "ds:text-start ds:transition-colors",
72
+ "ds:hover:bg-muted/10",
73
+ "ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
74
+ "ds:disabled:opacity-50 ds:disabled:cursor-not-allowed ds:disabled:hover:bg-transparent"
75
+ ].join(" "),
76
+ { variants: {}, defaultVariants: {} }
77
+ ), B = P(
78
+ ({ open: i, onOpenChange: a, items: d, onPick: m, title: k, id: h }, y) => {
79
+ const { t: r } = j(), [p, v] = N("");
80
+ S(() => {
81
+ i || v("");
82
+ }, [i]);
83
+ const b = f(() => {
84
+ const e = p.trim().toLowerCase();
85
+ return e ? d.filter(
86
+ (s) => s.title.toLowerCase().includes(e) || (s.description ?? "").toLowerCase().includes(e)
87
+ ) : d;
88
+ }, [d, p]), w = f(() => {
89
+ const e = [];
90
+ for (const s of b) {
91
+ const n = s.category || null;
92
+ let o = e.find((x) => x.category === n);
93
+ o || (o = { category: n, entries: [] }, n === null ? e.unshift(o) : e.push(o)), o.entries.push(s);
94
+ }
95
+ return e;
96
+ }, [b]), g = T(
97
+ (e) => {
98
+ m(e), a(!1);
99
+ },
100
+ [m, a]
101
+ ), u = f(
102
+ () => ({
103
+ pick(e) {
104
+ if (!i) return !1;
105
+ const s = d.find((n) => n.id === e);
106
+ return !s || s.disabled ? !1 : (g(e), !0);
107
+ },
108
+ getPickerState() {
109
+ return {
110
+ open: i,
111
+ items: d.map((e) => ({
112
+ id: e.id,
113
+ disabled: !!e.disabled
114
+ }))
115
+ };
116
+ }
117
+ }),
118
+ [i, d, g]
119
+ );
120
+ return W(y, () => u, [u]), I(R, u, h), /* @__PURE__ */ t(l.Root, { open: i, onOpenChange: a, children: /* @__PURE__ */ t(l.Content, { size: "lg", children: /* @__PURE__ */ c("div", { "data-component": "widget-picker", "data-component-id": h, children: [
121
+ /* @__PURE__ */ t(l.Title, { children: k ?? r("widgetPicker.title") }),
122
+ /* @__PURE__ */ t(l.Description, { className: "ds:sr-only", children: r("widgetPicker.description") }),
123
+ /* @__PURE__ */ t("div", { className: "ds:mt-[var(--spacing-sm)]", children: /* @__PURE__ */ t(
124
+ z,
125
+ {
126
+ "aria-label": r("widgetPicker.searchLabel"),
127
+ placeholder: r("widgetPicker.searchPlaceholder"),
128
+ startAdornment: /* @__PURE__ */ t(L, { "aria-hidden": "true" }),
129
+ value: p,
130
+ onChange: (e) => v(e.target.value)
131
+ }
132
+ ) }),
133
+ /* @__PURE__ */ t(
134
+ "div",
135
+ {
136
+ tabIndex: 0,
137
+ className: "ds:mt-[var(--spacing-md)] ds:flex ds:max-h-[60vh] ds:flex-col ds:gap-[var(--spacing-md)] ds:overflow-y-auto ds:pe-[var(--spacing-xs)] ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
138
+ children: w.length === 0 ? /* @__PURE__ */ t(
139
+ "p",
140
+ {
141
+ role: "status",
142
+ className: "ds:py-[var(--spacing-lg)] ds:text-center ds:text-sm ds:text-muted-foreground",
143
+ children: d.length === 0 ? r("widgetPicker.none") : r("widgetPicker.empty")
144
+ }
145
+ ) : w.map((e) => /* @__PURE__ */ c(
146
+ "section",
147
+ {
148
+ className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]",
149
+ children: [
150
+ e.category ? /* @__PURE__ */ t("h3", { className: "ds:text-xs ds:font-semibold ds:uppercase ds:tracking-wide ds:text-muted-foreground", children: e.category }) : null,
151
+ /* @__PURE__ */ t("div", { className: "ds:grid ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2", children: e.entries.map((s) => /* @__PURE__ */ c(
152
+ "button",
153
+ {
154
+ type: "button",
155
+ disabled: s.disabled,
156
+ onClick: () => g(s.id),
157
+ className: A(),
158
+ "data-widget-type-id": s.id,
159
+ children: [
160
+ s.icon ? /* @__PURE__ */ t(
161
+ "span",
162
+ {
163
+ "aria-hidden": "true",
164
+ className: "ds:mt-[var(--spacing-2xs)] ds:inline-flex ds:size-5 ds:shrink-0 ds:items-center ds:justify-center ds:text-muted-foreground ds:[&_svg]:size-5",
165
+ children: s.icon
166
+ }
167
+ ) : null,
168
+ /* @__PURE__ */ c("span", { className: "ds:flex ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-2xs)]", children: [
169
+ /* @__PURE__ */ c("span", { className: "ds:flex ds:items-center ds:gap-[var(--spacing-xs)]", children: [
170
+ /* @__PURE__ */ t("span", { className: "ds:truncate ds:text-sm ds:font-medium", children: s.title }),
171
+ s.badge ? /* @__PURE__ */ t(C, { variant: "info", size: "sm", children: s.badge }) : null
172
+ ] }),
173
+ s.description ? /* @__PURE__ */ t("span", { className: "ds:text-xs ds:text-muted-foreground", children: s.description }) : null
174
+ ] })
175
+ ]
176
+ },
177
+ s.id
178
+ )) })
179
+ ]
180
+ },
181
+ e.category ?? "__ungrouped__"
182
+ ))
183
+ }
184
+ )
185
+ ] }) }) });
186
+ }
187
+ );
188
+ B.displayName = "WidgetPicker";
189
+ export {
190
+ B as W,
191
+ R as w
192
+ };
193
+ //# sourceMappingURL=widget-picker-DEmTVuFL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget-picker-DEmTVuFL.js","sources":["../../src/components/widget-picker/widget-picker.agent.ts","../../src/components/widget-picker/widget-picker.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { WidgetPickerHandle } from './widget-picker';\n\nexport const widgetPickerAgent: AgentAdapter<WidgetPickerHandle> = {\n id: 'widget-picker',\n capabilities: ['pick'],\n state: {\n open: {\n type: 'boolean',\n descriptionKey: 'ui.agent.widgetPicker.state.open',\n description: 'Whether the picker dialog is currently open.',\n read: (handle) => handle.getPickerState().open,\n },\n items: {\n type: '{ id: string, disabled: boolean }[]',\n descriptionKey: 'ui.agent.widgetPicker.state.items',\n description:\n 'Widget-type ids on offer and whether each is pickable. Ids only — titles are host-app strings.',\n read: (handle) => handle.getPickerState().items,\n },\n },\n actions: {\n pick_widget: {\n // Picking adds a widget to the host dashboard — a write, reversible\n // by removing the widget again.\n safety: 'write',\n argsType: 'id',\n argsSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Widget-type id (see items state).',\n },\n },\n required: ['id'],\n },\n returns: 'boolean (accepted)',\n returnsSchema: {\n type: 'boolean',\n description:\n 'True when the pick was applied; false when the picker is closed, the id is unknown, or the item is disabled.',\n },\n idempotent: false,\n descriptionKey: 'ui.agent.widgetPicker.actions.pickWidget',\n description:\n 'Pick a widget type from the open catalogue. The picker closes and the host adds the widget. Refused while the dialog is closed and for disabled items.',\n invoke: (handle, args: { id: string }) => handle.pick(args.id),\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'widget-picker' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-widget-type-id',\n description: 'Each option tile carries its widget-type id.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* WidgetPicker — \"add a widget\" modal for configurable dashboards. */\n/* */\n/* A Dialog-composed catalogue picker: the consumer supplies the */\n/* available widget types (title/description/icon/category, all */\n/* pre-translated app strings), the kit renders a searchable, grouped */\n/* grid of option tiles and reports the pick. Designed as the add flow */\n/* for `DashboardGrid` (`onRequestAdd` opens it) but generic to any */\n/* pick-one-catalogue surface. Disabled items stay visible with an */\n/* optional badge (e.g. \"Requires reconnect\") so users can discover */\n/* locked capabilities. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Search } from 'lucide-react';\nimport { Dialog } from '../dialog';\nimport { TextInput } from '../text-input';\nimport { Badge } from '../badge';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { widgetPickerAgent } from './widget-picker.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface WidgetPickerItem {\n /** Stable widget-type id reported via `onPick`. */\n id: string;\n /** Visible name (consumer-translated). */\n title: string;\n /** One-line explanation (consumer-translated). */\n description?: string;\n /** Small illustrative icon. */\n icon?: ReactNode;\n /** Group heading (consumer-translated). Ungrouped items render first. */\n category?: string;\n /** Visible but not pickable. */\n disabled?: boolean;\n /** Short annotation rendered as a badge (e.g. \"Requires reconnect\"). */\n badge?: string;\n}\n\nexport interface WidgetPickerProps {\n /** Controlled visibility. */\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** The catalogue. */\n items: WidgetPickerItem[];\n /**\n * Called with the picked item id; the picker then closes itself via\n * `onOpenChange(false)`.\n */\n onPick: (id: string) => void;\n /** Dialog title. Defaults to the kit's translated \"Add a widget\". */\n title?: string;\n /** Opaque instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n}\n\nexport interface WidgetPickerHandle {\n /**\n * Pick an item programmatically. False when the picker is closed, the id\n * is unknown, or the item is disabled.\n */\n pick: (id: string) => boolean;\n getPickerState: () => {\n open: boolean;\n items: Array<{ id: string; disabled: boolean }>;\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst tileVariants = cva(\n [\n 'ds:flex ds:w-full ds:min-h-[var(--min-target-size)] ds:items-start ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-[var(--card)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:py-[var(--spacing-md)]',\n 'ds:text-start ds:transition-colors',\n 'ds:hover:bg-muted/10',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed ds:disabled:hover:bg-transparent',\n ].join(' '),\n { variants: {}, defaultVariants: {} },\n);\n\n/* ------------------------------------------------------------------ */\n/* WidgetPicker */\n/* ------------------------------------------------------------------ */\n\nexport const WidgetPicker = forwardRef<WidgetPickerHandle, WidgetPickerProps>(\n ({ open, onOpenChange, items, onPick, title, id }, ref) => {\n const { t } = useTranslation();\n const [query, setQuery] = useState('');\n\n // Clear the search when the picker closes, so the next open starts fresh\n // without a post-open reflow flash.\n useEffect(() => {\n if (!open) setQuery('');\n }, [open]);\n\n const filtered = useMemo(() => {\n const needle = query.trim().toLowerCase();\n if (!needle) return items;\n return items.filter(\n (item) =>\n item.title.toLowerCase().includes(needle) ||\n (item.description ?? '').toLowerCase().includes(needle),\n );\n }, [items, query]);\n\n /* Group by category, preserving first-seen order; ungrouped first. */\n const groups = useMemo(() => {\n const order: Array<{\n category: string | null;\n entries: WidgetPickerItem[];\n }> = [];\n for (const item of filtered) {\n // Treat an empty-string category the same as no category.\n const key = item.category || null;\n let group = order.find((g) => g.category === key);\n if (!group) {\n group = { category: key, entries: [] };\n if (key === null) order.unshift(group);\n else order.push(group);\n }\n group.entries.push(item);\n }\n return order;\n }, [filtered]);\n\n const handlePick = useCallback(\n (itemId: string) => {\n onPick(itemId);\n onOpenChange(false);\n },\n [onPick, onOpenChange],\n );\n\n const agentHandle = useMemo<WidgetPickerHandle>(\n () => ({\n pick(itemId) {\n if (!open) return false;\n const item = items.find((entry) => entry.id === itemId);\n if (!item || item.disabled) return false;\n handlePick(itemId);\n return true;\n },\n getPickerState() {\n return {\n open,\n items: items.map((item) => ({\n id: item.id,\n disabled: Boolean(item.disabled),\n })),\n };\n },\n }),\n [open, items, handlePick],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(widgetPickerAgent, agentHandle, id);\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Content size=\"lg\">\n <div data-component=\"widget-picker\" data-component-id={id}>\n <Dialog.Title>{title ?? t('widgetPicker.title')}</Dialog.Title>\n <Dialog.Description className=\"ds:sr-only\">\n {t('widgetPicker.description')}\n </Dialog.Description>\n <div className=\"ds:mt-[var(--spacing-sm)]\">\n <TextInput\n aria-label={t('widgetPicker.searchLabel')}\n placeholder={t('widgetPicker.searchPlaceholder')}\n startAdornment={<Search aria-hidden=\"true\" />}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n </div>\n <div\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- scrollable catalogue needs a keyboard tab stop so an all-disabled, overflowing list stays scrollable (axe scrollable-region-focusable)\n tabIndex={0}\n className=\"ds:mt-[var(--spacing-md)] ds:flex ds:max-h-[60vh] ds:flex-col ds:gap-[var(--spacing-md)] ds:overflow-y-auto ds:pe-[var(--spacing-xs)] ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]\"\n >\n {groups.length === 0 ? (\n <p\n role=\"status\"\n className=\"ds:py-[var(--spacing-lg)] ds:text-center ds:text-sm ds:text-muted-foreground\"\n >\n {items.length === 0\n ? t('widgetPicker.none')\n : t('widgetPicker.empty')}\n </p>\n ) : (\n groups.map((group) => (\n <section\n key={group.category ?? '__ungrouped__'}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n {group.category ? (\n <h3 className=\"ds:text-xs ds:font-semibold ds:uppercase ds:tracking-wide ds:text-muted-foreground\">\n {group.category}\n </h3>\n ) : null}\n <div className=\"ds:grid ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\">\n {group.entries.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n disabled={item.disabled}\n onClick={() => handlePick(item.id)}\n className={tileVariants()}\n data-widget-type-id={item.id}\n >\n {item.icon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:mt-[var(--spacing-2xs)] ds:inline-flex ds:size-5 ds:shrink-0 ds:items-center ds:justify-center ds:text-muted-foreground ds:[&_svg]:size-5\"\n >\n {item.icon}\n </span>\n ) : null}\n <span className=\"ds:flex ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span className=\"ds:truncate ds:text-sm ds:font-medium\">\n {item.title}\n </span>\n {item.badge ? (\n <Badge variant=\"info\" size=\"sm\">\n {item.badge}\n </Badge>\n ) : null}\n </span>\n {item.description ? (\n <span className=\"ds:text-xs ds:text-muted-foreground\">\n {item.description}\n </span>\n ) : null}\n </span>\n </button>\n ))}\n </div>\n </section>\n ))\n )}\n </div>\n </div>\n </Dialog.Content>\n </Dialog.Root>\n );\n },\n);\n\nWidgetPicker.displayName = 'WidgetPicker';\n"],"names":["widgetPickerAgent","handle","args","tileVariants","cva","WidgetPicker","forwardRef","open","onOpenChange","items","onPick","title","id","ref","t","useTranslation","query","setQuery","useState","useEffect","filtered","useMemo","needle","item","groups","order","key","group","g","handlePick","useCallback","itemId","agentHandle","entry","useImperativeHandle","useAgentRegistration","Dialog","jsx","jsxs","TextInput","Search","event","Badge"],"mappings":"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"}