@keboola/design 11.2.0 → 11.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/AGENTS.md +42 -14
  2. package/CHANGELOG.md +424 -0
  3. package/COMPONENT-API.md +33 -32
  4. package/dist/{AIKit-DiS0CVOW.js → AIKit-DDg5DBCG.js} +156 -76
  5. package/dist/AIKit-DDg5DBCG.js.map +1 -0
  6. package/dist/{Alert-DfZq9kGe.js → Alert-DHJFrWnS.js} +3 -3
  7. package/dist/{Alert-DfZq9kGe.js.map → Alert-DHJFrWnS.js.map} +1 -1
  8. package/dist/{AlertModal-Dp_XuJBW.js → AlertModal-BGJdaRRj.js} +3 -3
  9. package/dist/{AlertModal-Dp_XuJBW.js.map → AlertModal-BGJdaRRj.js.map} +1 -1
  10. package/dist/{AppShell-B5GQN6Zs.js → AppShell-DRgJxpXW.js} +29 -10
  11. package/dist/AppShell-DRgJxpXW.js.map +1 -0
  12. package/dist/{BrandEditor-DyzgfVkl.js → BrandEditor-Go7w8Zj2.js} +7 -7
  13. package/dist/{BrandEditor-DyzgfVkl.js.map → BrandEditor-Go7w8Zj2.js.map} +1 -1
  14. package/dist/{BrandLogo-CJkRd0F8.js → BrandLogo-Dmi7jo21.js} +2 -2
  15. package/dist/{BrandLogo-CJkRd0F8.js.map → BrandLogo-Dmi7jo21.js.map} +1 -1
  16. package/dist/{Breadcrumb-Frst8MTA.js → Breadcrumb-uEkM6adI.js} +3 -3
  17. package/dist/{Breadcrumb-Frst8MTA.js.map → Breadcrumb-uEkM6adI.js.map} +1 -1
  18. package/dist/{Button-6xBX0nNl.js → Button-DsRrU5F1.js} +6 -5
  19. package/dist/Button-DsRrU5F1.js.map +1 -0
  20. package/dist/{Card-BAoZ35CV.js → Card-Dyo7055Q.js} +2 -2
  21. package/dist/{Card-BAoZ35CV.js.map → Card-Dyo7055Q.js.map} +1 -1
  22. package/dist/{Checkbox-GJ8-srt4.js → Checkbox-fC0BuO2B.js} +3 -3
  23. package/dist/{Checkbox-GJ8-srt4.js.map → Checkbox-fC0BuO2B.js.map} +1 -1
  24. package/dist/{Clipboard-CBJZiviP.js → Clipboard-ChPdiUy3.js} +2 -2
  25. package/dist/{Clipboard-CBJZiviP.js.map → Clipboard-ChPdiUy3.js.map} +1 -1
  26. package/dist/{ClipboardButton-ClcluT0C.js → ClipboardButton-D9pDjgkB.js} +3 -3
  27. package/dist/{ClipboardButton-ClcluT0C.js.map → ClipboardButton-D9pDjgkB.js.map} +1 -1
  28. package/dist/{CodeEditor-DyaN-Ij2.js → CodeEditor-Cxy3HnKH.js} +244 -113
  29. package/dist/CodeEditor-Cxy3HnKH.js.map +1 -0
  30. package/dist/{ColorInput-B8z4j4Y_.js → ColorInput-Bxj-1eLT.js} +3 -3
  31. package/dist/{ColorInput-B8z4j4Y_.js.map → ColorInput-Bxj-1eLT.js.map} +1 -1
  32. package/dist/{ColorModeSwitch-dZFZyqy1.js → ColorModeSwitch-CsWLiTBX.js} +3 -3
  33. package/dist/{ColorModeSwitch-dZFZyqy1.js.map → ColorModeSwitch-CsWLiTBX.js.map} +1 -1
  34. package/dist/{Combobox-Dgm6Z4ib.js → Combobox-Cs_1pj2q.js} +31 -24
  35. package/dist/Combobox-Cs_1pj2q.js.map +1 -0
  36. package/dist/{Command-C0aZfVTq.js → Command-B7ML9YMv.js} +6 -6
  37. package/dist/{Command-C0aZfVTq.js.map → Command-B7ML9YMv.js.map} +1 -1
  38. package/dist/{CopyField-BJ96zvXs.js → CopyField-BO_sh-HO.js} +2 -2
  39. package/dist/{CopyField-BJ96zvXs.js.map → CopyField-BO_sh-HO.js.map} +1 -1
  40. package/dist/{DateInput-B3UdzRfW.js → DateInput-ZdaMQo5i.js} +4 -4
  41. package/dist/{DateInput-B3UdzRfW.js.map → DateInput-ZdaMQo5i.js.map} +1 -1
  42. package/dist/{DatePicker-Dw3DpbUh.js → DatePicker-nA8YdE84.js} +2 -2
  43. package/dist/{DatePicker-Dw3DpbUh.js.map → DatePicker-nA8YdE84.js.map} +1 -1
  44. package/dist/{DateRangeInput-DTuySEiq.js → DateRangeInput-DkvNh_sT.js} +4 -4
  45. package/dist/{DateRangeInput-DTuySEiq.js.map → DateRangeInput-DkvNh_sT.js.map} +1 -1
  46. package/dist/{DateRangePicker-DCmMHg4s.js → DateRangePicker-DjSUFjh4.js} +6 -6
  47. package/dist/{DateRangePicker-DCmMHg4s.js.map → DateRangePicker-DjSUFjh4.js.map} +1 -1
  48. package/dist/{DropdownMenu-t90tVw6l.js → DropdownMenu-CASr-jgl.js} +2 -2
  49. package/dist/{DropdownMenu-t90tVw6l.js.map → DropdownMenu-CASr-jgl.js.map} +1 -1
  50. package/dist/{FieldItem-D-h1NeBo.js → FieldItem-CCd9-xnp.js} +3 -3
  51. package/dist/{FieldItem-D-h1NeBo.js.map → FieldItem-CCd9-xnp.js.map} +1 -1
  52. package/dist/{FieldItem-CAPj9lj3.d.ts → FieldItem-vhIJW4pj.d.ts} +2 -10
  53. package/dist/{FileUpload-BRv0TaZk.js → FileUpload-ABThVZyg.js} +2 -2
  54. package/dist/{FileUpload-BRv0TaZk.js.map → FileUpload-ABThVZyg.js.map} +1 -1
  55. package/dist/{Form-DHvcFoEi.js → Form-k6PH-em3.js} +8 -8
  56. package/dist/{Form-DHvcFoEi.js.map → Form-k6PH-em3.js.map} +1 -1
  57. package/dist/{FormGroup-C41n65cE.js → FormGroup-DbcDtrgU.js} +3 -3
  58. package/dist/{FormGroup-C41n65cE.js.map → FormGroup-DbcDtrgU.js.map} +1 -1
  59. package/dist/{FullScreenModal-Cb3PGgh4.js → FullScreenModal-BvPuYibe.js} +3 -3
  60. package/dist/{FullScreenModal-Cb3PGgh4.js.map → FullScreenModal-BvPuYibe.js.map} +1 -1
  61. package/dist/{HoverCard-WfDkLK1s.js → HoverCard-B9ZMJxjn.js} +2 -2
  62. package/dist/{HoverCard-WfDkLK1s.js.map → HoverCard-B9ZMJxjn.js.map} +1 -1
  63. package/dist/{InputGroup-CdTq8H7c.js → InputGroup-BnLHY0eq.js} +3 -3
  64. package/dist/{InputGroup-CdTq8H7c.js.map → InputGroup-BnLHY0eq.js.map} +1 -1
  65. package/dist/{Kbd-CxHAo1oo.js → Kbd-CvSM3D3-.js} +2 -2
  66. package/dist/{Kbd-CxHAo1oo.js.map → Kbd-CvSM3D3-.js.map} +1 -1
  67. package/dist/MarkedText-DNGEUVWc.js +67 -0
  68. package/dist/MarkedText-DNGEUVWc.js.map +1 -0
  69. package/dist/{MermaidDiagram-ChL3WIQT.js → MermaidDiagram-WkonYErO.js} +6 -87
  70. package/dist/MermaidDiagram-WkonYErO.js.map +1 -0
  71. package/dist/{Modal-wqG8nJiK.js → Modal-Coj-H02o.js} +16 -4
  72. package/dist/Modal-Coj-H02o.js.map +1 -0
  73. package/dist/{MultiActionButtonGroup-BiIIubiL.js → MultiActionButtonGroup-CxWH7yWK.js} +3 -3
  74. package/dist/{MultiActionButtonGroup-BiIIubiL.js.map → MultiActionButtonGroup-CxWH7yWK.js.map} +1 -1
  75. package/dist/{Navbar-BfaPeLUL.js → Navbar-B2UsolVU.js} +3 -3
  76. package/dist/{Navbar-BfaPeLUL.js.map → Navbar-B2UsolVU.js.map} +1 -1
  77. package/dist/{PageToolbar-OQg3mPF-.js → PageToolbar-DnbFt14Q.js} +3 -3
  78. package/dist/{PageToolbar-OQg3mPF-.js.map → PageToolbar-DnbFt14Q.js.map} +1 -1
  79. package/dist/{Pagination-Cjfda8KG.js → Pagination-C_b7Xhey.js} +2 -2
  80. package/dist/{Pagination-Cjfda8KG.js.map → Pagination-C_b7Xhey.js.map} +1 -1
  81. package/dist/{Popconfirm-D7_vfxFd.js → Popconfirm-CILjmzKI.js} +3 -3
  82. package/dist/{Popconfirm-D7_vfxFd.js.map → Popconfirm-CILjmzKI.js.map} +1 -1
  83. package/dist/{Popover-CzeHjvrB.js → Popover-BEbQrC_P.js} +22 -19
  84. package/dist/Popover-BEbQrC_P.js.map +1 -0
  85. package/dist/{RadioGroup-sIveSsNa.js → RadioGroup-XFzFd1ti.js} +3 -3
  86. package/dist/{RadioGroup-sIveSsNa.js.map → RadioGroup-XFzFd1ti.js.map} +1 -1
  87. package/dist/{Search-3UiqNZRj.js → Search-4Bxtt8hS.js} +2 -2
  88. package/dist/{Search-3UiqNZRj.js.map → Search-4Bxtt8hS.js.map} +1 -1
  89. package/dist/{SearchInput-C7dF_Ir-.js → SearchInput-f_oY9T4Z.js} +3 -3
  90. package/dist/{SearchInput-C7dF_Ir-.js.map → SearchInput-f_oY9T4Z.js.map} +1 -1
  91. package/dist/{SectionNav-8NoTOKO8.js → SectionNav-BpJlisbT.js} +4 -4
  92. package/dist/{SectionNav-8NoTOKO8.js.map → SectionNav-BpJlisbT.js.map} +1 -1
  93. package/dist/{Select-Is0VkePH.js → Select-DpcgKqKB.js} +32 -21
  94. package/dist/Select-DpcgKqKB.js.map +1 -0
  95. package/dist/{Sheet-Dw9BDvjI.js → Sheet-Chf0kX1E.js} +3 -3
  96. package/dist/{Sheet-Dw9BDvjI.js.map → Sheet-Chf0kX1E.js.map} +1 -1
  97. package/dist/{Sidebar-Dcb4rinA.js → Sidebar-Cm6I4dE1.js} +9 -7
  98. package/dist/{Sidebar-Dcb4rinA.js.map → Sidebar-Cm6I4dE1.js.map} +1 -1
  99. package/dist/{Slider-BOPfMOMm.js → Slider-pPC_3gz9.js} +3 -3
  100. package/dist/{Slider-BOPfMOMm.js.map → Slider-pPC_3gz9.js.map} +1 -1
  101. package/dist/{Switch-CX2A0v50.js → Switch-ChfPKcTE.js} +2 -2
  102. package/dist/{Switch-CX2A0v50.js.map → Switch-ChfPKcTE.js.map} +1 -1
  103. package/dist/{Tabs-UMQuDoW8.js → Tabs-eB974xJf.js} +2 -2
  104. package/dist/{Tabs-UMQuDoW8.js.map → Tabs-eB974xJf.js.map} +1 -1
  105. package/dist/{TextInput-CMuN1WfY.js → TextInput-DHM6dHmn.js} +3 -3
  106. package/dist/{TextInput-CMuN1WfY.js.map → TextInput-DHM6dHmn.js.map} +1 -1
  107. package/dist/{ThemeProvider-QncUrfJn.js → ThemeProvider-DrQJtzpd.js} +90 -14
  108. package/dist/ThemeProvider-DrQJtzpd.js.map +1 -0
  109. package/dist/{TimePicker-D9zktB8A.js → TimePicker-BGeqc-Ed.js} +2 -2
  110. package/dist/{TimePicker-D9zktB8A.js.map → TimePicker-BGeqc-Ed.js.map} +1 -1
  111. package/dist/{Toast-DQSbs3oA.js → Toast-Dr6Uw7ao.js} +2 -2
  112. package/dist/{Toast-DQSbs3oA.js.map → Toast-Dr6Uw7ao.js.map} +1 -1
  113. package/dist/{ZoomableSvg-CZEu6sAq.js → ZoomableSvg-BWnDkR61.js} +4 -4
  114. package/dist/{ZoomableSvg-CZEu6sAq.js.map → ZoomableSvg-BWnDkR61.js.map} +1 -1
  115. package/dist/{context-KxxeMHbR.js → context-D7X470dy.js} +5 -34
  116. package/dist/context-D7X470dy.js.map +1 -0
  117. package/dist/defaults-i_xG2F_1.js +32 -0
  118. package/dist/defaults-i_xG2F_1.js.map +1 -0
  119. package/dist/editors.d.ts +12 -2
  120. package/dist/editors.js +20 -12
  121. package/dist/editors.js.map +1 -1
  122. package/dist/findLiteralMatches-BGBw8Vbl.js +62 -0
  123. package/dist/findLiteralMatches-BGBw8Vbl.js.map +1 -0
  124. package/dist/flint.d.ts +15 -0
  125. package/dist/flint.js +212 -0
  126. package/dist/flint.js.map +1 -0
  127. package/dist/index.d.ts +725 -533
  128. package/dist/index.js +60 -57
  129. package/dist/internal/blocks/AIKit.js +2 -2
  130. package/dist/internal/blocks/AppShell.js +2 -2
  131. package/dist/internal/blocks/BrandEditor.js +1 -1
  132. package/dist/internal/blocks/ChartPanel.js +1 -1
  133. package/dist/internal/blocks/ClipboardButton.js +1 -1
  134. package/dist/internal/blocks/ColorInput.js +1 -1
  135. package/dist/internal/blocks/ColorModeSwitch.js +1 -1
  136. package/dist/internal/blocks/Command.js +1 -1
  137. package/dist/internal/blocks/CopyField.js +1 -1
  138. package/dist/internal/blocks/DateInput.js +1 -1
  139. package/dist/internal/blocks/DateRangeInput.js +1 -1
  140. package/dist/{DiagramSkeleton-lwBS2YBa.js → internal/blocks/DiagramShared/DiagramSkeleton.js} +3 -3
  141. package/dist/internal/blocks/DiagramShared/DiagramSkeleton.js.map +1 -0
  142. package/dist/internal/blocks/EmptyConfigurationActionCard.js +1 -1
  143. package/dist/internal/blocks/ErrorState.js +1 -1
  144. package/dist/internal/blocks/ExportMenu.js +5 -5
  145. package/dist/internal/blocks/ExportMenu.js.map +1 -1
  146. package/dist/internal/blocks/Form/connectors/MultiComboboxField.js +1 -1
  147. package/dist/internal/blocks/Form.js +1 -1
  148. package/dist/internal/blocks/FormGroup.js +1 -1
  149. package/dist/internal/blocks/MultiActionButtonGroup.js +1 -1
  150. package/dist/internal/blocks/MultiCombobox.js +15 -11
  151. package/dist/internal/blocks/MultiCombobox.js.map +1 -1
  152. package/dist/internal/blocks/NumberInput.js +1 -1
  153. package/dist/internal/blocks/PageToolbar.js +1 -1
  154. package/dist/internal/blocks/PasswordInput.js +2 -2
  155. package/dist/internal/blocks/SearchInput.js +1 -1
  156. package/dist/internal/blocks/SearchInputWithNavigation.js +3 -3
  157. package/dist/internal/blocks/SectionNav.js +1 -1
  158. package/dist/internal/blocks/SplitButton.js +2 -2
  159. package/dist/internal/blocks/StatCard.js +1 -1
  160. package/dist/internal/blocks/TextInput.js +1 -1
  161. package/dist/internal/blocks/Textarea.js +1 -1
  162. package/dist/internal/blocks/TimeInput.js +3 -3
  163. package/dist/internal/components/Alert.js +1 -1
  164. package/dist/internal/components/AlertModal.js +1 -1
  165. package/dist/internal/components/Avatar.js +1 -1
  166. package/dist/internal/components/BrandLogo.js +1 -1
  167. package/dist/internal/components/Breadcrumb.js +1 -1
  168. package/dist/internal/components/Button.js +1 -1
  169. package/dist/internal/components/Card.js +1 -1
  170. package/dist/internal/components/Checkbox.js +1 -1
  171. package/dist/internal/components/Clipboard.js +1 -1
  172. package/dist/internal/components/CollapsiblePanel.js +1 -1
  173. package/dist/internal/components/Combobox.js +1 -1
  174. package/dist/internal/components/DatePicker.js +1 -1
  175. package/dist/internal/components/DateRangePicker.js +1 -1
  176. package/dist/internal/components/DropdownMenu.js +1 -1
  177. package/dist/internal/components/FileUpload.js +1 -1
  178. package/dist/internal/components/FullScreenModal.js +1 -1
  179. package/dist/internal/components/HoverCard.js +1 -1
  180. package/dist/internal/components/InputGroup.js +1 -1
  181. package/dist/internal/components/Kbd.js +1 -1
  182. package/dist/internal/components/MarkedText.js +1 -1
  183. package/dist/internal/components/Modal.js +1 -1
  184. package/dist/internal/components/Navbar.js +1 -1
  185. package/dist/internal/components/Pagination.js +1 -1
  186. package/dist/internal/components/Popconfirm.js +1 -1
  187. package/dist/internal/components/Popover.js +1 -1
  188. package/dist/internal/components/RadioGroup.js +1 -1
  189. package/dist/internal/components/Search.js +1 -1
  190. package/dist/internal/components/Select.js +1 -1
  191. package/dist/internal/components/Sheet.js +1 -1
  192. package/dist/internal/components/Sidebar.js +1 -1
  193. package/dist/internal/components/Slider.js +1 -1
  194. package/dist/internal/components/Switch.js +1 -1
  195. package/dist/internal/components/Tabs.js +1 -1
  196. package/dist/internal/components/ThemeProvider.js +4 -3
  197. package/dist/internal/components/TimePicker.js +1 -1
  198. package/dist/internal/components/Toast.js +2 -2
  199. package/dist/internal/components/Toggle.js +3 -3
  200. package/dist/internal/components/Toggle.js.map +1 -1
  201. package/dist/internal/components/Tooltip.js +1 -1
  202. package/dist/internal/components/Truncated.js +16 -8
  203. package/dist/internal/components/Truncated.js.map +1 -1
  204. package/dist/internal/components/ZoomableSvg.js +1 -1
  205. package/dist/internal/utils.js +3 -3
  206. package/dist/markdown-editor.js +7 -7
  207. package/dist/mermaid.js +1 -1
  208. package/dist/rjsf.js +11 -11
  209. package/dist/{styles-DSUP_-9Z.js → styles-BAFscjSV.js} +4 -3
  210. package/dist/styles-BAFscjSV.js.map +1 -0
  211. package/dist/styles.css +1 -1
  212. package/dist/svgTransforms-C9njt92h.js +89 -0
  213. package/dist/svgTransforms-C9njt92h.js.map +1 -0
  214. package/dist/testing.js +4 -3
  215. package/dist/testing.js.map +1 -1
  216. package/dist/{themeTokens-BNg98Mu9.js → themeTokens-D70HeNVF.js} +13 -6
  217. package/dist/{themeTokens-BNg98Mu9.js.map → themeTokens-D70HeNVF.js.map} +1 -1
  218. package/dist/{toast-CjkURw0M.js → toast-DIC0iNRf.js} +3 -3
  219. package/dist/toast-DIC0iNRf.js.map +1 -0
  220. package/dist/types-BPcAjMG0.d.ts +10 -0
  221. package/dist/{useColorSchemeState-CYqcUfSH.js → useColorSchemeState-klihG9-i.js} +2 -2
  222. package/dist/{useColorSchemeState-CYqcUfSH.js.map → useColorSchemeState-klihG9-i.js.map} +1 -1
  223. package/dist/{utils-D0c5VAyF.js → utils-B5Z52hYs.js} +2 -2
  224. package/dist/{utils-D0c5VAyF.js.map → utils-B5Z52hYs.js.map} +1 -1
  225. package/dist/vega.d.ts +46 -0
  226. package/dist/vega.js +26 -0
  227. package/dist/vega.js.map +1 -0
  228. package/dist/vegaTheme-DfoEQhOy.js +146 -0
  229. package/dist/vegaTheme-DfoEQhOy.js.map +1 -0
  230. package/package.json +28 -9
  231. package/src/styles.css +27 -4
  232. package/dist/AIKit-DiS0CVOW.js.map +0 -1
  233. package/dist/AppShell-B5GQN6Zs.js.map +0 -1
  234. package/dist/Button-6xBX0nNl.js.map +0 -1
  235. package/dist/CodeEditor-DyaN-Ij2.js.map +0 -1
  236. package/dist/Combobox-Dgm6Z4ib.js.map +0 -1
  237. package/dist/DiagramSkeleton-lwBS2YBa.js.map +0 -1
  238. package/dist/MarkedText-Ckbft5mw.js +0 -44
  239. package/dist/MarkedText-Ckbft5mw.js.map +0 -1
  240. package/dist/MermaidDiagram-ChL3WIQT.js.map +0 -1
  241. package/dist/Modal-wqG8nJiK.js.map +0 -1
  242. package/dist/Popover-CzeHjvrB.js.map +0 -1
  243. package/dist/Select-Is0VkePH.js.map +0 -1
  244. package/dist/ThemeProvider-QncUrfJn.js.map +0 -1
  245. package/dist/context-KxxeMHbR.js.map +0 -1
  246. package/dist/escapeStringRegexp-8MxP2knR.js +0 -6
  247. package/dist/escapeStringRegexp-8MxP2knR.js.map +0 -1
  248. package/dist/styles-DSUP_-9Z.js.map +0 -1
  249. package/dist/toast-CjkURw0M.js.map +0 -1
