@keboola/design 11.9.0 → 13.0.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 (367) hide show
  1. package/AGENTS.md +45 -14
  2. package/CHANGELOG.md +246 -0
  3. package/COMPONENT-API.md +352 -294
  4. package/README.md +11 -1
  5. package/dist/{AIKit-ELIsegJz.js → AIKit-DcOlHIBr.js} +420 -247
  6. package/dist/AIKit-DcOlHIBr.js.map +1 -0
  7. package/dist/{Alert-BsIM_oFK.js → Alert-UI-CIs-1.js} +16 -16
  8. package/dist/Alert-UI-CIs-1.js.map +1 -0
  9. package/dist/{AlertModal-BGJdaRRj.js → AlertModal-mbSnuuka.js} +8 -8
  10. package/dist/AlertModal-mbSnuuka.js.map +1 -0
  11. package/dist/{AppShell-DRgJxpXW.js → AppShell-WSQabK8r.js} +15 -52
  12. package/dist/AppShell-WSQabK8r.js.map +1 -0
  13. package/dist/{AutoSaveTextarea-BeuWuszr.js → AutoSaveTextarea-C5iIr2Ts.js} +2 -2
  14. package/dist/{AutoSaveTextarea-BeuWuszr.js.map → AutoSaveTextarea-C5iIr2Ts.js.map} +1 -1
  15. package/dist/{Badge-o5jURtpB.js → Badge-DIjhwPvh.js} +4 -9
  16. package/dist/Badge-DIjhwPvh.js.map +1 -0
  17. package/dist/{BrandEditor-BsTBM3s6.js → BrandEditor-Bkd6dhb8.js} +7 -7
  18. package/dist/{BrandEditor-BsTBM3s6.js.map → BrandEditor-Bkd6dhb8.js.map} +1 -1
  19. package/dist/{BrandLogo-CoKBk4MI.js → BrandLogo-CKpVSZb6.js} +4 -4
  20. package/dist/BrandLogo-CKpVSZb6.js.map +1 -0
  21. package/dist/{Breadcrumb-xqEUxfwn.js → Breadcrumb-BUoAZyhO.js} +8 -14
  22. package/dist/Breadcrumb-BUoAZyhO.js.map +1 -0
  23. package/dist/{Button-DsRrU5F1.js → Button-B21oVcPU.js} +31 -14
  24. package/dist/Button-B21oVcPU.js.map +1 -0
  25. package/dist/{Calendar-cG5NIJ4O.js → Calendar-DFtmZzbF.js} +99 -99
  26. package/dist/Calendar-DFtmZzbF.js.map +1 -0
  27. package/dist/{Card-Dyo7055Q.js → Card-BQmBWHXl.js} +35 -7
  28. package/dist/Card-BQmBWHXl.js.map +1 -0
  29. package/dist/{Checkbox-Dq5fPNrO.js → Checkbox-8yIIgY7g.js} +4 -4
  30. package/dist/Checkbox-8yIIgY7g.js.map +1 -0
  31. package/dist/{Clipboard-BZitKiSA.js → Clipboard-_xf6hMDD.js} +2 -2
  32. package/dist/{Clipboard-BZitKiSA.js.map → Clipboard-_xf6hMDD.js.map} +1 -1
  33. package/dist/{ClipboardButton-KHQnPEh_.js → ClipboardButton-srUgWgwH.js} +4 -4
  34. package/dist/{ClipboardButton-KHQnPEh_.js.map → ClipboardButton-srUgWgwH.js.map} +1 -1
  35. package/dist/{CodeEditor-BJKJXA0c.js → CodeEditor-jZMw1ioj.js} +55 -165
  36. package/dist/CodeEditor-jZMw1ioj.js.map +1 -0
  37. package/dist/{ColorInput-Bj3dfPFA.js → ColorInput-B3gBZ8Ya.js} +12 -27
  38. package/dist/ColorInput-B3gBZ8Ya.js.map +1 -0
  39. package/dist/{ColorModeSwitch-CWt-DZGC.js → ColorModeSwitch-Bw9wMyoL.js} +7 -17
  40. package/dist/ColorModeSwitch-Bw9wMyoL.js.map +1 -0
  41. package/dist/Combobox-C_MTpQ1l.js +1081 -0
  42. package/dist/Combobox-C_MTpQ1l.js.map +1 -0
  43. package/dist/{Command-BDU3C1gg.js → Command-BQPiZCNz.js} +4 -4
  44. package/dist/{Command-BDU3C1gg.js.map → Command-BQPiZCNz.js.map} +1 -1
  45. package/dist/{CopyField-BHRQUyuF.js → CopyField-Ba7h8MqZ.js} +19 -55
  46. package/dist/{CopyField-BHRQUyuF.js.map → CopyField-Ba7h8MqZ.js.map} +1 -1
  47. package/dist/{DateInput-B6N8g0ra.js → DateInput-D0nWUasV.js} +6 -6
  48. package/dist/{DateInput-B6N8g0ra.js.map → DateInput-D0nWUasV.js.map} +1 -1
  49. package/dist/{DatePicker-nA8YdE84.js → DatePicker-CtSa9b3V.js} +3 -3
  50. package/dist/{DatePicker-nA8YdE84.js.map → DatePicker-CtSa9b3V.js.map} +1 -1
  51. package/dist/{DateRangeInput-7M9Z4cVO.js → DateRangeInput-i6wE45-V.js} +10 -14
  52. package/dist/DateRangeInput-i6wE45-V.js.map +1 -0
  53. package/dist/{DateRangePicker-DjSUFjh4.js → DateRangePicker-BAnuz6vO.js} +9 -13
  54. package/dist/DateRangePicker-BAnuz6vO.js.map +1 -0
  55. package/dist/DiffView-ppTIzh2h.js.map +1 -1
  56. package/dist/{DropdownMenu-CgVwhDvl.js → DropdownMenu-gRM-A8qU.js} +3 -3
  57. package/dist/DropdownMenu-gRM-A8qU.js.map +1 -0
  58. package/dist/{FieldItem-DZGIdiXE.js → FieldItem-BHViBJS3.js} +12 -25
  59. package/dist/FieldItem-BHViBJS3.js.map +1 -0
  60. package/dist/{FieldItem-vhIJW4pj.d.ts → FieldItem-CPN1xjN5.d.ts} +11 -25
  61. package/dist/{FileUpload-DYQCTGjU.js → FileUpload-Ch2hrIWq.js} +11 -16
  62. package/dist/{FileUpload-DYQCTGjU.js.map → FileUpload-Ch2hrIWq.js.map} +1 -1
  63. package/dist/{Form-CcK7dRrC.js → Form-VkzfVPyT.js} +15 -23
  64. package/dist/{Form-CcK7dRrC.js.map → Form-VkzfVPyT.js.map} +1 -1
  65. package/dist/{FormGroup-DR_gZ25-.js → FormGroup-CmCppxOn.js} +11 -17
  66. package/dist/FormGroup-CmCppxOn.js.map +1 -0
  67. package/dist/{FullScreenModal-CN9nAs72.js → FullScreenModal-Cwnm8WdM.js} +15 -29
  68. package/dist/FullScreenModal-Cwnm8WdM.js.map +1 -0
  69. package/dist/{HoverCard-B9ZMJxjn.js → HoverCard-B8OKu9XZ.js} +2 -2
  70. package/dist/{HoverCard-B9ZMJxjn.js.map → HoverCard-B8OKu9XZ.js.map} +1 -1
  71. package/dist/{InputGroup-Do8K2hvD.js → InputGroup-CrlMRz4X.js} +11 -13
  72. package/dist/InputGroup-CrlMRz4X.js.map +1 -0
  73. package/dist/{Kbd-LCFMumoq.js → Kbd-J4n1J6i4.js} +23 -13
  74. package/dist/Kbd-J4n1J6i4.js.map +1 -0
  75. package/dist/{MarkedText-DNGEUVWc.js → MarkedText-DlmlJO0u.js} +2 -2
  76. package/dist/{MarkedText-DNGEUVWc.js.map → MarkedText-DlmlJO0u.js.map} +1 -1
  77. package/dist/{MermaidDiagram-ZG0iiDV_.js → MermaidDiagram-B30x2yV7.js} +16 -34
  78. package/dist/MermaidDiagram-B30x2yV7.js.map +1 -0
  79. package/dist/{Modal-I3VWk2oo.js → Modal-BkSuS9Yz.js} +17 -34
  80. package/dist/Modal-BkSuS9Yz.js.map +1 -0
  81. package/dist/{ModalTitle-CeLM_mX9.js → ModalTitle-BxopkIoQ.js} +3 -3
  82. package/dist/ModalTitle-BxopkIoQ.js.map +1 -0
  83. package/dist/{MultiActionButtonGroup-CYZ8IgSf.js → MultiActionButtonGroup-AWLj1Tg7.js} +3 -3
  84. package/dist/{MultiActionButtonGroup-CYZ8IgSf.js.map → MultiActionButtonGroup-AWLj1Tg7.js.map} +1 -1
  85. package/dist/{Navbar-Liy1TPI7.js → Navbar-B_DNpv5s.js} +9 -13
  86. package/dist/{Navbar-Liy1TPI7.js.map → Navbar-B_DNpv5s.js.map} +1 -1
  87. package/dist/{OtpInput-CbbymqYs.js → OtpInput-I8B8Vjdl.js} +2 -2
  88. package/dist/{OtpInput-CbbymqYs.js.map → OtpInput-I8B8Vjdl.js.map} +1 -1
  89. package/dist/{PageHeader-Q3IpCnQd.js → PageHeader-CgfyXpf1.js} +13 -26
  90. package/dist/PageHeader-CgfyXpf1.js.map +1 -0
  91. package/dist/{PageLayout-DSVM-ASz.js → PageLayout-DiAAILuS.js} +12 -20
  92. package/dist/PageLayout-DiAAILuS.js.map +1 -0
  93. package/dist/{PageToolbar-BKVJiDAL.js → PageToolbar-CIW0VmKe.js} +12 -42
  94. package/dist/PageToolbar-CIW0VmKe.js.map +1 -0
  95. package/dist/{Pagination-C_b7Xhey.js → Pagination-DH3f6LN0.js} +3 -3
  96. package/dist/{Pagination-C_b7Xhey.js.map → Pagination-DH3f6LN0.js.map} +1 -1
  97. package/dist/{Popconfirm-5pBzT_HQ.js → Popconfirm-Dhzn7sy6.js} +3 -3
  98. package/dist/{Popconfirm-5pBzT_HQ.js.map → Popconfirm-Dhzn7sy6.js.map} +1 -1
  99. package/dist/{Popover-BEbQrC_P.js → Popover-CEk915I1.js} +4 -3
  100. package/dist/Popover-CEk915I1.js.map +1 -0
  101. package/dist/{RadioGroup-Byc2mym4.js → RadioGroup-CBPRLRN0.js} +4 -4
  102. package/dist/{RadioGroup-Byc2mym4.js.map → RadioGroup-CBPRLRN0.js.map} +1 -1
  103. package/dist/{Search-Dhig_hPD.js → Search-DmkQo716.js} +3 -3
  104. package/dist/{Search-Dhig_hPD.js.map → Search-DmkQo716.js.map} +1 -1
  105. package/dist/{SearchInput-92r2bkA7.js → SearchInput-D3qMkHaW.js} +8 -13
  106. package/dist/SearchInput-D3qMkHaW.js.map +1 -0
  107. package/dist/{SectionNav-CNLJsiVG.js → SectionNav-TU5i3JeM.js} +10 -42
  108. package/dist/SectionNav-TU5i3JeM.js.map +1 -0
  109. package/dist/{Select-DV3Hak_l.js → Select-B4uK0QVm.js} +10 -12
  110. package/dist/Select-B4uK0QVm.js.map +1 -0
  111. package/dist/{Sheet-OparjIi-.js → Sheet-D0fAE14T.js} +5 -9
  112. package/dist/Sheet-D0fAE14T.js.map +1 -0
  113. package/dist/{Sidebar-CLEbBtNY.js → Sidebar-ZLMNIbg5.js} +16 -33
  114. package/dist/Sidebar-ZLMNIbg5.js.map +1 -0
  115. package/dist/{Slider-DLclvRws.js → Slider-B0ou9r0B.js} +3 -3
  116. package/dist/{Slider-DLclvRws.js.map → Slider-B0ou9r0B.js.map} +1 -1
  117. package/dist/{Stepper-C8sm9ZFM.js → Stepper-BLkLhfnd.js} +6 -9
  118. package/dist/{Stepper-C8sm9ZFM.js.map → Stepper-BLkLhfnd.js.map} +1 -1
  119. package/dist/{Switch-B0WdGSjz.js → Switch-DZvNePOm.js} +2 -2
  120. package/dist/{Switch-B0WdGSjz.js.map → Switch-DZvNePOm.js.map} +1 -1
  121. package/dist/{Table-CvYuTuNU.js → Table-BaVT5Tkn.js} +6 -11
  122. package/dist/{Table-CvYuTuNU.js.map → Table-BaVT5Tkn.js.map} +1 -1
  123. package/dist/{Tabs-eB974xJf.js → Tabs-CTDmye1N.js} +3 -3
  124. package/dist/{Tabs-eB974xJf.js.map → Tabs-CTDmye1N.js.map} +1 -1
  125. package/dist/{TextInput-CFTf4Cz1.js → TextInput-BWYXbfs4.js} +10 -14
  126. package/dist/TextInput-BWYXbfs4.js.map +1 -0
  127. package/dist/{ThemeProvider-DAmNn9Sd.js → ThemeProvider-VF38VfUa.js} +13 -31
  128. package/dist/ThemeProvider-VF38VfUa.js.map +1 -0
  129. package/dist/{TimePicker-BGeqc-Ed.js → TimePicker-CDGYrRxi.js} +2 -2
  130. package/dist/{TimePicker-BGeqc-Ed.js.map → TimePicker-CDGYrRxi.js.map} +1 -1
  131. package/dist/{Timeline-C8-wnRRr.js → Timeline-B-I6sb0M.js} +2 -2
  132. package/dist/{Timeline-C8-wnRRr.js.map → Timeline-B-I6sb0M.js.map} +1 -1
  133. package/dist/{Toast-Dr6Uw7ao.js → Toast-PfQf3vj-.js} +2 -2
  134. package/dist/{Toast-Dr6Uw7ao.js.map → Toast-PfQf3vj-.js.map} +1 -1
  135. package/dist/{Workbench-UR2FBC7I.js → Workbench-DmZzpkj7.js} +2 -2
  136. package/dist/{Workbench-UR2FBC7I.js.map → Workbench-DmZzpkj7.js.map} +1 -1
  137. package/dist/{ZoomableSvg-BZlk3PFJ.js → ZoomableSvg-C65nta_r.js} +5 -19
  138. package/dist/ZoomableSvg-C65nta_r.js.map +1 -0
  139. package/dist/charts.d.ts +21 -52
  140. package/dist/charts.js +13 -39
  141. package/dist/charts.js.map +1 -1
  142. package/dist/{context-D7X470dy.js → context-U293r3v-.js} +5 -9
  143. package/dist/context-U293r3v-.js.map +1 -0
  144. package/dist/editors.d.ts +27 -124
  145. package/dist/editors.js +29 -71
  146. package/dist/editors.js.map +1 -1
  147. package/dist/{findLiteralMatches-BGBw8Vbl.js → findLiteralMatches-DgGLzyG0.js} +8 -20
  148. package/dist/findLiteralMatches-DgGLzyG0.js.map +1 -0
  149. package/dist/flint.d.ts +3 -6
  150. package/dist/flint.js +31 -80
  151. package/dist/flint.js.map +1 -1
  152. package/dist/{icons-Cek151jC.js → icons-wcA70iQx.js} +105 -2
  153. package/dist/icons-wcA70iQx.js.map +1 -0
  154. package/dist/icons.d.ts +2 -2
  155. package/dist/icons.js +2 -2
  156. package/dist/{index-m-kQEWiY.d.ts → index-B7k-09i1.d.ts} +14 -2
  157. package/dist/index.d.ts +1180 -1867
  158. package/dist/index.js +69 -68
  159. package/dist/internal/blocks/AIKit.js +2 -2
  160. package/dist/internal/blocks/AppShell.js +1 -1
  161. package/dist/internal/blocks/AuthLayout.js +7 -27
  162. package/dist/internal/blocks/AuthLayout.js.map +1 -1
  163. package/dist/internal/blocks/AutoSaveTextarea.js +1 -1
  164. package/dist/internal/blocks/BrandEditor.js +1 -1
  165. package/dist/internal/blocks/ChartPanel.js +4 -8
  166. package/dist/internal/blocks/ChartPanel.js.map +1 -1
  167. package/dist/internal/blocks/ChipEditor.js +13 -21
  168. package/dist/internal/blocks/ChipEditor.js.map +1 -1
  169. package/dist/internal/blocks/ClipboardButton.js +1 -1
  170. package/dist/internal/blocks/ColorInput.js +1 -1
  171. package/dist/internal/blocks/ColorModeSwitch.js +1 -1
  172. package/dist/internal/blocks/Command.js +1 -1
  173. package/dist/internal/blocks/CopyField.js +1 -1
  174. package/dist/internal/blocks/DashboardHero.js +4 -7
  175. package/dist/internal/blocks/DashboardHero.js.map +1 -1
  176. package/dist/internal/blocks/DateInput.js +1 -1
  177. package/dist/internal/blocks/DateRangeInput.js +1 -1
  178. package/dist/internal/blocks/EmptyConfigurationActionCard.js +1 -1
  179. package/dist/internal/blocks/EmptyState.js +5 -9
  180. package/dist/internal/blocks/EmptyState.js.map +1 -1
  181. package/dist/internal/blocks/ErrorState.js +5 -9
  182. package/dist/internal/blocks/ErrorState.js.map +1 -1
  183. package/dist/internal/blocks/ExportMenu.js +6 -10
  184. package/dist/internal/blocks/ExportMenu.js.map +1 -1
  185. package/dist/internal/blocks/Form/connectors/ComboboxField.js +40 -0
  186. package/dist/internal/blocks/Form/connectors/ComboboxField.js.map +1 -0
  187. package/dist/internal/blocks/Form/connectors/MultiComboboxField.js +5 -22
  188. package/dist/internal/blocks/Form/connectors/MultiComboboxField.js.map +1 -1
  189. package/dist/internal/blocks/Form.js +1 -1
  190. package/dist/internal/blocks/FormGroup.js +1 -1
  191. package/dist/internal/blocks/GoogleButton.js +1 -1
  192. package/dist/internal/blocks/MicrosoftButton.js +1 -1
  193. package/dist/internal/blocks/MultiActionButtonGroup.js +1 -1
  194. package/dist/internal/blocks/MultiCombobox.js +160 -154
  195. package/dist/internal/blocks/MultiCombobox.js.map +1 -1
  196. package/dist/internal/blocks/NumberInput.js +1 -1
  197. package/dist/internal/blocks/OtpInput.js +1 -1
  198. package/dist/internal/blocks/PageHeader.js +1 -1
  199. package/dist/internal/blocks/PageLayout.js +1 -1
  200. package/dist/internal/blocks/PageToolbar.js +1 -1
  201. package/dist/internal/blocks/PasswordInput.js +4 -4
  202. package/dist/internal/blocks/PasswordInput.js.map +1 -1
  203. package/dist/internal/blocks/SearchInput.js +1 -1
  204. package/dist/internal/blocks/SearchInputWithNavigation.js +4 -4
  205. package/dist/internal/blocks/SectionNav.js +1 -1
  206. package/dist/internal/blocks/SplitButton.js +3 -3
  207. package/dist/internal/blocks/StatCard.js +4 -8
  208. package/dist/internal/blocks/StatCard.js.map +1 -1
  209. package/dist/internal/blocks/TextInput.js +1 -1
  210. package/dist/internal/blocks/Textarea.js +2 -2
  211. package/dist/internal/blocks/TimeInput.js +5 -5
  212. package/dist/internal/blocks/TimeInput.js.map +1 -1
  213. package/dist/internal/components/Alert.js +1 -1
  214. package/dist/internal/components/AlertModal.js +1 -1
  215. package/dist/internal/components/Avatar.js +1 -1
  216. package/dist/internal/components/Badge.js +1 -1
  217. package/dist/internal/components/BrandLogo.js +1 -1
  218. package/dist/internal/components/Breadcrumb.js +1 -1
  219. package/dist/internal/components/Button.js +1 -1
  220. package/dist/internal/components/ButtonGroup.js.map +1 -1
  221. package/dist/internal/components/Calendar.js +1 -1
  222. package/dist/internal/components/Card.js +1 -1
  223. package/dist/internal/components/Checkbox.js +1 -1
  224. package/dist/internal/components/Clipboard.js +1 -1
  225. package/dist/internal/components/CollapsiblePanel.js +3 -3
  226. package/dist/internal/components/CollapsiblePanel.js.map +1 -1
  227. package/dist/internal/components/Combobox.js +2 -2
  228. package/dist/internal/components/DatePicker.js +1 -1
  229. package/dist/internal/components/DateRangePicker.js +1 -1
  230. package/dist/internal/components/DropdownMenu.js +1 -1
  231. package/dist/internal/components/FileUpload.js +1 -1
  232. package/dist/internal/components/FullScreenModal.js +1 -1
  233. package/dist/internal/components/HoverCard.js +1 -1
  234. package/dist/internal/components/InputGroup.js +1 -1
  235. package/dist/internal/components/Kbd.js +1 -1
  236. package/dist/internal/components/MarkedText.js +1 -1
  237. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js +1 -1
  238. package/dist/internal/components/Modal.js +1 -1
  239. package/dist/internal/components/Navbar.js +1 -1
  240. package/dist/internal/components/Pagination.js +1 -1
  241. package/dist/internal/components/PanelWithDetails.js +1 -1
  242. package/dist/internal/components/Popconfirm.js +1 -1
  243. package/dist/internal/components/Popover.js +1 -1
  244. package/dist/internal/components/RadioGroup.js +1 -1
  245. package/dist/internal/components/Search.js +1 -1
  246. package/dist/internal/components/Select.js +1 -1
  247. package/dist/internal/components/Separator.js.map +1 -1
  248. package/dist/internal/components/Sheet.js +1 -1
  249. package/dist/internal/components/Sidebar.js +1 -1
  250. package/dist/internal/components/Skeleton/Skeleton.js +5 -9
  251. package/dist/internal/components/Skeleton/Skeleton.js.map +1 -1
  252. package/dist/internal/components/Slider.js +1 -1
  253. package/dist/internal/components/SpotlightBackdrop.js +3 -8
  254. package/dist/internal/components/SpotlightBackdrop.js.map +1 -1
  255. package/dist/internal/components/Stepper.js +1 -1
  256. package/dist/internal/components/Switch.js +1 -1
  257. package/dist/internal/components/Table.js +1 -1
  258. package/dist/internal/components/Tabs.js +1 -1
  259. package/dist/internal/components/ThemeProvider.js +3 -3
  260. package/dist/internal/components/TimePicker.js +1 -1
  261. package/dist/internal/components/Timeline.js +1 -1
  262. package/dist/internal/components/Toast.js +2 -2
  263. package/dist/internal/components/Tooltip.js +1 -1
  264. package/dist/internal/components/Truncated.js +4 -8
  265. package/dist/internal/components/Truncated.js.map +1 -1
  266. package/dist/internal/components/Workbench.js +1 -1
  267. package/dist/internal/components/ZoomableSvg.js +1 -1
  268. package/dist/internal/hooks/useScrollbarPosition.js +1 -1
  269. package/dist/internal/hooks/useStableCallback.js +4 -13
  270. package/dist/internal/hooks/useStableCallback.js.map +1 -1
  271. package/dist/internal/utils/accessibleName.js +11 -0
  272. package/dist/internal/utils/accessibleName.js.map +1 -0
  273. package/dist/internal/utils.js +2 -2
  274. package/dist/markdown-editor.d.ts +15 -37
  275. package/dist/markdown-editor.js +17 -23
  276. package/dist/markdown-editor.js.map +1 -1
  277. package/dist/mermaid.d.ts +4 -6
  278. package/dist/mermaid.js +1 -1
  279. package/dist/rjsf.d.ts +9 -19
  280. package/dist/rjsf.js +44 -84
  281. package/dist/rjsf.js.map +1 -1
  282. package/dist/{styles-BAFscjSV.js → styles-gzcjOyKv.js} +6 -6
  283. package/dist/styles-gzcjOyKv.js.map +1 -0
  284. package/dist/styles.css +1 -1
  285. package/dist/svgTransforms-Dw2hRA-i.js +51 -0
  286. package/dist/svgTransforms-Dw2hRA-i.js.map +1 -0
  287. package/dist/testing.d.ts +3 -10
  288. package/dist/testing.js +7 -15
  289. package/dist/testing.js.map +1 -1
  290. package/dist/themeTokens-7DEab0kp.js +31 -0
  291. package/dist/themeTokens-7DEab0kp.js.map +1 -0
  292. package/dist/{toast-DIC0iNRf.js → toast-CyXEdaCZ.js} +3 -3
  293. package/dist/toast-CyXEdaCZ.js.map +1 -0
  294. package/dist/{themeScopeContext-D7fSyb06.js → useColorSchemeState-Cw4MCXUs.js} +14 -14
  295. package/dist/useColorSchemeState-Cw4MCXUs.js.map +1 -0
  296. package/dist/{useControllableState-M6494mCT.js → useControllableState-CUYXMsfz.js} +3 -7
  297. package/dist/useControllableState-CUYXMsfz.js.map +1 -0
  298. package/dist/useElement-D-RjrGa4.js +21 -0
  299. package/dist/useElement-D-RjrGa4.js.map +1 -0
  300. package/dist/useThemeAttributes-B199Regy.js +67 -0
  301. package/dist/useThemeAttributes-B199Regy.js.map +1 -0
  302. package/dist/{utils-BW4AE8VP.js → utils-Bd28bWgm.js} +31 -26
  303. package/dist/utils-Bd28bWgm.js.map +1 -0
  304. package/dist/vega.d.ts +8 -30
  305. package/dist/vega.js +5 -13
  306. package/dist/vega.js.map +1 -1
  307. package/dist/{vegaTheme-CSvFEMBl.js → vegaTheme-VQMWTlBw.js} +7 -21
  308. package/dist/vegaTheme-VQMWTlBw.js.map +1 -0
  309. package/package.json +28 -27
  310. package/src/styles.css +120 -14
  311. package/src/theme.css +130 -5
  312. package/dist/AIKit-ELIsegJz.js.map +0 -1
  313. package/dist/Alert-BsIM_oFK.js.map +0 -1
  314. package/dist/AlertModal-BGJdaRRj.js.map +0 -1
  315. package/dist/AppShell-DRgJxpXW.js.map +0 -1
  316. package/dist/Badge-o5jURtpB.js.map +0 -1
  317. package/dist/BrandLogo-CoKBk4MI.js.map +0 -1
  318. package/dist/Breadcrumb-xqEUxfwn.js.map +0 -1
  319. package/dist/Button-DsRrU5F1.js.map +0 -1
  320. package/dist/Calendar-cG5NIJ4O.js.map +0 -1
  321. package/dist/Card-Dyo7055Q.js.map +0 -1
  322. package/dist/Checkbox-Dq5fPNrO.js.map +0 -1
  323. package/dist/CodeEditor-BJKJXA0c.js.map +0 -1
  324. package/dist/ColorInput-Bj3dfPFA.js.map +0 -1
  325. package/dist/ColorModeSwitch-CWt-DZGC.js.map +0 -1
  326. package/dist/Combobox-D8PrEqTG.js +0 -619
  327. package/dist/Combobox-D8PrEqTG.js.map +0 -1
  328. package/dist/DateRangeInput-7M9Z4cVO.js.map +0 -1
  329. package/dist/DateRangePicker-DjSUFjh4.js.map +0 -1
  330. package/dist/DropdownMenu-CgVwhDvl.js.map +0 -1
  331. package/dist/FieldItem-DZGIdiXE.js.map +0 -1
  332. package/dist/FormGroup-DR_gZ25-.js.map +0 -1
  333. package/dist/FullScreenModal-CN9nAs72.js.map +0 -1
  334. package/dist/InputGroup-Do8K2hvD.js.map +0 -1
  335. package/dist/Kbd-LCFMumoq.js.map +0 -1
  336. package/dist/MermaidDiagram-ZG0iiDV_.js.map +0 -1
  337. package/dist/Modal-I3VWk2oo.js.map +0 -1
  338. package/dist/ModalTitle-CeLM_mX9.js.map +0 -1
  339. package/dist/PageHeader-Q3IpCnQd.js.map +0 -1
  340. package/dist/PageLayout-DSVM-ASz.js.map +0 -1
  341. package/dist/PageToolbar-BKVJiDAL.js.map +0 -1
  342. package/dist/Popover-BEbQrC_P.js.map +0 -1
  343. package/dist/SearchInput-92r2bkA7.js.map +0 -1
  344. package/dist/SectionNav-CNLJsiVG.js.map +0 -1
  345. package/dist/Select-DV3Hak_l.js.map +0 -1
  346. package/dist/Sheet-OparjIi-.js.map +0 -1
  347. package/dist/Sidebar-CLEbBtNY.js.map +0 -1
  348. package/dist/TextInput-CFTf4Cz1.js.map +0 -1
  349. package/dist/ThemeProvider-DAmNn9Sd.js.map +0 -1
  350. package/dist/ZoomableSvg-BZlk3PFJ.js.map +0 -1
  351. package/dist/context-D7X470dy.js.map +0 -1
  352. package/dist/findLiteralMatches-BGBw8Vbl.js.map +0 -1
  353. package/dist/icons-Cek151jC.js.map +0 -1
  354. package/dist/internal/components/StatusDot.js +0 -67
  355. package/dist/internal/components/StatusDot.js.map +0 -1
  356. package/dist/styles-BAFscjSV.js.map +0 -1
  357. package/dist/svgTransforms-CJAYPk7o.js +0 -81
  358. package/dist/svgTransforms-CJAYPk7o.js.map +0 -1
  359. package/dist/themeScopeContext-D7fSyb06.js.map +0 -1
  360. package/dist/themeTokens-qP1-55O7.js +0 -119
  361. package/dist/themeTokens-qP1-55O7.js.map +0 -1
  362. package/dist/toast-DIC0iNRf.js.map +0 -1
  363. package/dist/useControllableState-M6494mCT.js.map +0 -1
  364. package/dist/useElement-BK3AAiIf.js +0 -24
  365. package/dist/useElement-BK3AAiIf.js.map +0 -1
  366. package/dist/utils-BW4AE8VP.js.map +0 -1
  367. package/dist/vegaTheme-CSvFEMBl.js.map +0 -1
