@alfadocs/ui-kit-debug 0.17.1 → 0.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/dist/_chunks/{accordion-DOmxGEWU.js → accordion-CNcodXuO.js} +6 -6
  2. package/dist/_chunks/{accordion-DOmxGEWU.js.map → accordion-CNcodXuO.js.map} +1 -1
  3. package/dist/_chunks/{ai-prompt-input-DEiQwIMn.js → ai-prompt-input-B-w5Rx3V.js} +184 -181
  4. package/dist/_chunks/ai-prompt-input-B-w5Rx3V.js.map +1 -0
  5. package/dist/_chunks/{alert-pgdXrEO5.js → alert-DBnawbmf.js} +64 -59
  6. package/dist/_chunks/alert-DBnawbmf.js.map +1 -0
  7. package/dist/_chunks/{audio-recorder-CRh4uyFL.js → audio-recorder-DNkQLW1G.js} +3 -3
  8. package/dist/_chunks/{audio-recorder-CRh4uyFL.js.map → audio-recorder-DNkQLW1G.js.map} +1 -1
  9. package/dist/_chunks/{autocomplete-mOg7WLOh.js → autocomplete-BxfabhZ8.js} +167 -164
  10. package/dist/_chunks/autocomplete-BxfabhZ8.js.map +1 -0
  11. package/dist/_chunks/{balance-cell-renderer-DWWtX-VM.js → balance-cell-renderer-DJB6WDPe.js} +2 -2
  12. package/dist/_chunks/{balance-cell-renderer-DWWtX-VM.js.map → balance-cell-renderer-DJB6WDPe.js.map} +1 -1
  13. package/dist/_chunks/{chat-input-UK-bXU7u.js → chat-input-B3XmFGDw.js} +123 -122
  14. package/dist/_chunks/chat-input-B3XmFGDw.js.map +1 -0
  15. package/dist/_chunks/checkbox-group-Bwmt1ovQ.js +213 -0
  16. package/dist/_chunks/checkbox-group-Bwmt1ovQ.js.map +1 -0
  17. package/dist/_chunks/{checkbox-D5EHnB14.js → checkbox-mwbrPZDY.js} +75 -70
  18. package/dist/_chunks/checkbox-mwbrPZDY.js.map +1 -0
  19. package/dist/_chunks/{collapsible-CuxUBoHJ.js → collapsible-hHiyZp0b.js} +61 -63
  20. package/dist/_chunks/collapsible-hHiyZp0b.js.map +1 -0
  21. package/dist/_chunks/{color-picker-BPfcByHH.js → color-picker-Bm-gzpsh.js} +2 -2
  22. package/dist/_chunks/{color-picker-BPfcByHH.js.map → color-picker-Bm-gzpsh.js.map} +1 -1
  23. package/dist/_chunks/{combobox-D5tWe0t_.js → combobox-Da9eq00i.js} +214 -211
  24. package/dist/_chunks/combobox-Da9eq00i.js.map +1 -0
  25. package/dist/_chunks/{copy-field-BCHAZ8QV.js → copy-field-BAF4mt9h.js} +95 -132
  26. package/dist/_chunks/copy-field-BAF4mt9h.js.map +1 -0
  27. package/dist/_chunks/{date-picker-BlhtBhPo.js → date-picker-BIoSLRly.js} +222 -219
  28. package/dist/_chunks/{date-picker-BlhtBhPo.js.map → date-picker-BIoSLRly.js.map} +1 -1
  29. package/dist/_chunks/{date-range-picker-C2hRu_Ke.js → date-range-picker-9gANFNG9.js} +81 -78
  30. package/dist/_chunks/date-range-picker-9gANFNG9.js.map +1 -0
  31. package/dist/_chunks/{date-time-picker-B67mPZmP.js → date-time-picker-DG7BiGdb.js} +98 -95
  32. package/dist/_chunks/date-time-picker-DG7BiGdb.js.map +1 -0
  33. package/dist/_chunks/{dialog-DRp6Dejy.js → dialog-DUomPCRS.js} +69 -71
  34. package/dist/_chunks/dialog-DUomPCRS.js.map +1 -0
  35. package/dist/_chunks/{dropdown-menu-dyV7gHh_.js → dropdown-menu-DZxwF23X.js} +108 -110
  36. package/dist/_chunks/dropdown-menu-DZxwF23X.js.map +1 -0
  37. package/dist/_chunks/{freemium-paywall-BTEiVkes.js → freemium-paywall-DXc7XlGE.js} +98 -97
  38. package/dist/_chunks/freemium-paywall-DXc7XlGE.js.map +1 -0
  39. package/dist/_chunks/{leo-sidebar-D3TuyH5_.js → leo-sidebar-DIsiTju3.js} +2 -2
  40. package/dist/_chunks/{leo-sidebar-D3TuyH5_.js.map → leo-sidebar-DIsiTju3.js.map} +1 -1
  41. package/dist/_chunks/{list-DcjV0m5B.js → list-BdvDctBz.js} +184 -180
  42. package/dist/_chunks/list-BdvDctBz.js.map +1 -0
  43. package/dist/_chunks/{message-tray-Fsend-du.js → message-tray-BNAS8al4.js} +111 -111
  44. package/dist/_chunks/message-tray-BNAS8al4.js.map +1 -0
  45. package/dist/_chunks/{multi-select-DooDzQIp.js → multi-select-CyspR5ZF.js} +157 -154
  46. package/dist/_chunks/multi-select-CyspR5ZF.js.map +1 -0
  47. package/dist/_chunks/{navigation-menu-DdufF-_4.js → navigation-menu-CyS1fBJ7.js} +85 -87
  48. package/dist/_chunks/navigation-menu-CyS1fBJ7.js.map +1 -0
  49. package/dist/_chunks/{notification-tray-C3dYdLAF.js → notification-tray-D_69dXFY.js} +114 -114
  50. package/dist/_chunks/notification-tray-D_69dXFY.js.map +1 -0
  51. package/dist/_chunks/{number-input-DH00o0DN.js → number-input-BZXu6bPY.js} +92 -89
  52. package/dist/_chunks/number-input-BZXu6bPY.js.map +1 -0
  53. package/dist/_chunks/{otp-input-BBXYvLx5.js → otp-input-BDF_iNpa.js} +92 -93
  54. package/dist/_chunks/otp-input-BDF_iNpa.js.map +1 -0
  55. package/dist/_chunks/{pagination-F1ei4khE.js → pagination-BWaXF7W0.js} +194 -211
  56. package/dist/_chunks/pagination-BWaXF7W0.js.map +1 -0
  57. package/dist/_chunks/{patient-shell-BE0CdPOJ.js → patient-shell-BOOaWZA9.js} +3 -3
  58. package/dist/_chunks/{patient-shell-BE0CdPOJ.js.map → patient-shell-BOOaWZA9.js.map} +1 -1
  59. package/dist/_chunks/{payment-form-CI77oIx1.js → payment-form-BjkuQeqR.js} +2 -2
  60. package/dist/_chunks/{payment-form-CI77oIx1.js.map → payment-form-BjkuQeqR.js.map} +1 -1
  61. package/dist/_chunks/{pdf-viewer-CnEJvmXC.js → pdf-viewer-BG_nsFT5.js} +2 -2
  62. package/dist/_chunks/{pdf-viewer-CnEJvmXC.js.map → pdf-viewer-BG_nsFT5.js.map} +1 -1
  63. package/dist/_chunks/{radio-group-Cz1a4QCA.js → radio-group-BHZOxrIK.js} +4 -4
  64. package/dist/_chunks/{radio-group-Cz1a4QCA.js.map → radio-group-BHZOxrIK.js.map} +1 -1
  65. package/dist/_chunks/{select-Ca6ibiDL.js → select-C92AT_OZ.js} +7 -7
  66. package/dist/_chunks/{select-Ca6ibiDL.js.map → select-C92AT_OZ.js.map} +1 -1
  67. package/dist/_chunks/{sidebar-D8Lq065m.js → sidebar-BqzlRBvC.js} +271 -291
  68. package/dist/_chunks/sidebar-BqzlRBvC.js.map +1 -0
  69. package/dist/_chunks/{slider-CkR6CLun.js → slider-CfEzeseL.js} +4 -4
  70. package/dist/_chunks/{slider-CkR6CLun.js.map → slider-CfEzeseL.js.map} +1 -1
  71. package/dist/_chunks/{tabs-CRCyPpJo.js → tabs-aEQfQV3x.js} +8 -8
  72. package/dist/_chunks/{tabs-CRCyPpJo.js.map → tabs-aEQfQV3x.js.map} +1 -1
  73. package/dist/_chunks/{theme-toggle-B3meAb3y.js → theme-toggle-BswYl0Yp.js} +2 -2
  74. package/dist/_chunks/{theme-toggle-B3meAb3y.js.map → theme-toggle-BswYl0Yp.js.map} +1 -1
  75. package/dist/_chunks/use-controllable-state-BiY4xTzM.js +23 -0
  76. package/dist/_chunks/use-controllable-state-BiY4xTzM.js.map +1 -0
  77. package/dist/_chunks/use-copy-to-clipboard-Cyfc_dlv.js +43 -0
  78. package/dist/_chunks/use-copy-to-clipboard-Cyfc_dlv.js.map +1 -0
  79. package/dist/_chunks/use-debounced-callback-BisrB-Fq.js.map +1 -1
  80. package/dist/_chunks/use-direction-D6rvvG9G.js.map +1 -1
  81. package/dist/_chunks/use-persistent-state-i23OWy6G.js +24 -0
  82. package/dist/_chunks/use-persistent-state-i23OWy6G.js.map +1 -0
  83. package/dist/_chunks/{warning-stack-CeRihME9.js → warning-stack-CDH9TudY.js} +2 -2
  84. package/dist/_chunks/{warning-stack-CeRihME9.js.map → warning-stack-CDH9TudY.js.map} +1 -1
  85. package/dist/_chunks/{workflow-map-D3MvrsZV.js → workflow-map-BeKe23uw.js} +3 -3
  86. package/dist/_chunks/{workflow-map-D3MvrsZV.js.map → workflow-map-BeKe23uw.js.map} +1 -1
  87. package/dist/agent-catalog.json +1 -1
  88. package/dist/components/_shared/use-debounced-callback.d.ts +1 -5
  89. package/dist/components/_shared/use-debounced-callback.d.ts.map +1 -1
  90. package/dist/components/_shared/use-direction.d.ts +1 -18
  91. package/dist/components/_shared/use-direction.d.ts.map +1 -1
  92. package/dist/components/_shared/use-focus-trap.d.ts +1 -31
  93. package/dist/components/_shared/use-focus-trap.d.ts.map +1 -1
  94. package/dist/components/accordion/index.js +1 -1
  95. package/dist/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
  96. package/dist/components/ai-prompt-input/index.js +1 -1
  97. package/dist/components/alert/alert.d.ts.map +1 -1
  98. package/dist/components/alert/index.js +1 -1
  99. package/dist/components/audio-recorder/index.js +1 -1
  100. package/dist/components/autocomplete/autocomplete.d.ts.map +1 -1
  101. package/dist/components/autocomplete/index.js +1 -1
  102. package/dist/components/chat-input/chat-input.d.ts.map +1 -1
  103. package/dist/components/chat-input/index.js +1 -1
  104. package/dist/components/checkbox/checkbox.d.ts.map +1 -1
  105. package/dist/components/checkbox/index.js +1 -1
  106. package/dist/components/checkbox-group/checkbox-group.d.ts.map +1 -1
  107. package/dist/components/checkbox-group/index.js +1 -1
  108. package/dist/components/collapsible/collapsible.d.ts.map +1 -1
  109. package/dist/components/collapsible/index.js +1 -1
  110. package/dist/components/color-picker/index.js +1 -1
  111. package/dist/components/combobox/combobox.d.ts.map +1 -1
  112. package/dist/components/combobox/index.js +1 -1
  113. package/dist/components/command-palette/command-palette.d.ts +1 -1
  114. package/dist/components/copy-field/index.js +1 -1
  115. package/dist/components/data-table/index.js +1 -1
  116. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  117. package/dist/components/date-picker/index.js +1 -1
  118. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  119. package/dist/components/date-range-picker/index.js +1 -1
  120. package/dist/components/date-time-picker/date-time-picker.d.ts.map +1 -1
  121. package/dist/components/date-time-picker/index.js +1 -1
  122. package/dist/components/dialog/dialog.d.ts.map +1 -1
  123. package/dist/components/dialog/index.js +1 -1
  124. package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
  125. package/dist/components/dropdown-menu/index.js +1 -1
  126. package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
  127. package/dist/components/freemium-paywall/index.js +1 -1
  128. package/dist/components/icon-button-group/icon-button-group.d.ts +14 -14
  129. package/dist/components/list/index.js +1 -1
  130. package/dist/components/list/list.d.ts.map +1 -1
  131. package/dist/components/message-tray/index.js +1 -1
  132. package/dist/components/message-tray/message-tray.d.ts.map +1 -1
  133. package/dist/components/multi-select/index.js +1 -1
  134. package/dist/components/multi-select/multi-select.d.ts.map +1 -1
  135. package/dist/components/navigation-menu/index.js +1 -1
  136. package/dist/components/navigation-menu/navigation-menu.d.ts.map +1 -1
  137. package/dist/components/notification-tray/index.js +1 -1
  138. package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
  139. package/dist/components/number-input/index.js +1 -1
  140. package/dist/components/number-input/number-input.d.ts.map +1 -1
  141. package/dist/components/otp-input/index.js +1 -1
  142. package/dist/components/otp-input/otp-input.d.ts.map +1 -1
  143. package/dist/components/pagination/index.js +1 -1
  144. package/dist/components/payment-form/index.js +1 -1
  145. package/dist/components/pdf-viewer/index.js +1 -1
  146. package/dist/components/radio-group/index.js +1 -1
  147. package/dist/components/select/index.js +1 -1
  148. package/dist/components/sidebar/index.js +8 -7
  149. package/dist/components/sidebar/index.js.map +1 -1
  150. package/dist/components/sidebar/sidebar.d.ts +1 -1
  151. package/dist/components/sidebar/sidebar.d.ts.map +1 -1
  152. package/dist/components/slider/index.js +1 -1
  153. package/dist/components/tabs/index.js +1 -1
  154. package/dist/components/theme-toggle/index.js +1 -1
  155. package/dist/components/warning-stack/index.js +1 -1
  156. package/dist/components/workflow/index.js +1 -1
  157. package/dist/hooks/index.d.ts +8 -0
  158. package/dist/hooks/index.d.ts.map +1 -1
  159. package/dist/hooks/index.js +98 -15
  160. package/dist/hooks/index.js.map +1 -1
  161. package/dist/hooks/use-debounced-callback.d.ts +19 -0
  162. package/dist/hooks/use-debounced-callback.d.ts.map +1 -0
  163. package/dist/hooks/use-debounced-value.d.ts +16 -0
  164. package/dist/hooks/use-debounced-value.d.ts.map +1 -0
  165. package/dist/hooks/use-direction.d.ts +19 -0
  166. package/dist/hooks/use-direction.d.ts.map +1 -0
  167. package/dist/hooks/use-focus-trap.d.ts +32 -0
  168. package/dist/hooks/use-focus-trap.d.ts.map +1 -0
  169. package/dist/hooks/use-isomorphic-layout-effect.d.ts +13 -0
  170. package/dist/hooks/use-isomorphic-layout-effect.d.ts.map +1 -0
  171. package/dist/hooks/use-persistent-state.d.ts +16 -0
  172. package/dist/hooks/use-persistent-state.d.ts.map +1 -0
  173. package/dist/index.js +493 -492
  174. package/dist/index.js.map +1 -1
  175. package/dist/patterns/leo-assistant/index.js +1 -1
  176. package/dist/patterns/patient-shell/index.js +1 -1
  177. package/dist/tokens.css +1 -1
  178. package/package.json +4 -2
  179. package/dist/_chunks/ai-prompt-input-DEiQwIMn.js.map +0 -1
  180. package/dist/_chunks/alert-pgdXrEO5.js.map +0 -1
  181. package/dist/_chunks/autocomplete-mOg7WLOh.js.map +0 -1
  182. package/dist/_chunks/chat-input-UK-bXU7u.js.map +0 -1
  183. package/dist/_chunks/checkbox-D5EHnB14.js.map +0 -1
  184. package/dist/_chunks/checkbox-group-Qkm3Rg1S.js +0 -208
  185. package/dist/_chunks/checkbox-group-Qkm3Rg1S.js.map +0 -1
  186. package/dist/_chunks/collapsible-CuxUBoHJ.js.map +0 -1
  187. package/dist/_chunks/combobox-D5tWe0t_.js.map +0 -1
  188. package/dist/_chunks/copy-field-BCHAZ8QV.js.map +0 -1
  189. package/dist/_chunks/date-range-picker-C2hRu_Ke.js.map +0 -1
  190. package/dist/_chunks/date-time-picker-B67mPZmP.js.map +0 -1
  191. package/dist/_chunks/dialog-DRp6Dejy.js.map +0 -1
  192. package/dist/_chunks/dropdown-menu-dyV7gHh_.js.map +0 -1
  193. package/dist/_chunks/freemium-paywall-BTEiVkes.js.map +0 -1
  194. package/dist/_chunks/list-DcjV0m5B.js.map +0 -1
  195. package/dist/_chunks/message-tray-Fsend-du.js.map +0 -1
  196. package/dist/_chunks/multi-select-DooDzQIp.js.map +0 -1
  197. package/dist/_chunks/navigation-menu-DdufF-_4.js.map +0 -1
  198. package/dist/_chunks/notification-tray-C3dYdLAF.js.map +0 -1
  199. package/dist/_chunks/number-input-DH00o0DN.js.map +0 -1
  200. package/dist/_chunks/otp-input-BBXYvLx5.js.map +0 -1
  201. package/dist/_chunks/pagination-F1ei4khE.js.map +0 -1
  202. package/dist/_chunks/sidebar-D8Lq065m.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfadocs/ui-kit-debug",