package/COMPONENT-API.md CHANGED
@@ -319,37 +319,38 @@ Source: `src/blocks/Form/connectors/MultiComboboxField.tsx`
319
319
 
320
320
  > Several values from a searchable list — state is `string[]`, never objects, so the form value stays what gets submitted. Project labels with `itemToLabel`; add `allowCreate` for an enum the user may extend. Imported by name from `@keboola/design`, composed inside `form.AppField` — NOT reachable as `field.MultiComboboxField`.
321
321
 
322
- | Prop | Type | Required | Default | Description |
323
- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
324
- | `action` | `ReactNode` | no | — | Optional node rendered at the trailing edge of the label row (opposite the label) — e.g. a "Forgot password?" link beside a Password label. Presentational placement only; it is a sibling of the `<Label>`, not part of the field's accessible name. Provide an interactive element (`ButtonInline` / `Link`). |
325
- | `allowClear` | `boolean` | no | — | |
326
- | `allowCreate` | `boolean` | no | — | |
327
- | `allowSelectAll` | `boolean` | no | — | |
328
- | `aria-describedby` | `string` | no | — | |
329
- | `className` | `string` | no | — | |
330
- | `empty` | `ReactNode` | no | — | |
331
- | `focusVariant` | `"off" \| "on" \| "default" \| null` | no | — | |
332
- | `groupToLabel` | `((group: Group<string>) => ReactNode)` | no | — | |
333
- | `help` | `ReactNode` | no | — | |
334
- | `indicator` | `Indicator` | no | — | |
335
- | `inputClassName` | `string` | no | — | |
336
- | `items` | `readonly (string \| Group<string>)[]` | no | — | |
337
- | `itemToChipColor` | `((item: unknown) => "gray" \| "gray-darker" \| "gray-inverse" \| "green" \| "green-darker" \| "green-inverse" \| "blue" \| "blue-inverse" \| "red" \| "orange" \| "orange-inverse" \| "amber" \| ... 9 more ...)` | no | — | |
338
- | `itemToChipLabel` | `((item: unknown) => ReactNode)` | no | — | |
339
- | `itemToDisabled` | `((item: string) => boolean)` | no | — | |
340
- | `itemToIcon` | `((item: string) => ReactNode)` | no | — | |
341
- | `itemToLabel` | `((item: string) => ReactNode)` | no | — | |
342
- | `itemToStringLabel` | `((itemValue: string) => string)` | no | — | When the item values are objects (`<Combobox.Item value={object}>`), this function converts the object value to a string representation for display in the input. If the shape of the object is `{ value, label }`, the label will be used automatically without needing to specify this prop. |
343
- | `itemToStringValue` | `((itemValue: string) => string)` | no | — | When the item values are objects (`<Combobox.Item value={object}>`), this function converts the object value to a string representation for form submission. If the shape of the object is `{ value, label }`, the value will be used automatically without needing to specify this prop. |
344
- | `label` | `ReactNode` | no | — | |
345
- | `maxVisible` | `number` | no | — | |
346
- | `queryToCreateLabel` | `((query: string) => ReactNode)` | no | — | |
347
- | `queryToCreateValue` | `((query: string) => string)` | no | — | |
348
- | `required` | `boolean` | no | — | |
349
- | `requiredMark` | `RequiredMark` | no | — | Which marker to show beside the label — gated by `required` so it never lies: `'required'` renders `*` only when the field is `required`; `'optional'` renders `(optional)` only when it is not; `'hidden'` renders neither. Defaults to `'required'`. |
350
- | `sizing` | `"small" \| "medium" \| "default" \| null` | no | — | |
351
- | `tooltip` | `ReactNode` | no | — | |
352
- | `variant` | `"primary" \| "secondary" \| null` | no | — | |
322
+ | Prop | Type | Required | Default | Description |
323
+ | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
324
+ | `action` | `ReactNode` | no | — | Optional node rendered at the trailing edge of the label row (opposite the label) — e.g. a "Forgot password?" link beside a Password label. Presentational placement only; it is a sibling of the `<Label>`, not part of the field's accessible name. Provide an interactive element (`ButtonInline` / `Link`). |
325
+ | `allowClear` | `boolean` | no | — | |
326
+ | `allowCreate` | `boolean` | no | — | |
327
+ | `allowSelectAll` | `boolean` | no | — | |
328
+ | `aria-describedby` | `string` | no | — | |
329
+ | `className` | `string` | no | — | |
330
+ | `empty` | `ReactNode` | no | — | |
331
+ | `focusVariant` | `"off" \| "on" \| "default" \| null` | no | — | |
332
+ | `groupToLabel` | `((group: Group<string>) => ReactNode)` | no | — | |
333
+ | `help` | `ReactNode` | no | — | |
334
+ | `indicator` | `Indicator` | no | — | |
335
+ | `inputClassName` | `string` | no | — | |
336
+ | `items` | `readonly (string \| Group<string>)[]` | no | — | |
337
+ | `itemToChipColor` | `((item: string) => "gray" \| "gray-darker" \| "gray-inverse" \| "green" \| "green-darker" \| "green-inverse" \| "blue" \| "blue-inverse" \| "red" \| "orange" \| "orange-inverse" \| "amber" \| ... 9 more ...)` | no | — | |
338
+ | `itemToChipLabel` | `((item: string) => ReactNode)` | no | — | |
339
+ | `itemToDisabled` | `((item: string) => boolean)` | no | — | |
340
+ | `itemToIcon` | `((item: string) => ReactNode)` | no | — | |
341
+ | `itemToLabel` | `((item: string) => ReactNode)` | no | — | |
342
+ | `itemToStringLabel` | `((itemValue: string) => string)` | no | — | When the item values are objects (`<Combobox.Item value={object}>`), this function converts the object value to a string representation for display in the input. If the shape of the object is `{ value, label }`, the label will be used automatically without needing to specify this prop. |
343
+ | `itemToStringValue` | `((itemValue: string) => string)` | no | — | When the item values are objects (`<Combobox.Item value={object}>`), this function converts the object value to a string representation for form submission. If the shape of the object is `{ value, label }`, the value will be used automatically without needing to specify this prop. |
344
+ | `label` | `ReactNode` | no | — | |
345
+ | `maxVisible` | `number` | no | — | |
346
+ | `pinnedChipLabels` | `ReactNode[]` | no | — | Labels for chips the control shows but the user does not own — a pinned set the caller keeps. - Each label gets a chip of its own, ahead of the values and outside the `maxVisible` slice. - No remove button, and no entry in `value` — there is nothing for a removal to report. |
347
+ | `queryToCreateLabel` | `((query: string) => ReactNode)` | no | — | |
348
+ | `queryToCreateValue` | `((query: string) => string)` | no | — | |
349
+ | `required` | `boolean` | no | — | |
350
+ | `requiredMark` | `RequiredMark` | no | — | Which marker to show beside the label — gated by `required` so it never lies: `'required'` renders `*` only when the field is `required`; `'optional'` renders `(optional)` only when it is not; `'hidden'` renders neither. Defaults to `'required'`. |
351
+ | `sizing` | `"small" \| "medium" \| "default" \| null` | no | — | |
352
+ | `tooltip` | `ReactNode` | no | — | |
353
+ | `variant` | `"primary" \| "secondary" \| null` | no | — | |
353
354
 