package/dist/vega.d.ts CHANGED
@@ -2,43 +2,21 @@ import { ResolvedColorScheme } from "./types-BPcAjMG0.js";
2
2
  import { Config } from "vega-lite";
3
3
  //#region src/vega/useVegaTheme.d.ts
4
4
  /**
5
- * {@link vegaTheme} for the scheme and brand currently painted on `<html>`,
6
- * rebuilt whenever either changes.
5
+ * {@link vegaTheme} for the current scheme and brand, rebuilt when either changes.
7
6
  *
8
- * - The config holds resolved colour strings, not `var()` references, so a
9
- * mounted chart would otherwise keep the palette it was first built with.
10
- * - The `useThemeAttributes` snapshot is the memo key: its reference moves on a
11
- * scheme or brand switch and stands still otherwise, and `scheme` comes out of
12
- * the same read, so the colours can never be resolved under one scheme and
13
- * memoized under the other.
14
- * - Re-rendering is not enough on its own — a consumer that compiles a spec in
15
- * an effect must depend on this config (or on `useThemeAttributes().cacheKey`)
16
- * and re-render the chart.
7
+ * - A consumer compiling a spec in an effect must depend on this config (or
8
+ * `useThemeAttributes().cacheKey`) and re-render the chart.
17
9
  */