3
- "version": "0.17.1",
3
+ "version": "0.17.2",
4
4
  "type": "module",
5
5
  "description": "AlfaDocs shared design system — tokens, components, patterns, and translations for platform, booking, and alfascribe. (debug build — identical runtime to @alfadocs/ui-kit, ships source maps for symbolication).",
6
6
  "license": "BUSL-1.1",
@@ -661,6 +661,7 @@
661
661
  }
662
662
  },
663
663
  "dependencies": {
664
+ "@alfadocs/ui-kit": "^0.17.1",
664
665
  "@radix-ui/react-accordion": "^1.2.12",
665
666
  "@radix-ui/react-alert-dialog": "^1.1.15",
666
667
  "@radix-ui/react-aspect-ratio": "^1.1.8",
@@ -766,6 +767,7 @@
766
767
  "typescript-eslint": "^8.59.3",
767
768
  "vite": "^6.4.2",
768
769
  "vitest": "^4.1.4",
769
- "vitest-axe": "^0.1.0"
770
+ "vitest-axe": "^0.1.0",
771
+ "webpack-cli": "^7.0.2"
770
772
  }
771
773
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai-prompt-input-DEiQwIMn.js","sources":["../../src/components/ai-prompt-input/ai-prompt-input.agent.ts","../../src/components/ai-prompt-input/ai-prompt-input.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AIPromptInput. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AIPromptInputHandle } from './ai-prompt-input';\n\nexport const aiPromptInputAgent: AgentAdapter<AIPromptInputHandle> = {\n id: 'ai-prompt-input',\n capabilities: ['edit_inline', 'submit'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.aiPromptInput.state.value',\n description: 'Current text in the composer (no PHI processing).',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiPromptInput.state.isEmpty',\n description: 'True when the composer has no text and no attachments.',\n read: (handle) => handle.isEmpty(),\n },\n isSubmitting: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiPromptInput.state.isSubmitting',\n description:\n 'True while an onSubmit invocation is in flight (best-effort).',\n read: (handle) => handle.isSubmitting(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n descriptionKey: 'ui.agent.aiPromptInput.actions.setValue',\n description: 'Replace the composer text with the given value.',\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.aiPromptInput.actions.clear',\n description: 'Clear text and attachments. Irreversible from the same UI.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n submit: {\n safety: 'write',\n descriptionKey: 'ui.agent.aiPromptInput.actions.submit',\n description: 'Submit the current composer state via onSubmit.',\n invoke: (handle) => {\n handle.submit();\n },\n },\n focus: {\n safety: 'read',\n descriptionKey: 'ui.agent.aiPromptInput.actions.focus',\n description: 'Move keyboard focus into the textarea.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'ai-prompt-input',\n description: 'Marks the AIPromptInput wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop; addresses a specific composer instance.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useId,\n useImperativeHandle,\n useMemo,\n useLayoutEffect,\n useRef,\n useState,\n type ChangeEvent,\n type ClipboardEvent,\n type CompositionEvent,\n type KeyboardEvent,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { aiPromptInputAgent } from './ai-prompt-input.agent';\nimport { Command } from 'cmdk';\nimport { useDropzone } from 'react-dropzone';\nimport { Send, X } from 'lucide-react';\nimport { IconButton } from '../button';\nimport { Select, type SelectOption } from '../select/select';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface AIPromptCommand {\n id: string;\n label: string;\n description?: string;\n}\n\nexport interface AIPromptModel {\n id: string;\n label: string;\n}\n\nexport interface AIPromptAttachment {\n id: string;\n file: File;\n}\n\nexport interface AIPromptSubmitPayload {\n text: string;\n command?: string;\n attachments: AIPromptAttachment[];\n modelId?: string;\n}\n\ntype NativeTextareaProps = Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'size' | 'onSubmit' | 'children'\n>;\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-input',\n 'ds:shadow-[var(--shadow-input)]',\n 'ds:transition-[border-color,box-shadow] ds:duration-[var(--animation-duration)]',\n 'ds:focus-within:border-[color:var(--primary)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/** Curated imperative handle for agent / external automation. */\nexport interface AIPromptInputHandle {\n /** Current composer text. */\n getValue: () => string;\n /** True when text is empty and no attachments are pending. */\n isEmpty: () => boolean;\n /** True while a submit is in flight. */\n isSubmitting: () => boolean;\n /** Replace the composer text. */\n setValue: (value: string) => void;\n /** Clear text and attachments. */\n clear: () => void;\n /** Programmatically submit. */\n submit: () => void;\n /** Move keyboard focus into the textarea. */\n focus: () => void;\n}\n\nexport interface AIPromptInputProps\n extends NativeTextareaProps, VariantProps<typeof rootVariants> {\n /** Slash-command catalog. The DS owns the menu; apps own the commands. */\n commands?: AIPromptCommand[];\n /** Model catalog rendered as a Radix Select in the footer. */\n models?: AIPromptModel[];\n defaultModelId?: string;\n modelId?: string;\n onModelChange?: (id: string) => void;\n /** Maximum attachment size in bytes. */\n maxSize?: number;\n /** `accept` forwarded to react-dropzone. */\n accept?: Record<string, string[]>;\n /** Optional active context pill — dismissible via Backspace when focused. */\n context?: string;\n onContextDismiss?: () => void;\n onSubmit?: (payload: AIPromptSubmitPayload) => void;\n onAttach?: (files: File[]) => void;\n onAttachmentRejected?: (reason: string) => void;\n minRows?: number;\n maxRows?: number;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const AIPromptInput = forwardRef<HTMLDivElement, AIPromptInputProps>(\n (\n {\n commands = [],\n models,\n defaultModelId,\n modelId,\n onModelChange,\n maxSize,\n accept,\n context,\n onContextDismiss,\n onSubmit,\n onAttach,\n onAttachmentRejected,\n minRows = 2,\n maxRows = 8,\n value,\n defaultValue,\n size = 'md',\n disabled,\n className,\n placeholder,\n onChange,\n onKeyDown,\n onCompositionStart,\n onCompositionEnd,\n onPaste,\n id,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const textareaId = useId();\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\n const composingRef = useRef(false);\n const slashMenuRef = useRef<HTMLDivElement | null>(null);\n\n const setRefs = useCallback((node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n }, []);\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n String(defaultValue ?? ''),\n );\n const currentValue = isControlled ? String(value) : internalValue;\n\n const [attachments, setAttachments] = useState<AIPromptAttachment[]>([]);\n const [slashOpen, setSlashOpen] = useState(false);\n const [slashQuery, setSlashQuery] = useState('');\n\n const [internalModel, setInternalModel] = useState<string>(\n defaultModelId ?? models?.[0]?.id ?? '',\n );\n const isModelControlled = modelId !== undefined;\n const currentModel = isModelControlled ? modelId : internalModel;\n\n /* ── Auto-grow ── */\n const resize = useCallback(() => {\n const el = innerRef.current;\n if (!el) return;\n const styles = window.getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight) || 24;\n const padTop = parseFloat(styles.paddingTop) || 0;\n const padBot = parseFloat(styles.paddingBottom) || 0;\n const borderTop = parseFloat(styles.borderTopWidth) || 0;\n const borderBot = parseFloat(styles.borderBottomWidth) || 0;\n const chrome = padTop + padBot + borderTop + borderBot;\n const minH = lineHeight * minRows + chrome;\n const maxH = lineHeight * maxRows + chrome;\n el.style.height = 'auto';\n const next = Math.max(minH, Math.min(el.scrollHeight, maxH));\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > maxH ? 'auto' : 'hidden';\n }, [minRows, maxRows]);\n\n useLayoutEffect(() => {\n resize();\n }, [resize, currentValue]);\n\n /* ── Slash detection ── */\n const detectSlash = useCallback((text: string, caretPos: number) => {\n // Find the start of the current line.\n const before = text.slice(0, caretPos);\n const lineStart = before.lastIndexOf('\\n') + 1;\n const lineText = text.slice(lineStart, caretPos);\n if (lineText.startsWith('/')) {\n const afterSlash = lineText.slice(1);\n // Only open if the characters after '/' contain no whitespace.\n if (!/\\s/.test(afterSlash)) {\n setSlashOpen(true);\n setSlashQuery(afterSlash);\n return;\n }\n }\n setSlashOpen(false);\n setSlashQuery('');\n }, []);\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) setInternalValue(e.target.value);\n if (composingRef.current) return;\n onChange?.(e);\n const caret = e.target.selectionStart ?? e.target.value.length;\n detectSlash(e.target.value, caret);\n };\n\n const handleCompositionStart = (\n e: CompositionEvent<HTMLTextAreaElement>,\n ) => {\n composingRef.current = true;\n onCompositionStart?.(e);\n };\n const handleCompositionEnd = (e: CompositionEvent<HTMLTextAreaElement>) => {\n composingRef.current = false;\n onCompositionEnd?.(e);\n };\n\n const isIMEKey = (e: KeyboardEvent<HTMLTextAreaElement>) =>\n e.nativeEvent.isComposing || e.keyCode === 229 || composingRef.current;\n\n const handleSubmit = useCallback(() => {\n const text = currentValue.trim();\n if (!text && attachments.length === 0) return;\n // Extract any leading command token.\n let command: string | undefined;\n let body = currentValue;\n const m = currentValue.match(/^\\/(\\S+)\\s?/);\n if (m) {\n command = m[1];\n body = currentValue.slice(m[0].length);\n }\n onSubmit?.({\n text: body,\n command,\n attachments,\n modelId: currentModel || undefined,\n });\n if (!isControlled) setInternalValue('');\n setAttachments([]);\n }, [currentValue, attachments, onSubmit, currentModel, isControlled]);\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<AIPromptInputHandle>(\n () => ({\n getValue: () => currentValue,\n isEmpty: () => !currentValue.trim() && attachments.length === 0,\n isSubmitting: () => false,\n setValue: (next: string) => {\n if (!isControlled) setInternalValue(next);\n },\n clear: () => {\n if (!isControlled) setInternalValue('');\n setAttachments([]);\n },\n submit: () => {\n handleSubmit();\n },\n focus: () => {\n innerRef.current?.focus();\n },\n }),\n [currentValue, attachments, isControlled, handleSubmit],\n );\n useAgentRegistration(aiPromptInputAgent, agentHandle, id);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (isIMEKey(e)) return;\n\n // Slash menu open — Escape closes; ArrowDown/ArrowUp/Enter handled by cmdk.\n if (slashOpen) {\n if (e.key === 'Escape') {\n e.preventDefault();\n setSlashOpen(false);\n return;\n }\n }\n\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n const insertCommand = (cmd: AIPromptCommand) => {\n const el = innerRef.current;\n if (!el) return;\n const caret = el.selectionStart ?? currentValue.length;\n const before = currentValue.slice(0, caret);\n const lineStart = before.lastIndexOf('\\n') + 1;\n // Extend past any non-whitespace characters that follow the caret so\n // we replace the ENTIRE slash token (\"/fi|xBug more\" → \"/fixBug more\"),\n // not just the part before the caret (which would garble the tail).\n let endOfSlashToken = caret;\n while (\n endOfSlashToken < currentValue.length &&\n !/\\s/.test(currentValue[endOfSlashToken])\n ) {\n endOfSlashToken += 1;\n }\n const afterSlash = currentValue.slice(endOfSlashToken);\n const nextValue =\n currentValue.slice(0, lineStart) + `/${cmd.id} ` + afterSlash;\n if (!isControlled) setInternalValue(nextValue);\n // External consumers mirror the same synthetic event pattern other\n // text inputs in the system use — the native `onChange` fires via React.\n setSlashOpen(false);\n setSlashQuery('');\n queueMicrotask(() => el.focus());\n };\n\n /* ── Clipboard paste: strip rich HTML to plaintext, hand files to onAttach ── */\n const handlePaste = (e: ClipboardEvent<HTMLTextAreaElement>) => {\n onPaste?.(e);\n if (e.defaultPrevented) return;\n const { clipboardData } = e;\n if (!clipboardData) return;\n const files: File[] = [];\n for (let i = 0; i < clipboardData.items.length; i += 1) {\n const item = clipboardData.items[i];\n if (item.kind === 'file') {\n const f = item.getAsFile();\n if (f) files.push(f);\n }\n }\n if (files.length > 0) {\n e.preventDefault();\n acceptFiles(files);\n }\n };\n\n /* ── Dropzone ── */\n const acceptFiles = useCallback(\n (files: File[]) => {\n const next: AIPromptAttachment[] = [];\n for (const f of files) {\n if (typeof maxSize === 'number' && f.size > maxSize) {\n onAttachmentRejected?.(\n t('chat.attachment.rejected', { reason: 'size' }),\n );\n continue;\n }\n next.push({\n id: crypto.randomUUID?.() ?? `att-${Math.random()}`,\n file: f,\n });\n }\n if (next.length > 0) {\n setAttachments((prev) => [...prev, ...next]);\n onAttach?.(next.map((a) => a.file));\n }\n },\n [maxSize, onAttach, onAttachmentRejected, t],\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop: acceptFiles,\n maxSize,\n accept,\n noClick: true,\n noKeyboard: true,\n });\n\n const removeAttachment = (id: string) => {\n setAttachments((prev) => prev.filter((a) => a.id !== id));\n };\n\n const effectiveId = id ?? textareaId;\n const labelId = `${effectiveId}-label`;\n const slashListId = `${effectiveId}-slash-list`;\n\n const modelOptions: SelectOption<string>[] =\n models?.map((m) => ({ value: m.id, label: m.label })) ?? [];\n\n return (\n <div\n ref={rootRef}\n {...getRootProps({\n className: [\n rootVariants({ size, className }),\n isDragActive\n ? 'ds:outline ds:outline-dashed ds:outline-[color:var(--primary)] ds:outline-offset-2 ds:bg-[color:var(--primary)]/5'\n : '',\n ].join(' '),\n })}\n aria-label={t('chat.attachmentZone')}\n data-component=\"ai-prompt-input\"\n data-component-id={id}\n >\n {/* Hidden file input owned by react-dropzone. The aria-label\n covers axe's `label` rule (the input is visually-hidden but\n still reachable programmatically). */}\n <input aria-label={t('chat.attachmentZone')} {...getInputProps()} />\n\n {context ? (\n <div className=\"ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)]\">\n {/* Native <button> — not a span with role=\"button\" — per\n 05-accessibility \"Interactive elements use the right tag\".\n Enter/Space dispatch naturally via the native button;\n Backspace/Delete also dismiss (pill convention). */}\n <button\n type=\"button\"\n aria-label={t('chat.contextActive', { name: context })}\n onClick={onContextDismiss}\n onKeyDown={(e) => {\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault();\n onContextDismiss?.();\n }\n }}\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:border ds:border-[color:var(--accent)]/30',\n 'ds:bg-[color:var(--accent)]/10 ds:text-[color:var(--foreground)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'type-body-sm',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n >\n {t('chat.contextActive', { name: context })}\n </button>\n </div>\n ) : null}\n\n <label id={labelId} htmlFor={effectiveId} className=\"ds:sr-only\">\n {t('chat.prompt')}\n </label>\n\n <div className=\"ds:relative\">\n {/* The textarea takes on a combobox role only while the slash\n popup is open. ARIA 1.2 permits `role=\"combobox\"` on a\n textarea — that's what makes `aria-expanded` / `aria-controls`\n valid here. When the popup is closed the textarea reverts to\n its plain implicit role so we don't add the aria attrs at all. */}\n <textarea\n ref={setRefs}\n id={effectiveId}\n rows={minRows}\n value={isControlled ? currentValue : undefined}\n defaultValue={!isControlled ? defaultValue : undefined}\n disabled={disabled}\n placeholder={placeholder ?? t('chat.input.placeholder')}\n aria-labelledby={labelId}\n role={slashOpen ? 'combobox' : undefined}\n aria-controls={slashOpen ? slashListId : undefined}\n aria-expanded={slashOpen ? true : undefined}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n className={[\n 'ds:w-full ds:resize-none ds:bg-transparent ds:outline-none',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]',\n 'ds:placeholder:text-[color:var(--muted-foreground)]',\n 'ds:leading-[var(--line-height-base)]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed',\n ].join(' ')}\n {...rest}\n />\n\n {slashOpen ? (\n <div\n ref={slashMenuRef}\n className={[\n 'ds:absolute ds:start-[var(--spacing-md)] ds:top-full ds:z-50',\n 'ds:mt-[var(--spacing-xs)]',\n 'ds:min-w-[240px] ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:bg-[color:var(--popover)] ds:text-[color:var(--popover-foreground)]',\n 'ds:shadow-[var(--shadow-md)]',\n // Match the Dialog / DropdownMenu open pattern: fade + scale\n // in from 95%. Origin set to the block-start so the menu\n // appears to expand from the textarea it sits beneath.\n 'ds:origin-top ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:zoom-in-95',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n id={slashListId}\n >\n <Command label={t('chat.slashMenu.label')} loop>\n <Command.Input\n value={slashQuery}\n onValueChange={setSlashQuery}\n className=\"ds:sr-only\"\n />\n <Command.List className=\"ds:max-h-60 ds:overflow-y-auto ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n <Command.Empty className=\"type-body-sm ds:text-[color:var(--muted-foreground)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]\">\n {t('chat.slashMenu.empty')}\n </Command.Empty>\n {commands.map((cmd) => (\n <Command.Item\n key={cmd.id}\n value={cmd.id}\n onSelect={() => insertCommand(cmd)}\n className={[\n 'ds:flex ds:flex-col ds:gap-[2px]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-body-sm ds:cursor-pointer',\n 'ds:aria-selected:bg-muted/20',\n 'ds:data-[selected=true]:bg-muted/20',\n ].join(' ')}\n >\n <span className=\"ds:font-medium\">/{cmd.id}</span>\n {cmd.description ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {cmd.description}\n </span>\n ) : null}\n </Command.Item>\n ))}\n </Command.List>\n </Command>\n </div>\n ) : null}\n </div>\n\n {attachments.length > 0 ? (\n <div\n role=\"group\"\n aria-label={t('chat.attachmentZone')}\n className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]\"\n >\n {attachments.map((att) => (\n <AttachmentChip\n key={att.id}\n file={att.file}\n onRemove={() => removeAttachment(att.id)}\n />\n ))}\n </div>\n ) : null}\n\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n {models && models.length > 0 ? (\n <div className=\"ds:me-auto ds:min-w-[140px]\">\n <Select\n aria-label={t('chat.model.select')}\n options={modelOptions}\n value={currentModel || ''}\n onValueChange={(v) => {\n if (!isModelControlled) setInternalModel(v);\n onModelChange?.(v);\n }}\n size=\"sm\"\n />\n </div>\n ) : (\n <div className=\"ds:me-auto\" />\n )}\n <span className=\"ds:sr-only\">{t('chat.input.sendHint')}</span>\n <IconButton\n icon={<Send />}\n aria-label={t('chat.send')}\n intent=\"primary\"\n size=\"sm\"\n disabled={\n disabled || (!currentValue.trim() && attachments.length === 0)\n }\n onClick={handleSubmit}\n aria-keyshortcuts=\"Meta+Enter Control+Enter\"\n />\n </div>\n </div>\n );\n },\n);\n\nAIPromptInput.displayName = 'AIPromptInput';\n\n/* ------------------------------------------------------------------ */\n/* Attachment chip */\n/* ------------------------------------------------------------------ */\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction AttachmentChip({\n file,\n onRemove,\n}: {\n file: File;\n onRemove: () => void;\n}): ReactNode {\n const { t } = useTranslation();\n return (\n <span\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:bg-muted/30',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-xs)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-meta',\n // Entrance when a file is attached via drop / paste / picker.\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-bottom-1',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n >\n <span className=\"ds:truncate ds:max-w-[16ch]\">{file.name}</span>\n <span className=\"ds:text-[color:var(--muted-foreground)] ds:tabular-nums\">\n {formatSize(file.size)}\n </span>\n <IconButton\n icon={<X />}\n aria-label={t('chat.attachment.remove', { name: file.name })}\n intent=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n />\n </span>\n );\n}\n"],"names":["aiPromptInputAgent","handle","args","rootVariants","cva","AIPromptInput","forwardRef","commands","models","defaultModelId","modelId","onModelChange","maxSize","accept","context","onContextDismiss","onSubmit","onAttach","onAttachmentRejected","minRows","maxRows","value","defaultValue","size","disabled","className","placeholder","onChange","onKeyDown","onCompositionStart","onCompositionEnd","onPaste","id","rest","ref","t","useTranslation","textareaId","useId","innerRef","useRef","composingRef","slashMenuRef","setRefs","useCallback","node","isControlled","internalValue","setInternalValue","useState","currentValue","attachments","setAttachments","slashOpen","setSlashOpen","slashQuery","setSlashQuery","internalModel","setInternalModel","_a","isModelControlled","currentModel","resize","el","styles","lineHeight","padTop","padBot","borderTop","borderBot","chrome","minH","maxH","next","useLayoutEffect","detectSlash","text","caretPos","lineStart","lineText","afterSlash","handleChange","caret","handleCompositionStart","handleCompositionEnd","isIMEKey","handleSubmit","command","body","m","rootRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration","handleKeyDown","insertCommand","cmd","endOfSlashToken","nextValue","handlePaste","clipboardData","files","i","item","f","acceptFiles","prev","a","getRootProps","getInputProps","isDragActive","useDropzone","removeAttachment","effectiveId","labelId","slashListId","modelOptions","jsxs","jsx","Command","att","AttachmentChip","Select","v","IconButton","Send","formatSize","bytes","file","onRemove","X"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"alert-pgdXrEO5.js","sources":["../../src/components/alert/alert.tsx"],"sourcesContent":["import {\n Children,\n forwardRef,\n isValidElement,\n useCallback,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Info, CircleCheck, TriangleAlert, CircleX, X } from 'lucide-react';\n\nconst alertVariants = cva(\n [\n // Default `items-center` keeps the icon + dismiss optically aligned\n // with a single-line description. The `data-[has-title=true]`\n // selector flips to `items-start` when an `<Alert.Title>` is\n // present so the icon anchors to the heading's top instead of\n // floating against the centre of the title+description block.\n // For multi-line descriptions without a title, `items-center` still\n // looks right at 2–3 lines and matches Toast / Notification.\n 'ds:flex ds:items-center ds:data-[has-title=true]:items-start ds:gap-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:border ds:border-[length:var(--border-width-sm)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:break-words',\n ].join(' '),\n {\n variants: {\n // Each variant paints `<Button intent=\"tonal\">` descendants via a\n // child selector — the button carries `data-intent=\"tonal\"`, the\n // Alert applies the matching tint (`*-foreground` for bg + the\n // surface `--background` for fg). Descendant selectors sidestep\n // custom-property inheritance and are rock-solid across themes.\n variant: {\n info: [\n 'ds:border-[color:var(--info)]',\n 'ds:bg-[color-mix(in_srgb,var(--info)_10%,transparent)]',\n 'ds:text-[var(--info-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--info-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n success: [\n 'ds:border-[color:var(--success)]',\n 'ds:bg-[color-mix(in_srgb,var(--success)_10%,transparent)]',\n 'ds:text-[var(--success-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--success-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n warning: [\n 'ds:border-[color:var(--warning)]',\n 'ds:bg-[color-mix(in_srgb,var(--warning)_10%,transparent)]',\n 'ds:text-[var(--warning-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--warning-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n error: [\n 'ds:border-[color:var(--error)]',\n 'ds:bg-[color-mix(in_srgb,var(--error)_10%,transparent)]',\n 'ds:text-[var(--error-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--error-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n },\n },\n defaultVariants: {\n variant: 'info',\n },\n },\n);\n\n// Icon stays `mt-0.5` only when an `<Alert.Title>` is present — that\n// offset compensates for the title's cap-height vs. line-box origin so\n// the glyph aligns with the heading's caps. Without a title, the\n// container uses `items-center` and the offset would push the icon\n// 2px off the optical axis.\nconst ICON_BASE = 'ds:shrink-0 ds:size-5';\nconst ICON_WITH_TITLE = `${ICON_BASE} ds:mt-0.5`;\n\nconst CLOSE_BUTTON_CLASSES = [\n 'ds:ms-auto ds:shrink-0 ds:inline-flex ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:-mt-[var(--spacing-xs)] ds:-me-[var(--spacing-xs)]',\n 'ds:text-current ds:opacity-70',\n 'ds:hover:opacity-100',\n 'ds:transition-opacity ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\nconst VARIANT_CONFIG = {\n info: { icon: <Info aria-hidden=\"true\" />, role: 'status', live: 'polite' },\n success: {\n icon: <CircleCheck aria-hidden=\"true\" />,\n role: 'status',\n live: 'polite',\n },\n warning: {\n icon: <TriangleAlert aria-hidden=\"true\" />,\n role: 'alert',\n live: 'assertive',\n },\n error: {\n icon: <CircleX aria-hidden=\"true\" />,\n role: 'alert',\n live: 'assertive',\n },\n} as const;\n\ninterface AlertTitleProps extends HTMLAttributes<HTMLHeadingElement> {\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span';\n}\n\nconst AlertTitle = forwardRef<HTMLHeadingElement, AlertTitleProps>(\n ({ as: Tag = 'h5', className, ...props }, ref) => (\n <Tag\n ref={ref}\n className={['type-title-item', className].filter(Boolean).join(' ')}\n {...props}\n />\n ),\n);\nAlertTitle.displayName = 'Alert.Title';\n\nconst AlertDescription = forwardRef<\n HTMLParagraphElement,\n HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n // `mt` is gated on the root's `data-has-title=\"true\"` attribute so\n // the margin only paints when there's a Title above the\n // Description to separate from. Without this gate, a Description\n // rendered alone sits a few pixels below the icon + dismiss ×\n // optical centre — visible on the AlfaDocs marketing privacy\n // generator before HTP-4860's follow-up fix.\n className={[\n 'ds:[[data-has-title=true]_&]:mt-[var(--spacing-xs)] type-body-sm',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nAlertDescription.displayName = 'Alert.Description';\n\nconst AlertAction = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'ds:mt-[var(--spacing-sm)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n ),\n);\nAlertAction.displayName = 'Alert.Action';\n\nexport interface AlertProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'role'>,\n VariantProps<typeof alertVariants> {\n variant?: 'info' | 'success' | 'warning' | 'error';\n dismissible?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n icon?: ReactNode;\n live?: 'assertive' | 'polite' | 'off';\n}\n\nexport type { AlertTitleProps };\n\nconst AlertRoot = forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n variant = 'info',\n dismissible = false,\n open: controlledOpen,\n onOpenChange,\n icon,\n live,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const [internalOpen, setInternalOpen] = useState(true);\n const [isClosing, setIsClosing] = useState(false);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const animationDurationMs = useCallback((): number => {\n if (typeof window === 'undefined') return 200;\n const raw = window\n .getComputedStyle(document.documentElement)\n .getPropertyValue('--animation-duration');\n if (!raw) return 200;\n const trimmed = raw.trim();\n const n = parseFloat(trimmed);\n if (!Number.isFinite(n)) return 200;\n return trimmed.endsWith('ms') ? n : n * 1000;\n }, []);\n\n if (!isOpen) return null;\n\n const config = VARIANT_CONFIG[variant];\n const effectiveIcon = icon !== undefined ? icon : config.icon;\n\n // Detect an `<Alert.Title>` anywhere in the immediate children so\n // the root can flip its cross-axis alignment. Nested wrappers\n // around a Title aren't supported — keep the API as flat as the\n // existing `Alert.Title` / `Alert.Description` convention.\n const hasTitle = Children.toArray(children).some(\n (child) => isValidElement(child) && child.type === AlertTitle,\n );\n\n const handleDismiss = () => {\n if (isClosing) return;\n setIsClosing(true);\n if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n closeTimerRef.current = setTimeout(() => {\n setIsClosing(false);\n if (!isControlled) setInternalOpen(false);\n onOpenChange?.(false);\n }, animationDurationMs());\n };\n\n return (\n <div\n ref={ref}\n role={config.role}\n aria-live={live ?? config.live}\n data-component=\"alert\"\n data-has-title={hasTitle ? 'true' : 'false'}\n data-state={isClosing ? 'closing' : 'open'}\n className={[\n alertVariants({ variant, className }),\n // Entry: fade + slide-down on mount. Exit: fade + slide-up + slight\n // scale when dismissed. Driven by `tw-animate-css`. Respects\n // `prefers-reduced-motion` via `motion-safe:` and zeroes under the\n // accessible theme (`--animation-duration: 0ms`).\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-top-2',\n 'ds:motion-safe:data-[state=closing]:animate-out ds:motion-safe:data-[state=closing]:fade-out-0',\n 'ds:motion-safe:data-[state=closing]:slide-out-to-top-2 ds:motion-safe:data-[state=closing]:zoom-out-95',\n // Pin the exit's end-state until React unmounts. Without\n // `fill-mode-forwards` the element snaps back to opacity:1 for one\n // paint frame after the animation ends.\n 'ds:motion-safe:data-[state=closing]:fill-mode-forwards',\n 'ds:motion-safe:duration-[var(--animation-duration)]',\n ].join(' ')}\n {...props}\n >\n {effectiveIcon ? (\n <span className={hasTitle ? ICON_WITH_TITLE : ICON_BASE}>\n {effectiveIcon}\n </span>\n ) : null}\n\n <div className=\"ds:flex-1 ds:min-w-0\">{children}</div>\n\n {dismissible ? (\n <button\n type=\"button\"\n aria-label={t('common.close', 'Close')}\n onClick={handleDismiss}\n className={CLOSE_BUTTON_CLASSES}\n >\n <X aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n ) : null}\n </div>\n );\n },\n);\n\nAlertRoot.displayName = 'Alert';\n\nexport const Alert = Object.assign(AlertRoot, {\n Title: AlertTitle,\n Description: AlertDescription,\n Action: AlertAction,\n});\n"],"names":["alertVariants","cva","ICON_BASE","ICON_WITH_TITLE","CLOSE_BUTTON_CLASSES","VARIANT_CONFIG","jsx","Info","CircleCheck","TriangleAlert","CircleX","AlertTitle","forwardRef","Tag","className","props","ref","AlertDescription","AlertAction","AlertRoot","variant","dismissible","controlledOpen","onOpenChange","icon","live","children","t","useTranslation","internalOpen","setInternalOpen","useState","isClosing","setIsClosing","closeTimerRef","useRef","isControlled","isOpen","animationDurationMs","useCallback","raw","trimmed","n","config","effectiveIcon","hasTitle","Children","child","isValidElement","handleDismiss","jsxs","Alert"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"autocomplete-mOg7WLOh.js","sources":["../../src/components/autocomplete/autocomplete.agent.ts","../../src/components/autocomplete/autocomplete.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { AutocompleteHandle } from './autocomplete';\n\nexport const autocompleteAgent: AgentAdapter<AutocompleteHandle> = {\n id: 'autocomplete',\n capabilities: ['filter', 'pick', 'open', 'close'],\n state: {\n value: {\n type: 'string | null',\n description:\n 'Currently-selected option value, or null when nothing is committed.',\n read: (handle) => handle.getValue(),\n },\n query: {\n type: 'string',\n description: 'Current free-text query in the input.',\n read: (handle) => handle.getQuery(),\n },\n isOpen: {\n type: 'boolean',\n description: 'True when the suggestion list is visible.',\n read: (handle) => handle.getIsOpen(),\n },\n },\n actions: {\n set_value: {\n safety: 'read',\n argsType: '{ value: string | null }',\n description: 'Set the committed value programmatically.',\n invoke: (handle, args: { value: string | null }) => {\n handle.setValue(args.value);\n },\n },\n apply_filter: {\n safety: 'read',\n argsType: '{ query: string }',\n description: 'Set the input query, which filters the suggestion list.',\n invoke: (handle, args: { query: string }) => {\n handle.setQuery(args.query);\n },\n },\n clear: {\n safety: 'read',\n description: 'Clear the value and the query.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n open: {\n safety: 'read',\n description: 'Open the suggestion list.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n description: 'Close the suggestion list.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'autocomplete' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-option-id',\n description: 'Each suggestion emits its value as data-option-id.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CompositionEvent,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n type Ref,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { Command } from 'cmdk';\nimport * as Popover from '@radix-ui/react-popover';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Spinner } from '../spinner/spinner';\nimport { useFormField } from '../form-field/form-field-context';\nimport { useDebouncedCallback } from '../_shared/use-debounced-callback';\nimport type { OptionShape } from '../_shared/option';\nimport { groupOptions } from '../_shared/group-options';\nimport {\n INPUT_SURFACE_CHROME,\n INPUT_SURFACE_HEIGHT,\n INPUT_SURFACE_TEXT,\n INPUT_SURFACE_TONE,\n} from '../_shared/input-surface';\nimport { useAgentRegistration } from '../../agent';\nimport { autocompleteAgent } from './autocomplete.agent';\n\n// ---------------------------------------------------------------------------\n// CVA — sizing / chrome tokens come from _shared/input-surface so the four\n// input surfaces (TextInput, Autocomplete, Combobox, MultiSelect) cannot drift.\n// ---------------------------------------------------------------------------\n\nconst autocompleteVariants = cva(\n ['ds:flex ds:w-full ds:items-center', INPUT_SURFACE_CHROME].join(' '),\n {\n variants: {\n size: {\n sm: `${INPUT_SURFACE_HEIGHT.sm} ${INPUT_SURFACE_TEXT.sm}`,\n md: `${INPUT_SURFACE_HEIGHT.md} ${INPUT_SURFACE_TEXT.md}`,\n lg: `${INPUT_SURFACE_HEIGHT.lg} ${INPUT_SURFACE_TEXT.lg}`,\n },\n tone: INPUT_SURFACE_TONE,\n },\n defaultVariants: { size: 'md', tone: 'default' },\n },\n);\n\nconst inputVariants = cva(\n [\n 'ds:flex-1 ds:min-w-0 ds:bg-transparent ds:text-foreground',\n 'ds:placeholder:text-muted-foreground',\n 'ds:outline-none ds:focus:outline-none ds:focus-visible:outline-none',\n 'ds:disabled:cursor-not-allowed',\n 'ds:read-only:cursor-default',\n ].join(' '),\n {\n variants: {\n hasStart: { true: 'ds:ps-2', false: 'ds:ps-3' },\n hasEnd: { true: 'ds:pe-2', false: 'ds:pe-3' },\n },\n defaultVariants: { hasStart: false, hasEnd: false },\n },\n);\n\nconst contentVariants = cva(\n [\n 'ds:z-[var(--z-dropdown)] ds:overflow-hidden',\n 'ds:rounded-[var(--radius-sm)] ds:border ds:border-border ds:bg-background',\n 'ds:shadow-[var(--shadow-md)]',\n 'ds:w-[var(--radix-popover-trigger-width)]',\n 'ds:animate-in ds:fade-in ds:zoom-in-95',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out',\n 'ds:data-[state=closed]:zoom-out-95',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n);\n\nconst itemVariants = cva(\n [\n 'ds:relative ds:flex ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:ps-3 ds:pe-3 ds:py-2 ds:text-[length:var(--font-size-sm)] ds:text-foreground',\n 'ds:rounded-[var(--radius-sm)] ds:select-none ds:cursor-pointer',\n 'ds:data-[disabled=true]:pointer-events-none ds:data-[disabled=true]:opacity-50',\n 'ds:data-[selected=true]:bg-primary ds:data-[selected=true]:text-primary-foreground',\n 'ds:hover:bg-muted ds:data-[selected=true]:hover:bg-primary',\n ].join(' '),\n);\n\nconst groupClasses = [\n 'ds:[&_[cmdk-group-heading]]:ps-3',\n 'ds:[&_[cmdk-group-heading]]:pe-3',\n 'ds:[&_[cmdk-group-heading]]:py-1.5',\n 'ds:[&_[cmdk-group-heading]]:type-eyebrow',\n 'ds:[&_[cmdk-group-heading]]:text-muted-foreground',\n].join(' ');\n\nconst adornmentBase =\n 'ds:inline-flex ds:items-center ds:shrink-0 ds:text-muted-foreground ds:[&_svg]:size-4';\n\n// ---------------------------------------------------------------------------\n// Agent handle — curated surface for agent-readiness adapter.\n//\n// The autocomplete `forwardRef` exposes the underlying `HTMLInputElement` for\n// form integration; the agent handle is a separate, structural contract\n// referenced by `autocomplete.agent.ts`. Consumers wire it via the platform\n// registry — it is not the component's React ref.\n// ---------------------------------------------------------------------------\n\nexport interface AutocompleteHandle {\n getValue: () => string | null;\n getQuery: () => string;\n getIsOpen: () => boolean;\n setValue: (value: string | null) => void;\n setQuery: (query: string) => void;\n clear: () => void;\n open: () => void;\n close: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\ntype CVAProps = VariantProps<typeof autocompleteVariants>;\n\nexport interface AutocompleteProps<T extends string = string> extends Pick<\n CVAProps,\n 'size' | 'tone'\n> {\n loadOptions: (\n query: string,\n opts: { signal: AbortSignal; locale: string },\n ) => Promise<OptionShape<T>[]>;\n debounceMs?: number;\n\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n onSelect?: (option: OptionShape<T>) => void;\n\n recents?: OptionShape<T>[];\n onRecentSelect?: (option: OptionShape<T>) => void;\n\n snapOnBlur?: boolean;\n\n startAdornment?: ReactNode;\n endAdornment?: ReactNode;\n placeholder?: string;\n\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n name?: string;\n id?: string;\n className?: string;\n 'aria-label'?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nfunction itemIdFor(idPrefix: string, kind: 'recent' | 'option', value: string) {\n return `${idPrefix}-${kind}-${value}`;\n}\n\nfunction cmdkValueFor(kind: 'recent' | 'option', value: string) {\n return `${kind}:${value}`;\n}\n\nconst AutocompleteImpl = forwardRef<HTMLInputElement, AutocompleteProps>(\n function Autocomplete(\n {\n loadOptions,\n debounceMs = 250,\n value,\n defaultValue,\n onChange,\n onSelect,\n recents,\n onRecentSelect,\n snapOnBlur = false,\n size = 'md',\n tone = 'default',\n startAdornment,\n endAdornment,\n placeholder,\n disabled,\n readOnly,\n required,\n name,\n id,\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n ) {\n const { t, i18n } = useTranslation();\n const ctx = useFormField();\n\n const reactId = useId();\n const idPrefix = id ?? ctx.id ?? reactId;\n const listId = `${idPrefix}-listbox`;\n const liveRegionId = `${idPrefix}-live`;\n\n const effectiveDisabled = Boolean(ctx.disabled || disabled);\n const effectiveRequired = Boolean(ctx.required || required);\n const effectiveInvalid = ctx.invalid;\n const effectiveTone: 'default' | 'error' = effectiveInvalid\n ? 'error'\n : (tone ?? 'default');\n const describedBy = ctx.describedBy || undefined;\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? '',\n );\n const currentValue = isControlled ? value : internalValue;\n\n const [open, setOpen] = useState(false);\n const [suggestions, setSuggestions] = useState<OptionShape[]>([]);\n const [loading, setLoading] = useState(false);\n const [cmdkValue, setCmdkValue] = useState<string>('');\n\n const composingRef = useRef(false);\n const abortRef = useRef<AbortController | null>(null);\n const latestQueryRef = useRef<string>(currentValue);\n const suggestionsByValueRef = useRef<Map<string, OptionShape>>(new Map());\n const recentsByValueRef = useRef<Map<string, OptionShape>>(new Map());\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const setRefs = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n const locale = i18n.language;\n\n useEffect(() => {\n const map = new Map<string, OptionShape>();\n for (const option of suggestions) map.set(option.value, option);\n suggestionsByValueRef.current = map;\n }, [suggestions]);\n\n useEffect(() => {\n const map = new Map<string, OptionShape>();\n if (recents) for (const option of recents) map.set(option.value, option);\n recentsByValueRef.current = map;\n }, [recents]);\n\n const runFetch = useCallback(\n (query: string) => {\n if (effectiveDisabled || readOnly) return;\n if (composingRef.current) return;\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n latestQueryRef.current = query;\n setLoading(true);\n loadOptions(query, { signal: controller.signal, locale })\n .then((results) => {\n if (controller.signal.aborted) return;\n if (latestQueryRef.current !== query) return;\n setSuggestions(results);\n setLoading(false);\n })\n .catch((error: unknown) => {\n if (controller.signal.aborted) return;\n if (\n error &&\n typeof error === 'object' &&\n 'name' in error &&\n (error as { name?: string }).name === 'AbortError'\n ) {\n return;\n }\n if (latestQueryRef.current !== query) return;\n setSuggestions([]);\n setLoading(false);\n });\n },\n [effectiveDisabled, readOnly, loadOptions, locale],\n );\n\n const debouncedFetch = useDebouncedCallback(runFetch, debounceMs);\n\n useEffect(() => {\n return () => {\n debouncedFetch.cancel();\n abortRef.current?.abort();\n };\n }, [debouncedFetch]);\n\n const commitValue = useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onChange?.(next);\n },\n [isControlled, onChange],\n );\n\n const resolveCmdkValue = useCallback(\n (\n raw: string,\n ): { kind: 'recent' | 'option'; option: OptionShape } | null => {\n const [kind, val] = raw.split(':');\n if (!val || (kind !== 'recent' && kind !== 'option')) return null;\n const lookup =\n kind === 'recent'\n ? recentsByValueRef.current\n : suggestionsByValueRef.current;\n const option = lookup.get(val);\n return option ? { kind, option } : null;\n },\n [],\n );\n\n const handleInputValueChange = (next: string) => {\n commitValue(next);\n if (effectiveDisabled || readOnly) return;\n if (!open) setOpen(true);\n if (composingRef.current) return;\n debouncedFetch(next);\n };\n\n const handleCompositionStart = (\n _event: CompositionEvent<HTMLInputElement>,\n ) => {\n composingRef.current = true;\n };\n\n const handleCompositionEnd = (\n event: CompositionEvent<HTMLInputElement>,\n ) => {\n composingRef.current = false;\n const next = event.currentTarget.value;\n debouncedFetch(next);\n };\n\n const handleFocus = (_event: FocusEvent<HTMLInputElement>) => {\n if (effectiveDisabled || readOnly) return;\n setOpen(true);\n if (currentValue) debouncedFetch(currentValue);\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n const next = event.relatedTarget as Node | null;\n // Focus moved into the popover — keep listbox open (pointer-down on item\n // moves focus into the portal but we treat that as \"still interacting\").\n if (next && contentRef.current && contentRef.current.contains(next)) {\n return;\n }\n if (snapOnBlur && cmdkValue) {\n const resolved = resolveCmdkValue(cmdkValue);\n if (resolved) {\n commitValue(resolved.option.label);\n onSelect?.(resolved.option);\n }\n }\n setOpen(false);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.nativeEvent.isComposing) return;\n if (event.key === 'Escape') {\n if (open) {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n }\n return;\n }\n if (event.key === 'ArrowDown' && !open) {\n event.preventDefault();\n setOpen(true);\n if (currentValue) debouncedFetch(currentValue);\n return;\n }\n if (event.key === 'Tab' && open && cmdkValue) {\n const resolved = resolveCmdkValue(cmdkValue);\n if (resolved) {\n commitValue(resolved.option.label);\n onSelect?.(resolved.option);\n setOpen(false);\n }\n }\n };\n\n const handleItemSelect = (\n kind: 'recent' | 'option',\n option: OptionShape,\n ) => {\n commitValue(option.label);\n if (kind === 'recent') onRecentSelect?.(option);\n else onSelect?.(option);\n setOpen(false);\n inputRef.current?.focus();\n };\n\n // Prevent input blur when clicking an item — keeps focus management predictable.\n const preventBlur = (event: MouseEvent<HTMLElement>) => {\n event.preventDefault();\n };\n\n const showRecents =\n Boolean(recents && recents.length > 0) && currentValue.length === 0;\n const groupedSuggestions = useMemo(\n () => groupOptions(suggestions),\n [suggestions],\n );\n\n const hasStart = Boolean(startAdornment);\n const hasEnd = Boolean(endAdornment) || loading;\n\n const wrapperClass = autocompleteVariants({\n size,\n tone: effectiveTone,\n className,\n });\n\n const activeDescendant = useMemo(() => {\n if (!cmdkValue) return undefined;\n const [kind, val] = cmdkValue.split(':');\n if (!val || (kind !== 'recent' && kind !== 'option')) return undefined;\n return itemIdFor(idPrefix, kind, val);\n }, [cmdkValue, idPrefix]);\n\n const hasSuggestions = suggestions.length > 0;\n const showEmpty =\n !showRecents && !hasSuggestions && !loading && currentValue.length > 0;\n const showLoadingRow = loading && !hasSuggestions;\n // Suppress the popover when there is nothing to render — prevents an empty\n // 1-line strip appearing under the input on focus with no query + no recents.\n const hasPopoverContent =\n showRecents || hasSuggestions || showEmpty || showLoadingRow;\n\n // Agent handle — refs mirror state for fresh reads from the memoized handle.\n const valueRefAgent = useRef<string>(currentValue);\n useEffect(() => {\n valueRefAgent.current = currentValue;\n }, [currentValue]);\n const openRefAgent = useRef<boolean>(open);\n useEffect(() => {\n openRefAgent.current = open;\n }, [open]);\n\n const agentHandle = useMemo<AutocompleteHandle>(\n () => ({\n getValue: () => valueRefAgent.current || null,\n getQuery: () => valueRefAgent.current,\n getIsOpen: () => openRefAgent.current,\n setValue: (next) => {\n commitValue(next ?? '');\n },\n setQuery: (query) => {\n commitValue(query);\n },\n clear: () => {\n commitValue('');\n },\n open: () => {\n setOpen(true);\n },\n close: () => {\n setOpen(false);\n },\n }),\n [commitValue],\n );\n useAgentRegistration(autocompleteAgent, agentHandle, id);\n\n const resultCount = suggestions.length;\n const liveMessage = loading\n ? t('common.loading', 'Loading…')\n : open && currentValue.length > 0\n ? t('inputs.autocomplete.results', {\n count: resultCount,\n defaultValue: '{{count}} results',\n })\n : '';\n\n return (\n <Command\n shouldFilter={false}\n value={cmdkValue}\n onValueChange={setCmdkValue}\n label={ariaLabel ?? placeholder}\n className=\"ds:w-full\"\n >\n <Popover.Root\n open={open && !effectiveDisabled && !readOnly && hasPopoverContent}\n >\n <Popover.Anchor asChild>\n <div\n className={wrapperClass}\n data-component=\"autocomplete\"\n data-component-id={id}\n data-disabled={effectiveDisabled || undefined}\n >\n {startAdornment ? (\n <span aria-hidden=\"true\" className={`${adornmentBase} ds:ps-3`}>\n {startAdornment}\n </span>\n ) : null}\n <Command.Input\n ref={setRefs}\n id={idPrefix}\n name={name}\n placeholder={placeholder}\n value={currentValue}\n onValueChange={handleInputValueChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n disabled={effectiveDisabled}\n readOnly={readOnly}\n required={effectiveRequired}\n role=\"combobox\"\n aria-autocomplete=\"both\"\n aria-expanded={open}\n // Only advertise aria-controls while the listbox is mounted\n // — Command.List lives inside the Popover.Content and only\n // renders when `open` is true. Pointing aria-controls at a\n // non-existent id fails axe's aria-valid-attr-value rule.\n aria-controls={open ? listId : undefined}\n aria-activedescendant={activeDescendant}\n aria-describedby={describedBy}\n aria-invalid={effectiveInvalid || undefined}\n aria-label={ariaLabel}\n autoComplete=\"off\"\n className={inputVariants({ hasStart, hasEnd })}\n />\n {loading ? (\n <span className={`${adornmentBase} ds:pe-3`} aria-hidden=\"true\">\n <Spinner size=\"sm\" />\n </span>\n ) : endAdornment ? (\n <span aria-hidden=\"true\" className={`${adornmentBase} ds:pe-3`}>\n {endAdornment}\n </span>\n ) : null}\n <span\n id={liveRegionId}\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n >\n {liveMessage}\n </span>\n </div>\n </Popover.Anchor>\n <Popover.Portal forceMount>\n <Popover.Content\n ref={contentRef}\n // `forceMount` keeps Command.List in the DOM even when the\n // popover is closed, so the input's cmdk-set\n // `aria-controls` always points at a real id (axe's\n // aria-valid-attr-value rule). Visibility is gated by\n // data-state via CSS / the `hidden` attribute below.\n forceMount\n hidden={!open}\n side=\"bottom\"\n align=\"start\"\n sideOffset={4}\n onOpenAutoFocus={(event) => event.preventDefault()}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onPointerDownOutside={(event) => {\n const target = event.target as Node | null;\n if (target && inputRef.current?.contains(target)) {\n event.preventDefault();\n return;\n }\n setOpen(false);\n }}\n onEscapeKeyDown={() => setOpen(false)}\n onMouseDown={preventBlur}\n className={contentVariants()}\n >\n <Command.List\n id={listId}\n className=\"ds:max-h-[min(24rem,var(--radix-popover-content-available-height))] ds:overflow-auto ds:p-1\"\n >\n {showRecents ? (\n <Command.Group\n heading={t('inputs.autocomplete.recent', 'Recent')}\n className={groupClasses}\n >\n {(recents ?? []).map((option) => (\n <Command.Item\n key={`recent-${option.value}`}\n id={itemIdFor(idPrefix, 'recent', option.value)}\n value={cmdkValueFor('recent', option.value)}\n disabled={option.disabled}\n onSelect={() => handleItemSelect('recent', option)}\n onMouseDown={preventBlur}\n className={itemVariants()}\n >\n {option.label}\n </Command.Item>\n ))}\n </Command.Group>\n ) : null}\n {showEmpty ? (\n <div className=\"ds:ps-3 ds:pe-3 ds:py-2 type-body-sm ds:text-muted-foreground\">\n {t('inputs.autocomplete.noResults', 'No results')}\n </div>\n ) : null}\n {showLoadingRow ? (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:ps-3 ds:pe-3 ds:py-2 type-body-sm ds:text-muted-foreground\">\n <Spinner size=\"sm\" />\n <span>{t('common.loading', 'Loading…')}</span>\n </div>\n ) : null}\n {!showRecents && hasSuggestions\n ? groupedSuggestions.map((group, index) => {\n const body = group.items.map((option) => (\n <Command.Item\n key={`option-${option.value}`}\n id={itemIdFor(idPrefix, 'option', option.value)}\n value={cmdkValueFor('option', option.value)}\n disabled={option.disabled}\n onSelect={() => handleItemSelect('option', option)}\n onMouseDown={preventBlur}\n className={itemVariants()}\n >\n {option.label}\n </Command.Item>\n ));\n if (!group.group) {\n return (\n <Command.Group key={`group-${index}`}>\n {body}\n </Command.Group>\n );\n }\n return (\n <Command.Group\n key={`group-${group.group}`}\n heading={group.group}\n className={groupClasses}\n >\n {body}\n </Command.Group>\n );\n })\n : null}\n </Command.List>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </Command>\n );\n },\n);\n\ninterface AutocompleteComponent {\n <T extends string = string>(\n props: AutocompleteProps<T> & { ref?: Ref<HTMLInputElement> },\n ): ReactElement | null;\n displayName?: string;\n}\n\nexport const Autocomplete =\n AutocompleteImpl as unknown as AutocompleteComponent;\n(Autocomplete as { displayName?: string }).displayName = 'Autocomplete';\n\nexport { autocompleteVariants };\n"],"names":["autocompleteAgent","handle","args","autocompleteVariants","cva","INPUT_SURFACE_CHROME","INPUT_SURFACE_HEIGHT","INPUT_SURFACE_TEXT","INPUT_SURFACE_TONE","inputVariants","contentVariants","itemVariants","groupClasses","adornmentBase","itemIdFor","idPrefix","kind","value","cmdkValueFor","AutocompleteImpl","forwardRef","loadOptions","debounceMs","defaultValue","onChange","onSelect","recents","onRecentSelect","snapOnBlur","size","tone","startAdornment","endAdornment","placeholder","disabled","readOnly","required","name","id","className","ariaLabel","ref","t","i18n","useTranslation","ctx","useFormField","reactId","useId","listId","liveRegionId","effectiveDisabled","effectiveRequired","effectiveInvalid","effectiveTone","describedBy","isControlled","internalValue","setInternalValue","useState","currentValue","open","setOpen","suggestions","setSuggestions","loading","setLoading","cmdkValue","setCmdkValue","composingRef","useRef","abortRef","latestQueryRef","suggestionsByValueRef","recentsByValueRef","inputRef","contentRef","setRefs","useCallback","node","locale","useEffect","map","option","runFetch","query","_a","controller","results","error","debouncedFetch","useDebouncedCallback","commitValue","next","resolveCmdkValue","raw","val","handleInputValueChange","handleCompositionStart","_event","handleCompositionEnd","event","handleFocus","handleBlur","resolved","handleKeyDown","handleItemSelect","preventBlur","showRecents","groupedSuggestions","useMemo","groupOptions","hasStart","hasEnd","wrapperClass","activeDescendant","hasSuggestions","showEmpty","showLoadingRow","hasPopoverContent","valueRefAgent","openRefAgent","agentHandle","useAgentRegistration","resultCount","liveMessage","jsx","Command","jsxs","Popover","Spinner","target","group","index","body","Autocomplete"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"chat-input-UK-bXU7u.js","sources":["../../node_modules/lucide-react/dist/esm/icons/paperclip.js","../../src/components/chat-input/chat-input.agent.ts","../../src/components/chat-input/chat-input.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551\",\n key: \"1miecu\"\n }\n ]\n];\nconst Paperclip = createLucideIcon(\"paperclip\", __iconNode);\n\nexport { __iconNode, Paperclip as default };\n//# sourceMappingURL=paperclip.js.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — ChatInput. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { ChatInputHandle } from './chat-input';\n\nexport const chatInputAgent: AgentAdapter<ChatInputHandle> = {\n id: 'chat-input',\n capabilities: ['edit_inline', 'submit'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.chatInput.state.value',\n description: 'Current text in the composer.',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.chatInput.state.isEmpty',\n description: 'True when the composer has no text.',\n read: (handle) => handle.isEmpty(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n descriptionKey: 'ui.agent.chatInput.actions.setValue',\n description: 'Replace the composer text.',\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.chatInput.actions.clear',\n description: 'Clear the composer. Irreversible from the same UI.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n submit: {\n safety: 'write',\n descriptionKey: 'ui.agent.chatInput.actions.submit',\n description: 'Submit the current composer state via onSubmit.',\n invoke: (handle) => {\n handle.submit();\n },\n },\n focus: {\n safety: 'read',\n descriptionKey: 'ui.agent.chatInput.actions.focus',\n description: 'Move keyboard focus into the textarea.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'chat-input',\n description: 'Marks the ChatInput 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 useId,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type CompositionEvent,\n type KeyboardEvent,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AlertCircle, Paperclip, Send } from 'lucide-react';\nimport { IconButton } from '../button';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { chatInputAgent } from './chat-input.agent';\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full',\n // Uses the kit's shared input-chrome tokens — `--input` for fill,\n // `--shadow-input` for the halo. Border stays at 1px (`--border`,\n // softened to `grey-700` in light) so the focus-within override and\n // forced-colors fallback both still paint a visible edge.\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:bg-input ds:shadow-[var(--shadow-input)]',\n 'ds:focus-within:border-[color:var(--primary)]',\n 'ds:transition-[border-color,box-shadow] ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:transition-none',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\ntype NativeTextareaProps = Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'size' | 'onSubmit' | 'children'\n>;\n\n/** Curated imperative handle for agent / external automation. */\nexport interface ChatInputHandle {\n getValue: () => string;\n isEmpty: () => boolean;\n setValue: (value: string) => void;\n clear: () => void;\n submit: () => void;\n focus: () => void;\n}\n\nexport interface ChatInputProps\n extends NativeTextareaProps, VariantProps<typeof rootVariants> {\n /** Invoked when the user submits (Cmd/Ctrl+Enter, or send button). */\n onSubmit?: (text: string) => void;\n /** Maximum allowed characters (grapheme clusters via Intl.Segmenter when available). */\n maxLength?: number;\n /** When true, plain Enter submits and Shift+Enter inserts a newline.\n * Default false (Enter inserts newline; Cmd/Ctrl+Enter submits). */\n submitOnEnter?: boolean;\n /** Minimum visible rows. Default 1. */\n minRows?: number;\n /** Maximum visible rows before the field scrolls. Default 8. */\n maxRows?: number;\n /** Optional attachment handler — when provided, renders the attachment button. */\n onAttach?: (files: FileList) => void;\n /** `accept` forwarded to the hidden file input. */\n accept?: string;\n /** Controls whether the textarea is disabled and submit is blocked. */\n disabled?: boolean;\n /** Optional slot placed between the textarea and the send button. */\n toolbar?: ReactNode;\n /** Visible label above the textarea. When omitted, a visually-hidden label is used. */\n label?: string;\n}\n\nfunction graphemeCount(value: string, locale: string): number {\n if (typeof Intl !== 'undefined' && typeof Intl.Segmenter === 'function') {\n try {\n const seg = new Intl.Segmenter(locale, { granularity: 'grapheme' });\n let n = 0;\n for (const _s of seg.segment(value)) n += 1;\n return n;\n } catch {\n /* fall through to Array.from */\n }\n }\n return Array.from(value).length;\n}\n\nexport const ChatInput = forwardRef<HTMLDivElement, ChatInputProps>(\n (\n {\n size = 'md',\n value,\n defaultValue,\n maxLength,\n submitOnEnter = false,\n minRows = 1,\n maxRows = 8,\n onSubmit,\n onAttach,\n accept,\n disabled,\n toolbar,\n label,\n placeholder,\n className,\n onChange,\n onKeyDown,\n onCompositionStart,\n onCompositionEnd,\n id,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const textareaId = useId();\n const composingRef = useRef(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\n\n const setRefs = useCallback((node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n }, []);\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n String(defaultValue ?? ''),\n );\n const currentValue = isControlled ? String(value) : internalValue;\n\n const count = graphemeCount(currentValue, i18n.language);\n const hasMaxLength = typeof maxLength === 'number' && maxLength > 0;\n const remaining = hasMaxLength ? Math.max(0, maxLength - count) : 0;\n const showCounter = hasMaxLength && count > (maxLength as number) * 0.9;\n const atLimit = hasMaxLength && count >= maxLength;\n\n /* Auto-grow — compute height from scrollHeight, clamped to [minRows, maxRows].\n Imperative `.style` write is permitted per 23-constraints\n §Runtime-computed dimensions (textarea scrollHeight measurement). */\n const resize = useCallback(() => {\n const el = innerRef.current;\n if (!el) return;\n const styles = window.getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight) || 24;\n const padTop = parseFloat(styles.paddingTop) || 0;\n const padBot = parseFloat(styles.paddingBottom) || 0;\n const borderTop = parseFloat(styles.borderTopWidth) || 0;\n const borderBot = parseFloat(styles.borderBottomWidth) || 0;\n const chrome = padTop + padBot + borderTop + borderBot;\n const minH = lineHeight * minRows + chrome;\n const maxH = lineHeight * maxRows + chrome;\n el.style.height = 'auto';\n const next = Math.max(minH, Math.min(el.scrollHeight, maxH));\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > maxH ? 'auto' : 'hidden';\n }, [minRows, maxRows]);\n\n useLayoutEffect(() => {\n resize();\n }, [resize, currentValue]);\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) setInternalValue(e.target.value);\n if (composingRef.current) return;\n onChange?.(e);\n };\n\n const handleCompositionStart = (\n e: CompositionEvent<HTMLTextAreaElement>,\n ) => {\n composingRef.current = true;\n onCompositionStart?.(e);\n };\n const handleCompositionEnd = (e: CompositionEvent<HTMLTextAreaElement>) => {\n composingRef.current = false;\n onCompositionEnd?.(e);\n };\n\n const isIMEKey = (e: KeyboardEvent<HTMLTextAreaElement>) =>\n e.nativeEvent.isComposing || e.keyCode === 229 || composingRef.current;\n\n const submit = () => {\n const text = currentValue.trim();\n if (!text || disabled || atLimit) return;\n onSubmit?.(currentValue);\n if (!isControlled) setInternalValue('');\n };\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<ChatInputHandle>(\n () => ({\n getValue: () => currentValue,\n isEmpty: () => !currentValue.trim(),\n setValue: (next: string) => {\n if (!isControlled) setInternalValue(next);\n },\n clear: () => {\n if (!isControlled) setInternalValue('');\n },\n submit: () => {\n submit();\n },\n focus: () => {\n innerRef.current?.focus();\n },\n }),\n // `submit` is a local closure that always sees the latest currentValue\n // via React's render cycle — depend on currentValue + isControlled so\n // the handle picks up new values across renders.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [currentValue, isControlled],\n );\n useAgentRegistration(chatInputAgent, agentHandle, id);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (isIMEKey(e)) return;\n\n if (e.key === 'Enter') {\n const explicitSubmit = e.metaKey || e.ctrlKey;\n const plainEnterSubmits = submitOnEnter && !e.shiftKey;\n if (explicitSubmit || plainEnterSubmits) {\n e.preventDefault();\n submit();\n }\n }\n };\n\n const handleAttach = () => {\n fileInputRef.current?.click();\n };\n\n const handleFilePick = (e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n onAttach?.(e.target.files);\n }\n // Reset so picking the same file twice still fires change.\n e.target.value = '';\n };\n\n const effectiveId = id ?? textareaId;\n const labelId = `${effectiveId}-label`;\n const counterId = hasMaxLength ? `${effectiveId}-counter` : undefined;\n const hintId = `${effectiveId}-hint`;\n\n const resolvedPlaceholder = placeholder ?? t('chat.input.placeholder');\n const resolvedLabel = label ?? t('chat.prompt');\n\n return (\n <div\n ref={rootRef}\n data-component=\"chat-input\"\n data-component-id={id}\n className={rootVariants({ size, className })}\n >\n <label\n id={labelId}\n htmlFor={effectiveId}\n className={\n label\n ? 'type-label ds:ps-[var(--spacing-sm)] ds:pt-[var(--spacing-sm)]'\n : 'ds:sr-only'\n }\n >\n {resolvedLabel}\n </label>\n <textarea\n ref={setRefs}\n id={effectiveId}\n value={isControlled ? currentValue : undefined}\n defaultValue={!isControlled ? defaultValue : undefined}\n disabled={disabled}\n rows={minRows}\n maxLength={maxLength}\n placeholder={resolvedPlaceholder}\n aria-labelledby={labelId}\n aria-describedby={\n [counterId, hintId].filter(Boolean).join(' ') || undefined\n }\n aria-invalid={atLimit || undefined}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n className={[\n 'ds:w-full ds:resize-none ds:bg-transparent',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]',\n 'ds:placeholder:text-[color:var(--muted-foreground)]',\n 'ds:leading-[var(--line-height-base)]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed',\n // Tokenised focus ring on the textarea itself — the 1px border\n // shift on the wrapper alone fails the 3px accessible-theme\n // requirement. See a11y-critical-fixes.mdx.\n 'ds:outline-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n {...rest}\n />\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n {onAttach ? (\n <>\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"ds:sr-only\"\n multiple\n accept={accept}\n onChange={handleFilePick}\n aria-label={t('chat.input.attach')}\n tabIndex={-1}\n />\n <IconButton\n icon={<Paperclip />}\n aria-label={t('chat.input.attach')}\n intent=\"ghost\"\n size=\"sm\"\n onClick={handleAttach}\n disabled={disabled}\n />\n </>\n ) : null}\n {toolbar}\n <div className=\"ds:ms-auto ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n {showCounter ? (\n <span\n id={counterId}\n aria-live=\"polite\"\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'type-meta ds:tabular-nums',\n atLimit\n ? 'ds:text-[color:var(--destructive)]'\n : 'ds:text-[color:var(--muted-foreground)]',\n ].join(' ')}\n >\n {atLimit ? (\n // Icon pairs with --destructive colour so the at-limit\n // state is not conveyed by hue alone (WCAG 1.4.1).\n <AlertCircle aria-hidden=\"true\" className=\"ds:size-3.5\" />\n ) : null}\n {t('chat.input.remaining', { count: remaining })}\n </span>\n ) : null}\n <span id={hintId} className=\"ds:sr-only\">\n {t('chat.input.sendHint')}\n </span>\n <IconButton\n icon={<Send />}\n aria-label={t('chat.send')}\n intent=\"primary\"\n size=\"sm\"\n disabled={disabled || !currentValue.trim() || atLimit}\n onClick={submit}\n aria-keyshortcuts=\"Meta+Enter Control+Enter\"\n />\n </div>\n </div>\n </div>\n );\n },\n);\n\nChatInput.displayName = 'ChatInput';\n"],"names":["__iconNode","Paperclip","createLucideIcon","chatInputAgent","handle","args","rootVariants","cva","graphemeCount","value","locale","seg","n","_s","ChatInput","forwardRef","size","defaultValue","maxLength","submitOnEnter","minRows","maxRows","onSubmit","onAttach","accept","disabled","toolbar","label","placeholder","className","onChange","onKeyDown","onCompositionStart","onCompositionEnd","id","rest","ref","t","i18n","useTranslation","textareaId","useId","composingRef","useRef","fileInputRef","innerRef","setRefs","useCallback","node","isControlled","internalValue","setInternalValue","useState","currentValue","count","hasMaxLength","remaining","showCounter","atLimit","resize","el","styles","lineHeight","padTop","padBot","borderTop","borderBot","chrome","minH","maxH","next","useLayoutEffect","handleChange","handleCompositionStart","handleCompositionEnd","isIMEKey","submit","rootRef","useImperativeHandle","agentHandle","useMemo","_a","useAgentRegistration","handleKeyDown","explicitSubmit","plainEnterSubmits","handleAttach","handleFilePick","effectiveId","labelId","counterId","hintId","resolvedPlaceholder","resolvedLabel","jsxs","jsx","Fragment","IconButton","AlertCircle","Send"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"checkbox-D5EHnB14.js","sources":["../../src/components/checkbox/checkbox-group-context.ts","../../src/components/checkbox/checkbox.agent.ts","../../src/components/checkbox/checkbox.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nexport interface CheckboxGroupContextShape {\n name?: string;\n value: Set<string>;\n toggle: (itemValue: string) => void;\n disabled: boolean;\n}\n\nexport const CheckboxGroupContext =\n createContext<CheckboxGroupContextShape | null>(null);\n\nexport function useCheckboxGroup(): CheckboxGroupContextShape | null {\n return useContext(CheckboxGroupContext);\n}\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — Checkbox. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { CheckboxHandle } from './checkbox';\n\nexport const checkboxAgent: AgentAdapter<CheckboxHandle> = {\n id: 'checkbox',\n capabilities: ['select_single'],\n state: {\n checked: {\n type: 'boolean | \"indeterminate\"',\n descriptionKey: 'ui.agent.checkbox.state.checked',\n description: 'Current checked state.',\n read: (handle) => handle.getChecked(),\n },\n },\n actions: {\n set_checked: {\n safety: 'write',\n argsType: '{ checked: boolean | \"indeterminate\" }',\n descriptionKey: 'ui.agent.checkbox.actions.setChecked',\n description: 'Set the checked state to a specific value.',\n invoke: (handle, args: { checked: boolean | 'indeterminate' }) => {\n handle.setChecked(args.checked);\n },\n },\n toggle: {\n safety: 'write',\n descriptionKey: 'ui.agent.checkbox.actions.toggle',\n description: 'Flip the checked state between checked and unchecked.',\n invoke: (handle) => {\n handle.toggle();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'checkbox',\n description: 'Marks the Checkbox 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 useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport * as RadixCheckbox from '@radix-ui/react-checkbox';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useCheckboxGroup } from './checkbox-group-context';\nimport { Tooltip } from '../tooltip';\nimport { useAgentRegistration } from '../../agent';\nimport { checkboxAgent } from './checkbox.agent';\n\n/** Agent-readiness curated handle for Checkbox. */\nexport interface CheckboxHandle {\n getChecked: () => boolean | 'indeterminate';\n setChecked: (checked: boolean | 'indeterminate') => void;\n toggle: () => void;\n}\n\nconst drawClasses = [\n 'ds:[stroke-dasharray:1] ds:[stroke-dashoffset:1]',\n 'ds:animate-[checkbox-indicator-draw_var(--animation-duration)_ease-out_forwards]',\n].join(' ');\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n data-slot=\"checkbox-check-icon\"\n className={className}\n >\n <path pathLength=\"1\" d=\"M5 12l5 5L20 7\" className={drawClasses} />\n </svg>\n );\n}\n\nfunction IndeterminateIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n data-slot=\"checkbox-indeterminate-icon\"\n className={className}\n >\n <path pathLength=\"1\" d=\"M5 12h14\" className={drawClasses} />\n </svg>\n );\n}\n\nconst checkboxVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center ds:shrink-0',\n 'ds:border ds:border-border ds:rounded-[var(--radius-sm)] ds:bg-background',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:data-[state=checked]:bg-primary ds:data-[state=checked]:border-primary',\n 'ds:data-[state=indeterminate]:bg-primary ds:data-[state=indeterminate]:border-primary',\n 'ds:relative ds:before:absolute ds:before:inset-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[\"\"]',\n ].join(' '),\n {\n variants: {\n // Per-size `mt` centers the box optically on the first line of the\n // label using the type-label line-box height — important when the\n // label wraps, because the wrapper uses `items-start` so children\n // align to the top edge rather than the multi-line block's centre.\n size: {\n sm: 'ds:size-3.5 ds:mt-[calc((var(--type-label-size)*var(--type-label-line-height)-0.875rem)/2)]',\n md: 'ds:size-4 ds:mt-[calc((var(--type-label-size)*var(--type-label-line-height)-1rem)/2)]',\n lg: 'ds:size-5 ds:mt-[calc((var(--type-label-size)*var(--type-label-line-height)-1.25rem)/2)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\ntype RadixRootProps = ComponentPropsWithoutRef<typeof RadixCheckbox.Root>;\n\nexport interface CheckboxProps\n extends\n Omit<RadixRootProps, 'checked' | 'onCheckedChange' | 'children'>,\n VariantProps<typeof checkboxVariants> {\n label: string;\n checked?: boolean | 'indeterminate';\n onCheckedChange?: (checked: boolean | 'indeterminate') => void;\n size?: 'sm' | 'md' | 'lg';\n disabledReason?: string;\n value?: string;\n}\n\nexport const Checkbox = forwardRef<HTMLButtonElement, CheckboxProps>(\n (\n {\n label,\n checked,\n onCheckedChange,\n size = 'md',\n disabled,\n disabledReason,\n name,\n value,\n id,\n className,\n ...props\n },\n ref,\n ) => {\n const generatedId = useId();\n const checkboxId = id ?? generatedId;\n const group = useCheckboxGroup();\n\n const inGroup = group !== null && value !== undefined;\n const [internalChecked, setInternalChecked] = useState<\n boolean | 'indeterminate'\n >(checked ?? false);\n const isControlled = checked !== undefined;\n const ownChecked = isControlled ? checked : internalChecked;\n const effectiveChecked = inGroup ? group.value.has(value) : ownChecked;\n const effectiveOnChange = inGroup\n ? () => group.toggle(value)\n : (next: boolean | 'indeterminate') => {\n if (!isControlled) setInternalChecked(next);\n onCheckedChange?.(next);\n };\n const effectiveName = group?.name ?? name;\n const effectiveDisabled = group?.disabled || disabled;\n\n const checkedRef = useRef<boolean | 'indeterminate'>(\n effectiveChecked ?? false,\n );\n checkedRef.current = effectiveChecked ?? false;\n\n const agentHandle = useMemo<CheckboxHandle>(\n () => ({\n getChecked: () => checkedRef.current,\n setChecked: (next) => {\n if (inGroup) {\n // Inside a group: toggle implements set via the group context.\n const isOn =\n checkedRef.current === true ||\n checkedRef.current === 'indeterminate';\n const want = next === true || next === 'indeterminate';\n if (isOn !== want) group.toggle(value);\n return;\n }\n if (!isControlled) setInternalChecked(next);\n onCheckedChange?.(next);\n },\n toggle: () => {\n if (inGroup) {\n group.toggle(value);\n return;\n }\n const next =\n checkedRef.current === true ||\n checkedRef.current === 'indeterminate'\n ? false\n : true;\n if (!isControlled) setInternalChecked(next);\n onCheckedChange?.(next);\n },\n }),\n [inGroup, group, value, isControlled, onCheckedChange],\n );\n useAgentRegistration(checkboxAgent, agentHandle, id);\n\n // `text-primary-foreground` lives on the SVG (not the <button> Root) so\n // a legacy consumer rule like `button, input, … { color: inherit }`\n // can't intercept it — the unlayered consumer rule would beat any\n // @layer utilities rule on the button itself, leaving the tick paint\n // (currentColor) inheriting the consumer's body text colour. See\n // styles.css for the matching form-element revert inside [data-component].\n const iconSizeClass = [\n 'ds:text-primary-foreground',\n size === 'sm' ? 'ds:size-3' : size === 'lg' ? 'ds:size-4' : 'ds:size-3.5',\n ].join(' ');\n\n const labelClasses = [\n 'type-label ds:text-foreground ds:select-none',\n effectiveDisabled\n ? 'ds:cursor-not-allowed ds:opacity-50'\n : 'ds:cursor-pointer',\n ].join(' ');\n\n const content = (\n <div\n data-component=\"checkbox\"\n data-component-id={id}\n data-option-id={value}\n className=\"ds:inline-flex ds:items-start ds:gap-[var(--spacing-sm)]\"\n >\n <RadixCheckbox.Root\n ref={ref}\n id={checkboxId}\n checked={effectiveChecked}\n onCheckedChange={effectiveOnChange}\n disabled={effectiveDisabled}\n aria-disabled={effectiveDisabled || undefined}\n name={effectiveName}\n value={value}\n className={checkboxVariants({ size, className })}\n {...props}\n >\n <RadixCheckbox.Indicator>\n {effectiveChecked === 'indeterminate' ? (\n <IndeterminateIcon className={iconSizeClass} />\n ) : (\n <CheckIcon className={iconSizeClass} />\n )}\n </RadixCheckbox.Indicator>\n </RadixCheckbox.Root>\n <label htmlFor={checkboxId} className={labelClasses}>\n {label}\n </label>\n </div>\n );\n\n if (effectiveDisabled && disabledReason) {\n return <Tooltip label={disabledReason}>{content}</Tooltip>;\n }\n\n return content;\n },\n);\n\nCheckbox.displayName = 'Checkbox';\n"],"names":["CheckboxGroupContext","createContext","useCheckboxGroup","useContext","checkboxAgent","handle","args","drawClasses","CheckIcon","className","jsx","IndeterminateIcon","checkboxVariants","cva","Checkbox","forwardRef","label","checked","onCheckedChange","size","disabled","disabledReason","name","value","id","props","ref","generatedId","useId","checkboxId","group","inGroup","internalChecked","setInternalChecked","useState","isControlled","effectiveChecked","effectiveOnChange","next","effectiveName","effectiveDisabled","checkedRef","useRef","agentHandle","useMemo","useAgentRegistration","iconSizeClass","labelClasses","content","jsxs","RadixCheckbox","Tooltip"],"mappings":"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"}
@@ -1,208 +0,0 @@
1
- import { jsx as s, jsxs as M } from "react/jsx-runtime";
2
- import { forwardRef as T, useId as W, useState as K, useMemo as S, useRef as X, Children as Y, isValidElement as Z } from "react";
3
- import { c as V } from "./index-D2ZczOXr.js";
4
- import { useTranslation as ee } from "react-i18next";
5
- import { C as _, a as se } from "./checkbox-D5EHnB14.js";
6
- import { u as te } from "./registry-C9nwlNyL.js";
7
- import { C as ce } from "./circle-alert-ChA9opNA.js";
8
- const re = {
9
- id: "checkbox-group",
10
- capabilities: ["select_multiple"],
11
- state: {
12
- selection: {
13
- type: "string[]",
14
- descriptionKey: "ui.agent.checkboxGroup.state.selection",
15
- description: "Values of currently-checked options.",
16
- read: (t) => t.getSelection()
17
- }
18
- },
19
- actions: {
20
- set_selection: {
21
- safety: "write",
22
- argsType: "{ ids: string[] }",
23
- descriptionKey: "ui.agent.checkboxGroup.actions.setSelection",
24
- description: "Replace the current selection with the given option values.",
25
- invoke: (t, l) => {
26
- t.setSelection(l.ids);
27
- }
28
- },
29
- clear_selection: {
30
- safety: "destructive",
31
- descriptionKey: "ui.agent.checkboxGroup.actions.clearSelection",
32
- description: "Uncheck every option in the group.",
33
- invoke: (t) => {
34
- t.clearSelection();
35
- }
36
- }
37
- },
38
- domHooks: {
39
- root: {
40
- attr: "data-component",
41
- value: "checkbox-group",
42
- description: "Marks the CheckboxGroup fieldset."
43
- },
44
- instanceId: {
45
- attr: "data-component-id",
46
- sourceProp: "id",
47
- description: "Sourced from the id prop."
48
- },
49
- item: {
50
- attr: "data-option-id",
51
- description: "Stable opaque value emitted on each rendered Checkbox child within the group."
52
- }
53
- }
54
- }, le = V("", {
55
- variants: {
56
- orientation: {
57
- vertical: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]",
58
- horizontal: "ds:flex ds:flex-wrap ds:gap-x-[var(--spacing-lg)] ds:gap-y-[var(--spacing-sm)]"
59
- }
60
- },
61
- defaultVariants: { orientation: "vertical" }
62
- });
63
- function ae(t) {
64
- const l = [];
65
- return Y.forEach(t, (a) => {
66
- if (!Z(a)) return;
67
- const f = a.props;
68
- typeof f.value == "string" && l.push(f.value);
69
- }), l;
70
- }
71
- const oe = T(
72
- ({
73
- label: t,
74
- value: l,
75
- onChange: a,
76
- name: f,
77
- id: v,
78
- orientation: $ = "vertical",
79
- disabled: N = !1,
80
- min: i,
81
- max: d,
82
- onConstraintViolation: c,
83
- withSelectAll: z = !1,
84
- options: u,
85
- error: m,
86
- helperText: g,
87
- className: E,
88
- children: b
89
- }, H) => {
90
- const { t: p } = ee(), x = W(), R = `${x}-helper`, w = `${x}-error`, I = `${x}-counter`, [P, q] = K([]), k = l !== void 0, r = k ? l : P, A = S(() => new Set(r), [r]), [C, o] = K(""), y = S(
91
- () => u ? u.map((e) => e.value) : ae(b),
92
- [u, b]
93
- ), n = (e) => {
94
- k || q(e), a == null || a(e);
95
- }, j = X(r);
96
- j.current = r;
97
- const U = S(
98
- () => ({
99
- getSelection: () => j.current.slice(),
100
- setSelection: (e) => n(e),
101
- clearSelection: () => n([])
102
- }),
103
- // eslint-disable-next-line react-hooks/exhaustive-deps
104
- [k, a]
105
- );
106
- te(re, U, v);
107
- const D = {
108
- name: f,
109
- value: A,
110
- toggle: (e) => {
111
- if (A.has(e)) {
112
- if (typeof i == "number" && r.length <= i) {
113
- o(p("inputs.checkboxGroup.minReached", { min: i })), c == null || c("min");
114
- return;
115
- }
116
- o(""), n(r.filter((Q) => Q !== e));
117
- return;
118
- }
119
- if (typeof d == "number" && r.length >= d) {
120
- o(p("inputs.checkboxGroup.maxReached", { max: d })), c == null || c("max");
121
- return;
122
- }
123
- o(""), n([...r, e]);
124
- },
125
- disabled: N
126
- }, h = y.length, G = r.length, B = h === 0 || G === 0 ? !1 : G >= h ? !0 : "indeterminate", F = () => {
127
- if (B === !0) {
128
- if (typeof i == "number" && i > 0) {
129
- o(p("inputs.checkboxGroup.minReached", { min: i })), c == null || c("min");
130
- return;
131
- }
132
- n([]), o("");
133
- return;
134
- }
135
- const e = typeof d == "number" ? y.slice(0, d) : y;
136
- n(e), o("");
137
- }, J = [
138
- g ? R : null,
139
- m ? w : null,
140
- h > 0 ? I : null
141
- ].filter(Boolean).join(" ") || void 0, L = b ?? (u ? u.map((e) => /* @__PURE__ */ s(
142
- _,
143
- {
144
- value: e.value,
145
- label: e.label,
146
- disabled: e.disabled
147
- },
148
- e.value
149
- )) : null), O = [
150
- "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:min-w-0 ds:border-0 ds:p-0 ds:m-0",
151
- E
152
- ].filter(Boolean).join(" ");
153
- return /* @__PURE__ */ M(
154
- "fieldset",
155
- {
156
- ref: H,
157
- id: v,
158
- className: O,
159
- "aria-describedby": J,
160
- "aria-invalid": !!m || void 0,
161
- "data-component": "checkbox-group",
162
- "data-component-id": v,
163
- children: [
164
- /* @__PURE__ */ s("legend", { className: "type-label ds:text-foreground ds:p-0 ds:mb-[var(--spacing-sm)]", children: t }),
165
- z ? /* @__PURE__ */ s(
166
- _,
167
- {
168
- label: p("inputs.checkboxGroup.selectAll"),
169
- checked: B,
170
- onCheckedChange: F,
171
- disabled: N
172
- }
173
- ) : null,
174
- /* @__PURE__ */ s(se.Provider, { value: D, children: /* @__PURE__ */ s("div", { className: le({ orientation: $ }), children: L }) }),
175
- g ? /* @__PURE__ */ s("p", { id: R, className: "type-body-sm ds:text-muted-foreground", children: g }) : null,
176
- m ? /* @__PURE__ */ M(
177
- "p",
178
- {
179
- id: w,
180
- role: "alert",
181
- className: "ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-body-sm ds:text-destructive",
182
- children: [
183
- /* @__PURE__ */ s(ce, { "aria-hidden": "true", className: "ds:size-4 ds:shrink-0" }),
184
- /* @__PURE__ */ s("span", { children: m })
185
- ]
186
- }
187
- ) : null,
188
- /* @__PURE__ */ s(
189
- "span",
190
- {
191
- id: I,
192
- role: "status",
193
- "aria-live": "polite",
194
- className: "ds:sr-only",
195
- children: h > 0 ? p("inputs.checkboxGroup.counter", { count: G, total: h }) : ""
196
- }
197
- ),
198
- /* @__PURE__ */ s("span", { role: "status", "aria-live": "polite", className: "ds:sr-only", children: C })
199
- ]
200
- }
201
- );
202
- }
203
- );
204
- oe.displayName = "CheckboxGroup";
205
- export {
206
- oe as C
207
- };
208
- //# sourceMappingURL=checkbox-group-Qkm3Rg1S.js.map