354
355
  ### `field.CheckboxField`
355
356
 
@@ -483,7 +484,7 @@ Source: `src/components/BrandLogo/BrandLogo.tsx`
483
484
 
484
485
  Source: `src/blocks/AppShell/AppShell.tsx`
485
486
 
486
- > Compound app-root shell that follows the active brand (sidebar vs top-nav). Subcomponents: `AppShell.Sidebar`, `AppShell.Header`, `AppShell.Aside`, `AppShell.Main`. `AppShell.Main` owns the default page gutter (`tw:p-6`) — override with `className="tw:p-0"`. `AppShell.Header` and `AppShell.Aside` take `flush` — pass it when the slot hosts a chrome component that paints itself (`Navbar`, `Sidebar side="right"`), so the slot drops its own padding, background and border instead of insetting the child. Native `<div>` attributes.
487
+ > Compound app-root shell that follows the active brand (sidebar vs top-nav). Subcomponents: `AppShell.Sidebar`, `AppShell.Header`, `AppShell.Aside`, `AppShell.Main`. `AppShell.Main` owns the default page gutter (`tw:p-6`) on a wrapper inside its scroll container — override with `contentClassName="tw:p-0"`, never a `p-*` in `className` (that sits on the scrollport and breaks every sticky header below it, `Table.Header` included). `Main` is also the scrollport by default and its content wrapper grows with the content; pass `clampContent` when the page runs its own `overflow-auto` scroller, so a `flex-1` descendant clamps to the shell instead of resolving against the content. `AppShell.Header` and `AppShell.Aside` take `flush` — pass it when the slot hosts a chrome component that paints itself (`Navbar`, `Sidebar side="right"`), so the slot drops its own padding, background and border instead of insetting the child. Native `<div>` attributes.
487
488
 