18
10
  declare const useVegaTheme: () => Config;
19
11
  //#endregion
20
12
  //#region src/vega/vegaTheme.d.ts
21
13
  /**
22
- * Scheme-following Vega-Lite config — the design system's chart look as a plain
23
- * `Config`, for any consumer that compiles or renders a Vega-Lite spec.
14
+ * The design system's Vega-Lite chart look, following scheme and brand.
24
15
  *
25
- * - `background: 'transparent'` drops vega's opaque white backdrop, so the page
26
- * surface shows through in both schemes.
27
- * - Axis/legend/header/title text and lines read the live semantic tokens, so a
28
- * dark scheme (and a customer brand) recolour the chart chrome for free.
29
- * - `range.category` is `--chart-1..5` in series order — the same decorative
30
- * palette the recharts wrappers in `@keboola/design/charts` use — so a
31
- * categorical encoding matches the rest of the platform's data-viz instead of
32
- * falling back to vega's `tableau10`.
33
- * - `range.ramp` puts the low end of a quantitative scale on `--accent` rather
34
- * than vega's blue-only default, which keeps the pale end legible on a dark
35
- * surface.
36
- * - A range set on the spec's own scale still wins, which is how a Flint chart
37
- * keeps the series colours it resolves during assembly.
38
- * - Colours are resolved to concrete `rgb(R, G, B)` strings, not `var()`
39
- * references: vega does its colour maths in JS and never consults the
40
- * stylesheet. Rebuild the config when the scheme or brand changes —
41
- * `useVegaTheme` does that for you.
16
+ * - `range.category` is `--chart-1..5`, the same palette as `@keboola/design/charts`.
17
+ * - A range set on the spec's own scale still wins (Flint charts rely on it).
18
+ * - Colours are concrete `rgb()` strings — vega never reads the stylesheet — so rebuild on a
19
+ * scheme or brand change; `useVegaTheme` does.
42
20
  */