488
489
  | Prop | Type | Required | Default | Description |
489
490
  | ------------ | -------------------- | -------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -1,19 +1,18 @@
1
1
  import { cn } from "./classNames-BzrkDnOD.js";
2
- import { Tooltip, TooltipProvider } from "./utils-D0c5VAyF.js";
3
- import { AlertCircle, ChevronDown, ChevronLeft, ChevronRight, CircleCheck, CirclePause, CircleX, FileText, Loader2, Maximize2, Minimize2, Play, Send, X, XCircle } from "./icons-Cek151jC.js";
4
- import { Button } from "./Button-6xBX0nNl.js";
5
- import { ClipboardButton } from "./ClipboardButton-ClcluT0C.js";
6
- import { FullScreenModal, FullScreenModalBody, FullScreenModalHeader } from "./FullScreenModal-Cb3PGgh4.js";
2
+ import { Tooltip, TooltipProvider } from "./utils-B5Z52hYs.js";
3
+ import { AlertCircle, ChevronDown, ChevronLeft, ChevronRight, ChevronUp, CircleCheck, CirclePause, CircleX, Loader2, Maximize2, Minimize2, Play, Send, Sparkles, TriangleAlert, X, XCircle } from "./icons-Cek151jC.js";
4
+ import { Button } from "./Button-DsRrU5F1.js";
5
+ import { ClipboardButton } from "./ClipboardButton-D9pDjgkB.js";
6
+ import { FullScreenModal, FullScreenModalBody, FullScreenModalHeader } from "./FullScreenModal-BvPuYibe.js";
7
7
  import { Truncated } from "./internal/components/Truncated.js";
8
- import { HoverCard } from "./HoverCard-WfDkLK1s.js";
9
- import { Command } from "./Command-C0aZfVTq.js";
10
- import { TextInput } from "./TextInput-CMuN1WfY.js";
11
- import { Checkbox } from "./Checkbox-GJ8-srt4.js";
8
+ import { HoverCard } from "./HoverCard-B9ZMJxjn.js";
9
+ import { Command } from "./Command-B7ML9YMv.js";
10
+ import { TextInput } from "./TextInput-DHM6dHmn.js";
11
+ import { Checkbox } from "./Checkbox-fC0BuO2B.js";
12
12
  import { Badge } from "./Badge-Ch26CXoP.js";
13
13
  import { Textarea } from "./internal/blocks/Textarea.js";
14
14
  import { Table } from "./Table-CvYuTuNU.js";
15
- import { DiagramSkeleton } from "./DiagramSkeleton-lwBS2YBa.js";
16
- import { Avatar } from "./internal/components/Avatar.js";
15
+ import { DiagramSkeleton } from "./internal/blocks/DiagramShared/DiagramSkeleton.js";
17
16
  import { Progress } from "./internal/components/Progress.js";
18
17
  import { Slot } from "@radix-ui/react-slot";
19
18
  import { Suspense, isValidElement, lazy, useEffect, useId, useRef, useState } from "react";
@@ -24,12 +23,12 @@ import ReactMarkdown from "react-markdown";
24
23
  import remarkGfm from "remark-gfm";
25
24
  //#region src/blocks/AIKit/CollapsibleStepHeader.tsx
26
25
  const variantClasses = {
27
- success: "tw:text-secondary-500 tw:focus-visible:outline-ring tw:not-disabled:hover:text-secondary-600",
28
- error: "tw:text-error-500 tw:focus-visible:outline-error-500 tw:not-disabled:hover:text-error-600",
29
- processing: "tw:text-secondary-500 tw:focus-visible:outline-ring tw:not-disabled:hover:text-secondary-600",
30
- dismissed: "tw:text-neutral-700 tw:focus-visible:outline-neutral-500 tw:not-disabled:hover:text-neutral-800"
26
+ success: "tw:text-muted-foreground tw:focus-visible:outline-ring tw:not-disabled:hover:text-foreground",
27
+ error: "tw:text-destructive tw:focus-visible:outline-destructive tw:not-disabled:hover:text-destructive",
28
+ processing: "tw:text-muted-foreground tw:focus-visible:outline-ring tw:not-disabled:hover:text-foreground",
29
+ dismissed: "tw:text-muted-foreground tw:focus-visible:outline-ring tw:not-disabled:hover:text-foreground"
31
30
  };