43
21
  declare const vegaTheme: (scheme: ResolvedColorScheme, from?: Element | null) => Config;
44
22
  //#endregion
package/dist/vega.js CHANGED
@@ -1,20 +1,12 @@
1
- import { useThemeAttributes } from "./themeTokens-qP1-55O7.js";
2
- import { vegaTheme } from "./vegaTheme-CSvFEMBl.js";
1
+ import { useThemeAttributes } from "./useThemeAttributes-B199Regy.js";
2
+ import { vegaTheme } from "./vegaTheme-VQMWTlBw.js";
3
3
  import { useMemo } from "react";
4
4
  //#region src/vega/useVegaTheme.ts
5
5
  /**
6
- * {@link vegaTheme} for the scheme and brand currently painted on `<html>`,
7
- * rebuilt whenever either changes.
6
+ * {@link vegaTheme} for the current scheme and brand, rebuilt when either changes.
8
7
  *
9
- * - The config holds resolved colour strings, not `var()` references, so a
10
- * mounted chart would otherwise keep the palette it was first built with.
11
- * - The `useThemeAttributes` snapshot is the memo key: its reference moves on a
12
- * scheme or brand switch and stands still otherwise, and `scheme` comes out of
13
- * the same read, so the colours can never be resolved under one scheme and
14
- * memoized under the other.
15
- * - Re-rendering is not enough on its own — a consumer that compiles a spec in
16
- * an effect must depend on this config (or on `useThemeAttributes().cacheKey`)
17
- * and re-render the chart.
8
+ * - A consumer compiling a spec in an effect must depend on this config (or
9
+ * `useThemeAttributes().cacheKey`) and re-render the chart.
18
10
  */