32
- const iconClasses = "tw:size-4 tw:shrink-0 tw:basis-4";
31
+ const iconClasses = "tw:size-3.5 tw:shrink-0 tw:basis-3.5 tw:opacity-70";
33
32
  const renderVariantIcon$1 = (variant) => {
34
33
  if (variant === "processing") return /* @__PURE__ */ jsx(Loader2, { className: cn(iconClasses, "tw:animate-spin") });
35
34
  if (variant === "error") return /* @__PURE__ */ jsx(XCircle, { className: iconClasses });
@@ -41,12 +40,12 @@ const CollapsibleStepHeader = ({ isExpanded, onToggle, label, variant = "success
41
40
  type: "button",
42
41
  "aria-expanded": isExpanded,
43
42
  onClick: onToggle,
44
- className: cn("tw:flex tw:w-fit tw:items-start tw:gap-2 tw:text-left tw:text-sm tw:font-medium tw:italic tw:transition-colors tw:focus-visible:outline tw:focus-visible:outline-2 tw:focus-visible:outline-offset-2 tw:disabled:opacity-40", variantClasses[variant]),
43
+ className: cn("tw:flex tw:w-fit tw:items-center tw:gap-1.5 tw:text-left tw:text-xs tw:font-medium tw:transition-colors tw:focus-visible:outline tw:focus-visible:outline-2 tw:focus-visible:outline-offset-2 tw:disabled:opacity-40", variantClasses[variant]),
45
44
  children: [renderVariantIcon$1(variant), /* @__PURE__ */ jsxs("span", {
46
45
  className: "tw:min-w-0",
47
46
  children: [label, /* @__PURE__ */ jsxs("span", {
48
47
  className: "tw:whitespace-nowrap",
49
- children: ["⁠", /* @__PURE__ */ jsx(ChevronDown, { className: cn("tw:ml-2 tw:inline-block tw:size-4 tw:align-middle tw:transition-transform", isExpanded && "tw:rotate-180") })]
48
+ children: ["⁠", /* @__PURE__ */ jsx(ChevronDown, { className: cn("tw:ml-1.5 tw:inline-block tw:size-3.5 tw:align-middle tw:transition-transform", isExpanded && "tw:rotate-180") })]
50
49
  })]
51
50
  })]
52
51
  });
@@ -54,24 +53,24 @@ const CollapsibleStepHeader = ({ isExpanded, onToggle, label, variant = "success
54
53
  //#endregion
55
54
  //#region src/blocks/AIKit/InlineStepDetail.tsx
56
55
  const InlineStepDetail = ({ children }) => /* @__PURE__ */ jsx("div", {
57
- className: "tw:ml-2.5 tw:whitespace-pre-wrap tw:border-l tw:border-neutral-200 tw:pl-3 tw:text-xs tw:text-neutral-400",
56
+ className: "tw:ml-2.5 tw:whitespace-pre-wrap tw:border-l tw:border-border tw:pl-3 tw:text-xs tw:text-muted-foreground",
58
57
  children
59
58
  });
60
59
  //#endregion
61
60
  //#region src/blocks/AIKit/InlineStepLabel.tsx
62
61
  const renderVariantIcon = (variant) => {
63
- if (variant === "processing") return /* @__PURE__ */ jsx(Loader2, { className: "tw:size-4 tw:animate-spin tw:text-neutral-200" });
64
- if (variant === "error") return /* @__PURE__ */ jsx(XCircle, { className: "tw:size-4 tw:text-error-500" });
65
- if (variant === "dismissed") return /* @__PURE__ */ jsx(XCircle, { className: "tw:size-4 tw:text-neutral-200" });
66
- return /* @__PURE__ */ jsx(CircleCheck, { className: "tw:size-4 tw:text-neutral-200" });
62
+ if (variant === "processing") return /* @__PURE__ */ jsx(Loader2, { className: "tw:size-3.5 tw:animate-spin tw:text-muted-foreground" });
63
+ if (variant === "error") return /* @__PURE__ */ jsx(XCircle, { className: "tw:size-3.5 tw:text-destructive" });
64
+ if (variant === "dismissed") return /* @__PURE__ */ jsx(XCircle, { className: "tw:size-3.5 tw:text-muted-foreground/50" });
65
+ return /* @__PURE__ */ jsx(CircleCheck, { className: "tw:size-3.5 tw:text-muted-foreground/50" });
67
66
  };
68
67
  const InlineStepLabel = ({ variant, children }) => /* @__PURE__ */ jsxs("div", {
69
68
  className: "tw:flex tw:min-w-0 tw:items-center tw:gap-1",
70
69
  children: [/* @__PURE__ */ jsx("div", {
71
- className: "tw:flex tw:size-5 tw:shrink-0 tw:items-center tw:justify-center",
70
+ className: "tw:relative tw:flex tw:size-5 tw:shrink-0 tw:items-center tw:justify-center tw:[background:var(--inline-step-surface,transparent)]",
72
71
  children: renderVariantIcon(variant)
73
72
  }), /* @__PURE__ */ jsx("div", {
74
- className: "tw:flex tw:min-w-0 tw:flex-wrap tw:items-center tw:gap-x-1.5 tw:gap-y-1 tw:text-sm tw:font-medium tw:italic tw:text-neutral-800",
73
+ className: "tw:flex tw:min-w-0 tw:flex-wrap tw:items-center tw:gap-x-1.5 tw:gap-y-1 tw:text-xs tw:font-medium tw:text-muted-foreground",
75
74
  children
76
75
  })]
77
76
  });
@@ -113,7 +112,7 @@ const MermaidDiagram = lazy(() => import("@keboola/design/mermaid").then((module
113
112
  console.error("[AIKit] failed to load the MermaidDiagram chunk", error);
114
113
  return { default: ({ code }) => /* @__PURE__ */ jsx("pre", { children: /* @__PURE__ */ jsx("code", { children: code }) }) };
115
114
  }));
116
- const proseClass = "tw:prose tw:prose-sm tw:max-w-none tw:break-words tw:[&_pre]:bg-neutral-50 tw:[&_pre]:text-neutral-800 tw:[&_:not(pre)>code]:bg-neutral-50 tw:[&_:not(pre)>code]:rounded tw:[&_:not(pre)>code]:px-1 tw:[&_:not(pre)>code]:py-0.5 tw:[&_:not(pre)>code]:before:content-none tw:[&_:not(pre)>code]:after:content-none";
115
+ const proseClass = "tw:prose tw:prose-sm tw:max-w-none tw:break-words tw:[&_pre]:bg-muted tw:[&_pre]:text-foreground tw:[&_:not(pre)>code]:bg-muted tw:[&_:not(pre)>code]:text-foreground tw:[&_:not(pre)>code]:rounded tw:[&_:not(pre)>code]:px-1 tw:[&_:not(pre)>code]:py-0.5 tw:[&_:not(pre)>code]:before:content-none tw:[&_:not(pre)>code]:after:content-none";
117
116
  const getText = (node) => {
118
117
  if (typeof node === "string") return node;
119
118
  if (typeof node === "number") return String(node);
@@ -128,7 +127,15 @@ const getLanguage = (element) => {
128
127
  if (typeof props.className !== "string") return void 0;
129
128
  return props.className.match(/language-(\S+)/)?.[1];
130
129
  };
131
- const components = {
130
+ /**
131
+ * The plugins this renderer always runs.
132
+ *
133
+ * - GFM is part of its contract: tables route through the design `Table`, and autolinks and
134
+ * task lists are what an assistant answer is written in.
135
+ * - A caller's own plugins are appended to these, never substituted for them.
136
+ */
137
+ const baseRemarkPlugins = [remarkGfm];
138
+ const baseComponents = {
132
139
  pre({ children, ...props }) {
133
140
  const child = Array.isArray(children) ? children[0] : children;
134
141
  if (getLanguage(child) === "mermaid") {
@@ -207,13 +214,16 @@ const components = {
207
214
  * `MessageBubble` to render an assistant message body. Code blocks expose a
208
215
  * copy button, so mount a `TooltipProvider` once at the app root.
209
216
  */
210
- const Markdown = ({ children, className }) => {
217
+ const Markdown = ({ children, className, remarkPlugins, components: componentOverrides }) => {
211
218
  return /* @__PURE__ */ jsx("div", {
212
219
  "data-prose": true,
213
220
  className: cn(proseClass, className),
214
221
  children: /* @__PURE__ */ jsx(ReactMarkdown, {
215
- remarkPlugins: [remarkGfm],
216
- components,
222
+ remarkPlugins: remarkPlugins === void 0 ? baseRemarkPlugins : [...baseRemarkPlugins, ...remarkPlugins],
223
+ components: componentOverrides === void 0 ? baseComponents : {
224
+ ...baseComponents,
225
+ ...componentOverrides
226
+ },
217
227
  children
218
228
  })
219
229
  });
@@ -223,22 +233,31 @@ const Markdown = ({ children, className }) => {
223
233
  const containerClasses = cva([
224
234
  "tw:flex",
225
235
  "tw:max-w-full",
226
- "tw:gap-4"
236
+ "tw:gap-3"
227
237
  ], {
228
238
  variants: { variant: {
229
- user: ["tw:justify-self-end", "tw:flex-row-reverse"],
230
- assistant: [
231
- "tw:justify-self-start",
232
- "tw:w-full",
233
- "tw:gap-3"
234
- ]
239
+ user: ["tw:justify-end"],
240
+ assistant: ["tw:justify-start", "tw:w-full"]
241
+ } },
242
+ defaultVariants: { variant: "assistant" }
243
+ });
244
+ const stackClasses = cva([
245
+ "tw:flex",
246
+ "tw:min-w-0",
247
+ "tw:flex-1",
248
+ "tw:flex-col",
249
+ "tw:gap-2"
250
+ ], {
251
+ variants: { variant: {
252
+ user: ["tw:items-end"],
253
+ assistant: []
235
254
  } },
236
255
  defaultVariants: { variant: "assistant" }
237
256
  });
238
257
  const contentClasses = cva([
239
258
  "tw:flex",
240
259
  "tw:flex-col",
241
- "tw:gap-4",
260
+ "tw:gap-3",
242
261
  "tw:break-words",
243
262
  "tw:leading-relaxed",
244
263
  "tw:text-foreground",
@@ -252,33 +271,30 @@ const contentClasses = cva([
252
271
  "tw:[&>*]:min-w-0"
253
272
  ],
254
273
  user: [
255
- "tw:max-w-screen-sm",
274
+ "tw:max-w-[min(85%,40rem)]",
256
275
  "tw:w-fit",
257
276
  "tw:bg-muted",
258
- "tw:p-3",
259
- "tw:rounded-2xl",
260
- "tw:ml-6",
277
+ "tw:px-3",
278
+ "tw:py-2",
279
+ "tw:rounded-xl",
261
280
  "tw:overflow-hidden",
262
281
  "tw:break-anywhere"
263
282
  ]
264
283
  } },
265
284
  defaultVariants: { variant: "assistant" }
266
285
  });
267
- const MessageBubble = ({ variant, children, user, actions, createdAt }) => {
268
- return /* @__PURE__ */ jsxs("div", {
286
+ const MessageBubble = ({ variant, children, actions, createdAt }) => {
287
+ return /* @__PURE__ */ jsx("div", {
269
288
  className: containerClasses({ variant }),
270
289
  "data-testid": `chat-message-${variant}`,
271
- children: [variant === "user" && /* @__PURE__ */ jsx(Avatar, {
272
- user,
273
- size: 30,
274
- title: createdAt
275
- }), /* @__PURE__ */ jsxs("div", {
276
- className: "tw:flex tw:min-w-0 tw:flex-1 tw:flex-col tw:gap-2",
290
+ children: /* @__PURE__ */ jsxs("div", {
291
+ className: stackClasses({ variant }),
277
292
  children: [/* @__PURE__ */ jsx("div", {
278
293
  className: contentClasses({ variant }),
294
+ title: variant === "user" ? createdAt : void 0,
279
295
  children
280
296
  }), actions]
281
- })]
297
+ })
282
298
  });
283
299
  };
284
300
  //#endregion
@@ -665,7 +681,7 @@ const PromptInputSubmit = ({ ref, disabled, status = "ready" }) => {
665
681
  const icon = (() => {
666
682
  if (status === "streaming") return /* @__PURE__ */ jsx(CirclePause, { className: "tw:size-4" });
667
683
  if (status === "interrupted") return /* @__PURE__ */ jsx(Play, { className: "tw:size-4" });
668
- return /* @__PURE__ */ jsx(Send, { className: "tw:size-4" });
684
+ return /* @__PURE__ */ jsx(Send, { className: "tw:size-4 tw:translate-x-[-1px] tw:translate-y-[1px]" });
669
685
  })();
670
686
  const getTooltipText = () => {
671
687
  if (status === "streaming") return "Stop";
@@ -679,9 +695,9 @@ const PromptInputSubmit = ({ ref, disabled, status = "ready" }) => {
679
695
  disabled,
680
696
  "aria-label": ARIA_LABEL_BY_STATUS[status],
681
697
  size: "icon-sm",
682
- variant: "invisible",
698
+ variant: "primary",
683
699
  isLoading: status === "submitted",
684
- className: "tw:ml-auto tw:flex tw:items-center tw:rounded-lg tw:[&_svg]:text-secondary-500 tw:not-disabled:hover:[&_svg]:text-secondary-600",
700
+ className: cn("tw:ml-auto tw:flex tw:items-center tw:rounded-full", "tw:bg-gradient-to-br tw:from-[#61E4FF] tw:via-[#1F8FFF] tw:to-[#7C5CFF]", "tw:hover:not-disabled:brightness-110"),
685
701
  children: status !== "submitted" && icon
686
702
  }) })
687
703
  }), getTooltipText() && /* @__PURE__ */ jsx(Tooltip.Content, {
@@ -742,12 +758,16 @@ const wrapperVariants = cva(null, {
742
758
  inline: ""
743
759
  } }
744
760
  });
745
- const PromptInput = ({ onSend, onAbort, onContinue, prefix, variant, suffix, disabled, disableSubmit, value = "", onValueChange, status = "ready", maxRows = 6, minRows, commands, ...textareaProps }) => {
761
+ const PromptInput = ({ onSend, onAbort, onContinue, prefix, variant, suffix, disabled, disableSubmit, value = "", onValueChange, status = "ready", maxRows = 6, minRows, commands, autoFocus, ...textareaProps }) => {
746
762
  const defaultMinRows = variant === "inline" ? 1 : 2;
747
763
  const isDisabled = (disabled || disableSubmit || !value.trim()) && status !== "streaming" && status !== "interrupted";
748
764
  const textareaId = useId();
749
765
  const textareaRef = useRef(null);
750
766
  const [dismissedValue, setDismissedValue] = useState(null);
767
+ const autoFocusRef = useRef(autoFocus);
768
+ useEffect(() => {
769
+ if (autoFocusRef.current) textareaRef.current?.focus({ preventScroll: true });
770
+ }, []);
751
771
  if (dismissedValue !== null && value !== dismissedValue) setDismissedValue(null);
752
772
  const hasCommands = !!commands && commands.length > 0;
753
773
  const valueLooksLikeSlashCommand = value.startsWith("/") && !/\s/.test(value);
@@ -878,7 +898,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
878
898
  else handleCustomFocus();
879
899
  };
880
900
  return /* @__PURE__ */ jsxs("div", {
881
- className: cn("tw:flex tw:max-w-[800px] tw:flex-col tw:gap-4 tw:overflow-hidden tw:rounded-xl tw:border tw:border-solid tw:border-border tw:bg-neutral-50 tw:shadow-lg", className),
901
+ className: cn("tw:flex tw:max-w-[800px] tw:flex-col tw:gap-4 tw:overflow-hidden tw:rounded-xl tw:border tw:border-solid tw:border-border tw:bg-card tw:text-card-foreground tw:shadow-lg", className),
882
902
  "data-testid": "question-root",
883
903
  "data-question-step": currentStep,
884
904
  "data-question-total-steps": totalSteps,
@@ -889,10 +909,10 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
889
909
  children: [/* @__PURE__ */ jsxs("div", {
890
910
  className: "tw:flex tw:min-w-0 tw:flex-1 tw:flex-col tw:gap-1",
891
911
  children: [/* @__PURE__ */ jsx("p", {
892
- className: "tw:m-0 tw:text-base tw:font-semibold tw:leading-6 tw:text-neutral-800",
912
+ className: "tw:m-0 tw:text-base tw:font-semibold tw:leading-6",
893
913
  children: question
894
914
  }), header && /* @__PURE__ */ jsx("p", {
895
- className: "tw:m-0 tw:text-xs tw:leading-4 tw:text-neutral-500",
915
+ className: "tw:m-0 tw:text-xs tw:leading-4 tw:text-muted-foreground",
896
916
  children: header
897
917
  })]
898
918
  }), onClose && /* @__PURE__ */ jsx(Button, {
@@ -909,7 +929,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
909
929
  children: /* @__PURE__ */ jsxs("div", {
910
930
  className: "tw:flex tw:flex-col tw:gap-4 tw:border-0 tw:border-l tw:border-solid tw:border-primary tw:px-4 tw:py-2",
911
931
  children: [options.map((option) => /* @__PURE__ */ jsxs("div", {
912
- className: "tw:-mx-2 tw:-my-1.5 tw:flex tw:cursor-pointer tw:items-start tw:gap-2 tw:rounded-md tw:px-2 tw:py-1.5 tw:hover:bg-neutral-100",
932
+ className: "tw:-mx-2 tw:-my-1.5 tw:flex tw:cursor-pointer tw:items-start tw:gap-2 tw:rounded-md tw:px-2 tw:py-1.5 tw:hover:bg-accent",
913
933
  onClick: () => handleOptionToggle(option.id),
914
934
  onKeyDown: handleKeyDown(() => handleOptionToggle(option.id)),
915
935
  role: "button",
@@ -925,16 +945,17 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
925
945
  children: [/* @__PURE__ */ jsxs("div", {
926
946
  className: "tw:flex tw:flex-col tw:gap-1.5",
927
947
  children: [/* @__PURE__ */ jsx("span", {
928
- className: "tw:text-sm tw:font-medium tw:leading-none tw:text-neutral-800",
948
+ className: "tw:text-sm tw:font-medium tw:leading-none",
929
949
  children: option.label
930
950
  }), option.description && /* @__PURE__ */ jsx("span", {
931
951
  className: "tw:text-sm tw:font-normal tw:leading-5 tw:text-muted-foreground",
932
952
  children: option.description
933
953
  })]
934
954
  }), option.preview && /* @__PURE__ */ jsx("div", {
935
- className: cn("tw:ml-auto tw:flex tw:max-h-40 tw:min-w-0 tw:max-w-[50%] tw:flex-col tw:overflow-hidden tw:rounded-md", !renderPreview && "tw:overflow-auto tw:border tw:border-solid tw:border-neutral-200 tw:bg-white tw:p-2"),
955
+ "data-testid": "question-option-preview",
956
+ className: cn("tw:ml-auto tw:flex tw:max-h-40 tw:min-w-0 tw:max-w-[50%] tw:flex-col tw:overflow-hidden tw:rounded-md", !renderPreview && "tw:overflow-auto tw:border tw:border-solid tw:border-border tw:bg-muted tw:p-2 tw:text-foreground"),
936
957
  children: renderPreview ? renderPreview(option.preview) : /* @__PURE__ */ jsx("pre", {
937
- className: "tw:m-0 tw:overflow-visible tw:border-0 tw:bg-transparent tw:p-0 tw:font-mono tw:text-xs tw:leading-5 tw:text-neutral-700",
958
+ className: "tw:m-0 tw:overflow-visible tw:border-0 tw:bg-transparent tw:p-0 tw:font-mono tw:text-xs tw:leading-5 tw:text-foreground",
938
959
  children: option.preview
939
960
  })
940
961
  })]
@@ -942,7 +963,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
942
963
  }, option.id)), showCustomAnswer && /* @__PURE__ */ jsxs("div", {
943
964
  className: "tw:flex tw:flex-col tw:gap-2",
944
965
  children: [/* @__PURE__ */ jsxs("div", {
945
- className: "tw:-mx-2 tw:-my-1.5 tw:flex tw:cursor-pointer tw:items-start tw:gap-2 tw:rounded-md tw:px-2 tw:py-1.5 tw:hover:bg-neutral-100",
966
+ className: "tw:-mx-2 tw:-my-1.5 tw:flex tw:cursor-pointer tw:items-start tw:gap-2 tw:rounded-md tw:px-2 tw:py-1.5 tw:hover:bg-accent",
946
967
  onClick: handleCustomRowClick,
947
968
  onKeyDown: handleKeyDown(handleCustomRowClick),
948
969
  role: "button",
@@ -953,7 +974,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
953
974
  onClick: (e) => e.stopPropagation(),
954
975
  className: "tw:shrink-0"
955
976
  }), /* @__PURE__ */ jsx("span", {
956
- className: cn("tw:text-sm tw:font-medium tw:leading-none", !multiSelect && isCustomSelected ? "tw:text-primary" : "tw:text-neutral-800"),
977
+ className: cn("tw:text-sm tw:font-medium tw:leading-none", !multiSelect && isCustomSelected && "tw:text-primary"),
957
978
  children: "Other"
958
979
  })]
959
980
  }), /* @__PURE__ */ jsx(TextInput, {
@@ -980,7 +1001,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
980
1001
  value: progressValue,
981
1002
  className: "tw:rounded-none"
982
1003
  }), /* @__PURE__ */ jsxs("div", {
983
- className: cn("tw:flex tw:items-center tw:justify-end tw:gap-4 tw:px-4 tw:py-3", !hasSteps && "tw:border-0 tw:border-t tw:border-solid tw:border-neutral-100"),
1004
+ className: cn("tw:flex tw:items-center tw:justify-end tw:gap-4 tw:px-4 tw:py-3", !hasSteps && "tw:border-0 tw:border-t tw:border-solid tw:border-border"),
984
1005
  children: [
985
1006
  hasSteps && /* @__PURE__ */ jsxs("div", {
986
1007
  className: "tw:flex tw:items-center tw:gap-2",
@@ -994,7 +1015,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
994
1015
  children: /* @__PURE__ */ jsx(ChevronLeft, { className: cn("tw:size-5", isFirstStep ? "tw:text-primary/25" : "tw:text-primary") })
995
1016
  }),
996
1017
  /* @__PURE__ */ jsxs("span", {
997
- className: "tw:text-xs tw:leading-4 tw:text-neutral-500",
1018
+ className: "tw:text-xs tw:leading-4 tw:text-muted-foreground",
998
1019
  children: [
999
1020
  currentStep,
1000
1021
  " of ",
@@ -1092,9 +1113,9 @@ const SuggestedPrompt = ({ label, disabled, onClick, icon, className }) => {
1092
1113
  return /* @__PURE__ */ jsxs("button", {
1093
1114
  type: "button",
1094
1115
  disabled,
1095
- className: cn("tailwindcss-preflight tw:flex tw:items-center tw:justify-start tw:gap-2 tw:whitespace-nowrap tw:rounded-lg tw:p-2 tw:text-left tw:text-sm tw:font-medium tw:text-foreground tw:transition-colors tw:not-disabled:hover:bg-muted tw:disabled:cursor-not-allowed tw:disabled:opacity-50", className),
1116
+ className: cn("tailwindcss-preflight tw:flex tw:items-center tw:justify-start tw:gap-2.5 tw:whitespace-nowrap", "tw:rounded-lg tw:px-3 tw:py-2", "tw:text-left tw:text-sm tw:font-medium tw:text-foreground", "tw:transition-colors tw:not-disabled:hover:bg-accent", "tw:focus-visible:outline-none tw:focus-visible:ring-2 tw:focus-visible:ring-ring tw:focus-visible:ring-offset-1", "tw:disabled:cursor-not-allowed tw:disabled:opacity-50", className),
1096
1117
  onClick,
1097
- children: [icon ?? /* @__PURE__ */ jsx(FileText, { className: "tw:size-4 tw:shrink-0 tw:basis-4 tw:[&_*]:stroke-aigradient-600" }), /* @__PURE__ */ jsx("div", {
1118
+ children: [icon ?? /* @__PURE__ */ jsx(Sparkles, { className: "tw:size-4 tw:shrink-0 tw:basis-4 tw:[&_*]:stroke-aigradient-600" }), /* @__PURE__ */ jsx("div", {
1098
1119
  className: "tw:whitespace-normal tw:text-left",
1099
1120
  children: label
1100
1121
  })]
@@ -1104,10 +1125,10 @@ const SuggestedPrompt = ({ label, disabled, onClick, icon, className }) => {
1104
1125
  //#region src/blocks/AIKit/ThinkingIndicator.tsx
1105
1126
  const ThinkingIndicator = ({ label = "Thinking..." }) => {
1106
1127
  return /* @__PURE__ */ jsxs("div", {
1107
- className: "tw:flex tw:items-center tw:gap-2",
1128
+ className: "tw:flex tw:items-center tw:gap-1.5",
1108
1129
  "data-testid": "chat-thinking-indicator",
1109
- children: [/* @__PURE__ */ jsx(Loader2, { className: "tw:size-4 tw:animate-spin tw:text-secondary-500" }), /* @__PURE__ */ jsx("span", {
1110
- className: "tw:text-sm tw:italic tw:text-secondary-500",
1130
+ children: [/* @__PURE__ */ jsx(Loader2, { className: "tw:size-3.5 tw:animate-spin tw:text-muted-foreground" }), /* @__PURE__ */ jsx("span", {
1131
+ className: "tw:text-xs tw:font-medium tw:text-muted-foreground",
1111
1132
  children: label
1112
1133
  })]
1113
1134
  });
@@ -1258,6 +1279,63 @@ const ToolCallChip = ({ label, state, icon, trailing, onClick, className }) => {
1258
1279
  });
1259
1280
  };
1260
1281
  //#endregion
1282
+ //#region src/blocks/AIKit/ToolCallStatusHeader.tsx
1283
+ const headerVariants = cva("tw:flex tw:items-center tw:justify-between tw:gap-2 tw:px-2.5 tw:py-1.5", {
1284
+ variants: { status: {
1285
+ processing: "tw:border-b tw:border-border/60",
1286
+ warning: "tw:bg-warning/10",
1287
+ success: "tw:border-b tw:border-border/60",
1288
+ error: "tw:bg-destructive/10"
1289
+ } },
1290
+ defaultVariants: { status: "success" }
1291
+ });
1292
+ const statusInk = {
1293
+ processing: "tw:text-muted-foreground",
1294
+ warning: "tw:text-warning",
1295
+ success: "tw:text-muted-foreground",
1296
+ error: "tw:text-destructive"
1297
+ };
1298
+ const statusIconInk = {
1299
+ processing: "tw:text-muted-foreground",
1300
+ warning: "tw:text-warning",
1301
+ success: "tw:text-success/70",
1302
+ error: "tw:text-destructive"
1303
+ };
1304
+ const ToolCallStatusHeader = ({ icon: IconComponent, iconSpin, status, text, needsConfirmation, isCollapsible, isCollapsed, onToggleCollapse }) => {
1305
+ return /* @__PURE__ */ jsxs("div", {
1306
+ role: isCollapsible ? "button" : void 0,
1307
+ tabIndex: isCollapsible ? 0 : void 0,
1308
+ "aria-expanded": isCollapsible ? !isCollapsed : void 0,
1309
+ "data-status": status,
1310
+ className: cn(headerVariants({ status }), isCollapsible && "tw:cursor-pointer"),
1311
+ onClick: isCollapsible ? onToggleCollapse : void 0,
1312
+ onKeyDown: isCollapsible ? (e) => {
1313
+ if (e.key === "Enter" || e.key === " ") {
1314
+ e.preventDefault();
1315
+ onToggleCollapse?.();
1316
+ }
1317
+ } : void 0,
1318
+ children: [/* @__PURE__ */ jsxs("div", {
1319
+ className: "tw:flex tw:min-w-0 tw:flex-1 tw:items-center tw:gap-1.5",
1320
+ children: [/* @__PURE__ */ jsx(IconComponent, { className: cn("tw:size-3.5 tw:shrink-0", statusIconInk[status], iconSpin && "tw:animate-spin") }), /* @__PURE__ */ jsx("span", {
1321
+ "data-testid": "tool-status-text",
1322
+ className: cn("tw:truncate tw:pr-0.5 tw:text-xs tw:font-medium", statusInk[status]),
1323
+ children: text
1324
+ })]
1325
+ }), (needsConfirmation || isCollapsible) && /* @__PURE__ */ jsxs("div", {
1326
+ className: "tw:flex tw:shrink-0 tw:items-center tw:gap-2",
1327
+ children: [needsConfirmation && /* @__PURE__ */ jsxs("div", {
1328
+ className: "tw:flex tw:items-center tw:gap-1",
1329
+ children: [/* @__PURE__ */ jsx("span", {
1330
+ "data-testid": "tool-confirmation-required",
1331
+ className: "tw:text-xs tw:font-medium tw:text-warning",
1332
+ children: "Confirmation required"
1333
+ }), /* @__PURE__ */ jsx(TriangleAlert, { className: "tw:size-3.5 tw:text-warning" })]
1334
+ }), isCollapsible && (isCollapsed ? /* @__PURE__ */ jsx(ChevronDown, { className: "tw:size-3.5 tw:shrink-0 tw:text-muted-foreground" }) : /* @__PURE__ */ jsx(ChevronUp, { className: "tw:size-3.5 tw:shrink-0 tw:text-muted-foreground" }))]
1335
+ })]
1336
+ });
1337
+ };
1338
+ //#endregion
1261
1339
  //#region src/blocks/AIKit/usageStatsHelpers.ts
1262
1340
  /** Clamp a percentage to 0–100 and normalize non-finite input to 0. */
1263
1341
  const clampPercentage = (value) => Number.isFinite(value) ? Math.min(100, Math.max(0, value)) : 0;
@@ -1296,15 +1374,17 @@ const UsageStatsRing = ({ value, size = 16, strokeWidth = 2.5, className }) => {
1296
1374
  //#endregion
1297
1375
  //#region src/blocks/AIKit/UsageStats.tsx
1298
1376
  const UsageStats = ({ value, alert = false, children, className, ariaLabel, align = "end", side = "top", sideOffset = 8 }) => {
1299
- const defaultLabel = `Usage: ${Math.round(clampPercentage(value))}%${alert ? " (usage alert)" : ""}`;
1377
+ const hasAlert = Boolean(alert);
1378
+ const isWarning = alert === "warning";
1379
+ const defaultLabel = `Usage: ${Math.round(clampPercentage(value))}%${hasAlert ? " (usage alert)" : ""}`;
1300
1380
  return /* @__PURE__ */ jsxs(HoverCard, { children: [/* @__PURE__ */ jsx(HoverCard.Trigger, {
1301
1381
  asChild: true,
1302
1382
  children: /* @__PURE__ */ jsxs("span", {
1303
1383
  "aria-label": ariaLabel ?? defaultLabel,
1304
1384
  className: cn("tw:relative tw:inline-flex tw:size-8 tw:items-center tw:justify-center", className),
1305
- children: [/* @__PURE__ */ jsx(UsageStatsRing, { value }), alert && /* @__PURE__ */ jsx(AlertCircle, {
1385
+ children: [/* @__PURE__ */ jsx(UsageStatsRing, { value }), hasAlert && /* @__PURE__ */ jsx(AlertCircle, {
1306
1386
  "data-testid": "usage-stats-alert",
1307
- className: "tw:absolute tw:-right-0.5 tw:-top-0.5 tw:size-3 tw:text-error-500"
1387
+ className: cn("tw:absolute tw:-right-0.5 tw:-top-0.5 tw:size-3", isWarning ? "tw:text-warning-500" : "tw:text-error-500")
1308
1388
  })]
1309
1389
  })
1310
1390
  }), /* @__PURE__ */ jsx(HoverCard.Content, {
@@ -1315,6 +1395,6 @@ const UsageStats = ({ value, alert = false, children, className, ariaLabel, alig
1315
1395
  })] });
1316
1396
  };
1317
1397
  //#endregion
1318
- export { AnswerSummary, CollapsibleStepHeader, InlineStepDetail, InlineStepLabel, Markdown, MessageBubble, PlanApproval, PlanRewritingIndicator, PromptInput, Question, QuestionBlock, SuggestedPrompt, ThinkingIndicator, ToolCallApproval, ToolCallChip, UsageStats, UsageStatsRing };
1398
+ export { AnswerSummary, CollapsibleStepHeader, InlineStepDetail, InlineStepLabel, Markdown, MessageBubble, PlanApproval, PlanRewritingIndicator, PromptInput, Question, QuestionBlock, SuggestedPrompt, ThinkingIndicator, ToolCallApproval, ToolCallChip, ToolCallStatusHeader, UsageStats, UsageStatsRing };
1319
1399
 
1320
- //# sourceMappingURL=AIKit-DiS0CVOW.js.map
1400
+ //# sourceMappingURL=AIKit-DDg5DBCG.js.map