19
11
  const useVegaTheme = () => {
20
12
  const theme = useThemeAttributes();
package/dist/vega.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vega.js","names":[],"sources":["../src/vega/useVegaTheme.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport type { Config } from 'vega-lite';\n\nimport { useThemeAttributes } from '../components/ThemeProvider/useThemeAttributes';\n\nimport { vegaTheme } from './vegaTheme';\n\n/**\n * {@link vegaTheme} for the scheme and brand currently painted on `<html>`,\n * rebuilt whenever either changes.\n *\n * - The config holds resolved colour strings, not `var()` references, so a\n * mounted chart would otherwise keep the palette it was first built with.\n * - The `useThemeAttributes` snapshot is the memo key: its reference moves on a\n * scheme or brand switch and stands still otherwise, and `scheme` comes out of\n * the same read, so the colours can never be resolved under one scheme and\n * memoized under the other.\n * - Re-rendering is not enough on its own — a consumer that compiles a spec in\n * an effect must depend on this config (or on `useThemeAttributes().cacheKey`)\n * and re-render the chart.\n */\nexport const useVegaTheme = (): Config => {\n const theme = useThemeAttributes();\n\n // The whole snapshot is the memo key, not `theme.scheme`: its reference moves\n // when the scheme *or* the brand does, and a brand switch repaints every\n // `--*` value while leaving the scheme alone.\n return useMemo(() => vegaTheme(theme.scheme, theme.scope), [theme]);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAqBA,MAAa,qBAA6B;CACxC,MAAM,QAAQ,mBAAmB;CAKjC,OAAO,cAAc,UAAU,MAAM,QAAQ,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC;AACpE"}
1
+ {"version":3,"file":"vega.js","names":[],"sources":["../src/vega/useVegaTheme.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport type { Config } from 'vega-lite';\n\nimport { useThemeAttributes } from '../components/ThemeProvider/useThemeAttributes';\n\nimport { vegaTheme } from './vegaTheme';\n\n/**\n * {@link vegaTheme} for the current scheme and brand, rebuilt when either changes.\n *\n * - A consumer compiling a spec in an effect must depend on this config (or\n * `useThemeAttributes().cacheKey`) and re-render the chart.\n */\nexport const useVegaTheme = (): Config => {\n const theme = useThemeAttributes();\n\n // Keyed on the whole snapshot, not `theme.scheme` — a brand switch repaints tokens too.\n return useMemo(() => vegaTheme(theme.scheme, theme.scope), [theme]);\n};\n"],"mappings":";;;;;;;;;;AAaA,MAAa,qBAA6B;CACxC,MAAM,QAAQ,mBAAmB;CAGjC,OAAO,cAAc,UAAU,MAAM,QAAQ,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC;AACpE"}
@@ -1,4 +1,4 @@
1
- import { createChannelResolver } from "./themeTokens-qP1-55O7.js";
1
+ import { createChannelResolver } from "./themeTokens-7DEab0kp.js";
2
2
  //#region src/vega/vegaTokens.ts
3
3
  /**
4
4
  * Serializes `"R G B"` channels comma-separated, the only form vega parses.
@@ -85,26 +85,12 @@ const createVegaColorResolver = (scheme, from) => {
85
85
  //#region src/vega/vegaTheme.ts
86
86
  const CHART_FONT = "Inter, system-ui, sans-serif";
87
87
  /**
88
- * Scheme-following Vega-Lite config — the design system's chart look as a plain
89
- * `Config`, for any consumer that compiles or renders a Vega-Lite spec.
88
+ * The design system's Vega-Lite chart look, following scheme and brand.
90
89
  *
91
- * - `background: 'transparent'` drops vega's opaque white backdrop, so the page
92
- * surface shows through in both schemes.
93
- * - Axis/legend/header/title text and lines read the live semantic tokens, so a
94
- * dark scheme (and a customer brand) recolour the chart chrome for free.
95
- * - `range.category` is `--chart-1..5` in series order — the same decorative
96
- * palette the recharts wrappers in `@keboola/design/charts` use — so a
97
- * categorical encoding matches the rest of the platform's data-viz instead of
98
- * falling back to vega's `tableau10`.
99
- * - `range.ramp` puts the low end of a quantitative scale on `--accent` rather
100
- * than vega's blue-only default, which keeps the pale end legible on a dark
101
- * surface.
102
- * - A range set on the spec's own scale still wins, which is how a Flint chart
103
- * keeps the series colours it resolves during assembly.
104
- * - Colours are resolved to concrete `rgb(R, G, B)` strings, not `var()`
105
- * references: vega does its colour maths in JS and never consults the
106
- * stylesheet. Rebuild the config when the scheme or brand changes —
107
- * `useVegaTheme` does that for you.
90
+ * - `range.category` is `--chart-1..5`, the same palette as `@keboola/design/charts`.
91
+ * - A range set on the spec's own scale still wins (Flint charts rely on it).
92
+ * - Colours are concrete `rgb()` strings — vega never reads the stylesheet — so rebuild on a
93
+ * scheme or brand change; `useVegaTheme` does.
108
94
  */
109
95
  const vegaTheme = (scheme, from) => {
110
96
  const token = createVegaColorResolver(scheme, from);
@@ -143,4 +129,4 @@ const vegaTheme = (scheme, from) => {
143
129
  //#endregion
144
130
  export { SERIES_TOKENS, createVegaColorResolver, vegaRgb, vegaTheme };
145
131
 
146
- //# sourceMappingURL=vegaTheme-CSvFEMBl.js.map
132
+ //# sourceMappingURL=vegaTheme-VQMWTlBw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vegaTheme-VQMWTlBw.js","names":[],"sources":["../src/vega/vegaTokens.ts","../src/vega/vegaTheme.ts"],"sourcesContent":["import type { ResolvedColorScheme } from '../components/ThemeProvider/types';\nimport { createChannelResolver } from '../utils/themeTokens';\n\n/**\n * Serializes `\"R G B\"` channels comma-separated, the only form vega parses.\n *\n * - vega reads colours through d3-color 3.1, which answers `null` for the\n * space-separated CSS Color 4 form the rest of the package emits.\n * - A flat fill survives that anyway — the string reaches the SVG attribute and\n * the browser parses it. An interpolated one does not: both endpoints of a\n * sequential ramp collapse, and a quantitative scale paints solid black.\n */\nexport const vegaRgb = (channels: string, alpha?: number): string => {\n const c = channels.split(/\\s+/).join(', ');\n return alpha === undefined ? `rgb(${c})` : `rgba(${c}, ${alpha})`;\n};\n\n/** The `--chart-*` slots, in series order. */\nexport const SERIES_TOKENS = ['chart-1', 'chart-2', 'chart-3', 'chart-4', 'chart-5'] as const;\n\n/**\n * Fallback channels for the tokens a vega chart reads, mirroring the `:root` /\n * `[data-theme='dark']` blocks of `styles.css`. The resolver reaches these only\n * when the live custom property is missing — SSR, or a unit test that loads no\n * CSS.\n */\nconst FALLBACK_CHANNELS = {\n foreground: { light: '30 41 59', dark: '229 230 236' },\n 'muted-foreground': { light: '100 116 139', dark: '141 144 153' },\n border: { light: '229 231 235', dark: '52 53 62' },\n 'chart-1': { light: '31 143 255', dark: '92 173 255' },\n 'chart-2': { light: '0 194 135', dark: '0 230 161' },\n 'chart-3': { light: '146 92 255', dark: '173 133 255' },\n 'chart-4': { light: '245 147 0', dark: '255 190 92' },\n 'chart-5': { light: '237 94 223', dark: '242 140 232' },\n // The sequential ramp's low end and the surface it must stay legible against.\n accent: { light: '224 242 254', dark: '30 58 95' },\n card: { light: '255 255 255', dark: '34 34 40' },\n} as const;\n\nexport type VegaTokenName = keyof typeof FALLBACK_CHANNELS;\n\n/**\n * A vega-serializing token resolver bound to one `getComputedStyle` snapshot.\n *\n * - Answers `rgb(R, G, B)` / `rgba(R, G, B, a)` — see {@link vegaRgb}.\n * - Falls back per scheme when the custom property is not painted.\n * - Build one per palette, never at module level: the values change whenever\n * the scheme or the brand does.\n */\nexport const createVegaColorResolver = (scheme: ResolvedColorScheme, from?: Element | null) => {\n const resolve = createChannelResolver(from);\n\n return (token: VegaTokenName, alpha?: number): string =>\n vegaRgb(resolve(token, FALLBACK_CHANNELS[token][scheme]), alpha);\n};\n","import type { Config } from 'vega-lite';\n\nimport type { ResolvedColorScheme } from '../components/ThemeProvider/types';\n\nimport { createVegaColorResolver, SERIES_TOKENS } from './vegaTokens';\n\nconst CHART_FONT = 'Inter, system-ui, sans-serif';\n\n/**\n * The design system's Vega-Lite chart look, following scheme and brand.\n *\n * - `range.category` is `--chart-1..5`, the same palette as `@keboola/design/charts`.\n * - A range set on the spec's own scale still wins (Flint charts rely on it).\n * - Colours are concrete `rgb()` strings — vega never reads the stylesheet — so rebuild on a\n * scheme or brand change; `useVegaTheme` does.\n */\nexport const vegaTheme = (scheme: ResolvedColorScheme, from?: Element | null): Config => {\n const token = createVegaColorResolver(scheme, from);\n\n const label = token('muted-foreground');\n const heading = token('foreground');\n const line = token('border');\n\n return {\n background: 'transparent',\n font: CHART_FONT,\n axis: {\n labelColor: label,\n titleColor: heading,\n gridColor: token('border', 0.6),\n domainColor: line,\n tickColor: line,\n },\n legend: { labelColor: label, titleColor: heading },\n header: { labelColor: label, titleColor: heading },\n title: { color: heading, subtitleColor: label },\n text: { color: heading },\n range: {\n category: SERIES_TOKENS.map((name) => token(name)),\n ramp: [token('accent'), token('chart-1')],\n },\n };\n};\n"],"mappings":";;;;;;;;;;;AAYA,MAAa,WAAW,UAAkB,UAA2B;CACnE,MAAM,IAAI,SAAS,MAAM,KAAK,CAAC,CAAC,KAAK,IAAI;CACzC,OAAO,UAAU,KAAA,IAAY,OAAO,EAAE,KAAK,QAAQ,EAAE,IAAI,MAAM;AACjE;;AAGA,MAAa,gBAAgB;CAAC;CAAW;CAAW;CAAW;CAAW;AAAS;;;;;;;AAQnF,MAAM,oBAAoB;CACxB,YAAY;EAAE,OAAO;EAAY,MAAM;CAAc;CACrD,oBAAoB;EAAE,OAAO;EAAe,MAAM;CAAc;CAChE,QAAQ;EAAE,OAAO;EAAe,MAAM;CAAW;CACjD,WAAW;EAAE,OAAO;EAAc,MAAM;CAAa;CACrD,WAAW;EAAE,OAAO;EAAa,MAAM;CAAY;CACnD,WAAW;EAAE,OAAO;EAAc,MAAM;CAAc;CACtD,WAAW;EAAE,OAAO;EAAa,MAAM;CAAa;CACpD,WAAW;EAAE,OAAO;EAAc,MAAM;CAAc;CAEtD,QAAQ;EAAE,OAAO;EAAe,MAAM;CAAW;CACjD,MAAM;EAAE,OAAO;EAAe,MAAM;CAAW;AACjD;;;;;;;;;AAYA,MAAa,2BAA2B,QAA6B,SAA0B;CAC7F,MAAM,UAAU,sBAAsB,IAAI;CAE1C,QAAQ,OAAsB,UAC5B,QAAQ,QAAQ,OAAO,kBAAkB,MAAM,CAAC,OAAO,GAAG,KAAK;AACnE;;;ACjDA,MAAM,aAAa;;;;;;;;;AAUnB,MAAa,aAAa,QAA6B,SAAkC;CACvF,MAAM,QAAQ,wBAAwB,QAAQ,IAAI;CAElD,MAAM,QAAQ,MAAM,kBAAkB;CACtC,MAAM,UAAU,MAAM,YAAY;CAClC,MAAM,OAAO,MAAM,QAAQ;CAE3B,OAAO;EACL,YAAY;EACZ,MAAM;EACN,MAAM;GACJ,YAAY;GACZ,YAAY;GACZ,WAAW,MAAM,UAAU,EAAG;GAC9B,aAAa;GACb,WAAW;EACb;EACA,QAAQ;GAAE,YAAY;GAAO,YAAY;EAAQ;EACjD,QAAQ;GAAE,YAAY;GAAO,YAAY;EAAQ;EACjD,OAAO;GAAE,OAAO;GAAS,eAAe;EAAM;EAC9C,MAAM,EAAE,OAAO,QAAQ;EACvB,OAAO;GACL,UAAU,cAAc,KAAK,SAAS,MAAM,IAAI,CAAC;GACjD,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC;EAC1C;CACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keboola/design",
3
- "version": "11.9.0",
3
+ "version": "13.0.0",
4
4
  "description": "Keboola UI platform design system — shadcn-aligned React primitives, Keboola-branded blocks, and the form bindings built on TanStack Form.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -121,14 +121,19 @@
121
121
  "devDependencies": {
122
122
  "@arethetypeswrong/cli": "^0.18.2",
123
123
  "@google/design.md": "0.2.0",
124
+ "@keboola/agent-vocabulary": "^0.1.1",
125
+ "@keboola/eslint-plugin-design": "^0.5.0",
126
+ "@keboola/oxlint-config": "^10.2.0",
127
+ "@keboola/tsconfig": "^0.2.1",
128
+ "@keboola/vitest-config": "^1.0.0",
124
129
  "@playwright/test": "1.63.0",
125
130
  "@size-limit/esbuild": "12.1.0",
126
131
  "@size-limit/file": "12.1.0",
127
- "@storybook/addon-a11y": "10.2.19",
128
- "@storybook/addon-docs": "^10.2.19",
129
- "@storybook/addon-links": "^10.2.19",
130
- "@storybook/addon-vitest": "10.2.19",
131
- "@storybook/react-vite": "^10.2.19",
132
+ "@storybook/addon-a11y": "10.6.1",
133
+ "@storybook/addon-docs": "^10.6.1",
134
+ "@storybook/addon-links": "^10.6.1",
135
+ "@storybook/addon-vitest": "10.6.1",
136
+ "@storybook/react-vite": "^10.6.1",
132
137
  "@tailwindcss/cli": "^4.3.3",
133
138
  "@tailwindcss/typography": "^0.5.19",
134
139
  "@tailwindcss/vite": "^4.3.3",
@@ -137,24 +142,24 @@
137
142
  "@testing-library/react": "^16.3.3",
138
143
  "@testing-library/user-event": "^14.6.7",
139
144
  "@types/d3-color": "^3.1.3",
140
- "@types/react": "^19.2.15",
141
- "@types/react-dom": "^19.2.3",
145
+ "@types/react": "^19.3.0",
146
+ "@types/react-dom": "^19.3.0",
142
147
  "@typescript/native": "npm:typescript@^7.0.2",
143
148
  "@vitejs/plugin-react": "^6.1.1",
144
- "@vitest/browser": "4.1.11",
145
- "@vitest/browser-playwright": "4.1.11",
146
- "@vitest/coverage-istanbul": "4.1.11",
147
- "@vitest/coverage-v8": "^4.1.11",
149
+ "@vitest/browser": "5.0.1",
150
+ "@vitest/browser-playwright": "5.0.1",
151
+ "@vitest/coverage-istanbul": "5.0.1",
152
+ "@vitest/coverage-v8": "^5.0.1",
148
153
  "d3-color": "^3.1.0",
149
154
  "eslint-plugin-storybook": "^10.3.5",
150
155
  "oxfmt": "^0.66.0",
151
156
  "oxlint": "^1.81.0",
152
157
  "playwright": "1.63.0",
153
- "react": "^19.2.7",
158
+ "react": "^19.3.0",
154
159
  "react-docgen-typescript": "^2.4.0",
155
- "react-dom": "^19.2.7",
160
+ "react-dom": "^19.3.0",
156
161
  "size-limit": "12.1.0",
157
- "storybook": "^10.2.19",
162
+ "storybook": "^10.6.1",
158
163
  "tailwindcss": "^4.3.3",
159
164
  "tailwindcss-scoped-preflight": "^4.0.6",
160
165
  "tsdown": "^0.22.14",
@@ -162,11 +167,7 @@
162
167
  "tw-animate-css": "^1.4.0",
163
168
  "typescript": "npm:@typescript/typescript6@^6.0.2",
164
169
  "vite": "^8.3.0",
165
- "vitest": "^4.1.11",
166
- "@keboola/agent-vocabulary": "^0.1.1",
167
- "@keboola/oxlint-config": "^10.1.0",
168
- "@keboola/tsconfig": "^0.2.1",
169
- "@keboola/vitest-config": "^1.0.0"
170
+ "vitest": "^5.0.1"
170
171
  },
171
172
  "peerDependencies": {
172
173
  "@testing-library/react": "^16.3.2",
@@ -193,6 +194,9 @@
193
194
  "@codemirror/state": "^6.7.1",
194
195
  "@codemirror/view": "^6.43.9",
195
196
  "@iconify-json/lucide": "^1.2.118",
197
+ "@keboola/brand-registry": "^2.0.0",
198
+ "@keboola/codemirror-lang-sql": "^0.7.3",
199
+ "@keboola/tailwind-config": "^1.2.0",
196
200
  "@lexical/code": "^0.42.0",
197
201
  "@lexical/link": "^0.42.0",
198
202
  "@lexical/list": "^0.42.0",
@@ -237,7 +241,7 @@
237
241
  "clsx": "^2.1.1",
238
242
  "cmdk": "^1.1.1",
239
243
  "diff": "^9.0.0",
240
- "dompurify": "^3.4.14",
244
+ "dompurify": "^3.4.16",
241
245
  "flint-chart": "0.5.1",
242
246
  "input-otp": "^1.4.2",
243
247
  "lexical": "^0.42.0",
@@ -254,10 +258,7 @@
254
258
  "sonner": "^2.0.7",
255
259
  "tailwind-merge": "^3.6.0",
256
260
  "vega": "^6.4.0",
257
- "vega-lite": "^6.4.3",
258
- "@keboola/brand-registry": "^1.9.4",
259
- "@keboola/codemirror-lang-sql": "^0.7.3",
260
- "@keboola/tailwind-config": "^1.1.2"
261
+ "vega-lite": "^6.4.3"
261
262
  },
262
263
  "scripts": {
263
264
  "dev": "storybook dev -p \"${PORT:-6006}\"",
@@ -267,8 +268,8 @@
267
268
  "build:js": "tsdown",
268
269
  "build:css": "tailwindcss -i src/styles.css -o dist/styles.css --minify",
269
270
  "build:check": "node ../../tooling/check-dist-exports.mjs && attw --pack . --profile esm-only --exclude-entrypoints ./styles ./styles/compiled ./theme",
270
- "test": "vitest run --config vite.config.ts --passWithNoTests --reporter=dot",
271
- "test:stories": "vitest run --config vitest.config.ts",
271
+ "test": "vitest run --config vite.config.ts --reporter=dot",
272
+ "test:stories": "vitest run --config vitest.config.ts --reporter=default --reporter=github-actions --reporter=junit --outputFile.junit=./junit-report.stories.xml",
272
273
  "test:stories:coverage": "vitest run --config vitest.config.ts --coverage",
273
274
  "test:visual": "playwright test -c playwright.visual.config.ts",
274
275
  "test:visual:update": "playwright test -c playwright.visual.config.ts --update-snapshots",
package/src/styles.css CHANGED
@@ -310,6 +310,12 @@
310
310
  color-scheme: normal;
311
311
  }
312
312
 
313
+ /* Dark selection — a translucent primary wash, so the selected run keeps its own ink
314
+ instead of flipping to a solid fill. Light keeps the UA default. */
315
+ [data-theme='dark'] ::selection {
316
+ background-color: rgb(var(--primary) / 0.35);
317
+ }
318
+
313
319
  @font-face {
314
320
  font-family: 'Inter';
315
321
  font-style: normal;
@@ -379,6 +385,7 @@
379
385
  h1 {
380
386
  font-size: 28px;
381
387
  line-height: 32px;
388
+ @apply tw:text-foreground;
382
389
  font-weight: 500;
383
390
  }
384
391
 
@@ -483,23 +490,122 @@
483
490
  }
484
491
  }
485
492
 
486
- @layer utilities {
487
- /* Tailwind Typography pins its own palette (`--tw-prose-bold`, `--tw-prose-headings`,
488
- …) to light-mode values, so those elements stay near-black when the semantic tokens
489
- flip — bold text in a Markdown answer renders dark-on-dark. `prose` has no awareness
490
- of `[data-theme]`, so invert it here.
491
-
492
- In `utilities`, not `components`: `.tw:prose` is itself a utility, and a v4 cascade
493
- layer beats specificity outright — a more specific rule in `components` still loses
494
- to the plain utility. Same layer, higher specificity, so this wins. */
495
- [data-theme='dark'] .tw\:prose {
496
- @apply tw:prose-invert;
497
- }
498
- }
499
-
500
493
  @layer utilities {
501
494
  [data-header-span='full']
502
495
  > [data-app-shell-slot]:has(> [data-collapsible='off-canvas'][data-state='collapsed']) {
503
496
  overflow-x: clip;
504
497
  }
505
498
  }
499
+
500
+ /**
501
+ * `tw:prose-answer` — how an assistant answer reads.
502
+ *
503
+ * - An answer is long-form prose read once, top to bottom, and wants different typography from the
504
+ * dense table-and-form UI it sits beside. Bare `tw:prose` stays the chrome rhythm that config
505
+ * descriptions and the markdown editor are written in.
506
+ * - Plain CSS rather than a `typography.ts` modifier: the typography plugin runs every key of a
507
+ * `css` object through `inWhere()`, so an at-rule key compiles to `:where(@container …)` — a
508
+ * selector, and a dead one. The width-responsive half of this rhythm cannot be written there.
509
+ * - `@utility` cannot be nested in a layer, so these rules keep real specificity (`0,1,1`) against
510
+ * prose's `:where()`-wrapped `0,1,0`. They win on specificity, not on source order.
511
+ * - Every length is `em`, so the whole scale follows the base size rather than being pinned.
512
+ */
513
+ @utility prose-answer {
514
+ /* Capped in `ch`, not pixels: an 828px column at 14px carries ~114 characters, well past the
515
+ * 45–75 a reader tracks comfortably, and a pixel cap drifts with the type size. */
516
+ max-width: 78ch;
517
+
518
+ /* Headings inside a reply are document structure, not page titles. The chrome scale starts where
519
+ * a page heading has a whole screen under it; a message is a column inside a panel, so the same
520
+ * ratios make an `h1` shout. These step clearly and stay relative. */
521
+ h1 {
522
+ font-size: 1.5em;
523
+ }
524
+ h2 {
525
+ font-size: 1.25em;
526
+ }
527
+ h3 {
528
+ font-size: 1.1em;
529
+ }
530
+ :is(h1, h2, h3, h4, h5, h6) {
531
+ font-weight: 600;
532
+ line-height: 1.375;
533
+ /* Far more space above than below. That asymmetry is what makes an answer scannable — it reads
534
+ * as "new section, and this belongs to it". */
535
+ margin-bottom: 0.6em;
536
+ }
537
+ /* `:not(:first-child)` keeps the rhythm off the top edge of a message: prose zeroes the outer
538
+ * margins with a rule of its own, and a top margin that survives it lands inside the bubble as
539
+ * padding. */
540
+ :is(h1, h2, h3, h4, h5, h6):not(:first-child) {
541
+ margin-top: 1.4em;
542
+ }
543
+ /* An icon leading a heading belongs to it, so it takes the heading's ink. Muted grey beside bold
544
+ * near-black text reads as washed out rather than secondary; in body copy the icon keeps its
545
+ * muted default. */
546
+ :is(h1, h2, h3, h4, h5, h6) svg {
547
+ color: currentColor;
548
+ }
549
+
550
+ /* Bottom margin only. With a top margin too, a paragraph following a heading wins the margin
551
+ * collapse and reopens the gap the heading's tight bottom margin closes — the asymmetry only
552
+ * holds if one side owns it. */
553
+ :is(p, ul, ol) {
554
+ margin-top: 0;
555
+ }
556
+ :is(p, ul, ol):not(:last-child) {
557
+ margin-bottom: 0.8em;
558
+ }
559
+ /* Prose pins a line-height per element, so the root's is not inherited and has to be restated
560
+ * where it matters. */
561
+ :is(p, li) {
562
+ line-height: 1.55;
563
+ }
564
+ li:not(:first-child) {
565
+ margin-top: 0.35em;
566
+ }
567
+ li {
568
+ margin-bottom: 0;
569
+ }
570
+
571
+ /* Long lines need more leading, not less. A container query, not a viewport one: the panel
572
+ * narrows this column without the viewport changing at all. The `messages` container is the
573
+ * contract a transcript declares (`tw:@container/messages`); where none exists, the narrow
574
+ * values stand. */
575
+ @container messages (min-width: 640px) {
576
+ :is(h1, h2, h3, h4, h5, h6):not(:first-child) {
577
+ margin-top: 1.6em;
578
+ }
579
+ :is(p, ul, ol):not(:last-child) {
580
+ margin-bottom: 0.9em;
581
+ }
582
+ :is(p, li) {
583
+ line-height: 1.6;
584
+ }
585
+ }
586
+ }
587
+
588
+ /**
589
+ * `tw:prose-code-chip` — inline code as a chip rather than a bare accent word.
590
+ *
591
+ * - Every markdown surface this package draws is full of identifiers, and a chip separates them
592
+ * from the sentence. The fill is the `--muted` / `--foreground` pair every inset surface takes.
593
+ * - Its own utility, not part of `tw:prose-answer`: this is palette, and the palette does not
594
+ * depend on which rhythm the surface wears. Inside `prose-answer` it left every `rhythm="chrome"`
595
+ * surface on `--tw-prose-code`, which is `#c7254e` in both schemes — 3.36:1 on the dark page,
596
+ * under AA.
597
+ * - An `@utility` for the same reason `prose-answer` is one: it has to out-specify prose's
598
+ * `:where()`-wrapped `code` colour from the same layer. A rule in `components` loses on layer
599
+ * order and leaves the accent ink on the chip's fill.
600
+ * - The dark tooltip keeps its own chip: `[data-tooltip-content='true'] .tw\:prose :not(pre) > code`
601
+ * is `(0,2,2)` against this rule's `(0,1,2)`, both in `utilities`.
602
+ */
603
+ @utility prose-code-chip {
604
+ :not(pre) > code {
605
+ background-color: rgb(var(--muted));
606
+ color: rgb(var(--foreground));
607
+ border-radius: 0.25rem;
608
+ padding: 0.125rem 0.25rem;
609
+ font-weight: inherit;
610
+ }
611
+ }
package/src/theme.css CHANGED
@@ -61,6 +61,7 @@
61
61
  --animate-progress-bar: progress-bar var(--progress-bar-duration, 3s) linear forwards;
62
62
  --animate-spinner-dots: spinner-dots 1s ease-in-out infinite;
63
63
  --animate-marching-ants: marching-ants 1s linear infinite;
64
+ --animate-kai-drift: kai-drift 12s ease-in-out infinite;
64
65
 
65
66
  /* Collapsible disclosure — keyframes below. `tw-animate-css` owns `collapsible-down`/`-up`
66
67
  * and every app imports it unlayered, so those two names are unusable here.
@@ -69,6 +70,130 @@
69
70
  --animate-collapsible-close: collapsible-close 300ms ease;
70
71
  }
71
72
 
73
+ /* Kai's fill: bright pools drift over its blue, a darker one circles on its own slower path. */
74
+ @utility bg-kai {
75
+ isolation: isolate;
76
+ overflow: hidden;
77
+ background-color: #1f8fff;
78
+ background-image:
79
+ radial-gradient(circle, #61e4ff 0, transparent 50%),
80
+ radial-gradient(circle, #8b5cff 0, transparent 50%),
81
+ radial-gradient(circle, #2dd4ff 0, transparent 45%);
82
+ background-size:
83
+ 160% 300%,
84
+ 180% 320%,
85
+ 140% 280%;
86
+ background-position:
87
+ 0% 20%,
88
+ 100% 80%,
89
+ 50% 0%;
90
+ background-repeat: no-repeat;
91
+ /* The glow sits under the focus ring's own shadows, so keyboard focus still shows. */
92
+ box-shadow:
93
+ var(--tw-ring-offset-shadow, 0 0 #0000),
94
+ var(--tw-ring-shadow, 0 0 #0000),
95
+ 0 6px 18px -8px rgb(56 132 255 / 0.55);
96
+
97
+ &::before {
98
+ content: '';
99
+ position: absolute;
100
+ z-index: -1;
101
+ inset: -60% -20%;
102
+ background: radial-gradient(closest-side, rgb(37 20 140 / 0.45), transparent 70%);
103
+ background-size: 45% 90%;
104
+ background-repeat: no-repeat;
105
+ animation: kai-shade 20s linear infinite;
106
+ pointer-events: none;
107
+ }
108
+
109
+ @media (prefers-reduced-motion: reduce) {
110
+ &::before {
111
+ animation: none;
112
+ }
113
+ }
114
+ }
115
+
116
+ @keyframes kai-drift {
117
+ 0%,
118
+ 100% {
119
+ background-position:
120
+ 0% 20%,
121
+ 100% 80%,
122
+ 50% 0%;
123
+ }
124
+ 10% {
125
+ background-position:
126
+ 30% 0%,
127
+ 80% 100%,
128
+ 90% 30%;
129
+ }
130
+ 20% {
131
+ background-position:
132
+ 70% 10%,
133
+ 40% 90%,
134
+ 100% 70%;
135
+ }
136
+ 30% {
137
+ background-position:
138
+ 100% 40%,
139
+ 10% 60%,
140
+ 60% 100%;
141
+ }
142
+ 40% {
143
+ background-position:
144
+ 80% 90%,
145
+ 0% 20%,
146
+ 20% 80%;
147
+ }
148
+ 50% {
149
+ background-position:
150
+ 40% 100%,
151
+ 30% 0%,
152
+ 0% 40%;
153
+ }
154
+ 60% {
155
+ background-position:
156
+ 10% 70%,
157
+ 70% 10%,
158
+ 30% 0%;
159
+ }
160
+ 70% {
161
+ background-position:
162
+ 0% 30%,
163
+ 100% 40%,
164
+ 80% 20%;
165
+ }
166
+ 80% {
167
+ background-position:
168
+ 50% 0%,
169
+ 90% 90%,
170
+ 100% 90%;
171
+ }
172
+ 90% {
173
+ background-position:
174
+ 20% 50%,
175
+ 60% 70%,
176
+ 40% 60%;
177
+ }
178
+ }
179
+
180
+ /* The darker pool's orbit: a slow loop across the button, out of step with the bright ones. */
181
+ @keyframes kai-shade {
182
+ 0%,
183
+ 100% {
184
+ background-position: 0% 50%;
185
+ }
186
+ 25% {
187
+ background-position: 50% 0%;
188
+ }
189
+ 50% {
190
+ background-position: 100% 50%;
191
+ }
192
+ 75% {
193
+ background-position: 50% 100%;
194
+ }
195
+ }
196
+
72
197
  @keyframes progress-bar {
73
198
  from {
74
199
  width: 0%;
@@ -158,11 +283,11 @@
158
283
  * still highlighted a `[data-disabled="true"]` control on hover and focus. */
159
284
  @custom-variant not-disabled (&:not([data-disabled="true"]):not(:disabled));
160
285
 
161
- /* `overflow-wrap: anywhere` — no v4 core utility covers it (`break-words` is `break-word`,
162
- * which keeps long unbroken tokens overflowing). Authored in 16 app files. */
163
- @utility break-anywhere {
164
- overflow-wrap: anywhere;
165
- }
286
+ /* Interactive-surface variant — `interactive:hover:…`. Matches:
287
+ * - an `<a href>`, unless it opts out with `data-interactive="false"`;
288
+ * - any element that opts in with `data-interactive="true"`.
289
+ * Lives here, not in a JS plugin, for the same reason as `not-disabled`: apps compile design's classes. */
290
+ @custom-variant interactive (&:is([data-interactive="true"], a[href]:not([data-interactive="false"])));
166
291
 
167
292
  @theme inline {
168
293
  --color-inherit: inherit;