@keboola/design 11.2.0 → 11.3.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 (233) hide show
  1. package/AGENTS.md +25 -14
  2. package/CHANGELOG.md +254 -0
  3. package/COMPONENT-API.md +1 -1
  4. package/dist/{AIKit-DiS0CVOW.js → AIKit-DaFT7p92.js} +23 -22
  5. package/dist/AIKit-DaFT7p92.js.map +1 -0
  6. package/dist/{Alert-DfZq9kGe.js → Alert-CseY3yAj.js} +3 -3
  7. package/dist/{Alert-DfZq9kGe.js.map → Alert-CseY3yAj.js.map} +1 -1
  8. package/dist/{AlertModal-Dp_XuJBW.js → AlertModal-DQAGpsEy.js} +3 -3
  9. package/dist/{AlertModal-Dp_XuJBW.js.map → AlertModal-DQAGpsEy.js.map} +1 -1
  10. package/dist/{AppShell-B5GQN6Zs.js → AppShell-BUoxM3fv.js} +29 -10
  11. package/dist/AppShell-BUoxM3fv.js.map +1 -0
  12. package/dist/{BrandEditor-DyzgfVkl.js → BrandEditor-BnTLMRMp.js} +6 -6
  13. package/dist/{BrandEditor-DyzgfVkl.js.map → BrandEditor-BnTLMRMp.js.map} +1 -1
  14. package/dist/{BrandLogo-CJkRd0F8.js → BrandLogo-V2pRUAeO.js} +2 -2
  15. package/dist/{BrandLogo-CJkRd0F8.js.map → BrandLogo-V2pRUAeO.js.map} +1 -1
  16. package/dist/{Breadcrumb-Frst8MTA.js → Breadcrumb-CQTPn_KB.js} +3 -3
  17. package/dist/{Breadcrumb-Frst8MTA.js.map → Breadcrumb-CQTPn_KB.js.map} +1 -1
  18. package/dist/{Button-6xBX0nNl.js → Button-CPsEQuTN.js} +2 -2
  19. package/dist/{Button-6xBX0nNl.js.map → Button-CPsEQuTN.js.map} +1 -1
  20. package/dist/{Card-BAoZ35CV.js → Card-Cd5HSBmv.js} +2 -2
  21. package/dist/{Card-BAoZ35CV.js.map → Card-Cd5HSBmv.js.map} +1 -1
  22. package/dist/{Checkbox-GJ8-srt4.js → Checkbox-5VNCcV7E.js} +3 -3
  23. package/dist/{Checkbox-GJ8-srt4.js.map → Checkbox-5VNCcV7E.js.map} +1 -1
  24. package/dist/{Clipboard-CBJZiviP.js → Clipboard-B7rckqV_.js} +2 -2
  25. package/dist/{Clipboard-CBJZiviP.js.map → Clipboard-B7rckqV_.js.map} +1 -1
  26. package/dist/{ClipboardButton-ClcluT0C.js → ClipboardButton-CQ6Aewpg.js} +3 -3
  27. package/dist/{ClipboardButton-ClcluT0C.js.map → ClipboardButton-CQ6Aewpg.js.map} +1 -1
  28. package/dist/{CodeEditor-DyaN-Ij2.js → CodeEditor-CUse8znx.js} +237 -95
  29. package/dist/CodeEditor-CUse8znx.js.map +1 -0
  30. package/dist/{ColorInput-B8z4j4Y_.js → ColorInput-Q1D9Vcc_.js} +3 -3
  31. package/dist/{ColorInput-B8z4j4Y_.js.map → ColorInput-Q1D9Vcc_.js.map} +1 -1
  32. package/dist/{ColorModeSwitch-dZFZyqy1.js → ColorModeSwitch-B5PXCVqB.js} +3 -3
  33. package/dist/{ColorModeSwitch-dZFZyqy1.js.map → ColorModeSwitch-B5PXCVqB.js.map} +1 -1
  34. package/dist/{Combobox-Dgm6Z4ib.js → Combobox-CyoRA7oY.js} +5 -5
  35. package/dist/Combobox-CyoRA7oY.js.map +1 -0
  36. package/dist/{Command-C0aZfVTq.js → Command-Ds68v2rX.js} +3 -3
  37. package/dist/{Command-C0aZfVTq.js.map → Command-Ds68v2rX.js.map} +1 -1
  38. package/dist/{CopyField-BJ96zvXs.js → CopyField-DI66uY_g.js} +2 -2
  39. package/dist/{CopyField-BJ96zvXs.js.map → CopyField-DI66uY_g.js.map} +1 -1
  40. package/dist/{DateInput-B3UdzRfW.js → DateInput-BPj2pzsn.js} +4 -4
  41. package/dist/{DateInput-B3UdzRfW.js.map → DateInput-BPj2pzsn.js.map} +1 -1
  42. package/dist/{DatePicker-Dw3DpbUh.js → DatePicker-DyEGuW9m.js} +2 -2
  43. package/dist/{DatePicker-Dw3DpbUh.js.map → DatePicker-DyEGuW9m.js.map} +1 -1
  44. package/dist/{DateRangeInput-DTuySEiq.js → DateRangeInput-u9DxNbHW.js} +4 -4
  45. package/dist/{DateRangeInput-DTuySEiq.js.map → DateRangeInput-u9DxNbHW.js.map} +1 -1
  46. package/dist/{DateRangePicker-DCmMHg4s.js → DateRangePicker-CYYhX6S7.js} +6 -6
  47. package/dist/{DateRangePicker-DCmMHg4s.js.map → DateRangePicker-CYYhX6S7.js.map} +1 -1
  48. package/dist/{DropdownMenu-t90tVw6l.js → DropdownMenu-DpMEcyCq.js} +2 -2
  49. package/dist/{DropdownMenu-t90tVw6l.js.map → DropdownMenu-DpMEcyCq.js.map} +1 -1
  50. package/dist/{FieldItem-D-h1NeBo.js → FieldItem-qQKGU9lF.js} +3 -3
  51. package/dist/{FieldItem-D-h1NeBo.js.map → FieldItem-qQKGU9lF.js.map} +1 -1
  52. package/dist/{FieldItem-CAPj9lj3.d.ts → FieldItem-vhIJW4pj.d.ts} +2 -10
  53. package/dist/{FileUpload-BRv0TaZk.js → FileUpload-C336MVnU.js} +2 -2
  54. package/dist/{FileUpload-BRv0TaZk.js.map → FileUpload-C336MVnU.js.map} +1 -1
  55. package/dist/{Form-DHvcFoEi.js → Form-CTygENDc.js} +8 -8
  56. package/dist/{Form-DHvcFoEi.js.map → Form-CTygENDc.js.map} +1 -1
  57. package/dist/{FormGroup-C41n65cE.js → FormGroup-BnwP0jNu.js} +3 -3
  58. package/dist/{FormGroup-C41n65cE.js.map → FormGroup-BnwP0jNu.js.map} +1 -1
  59. package/dist/{FullScreenModal-Cb3PGgh4.js → FullScreenModal-j-M4aPFd.js} +3 -3
  60. package/dist/{FullScreenModal-Cb3PGgh4.js.map → FullScreenModal-j-M4aPFd.js.map} +1 -1
  61. package/dist/{HoverCard-WfDkLK1s.js → HoverCard-yQq-O49c.js} +2 -2
  62. package/dist/{HoverCard-WfDkLK1s.js.map → HoverCard-yQq-O49c.js.map} +1 -1
  63. package/dist/{InputGroup-CdTq8H7c.js → InputGroup-D7zlmqPB.js} +3 -3
  64. package/dist/{InputGroup-CdTq8H7c.js.map → InputGroup-D7zlmqPB.js.map} +1 -1
  65. package/dist/{Kbd-CxHAo1oo.js → Kbd-D6LpR7G2.js} +2 -2
  66. package/dist/{Kbd-CxHAo1oo.js.map → Kbd-D6LpR7G2.js.map} +1 -1
  67. package/dist/{MermaidDiagram-ChL3WIQT.js → MermaidDiagram-JlvuGcY-.js} +6 -87
  68. package/dist/MermaidDiagram-JlvuGcY-.js.map +1 -0
  69. package/dist/{Modal-wqG8nJiK.js → Modal-o4ATIexE.js} +3 -3
  70. package/dist/{Modal-wqG8nJiK.js.map → Modal-o4ATIexE.js.map} +1 -1
  71. package/dist/{MultiActionButtonGroup-BiIIubiL.js → MultiActionButtonGroup-GTeFk-L8.js} +3 -3
  72. package/dist/{MultiActionButtonGroup-BiIIubiL.js.map → MultiActionButtonGroup-GTeFk-L8.js.map} +1 -1
  73. package/dist/{Navbar-BfaPeLUL.js → Navbar-CAQs4BZz.js} +2 -2
  74. package/dist/{Navbar-BfaPeLUL.js.map → Navbar-CAQs4BZz.js.map} +1 -1
  75. package/dist/{PageToolbar-OQg3mPF-.js → PageToolbar-bG2YtSa3.js} +3 -3
  76. package/dist/{PageToolbar-OQg3mPF-.js.map → PageToolbar-bG2YtSa3.js.map} +1 -1
  77. package/dist/{Pagination-Cjfda8KG.js → Pagination-BB3X7ooY.js} +2 -2
  78. package/dist/{Pagination-Cjfda8KG.js.map → Pagination-BB3X7ooY.js.map} +1 -1
  79. package/dist/{Popconfirm-D7_vfxFd.js → Popconfirm-C2Ky5hJO.js} +3 -3
  80. package/dist/{Popconfirm-D7_vfxFd.js.map → Popconfirm-C2Ky5hJO.js.map} +1 -1
  81. package/dist/{Popover-CzeHjvrB.js → Popover-DsbI2HKu.js} +2 -2
  82. package/dist/{Popover-CzeHjvrB.js.map → Popover-DsbI2HKu.js.map} +1 -1
  83. package/dist/{RadioGroup-sIveSsNa.js → RadioGroup-BMxuZEbT.js} +3 -3
  84. package/dist/{RadioGroup-sIveSsNa.js.map → RadioGroup-BMxuZEbT.js.map} +1 -1
  85. package/dist/{Search-3UiqNZRj.js → Search-DFeECt5D.js} +2 -2
  86. package/dist/{Search-3UiqNZRj.js.map → Search-DFeECt5D.js.map} +1 -1
  87. package/dist/{SearchInput-C7dF_Ir-.js → SearchInput-CCpdUego.js} +3 -3
  88. package/dist/{SearchInput-C7dF_Ir-.js.map → SearchInput-CCpdUego.js.map} +1 -1
  89. package/dist/{SectionNav-8NoTOKO8.js → SectionNav-Bw_MVL0_.js} +4 -4
  90. package/dist/{SectionNav-8NoTOKO8.js.map → SectionNav-Bw_MVL0_.js.map} +1 -1
  91. package/dist/{Select-Is0VkePH.js → Select-D6IZVvwL.js} +5 -5
  92. package/dist/Select-D6IZVvwL.js.map +1 -0
  93. package/dist/{Sheet-Dw9BDvjI.js → Sheet-BIzs2K2H.js} +3 -3
  94. package/dist/{Sheet-Dw9BDvjI.js.map → Sheet-BIzs2K2H.js.map} +1 -1
  95. package/dist/{Sidebar-Dcb4rinA.js → Sidebar-r1TW4g_b.js} +5 -5
  96. package/dist/{Sidebar-Dcb4rinA.js.map → Sidebar-r1TW4g_b.js.map} +1 -1
  97. package/dist/{Slider-BOPfMOMm.js → Slider-CjxyfEty.js} +3 -3
  98. package/dist/{Slider-BOPfMOMm.js.map → Slider-CjxyfEty.js.map} +1 -1
  99. package/dist/{Switch-CX2A0v50.js → Switch-BueTV03C.js} +2 -2
  100. package/dist/{Switch-CX2A0v50.js.map → Switch-BueTV03C.js.map} +1 -1
  101. package/dist/{Tabs-UMQuDoW8.js → Tabs-l72-WuhK.js} +2 -2
  102. package/dist/{Tabs-UMQuDoW8.js.map → Tabs-l72-WuhK.js.map} +1 -1
  103. package/dist/{TextInput-CMuN1WfY.js → TextInput-DhdRk8qm.js} +3 -3
  104. package/dist/{TextInput-CMuN1WfY.js.map → TextInput-DhdRk8qm.js.map} +1 -1
  105. package/dist/{ThemeProvider-QncUrfJn.js → ThemeProvider-DZfGdf1v.js} +5 -4
  106. package/dist/{ThemeProvider-QncUrfJn.js.map → ThemeProvider-DZfGdf1v.js.map} +1 -1
  107. package/dist/{TimePicker-D9zktB8A.js → TimePicker-B6d2rAbX.js} +2 -2
  108. package/dist/{TimePicker-D9zktB8A.js.map → TimePicker-B6d2rAbX.js.map} +1 -1
  109. package/dist/{Toast-DQSbs3oA.js → Toast-CxXUulYN.js} +2 -2
  110. package/dist/{Toast-DQSbs3oA.js.map → Toast-CxXUulYN.js.map} +1 -1
  111. package/dist/{ZoomableSvg-CZEu6sAq.js → ZoomableSvg-CNIzRHKH.js} +4 -4
  112. package/dist/{ZoomableSvg-CZEu6sAq.js.map → ZoomableSvg-CNIzRHKH.js.map} +1 -1
  113. package/dist/{context-KxxeMHbR.js → context-BrNtMc1H.js} +3 -33
  114. package/dist/context-BrNtMc1H.js.map +1 -0
  115. package/dist/defaults-CTfvj2KB.js +34 -0
  116. package/dist/defaults-CTfvj2KB.js.map +1 -0
  117. package/dist/editors.d.ts +12 -2
  118. package/dist/editors.js +20 -12
  119. package/dist/editors.js.map +1 -1
  120. package/dist/flint.d.ts +15 -0
  121. package/dist/flint.js +212 -0
  122. package/dist/flint.js.map +1 -0
  123. package/dist/index.d.ts +49 -7
  124. package/dist/index.js +57 -55
  125. package/dist/internal/blocks/AIKit.js +1 -1
  126. package/dist/internal/blocks/AppShell.js +2 -2
  127. package/dist/internal/blocks/BrandEditor.js +1 -1
  128. package/dist/internal/blocks/ChartPanel.js +1 -1
  129. package/dist/internal/blocks/ClipboardButton.js +1 -1
  130. package/dist/internal/blocks/ColorInput.js +1 -1
  131. package/dist/internal/blocks/ColorModeSwitch.js +1 -1
  132. package/dist/internal/blocks/Command.js +1 -1
  133. package/dist/internal/blocks/CopyField.js +1 -1
  134. package/dist/internal/blocks/DateInput.js +1 -1
  135. package/dist/internal/blocks/DateRangeInput.js +1 -1
  136. package/dist/{DiagramSkeleton-lwBS2YBa.js → internal/blocks/DiagramShared/DiagramSkeleton.js} +3 -3
  137. package/dist/internal/blocks/DiagramShared/DiagramSkeleton.js.map +1 -0
  138. package/dist/internal/blocks/EmptyConfigurationActionCard.js +1 -1
  139. package/dist/internal/blocks/ErrorState.js +1 -1
  140. package/dist/internal/blocks/ExportMenu.js +3 -3
  141. package/dist/internal/blocks/Form/connectors/MultiComboboxField.js +1 -1
  142. package/dist/internal/blocks/Form.js +1 -1
  143. package/dist/internal/blocks/FormGroup.js +1 -1
  144. package/dist/internal/blocks/MultiActionButtonGroup.js +1 -1
  145. package/dist/internal/blocks/MultiCombobox.js +4 -3
  146. package/dist/internal/blocks/MultiCombobox.js.map +1 -1
  147. package/dist/internal/blocks/NumberInput.js +1 -1
  148. package/dist/internal/blocks/PageToolbar.js +1 -1
  149. package/dist/internal/blocks/PasswordInput.js +2 -2
  150. package/dist/internal/blocks/SearchInput.js +1 -1
  151. package/dist/internal/blocks/SearchInputWithNavigation.js +3 -3
  152. package/dist/internal/blocks/SectionNav.js +1 -1
  153. package/dist/internal/blocks/SplitButton.js +2 -2
  154. package/dist/internal/blocks/StatCard.js +1 -1
  155. package/dist/internal/blocks/TextInput.js +1 -1
  156. package/dist/internal/blocks/Textarea.js +1 -1
  157. package/dist/internal/blocks/TimeInput.js +3 -3
  158. package/dist/internal/components/Alert.js +1 -1
  159. package/dist/internal/components/AlertModal.js +1 -1
  160. package/dist/internal/components/Avatar.js +1 -1
  161. package/dist/internal/components/BrandLogo.js +1 -1
  162. package/dist/internal/components/Breadcrumb.js +1 -1
  163. package/dist/internal/components/Button.js +1 -1
  164. package/dist/internal/components/Card.js +1 -1
  165. package/dist/internal/components/Checkbox.js +1 -1
  166. package/dist/internal/components/Clipboard.js +1 -1
  167. package/dist/internal/components/CollapsiblePanel.js +1 -1
  168. package/dist/internal/components/Combobox.js +1 -1
  169. package/dist/internal/components/DatePicker.js +1 -1
  170. package/dist/internal/components/DateRangePicker.js +1 -1
  171. package/dist/internal/components/DropdownMenu.js +1 -1
  172. package/dist/internal/components/FileUpload.js +1 -1
  173. package/dist/internal/components/FullScreenModal.js +1 -1
  174. package/dist/internal/components/HoverCard.js +1 -1
  175. package/dist/internal/components/InputGroup.js +1 -1
  176. package/dist/internal/components/Kbd.js +1 -1
  177. package/dist/internal/components/Modal.js +1 -1
  178. package/dist/internal/components/Navbar.js +1 -1
  179. package/dist/internal/components/Pagination.js +1 -1
  180. package/dist/internal/components/Popconfirm.js +1 -1
  181. package/dist/internal/components/Popover.js +1 -1
  182. package/dist/internal/components/RadioGroup.js +1 -1
  183. package/dist/internal/components/Search.js +1 -1
  184. package/dist/internal/components/Select.js +1 -1
  185. package/dist/internal/components/Sheet.js +1 -1
  186. package/dist/internal/components/Sidebar.js +1 -1
  187. package/dist/internal/components/Slider.js +1 -1
  188. package/dist/internal/components/Switch.js +1 -1
  189. package/dist/internal/components/Tabs.js +1 -1
  190. package/dist/internal/components/ThemeProvider.js +3 -2
  191. package/dist/internal/components/TimePicker.js +1 -1
  192. package/dist/internal/components/Toast.js +2 -2
  193. package/dist/internal/components/Tooltip.js +1 -1
  194. package/dist/internal/components/Truncated.js +16 -8
  195. package/dist/internal/components/Truncated.js.map +1 -1
  196. package/dist/internal/components/ZoomableSvg.js +1 -1
  197. package/dist/internal/utils.js +1 -1
  198. package/dist/markdown-editor.js +7 -7
  199. package/dist/mermaid.js +1 -1
  200. package/dist/rjsf.js +11 -11
  201. package/dist/{styles-DSUP_-9Z.js → styles-BAFscjSV.js} +4 -3
  202. package/dist/styles-BAFscjSV.js.map +1 -0
  203. package/dist/styles.css +1 -1
  204. package/dist/svgTransforms-C9njt92h.js +89 -0
  205. package/dist/svgTransforms-C9njt92h.js.map +1 -0
  206. package/dist/testing.js +3 -2
  207. package/dist/testing.js.map +1 -1
  208. package/dist/{themeTokens-BNg98Mu9.js → themeTokens-7T1AFLhq.js} +13 -6
  209. package/dist/{themeTokens-BNg98Mu9.js.map → themeTokens-7T1AFLhq.js.map} +1 -1
  210. package/dist/{toast-CjkURw0M.js → toast-BweSoKn3.js} +3 -3
  211. package/dist/toast-BweSoKn3.js.map +1 -0
  212. package/dist/types-BPcAjMG0.d.ts +10 -0
  213. package/dist/{useColorSchemeState-CYqcUfSH.js → useColorSchemeState-BJEk6esG.js} +2 -2
  214. package/dist/{useColorSchemeState-CYqcUfSH.js.map → useColorSchemeState-BJEk6esG.js.map} +1 -1
  215. package/dist/{utils-D0c5VAyF.js → utils-B-g7d_Jb.js} +2 -2
  216. package/dist/{utils-D0c5VAyF.js.map → utils-B-g7d_Jb.js.map} +1 -1
  217. package/dist/vega.d.ts +46 -0
  218. package/dist/vega.js +26 -0
  219. package/dist/vega.js.map +1 -0
  220. package/dist/vegaTheme-FBXgAdHK.js +146 -0
  221. package/dist/vegaTheme-FBXgAdHK.js.map +1 -0
  222. package/package.json +26 -7
  223. package/src/styles.css +27 -4
  224. package/dist/AIKit-DiS0CVOW.js.map +0 -1
  225. package/dist/AppShell-B5GQN6Zs.js.map +0 -1
  226. package/dist/CodeEditor-DyaN-Ij2.js.map +0 -1
  227. package/dist/Combobox-Dgm6Z4ib.js.map +0 -1
  228. package/dist/DiagramSkeleton-lwBS2YBa.js.map +0 -1
  229. package/dist/MermaidDiagram-ChL3WIQT.js.map +0 -1
  230. package/dist/Select-Is0VkePH.js.map +0 -1
  231. package/dist/context-KxxeMHbR.js.map +0 -1
  232. package/dist/styles-DSUP_-9Z.js.map +0 -1
  233. package/dist/toast-CjkURw0M.js.map +0 -1
package/AGENTS.md CHANGED
@@ -20,18 +20,20 @@ Working **on** the package (commands, layer boundary, token surface, the FA→Lu
20
20
 
21
21
  The root barrel (`@keboola/design`) is **not** the whole package. These live only at their subpath — an agent scanning the barrel (or `dist/index.d.ts`) misses them and wrongly concludes the capability is absent. The "always import from the package root" rule above holds for everything in the barrel; the rows below are the **deliberate exceptions** — import them from the subpath, not the root.
22
22
 
23
- | Subpath | Exports | Reach for it when |
24
- | --------------------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------- |
25
- | `@keboola/design` | Components, blocks, hooks, `ThemeProvider`, forms | Default — everything below the listed exceptions |
26
- | `@keboola/design/icons` | Lucide re-export + Keboola-custom SVG icons | Any icon (`import { ChevronDown } from '@keboola/design/icons'`) |
27
- | `@keboola/design/editors` | `CodeEditor`, `SqlEditor`, `MergeEditor` | Real code editing — pulls the ~1.3 MB CodeMirror bundle |
28
- | `@keboola/design/charts` | `LineChart`, `BarChart`, `AreaChart`, `PieChart`, `ChartContainer` | Data-viz — themed recharts wrappers; **not** in the root barrel |
29
- | `@keboola/design/mermaid` | `MermaidDiagram` (`{ code }`) | Render a Mermaid diagram — **not** in the root barrel |
30
- | `@keboola/design/markdown-editor` | `MarkdownEditor` | Markdown editing — **not** in the root barrel |
31
- | `@keboola/design/rjsf` | `RjsfSchemaEditor`, `useRootFormData` | JSON-Schema-driven config forms (RJSF) — pulls `@rjsf/*` + ajv |
32
- | `@keboola/design/testing` | `renderWithTheme` | Unit tests that need a component wrapped in `ThemeProvider` |
33
- | `@keboola/design/styles` | Tailwind-extending stylesheet | App entry, Tailwind consumers (**default**) |
34
- | `@keboola/design/styles/compiled` | Pre-compiled CSS (~176 KB) | App entry, when you cannot run Tailwind |
23
+ | Subpath | Exports | Reach for it when |
24
+ | --------------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------- |
25
+ | `@keboola/design` | Components, blocks, hooks, `ThemeProvider`, forms | Default — everything below the listed exceptions |
26
+ | `@keboola/design/icons` | Lucide re-export + Keboola-custom SVG icons | Any icon (`import { ChevronDown } from '@keboola/design/icons'`) |
27
+ | `@keboola/design/editors` | `CodeEditor`, `SqlEditor`, `MergeEditor` | Real code editing — pulls the ~1.3 MB CodeMirror bundle |
28
+ | `@keboola/design/charts` | `LineChart`, `BarChart`, `AreaChart`, `PieChart`, `ChartContainer` | Data-viz — themed recharts wrappers; **not** in the root barrel |
29
+ | `@keboola/design/mermaid` | `MermaidDiagram` (`{ code }`) | Render a Mermaid diagram — **not** in the root barrel |
30
+ | `@keboola/design/flint` | `FlintChart` (`{ code }`) | Render a Flint chart (JSON spec, Vega-Lite) — **not** in the root barrel |
31
+ | `@keboola/design/vega` | `vegaTheme(scheme)`, `useVegaTheme()` | Brand + scheme aware Vega-Lite `Config` for any chart you render yourself |
32
+ | `@keboola/design/markdown-editor` | `MarkdownEditor` | Markdown editing — **not** in the root barrel |
33
+ | `@keboola/design/rjsf` | `RjsfSchemaEditor`, `useRootFormData` | JSON-Schema-driven config forms (RJSF) — pulls `@rjsf/*` + ajv |
34
+ | `@keboola/design/testing` | `renderWithTheme` | Unit tests that need a component wrapped in `ThemeProvider` |
35
+ | `@keboola/design/styles` | Tailwind-extending stylesheet | App entry, Tailwind consumers (**default**) |
36
+ | `@keboola/design/styles/compiled` | Pre-compiled CSS (~176 KB) | App entry, when you cannot run Tailwind |
35
37
 
36
38
  ### design ≠ shadcn — API deltas
37
39
 
@@ -156,6 +158,15 @@ Charts ship from the **`@keboola/design/charts`** subpath (recharts under the ho
156
158
 
157
159
  Reach for it when **two or more series of similar magnitude sit far from zero** and their difference is the story — actual vs target, used vs quota. Don't reach for it for a **single series whose magnitude the reader is meant to judge**: zooming the axis turns ordinary noise into a dramatic trend. And it is deliberately absent from `BarChart` / `AreaChart` — a line encodes value by position, so the baseline is just a viewport, but a bar's length and an area's fill are measured _from_ the baseline, and truncating those makes the geometry misstate the ratios. If an area chart needs a non-zero baseline, it is a line chart. (`ChartContainer` + a raw recharts chart remains the escape hatch for anything the wrappers don't model.)
158
160
 
161
+ **Rendering a Vega-Lite spec yourself?** Take the config from **`@keboola/design/vega`** instead of hand-writing colours — `useVegaTheme()` in a component, `vegaTheme(scheme)` outside one. It carries the transparent background, the semantic axis/legend/title chrome, and `range.category` = `--chart-1..5` in series order, so a spec from anywhere lands on the same palette as the recharts wrappers and follows the active scheme and brand. Pass it as the compile/render `config`; a range set on the spec's own scale still wins.
162
+
163
+ ```tsx
164
+ const config = useVegaTheme();
165
+ const { spec } = compile(vegaLiteSpec, { config });
166
+ ```
167
+
168
+ The config holds resolved `rgb(…)` strings, not `var()` references — vega does its colour maths in JS and never consults the stylesheet. So a chart rendered once must be re-rendered when the config identity changes; `useVegaTheme` gives you a new one on every scheme or brand switch.
169
+
159
170
  ### Layout
160
171
 
161
172
  **No** `Stack` / `Flex` / `Box` component exists, by design — shadcn doesn't ship them, and adding wrappers creates a third way to do layout. Use Tailwind utility classes directly.
@@ -176,7 +187,7 @@ Vertical rhythm: prefer `tw:gap-*` on a flex column parent over `tw:mt-*` on chi
176
187
 
177
188
  **`Card` padding: the root owns it, or the slots do — never both.** `Card padding` (default `small`) pads the root and gaps its slots, which is right for a plain content card. Set `padding="none"` when a slot must bleed to the card edge — a table, an `EmptyState`, or a header with a rule under it — and the root also drops its gap so the bands sit flush. In that mode the slots pad themselves: `Card.Header divider` becomes its own padded band with a full-bleed bottom rule, and `Card.Content padded` takes the standard body padding. `Card.Header` distributes its children by `layout`: **`row`** (default) pushes them apart, title left and actions right; **`inline`** keeps them together for a title with an icon or badge; **`stack`** puts a description under the title. Don't hand-roll these with `className` — `cva` here concatenates rather than tailwind-merges, so a `tw:justify-start` in `className` will not reliably beat the `row` default. Use the prop.
178
189
 
179
- **Page gutter: `AppShell.Main` owns it, with an opinionated default.** `AppShell.Main` applies a default page gutter (`tw:p-6`) so content looks right out of the box. Because `cn` is tailwind-merge, override it from the call site when the app owns its own gutter — e.g. `className="tw:p-0"` (kbc-ui does this; it centralizes the gutter on its own shell wrapper). `PageLayout` still adds **no** gutter of its own, so header and content align inside whatever gutter `AppShell.Main` provides.
190
+ **Page gutter: `AppShell.Main` owns it, on a wrapper inside its scroll container.** `AppShell.Main` applies a default page gutter (`tw:p-6`) so content looks right out of the box. Override it from the call site through **`contentClassName`** — e.g. `contentClassName="tw:p-0"` (kbc-ui does this; it centralizes the gutter on its own shell wrapper). **Never put a `p-*` in `className`**: that lands on the scroll container, and sticky insets resolve against the nearest scrollport's _padding box_, so it parks every `position: sticky` descendant — `Table.Header` included — one gutter below the visible top edge, with scrolled content showing through the strip above. `className` is still the right place for the scroll behaviour itself (`tw:overflow-visible`). `PageLayout` adds **no** gutter of its own, so header and content align inside whatever gutter `AppShell.Main` provides.
180
191
 
181
192
  ```tsx
182
193
  // Default gutter — nothing to add:
@@ -185,7 +196,7 @@ Vertical rhythm: prefer `tw:gap-*` on a flex column parent over `tw:mt-*` on chi
185
196
  </AppShell.Main>
186
197
 
187
198
  // Own your gutter — opt out and add your own:
188
- <AppShell.Main className="tw:p-0">
199
+ <AppShell.Main contentClassName="tw:p-0">
189
200
  <div className="tw:px-8 tw:py-6">{/* custom gutter */}</div>
190
201
  </AppShell.Main>
191
202
  ```
package/CHANGELOG.md CHANGED
@@ -1,5 +1,259 @@
1
1
  # @keboola/design
2
2
 
3
+ ## 11.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - `AppShell.Main` takes `clampContent`, which bounds its content wrapper to the shell's height
8
+ instead of letting it grow with the content. Pass it when the page runs its own `overflow-auto`
9
+ scroller — a `flex-1` descendant then clamps to the scrollport rather than to the content, so the
10
+ page's scroller is the element that scrolls. Default behaviour is unchanged; no migration.
11
+
12
+ - `AppShell.Main` no longer carries its page gutter on the scroll container.
13
+
14
+ Sticky insets resolve against the nearest scrollport's padding box, so the gutter on the scrolling
15
+ element parked every `position: sticky` descendant one gutter below the scrollport's visible top
16
+ edge — `Table.Header` included. Scrolled rows showed through the strip above the header, on every
17
+ table in every app on this shell.
18
+
19
+ The gutter now sits on a content wrapper inside `Main`, and `contentClassName` overrides it.
20
+
21
+ **Migration** — only if you override `Main`'s padding through `className`:
22
+
23
+ ```diff
24
+ - <AppShell.Main className="tw:p-0">
25
+ + <AppShell.Main contentClassName="tw:p-0">
26
+ ```
27
+
28
+ With `asChild`, your element stays the scroll container and the gutter wrapper is nested inside it,
29
+ so the padding that used to land on your element now lands on a child `<div>`.
30
+
31
+ `className` still lands on the scroll container, so an `overflow-visible` reset stays where it is.
32
+ Overrides that mix the two need splitting:
33
+
34
+ ```diff
35
+ - <AppShell.Main className={cn('tw:p-0', { 'tw:overflow-visible': isLegacy })}>
36
+ + <AppShell.Main
37
+ + className={cn({ 'tw:overflow-visible': isLegacy })}
38
+ + contentClassName="tw:p-0"
39
+ + >
40
+ ```
41
+
42
+ - `appShellSlotSelector(slot)` builds the CSS selector for a shell slot's `data-app-shell-slot`
43
+ attribute, so a consumer measuring or observing `AppShell.Main` from outside the shell no longer
44
+ hand-types the attribute. Renaming it then breaks the build instead of silently matching nothing.
45
+
46
+ The slot names are exported as `AppShellSlot`.
47
+
48
+ - New lazy subpath export `@keboola/design/flint`: `FlintChart` renders a
49
+ [flint-chart](https://github.com/microsoft/flint-chart) JSON spec
50
+ (`ChartAssemblyInput`) to a static SVG via the Vega-Lite backend, displayed
51
+ through `ZoomableSvg` with the same zoom/fullscreen/export UX as
52
+ `MermaidDiagram`. `flint-chart`, `vega` and `vega-lite` ship only in the flint
53
+ chunk — the root barrel and every existing entry are unaffected.
54
+
55
+ - New subpath export `@keboola/design/vega`: `vegaTheme(scheme)` and
56
+ `useVegaTheme()` hand out the design system's chart look as a plain Vega-Lite
57
+ `Config` — transparent background, semantic axis/legend/title chrome, and
58
+ `range.category` filled with `--chart-1..5` in series order. Any consumer that
59
+ compiles or renders a Vega-Lite spec is now on-brand and follows the active
60
+ colour scheme and brand; previously the config was private to `FlintChart`, so
61
+ only a Flint spec could reach it. `FlintChart` imports it from the new module
62
+ and keeps only the Flint-specific series plumbing. Nothing about the rendered
63
+ Flint chart changes.
64
+
65
+ The config holds resolved `rgb(…)` strings rather than `var()` references —
66
+ vega does its colour maths in JS and never reads the stylesheet — so rebuild it
67
+ when the scheme or brand changes; `useVegaTheme()` does that for you.
68
+
69
+ ### Patch Changes
70
+
71
+ - Make the AI Kit `Question` card follow the colour scheme and the brand.
72
+
73
+ Every colour in the component was a primitive: the card was `bg-neutral-50`, its option
74
+ preview `border-neutral-200` + `bg-white`, the labels `text-neutral-800`/`-700`, the
75
+ header and step counter `text-neutral-500`, the row hovers `hover:bg-neutral-100` and the
76
+ footer rule `border-neutral-100`. None of those participate in the `[data-theme='dark']`
77
+ variable swap, so the whole card rendered as a light slab on the dark page — carrying the
78
+ dark scheme's light ink, which is light-on-light — and no customer brand reached any of
79
+ it.
80
+
81
+ They are now semantic tokens throughout: the card is `bg-card` + `text-card-foreground`,
82
+ the preview inset `bg-muted` + `text-foreground` + `border-border`, secondary text
83
+ `text-muted-foreground`, hovers `hover:bg-accent`, rules `border-border`. Labels that
84
+ just want the card's default ink now inherit it instead of restating a colour.
85
+
86
+ The card is `bg-card` rather than `bg-muted` because under the dark scheme `--muted` and
87
+ `--popover` are the same value (`` `#26262d` ``), so a muted card would collide with the
88
+ popover surface it can sit next to; `--card` (`` `#222228` ``) stays distinct from both
89
+ that and `background`. The inset takes `bg-muted`, matching how the AI Kit paints code
90
+ surfaces elsewhere.
91
+
92
+ Covered by a `Follows scheme (light)` / `Follows scheme (dark)` story pair that measures
93
+ rendered colours in a real browser: both painted surfaces must match the page's light/dark
94
+ polarity, and the question title and preview code must clear AA against the surface they
95
+ actually sit on. Reverting either fill fails the dark story.
96
+
97
+ - Make `CodeEditor` and `SqlEditor` legible under the dark colour scheme.
98
+
99
+ The theme called `githubLightInit` in both schemes, so only the editor chrome followed
100
+ the scheme while every syntax colour stayed a light-theme value. Measured on the two
101
+ dark surfaces — the plain variant paints on `background`, `variant="field"` on `muted` —
102
+ all eleven stock tokens failed AA on `muted` and only `atom`/`bool` cleared `background`.
103
+ The palette is now picked by scheme, and `githubDarkInit` clears AA for every token on
104
+ all four surfaces an editor paints on (tightest: `comment` at 4.89:1).
105
+
106
+ Also a light/dark pair for the two overrides that were single values: functions
107
+ (`purple[600]` → `300`, from 2.89:1) and special vars (`cyan` → `300`, from 3.81:1).
108
+ Special vars additionally move `700` → `800` in **light**, where the field surface was
109
+ 4.45:1 — the one visible light-scheme change.
110
+
111
+ The surfaces those editors paint follow, since a dark palette on a light slab is worse
112
+ than the light palette was:
113
+ - the unified merge wash forced `colors.white`, where the dark `foreground` is 1.25:1;
114
+ - search matches and the SQL run/error lines were opaque light pastels, and light search
115
+ matches were themselves below AA at 3.90:1 (now 5.42:1);
116
+ - the legacy `variant="field"` surface was a fixed `neutral[100]`, where the dark
117
+ `foreground` is 1.09:1;
118
+ - the read-only wash used `secondary`, which resolves lighter than `muted` under dark.
119
+
120
+ `caret` and `selectionMatch` are now pinned rather than inherited from whichever
121
+ initialiser ran — the caret was invisible in dark, painted black on the dark page.
122
+
123
+ Light gains four AA fixes of its own, each to the nearest step of our ramp in the same hue:
124
+ `keyword` (4.38:1 → 5.96:1), `comment` (4.40:1 on the field surface → 6.15:1), markdown
125
+ `quote` (4.43:1 → 7.15:1) and `invalid` (4.44:1 on the read-only wash → 7.81:1).
126
+
127
+ One light colour is deliberately left: `atom`/`bool` — JSON `true`/`false`/`null` — at
128
+ 3.34:1. The darker orange that would clear AA is the amber already carrying `string`, so
129
+ JSON would render `true` and `"text"` alike; it needs a hue rather than a ramp step, which
130
+ is a design call rather than a measurement.
131
+
132
+ `CONTRAST-AUDIT.md` grows an editor-palette section: every tag, both schemes, all four
133
+ surfaces an editor is painted on. Dark has no sub-AA rows; light has only the one above.
134
+
135
+ - Add `withCompletions` to `CodeEditor`, for a field where nothing should be completed.
136
+
137
+ An editable editor installs `autocompletion()`, so any language that publishes a word
138
+ list through language data opens a popup without the caller asking for one. Shell is the
139
+ only such mode we use as a stand-in for freeform text: `text/x-sh` offers 88 words —
140
+ `if`, `export`, plus `ls`, `curl`, `sudo`, `vim`, `zsh` and the rest of the command list.
141
+ `withCompletions={false}` silences every source, the language's included.
142
+
143
+ The gate only works because the plugin is now installed once. `basicSetup` was adding a
144
+ second, option-less `autocompletion()` on top of the one each editor installs itself, so
145
+ `CodeEditor`'s `readOnly ? [] : [autocompletion()]` had been deciding nothing since it was
146
+ written, and `SqlEditor`'s configured copy from `installExtensions` was competing with an
147
+ unconfigured one. `buildBasicSetup` turns basicSetup's off and leaves each editor its own.
148
+
149
+ A read-only editor therefore no longer gets the plugin at all, which is what that line
150
+ always claimed: until now Ctrl-Space could open a popup on a viewer.
151
+
152
+ - Update the CodeMirror suite (`@codemirror/view` 6.43.9, `@codemirror/commands` 6.11.0, `@uiw/codemirror-theme-github` 4.25.11) to pick up the upstream `posAtCoords` and Firefox 153+ selection fixes behind the editor crashes on click and drag-select
153
+
154
+ - The filled primary button clears WCAG-AA in the dark colour scheme.
155
+
156
+ Under `[data-theme='dark']` the default filled `Button` rendered white ink on the brand blue
157
+ (`--primary`, `#1f8fff`) at 14px / weight 500 — **3.27:1**, which axe-core reports `serious` and
158
+ which AA wants at 4.5:1. It was not one component's problem: every filled primary control shared
159
+ the pairing, and `components-button--default` only looked clean because that story renders the
160
+ tinted variant. The light scheme was never affected (white on `#2563eb` is 5.17:1).
161
+
162
+ The **label** carries the fix, not the fill: `--primary` is the brand's own colour, so darkening it
163
+ would cost brand fidelity and make `--primary` worse as link text on the dark background. Dark
164
+ `--primary-foreground` and `--sidebar-primary-foreground` become a hue-matched near-black
165
+ (`10 26 43`, i.e. `#0a1a2b`) — **5.38:1** — which is the pairing `gargoola`, `keboola-portal` and
166
+ `oncall` already ship in their own `colorsDark`. `keboola`'s `colorsDark.primaryForeground` moves
167
+ with the stylesheet; brands without a `colorsDark` block (`example-customer`, both legacy brands)
168
+ inherit it. Measured on a running Storybook, the three stories that carried the violation —
169
+ `components-button--block`, `patterns-modalform--default`, `patterns-authscreen--signed-out` —
170
+ now report zero axe `color-contrast` violations in dark for both `keboola` and `example-customer`.
171
+
172
+ `ToastAction` consumed `--primary-foreground` as its chip _surface_ rather than as ink on a primary
173
+ fill, so it takes a fixed `bg-white` instead. All four non-`default` toast variants are painted with
174
+ a scheme-blind primitive (`bg-error-550`, `bg-blue-600`, `bg-green-700`, `bg-warning-550`), so the
175
+ chip on them must not move with the scheme. Under `keboola` this renders identically to before; under
176
+ `gargoola`, `keboola-portal` and `oncall` — which already ship near-black dark `primaryForeground` —
177
+ the chip was a dark block on those fills, so for them it is a fix rather than a no-op.
178
+
179
+ Both dark `--sidebar-primary-foreground` and its light counterpart become `var(--primary-foreground)`,
180
+ matching `--sidebar-primary: var(--primary)` — the sidebar badge's ink now genuinely follows the
181
+ button's instead of repeating it as a literal.
182
+
183
+ Regression cover: `checkInteractiveContrast(keboola)` no longer reports
184
+ `dark:primary/primaryForeground`, and a new `tokenBlocks.test.ts` derives every `--x` /
185
+ `--x-foreground` pair out of `styles.css` — 13 per palette — and measures each against AA, so a
186
+ token pair added later is covered without editing the test. `CONTRAST-AUDIT.md` reports the same
187
+ ratios but cannot fail on one, so the gate is the test. The CSS block parser it needs is lifted out
188
+ of `scripts/contrast-audit.ts` into `src/tokenBlocks.ts` — one parser, now type-checked, and it
189
+ throws on an unclosed block instead of parsing to EOF. `KNOWN_BELOW_AA` records the ratio of each
190
+ pair still below AA (`light:muted` 4.34, `dark:destructive` 3.91, `dark:info` 2.37, `dark:success`
191
+ 2.01) and asserts it both ways, so a pinned pair cannot quietly get worse or stay pinned once fixed.
192
+
193
+ `contrast.test.ts` also picks up `oncall`, which had no contrast coverage at all; its one residual
194
+ (`light:accent/accentForeground`, 3.74:1) is now pinned.
195
+
196
+ - Paint native chrome in the theme the app pinned, not the operating system's.
197
+
198
+ `color-scheme` was declared nowhere, so a browser drew light-scheme scrollbars, spinners and form controls over a dark page — most visibly as a pale band along the bottom edge of any scrolling `Modal.Body`. `:root` now declares `light` and `[data-theme='dark']` declares `dark`, per theme rather than `light dark`, so the OS preference cannot override what `ThemeProvider` chose.
199
+
200
+ Embeds are held neutral. `color-scheme` inherits, and a third-party widget that ships a transparent body declares no scheme of its own; when an iframe element's scheme and its document's disagree, the browser stops honouring that transparency and paints the embedded canvas opaque. Left alone, the Jira Service Desk launcher became a white tile over the dark page.
201
+
202
+ - A Flint chart with a quantitative colour renders its data instead of solid black.
203
+
204
+ Every colour in the Flint theme was serialized space-separated (`rgb(31 143 255)`), and vega parses colours with d3-color 3.1, which answers `null` for that form. A flat fill survived it — the string reaches the SVG attribute and the browser parses it — but the sequential ramp behind a quantitative `color` field did not: both endpoints collapsed and the chart painted `rgb(0, 0, 0)`. The theme now emits the comma-separated form, and an integration test renders a heatmap through the real pipeline to hold it.
205
+
206
+ - `AIKit/Markdown` code surfaces follow the colour scheme and the brand.
207
+
208
+ Fenced blocks and inline code were painted with `neutral-50` / `neutral-800`, literals that cannot take part in the `[data-theme='dark']` variable swap. In dark mode `prose-invert` flipped the surrounding text to light while the pinned fill stayed near-white, leaving inline code unreadable. Both now use the semantic `muted` / `foreground` pair, the same one the stylesheet already gives a prose blockquote.
209
+
210
+ Typography's inverted palette pinned the ink of a fenced block and of code in a quote to `#c7254e` regardless of the fill beneath it — 2.72:1 once that fill follows the dark scheme. Both now inherit the surface they sit on, so the ink moves with the fill.
211
+
212
+ - `MultiCombobox` renders its Base UI root with `autoHighlight`, matching `Combobox`. Without it
213
+ nothing was highlighted while filtering, so Enter closed the popup without selecting — a typed
214
+ free-form value was dropped silently when `allowCreate` was on.
215
+
216
+ - Legacy (non-argo) `Select` chrome now follows the colour scheme.
217
+
218
+ `Select.Trigger` and `DateRangePicker`'s trigger share `overlayTriggerVariants`, whose `primary`
219
+ variant painted a fixed white fill with `neutral-800` ink and a `neutral-200` edge. The `neutral`
220
+ ramp is scheme-blind — `[data-theme='dark']` redefines only the semantic tokens — so wherever a
221
+ subtree renders legacy chrome, dark mode left the trigger as a white slab with near-black text
222
+ inside a dark panel. It now uses `input-background` / `foreground` / `input`, the same trio the
223
+ `primary` `InputGroup` beside it already used, so a trigger and an input in one row stay the same
224
+ colour.
225
+
226
+ The highlighted option in `Select` and `Combobox` had the matching defect: a fixed `neutral-100`
227
+ fill under a scheme-following `text-foreground`, leaving the label at roughly 1.05:1 in dark. It
228
+ now uses the `secondary` pair, which carries its own foreground. (`muted` is not usable there — in
229
+ dark it equals `popover`, so the band would disappear into the listbox instead.) `Combobox`'s check
230
+ indicator moves with the label it pairs with.
231
+
232
+ Scope: only the `primary` variant. `secondary` keeps its fixed `neutral-100` fill under
233
+ `neutral-800` ink and stays light-pinned in dark.
234
+
235
+ Light-scheme note: the trigger fill is unchanged (`input-background` resolves to white), but its
236
+ ink and border now come from the brand's `foreground` / `input` slots instead of the `neutral`
237
+ ramp, and the option highlight from `secondary` instead of `neutral-100`. Storybook visual
238
+ baselines for `Select`, `Combobox` and `DateRangePicker` move accordingly.
239
+
240
+ - `Truncated` now ellipsizes and reveals its tooltip when the text cannot wrap
241
+
242
+ `-webkit-line-clamp` draws its ellipsis only on text it wrapped itself, so text that
243
+ cannot wrap — an inherited `white-space: nowrap`, which `Button`'s non-legacy base class
244
+ set applies — was cut off mid-word with no ellipsis at all. Truncation is now also marked
245
+ with `text-overflow: ellipsis`, which covers the single-line case; the wrapped case is
246
+ unchanged.
247
+
248
+ The tooltip had the matching gap: overflow was measured on the vertical axis only, so a
249
+ single unwrappable line never counted as truncated and the full text stayed unreachable.
250
+ It is now detected on either axis.
251
+
252
+ - Updated dependencies:
253
+ - @keboola/codemirror-lang-sql@0.7.3
254
+ - @keboola/brand-registry@1.9.4
255
+ - @keboola/tailwind-config@1.1.2
256
+
3
257
  ## 11.2.0
4
258
 
5
259
  ### Minor Changes
package/COMPONENT-API.md CHANGED
@@ -483,7 +483,7 @@ Source: `src/components/BrandLogo/BrandLogo.tsx`
483
483
 
484
484
  Source: `src/blocks/AppShell/AppShell.tsx`
485
485
 
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.
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`) 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
487
 
488
488
  | Prop | Type | Required | Default | Description |
489
489
  | ------------ | -------------------- | -------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -1,18 +1,18 @@
1
1
  import { cn } from "./classNames-BzrkDnOD.js";
2
- import { Tooltip, TooltipProvider } from "./utils-D0c5VAyF.js";
2
+ import { Tooltip, TooltipProvider } from "./utils-B-g7d_Jb.js";
3
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";
4
+ import { Button } from "./Button-CPsEQuTN.js";
5
+ import { ClipboardButton } from "./ClipboardButton-CQ6Aewpg.js";
6
+ import { FullScreenModal, FullScreenModalBody, FullScreenModalHeader } from "./FullScreenModal-j-M4aPFd.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-yQq-O49c.js";
9
+ import { Command } from "./Command-Ds68v2rX.js";
10
+ import { TextInput } from "./TextInput-DhdRk8qm.js";
11
+ import { Checkbox } from "./Checkbox-5VNCcV7E.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";
15
+ import { DiagramSkeleton } from "./internal/blocks/DiagramShared/DiagramSkeleton.js";
16
16
  import { Avatar } from "./internal/components/Avatar.js";
17
17
  import { Progress } from "./internal/components/Progress.js";
18
18
  import { Slot } from "@radix-ui/react-slot";
@@ -113,7 +113,7 @@ const MermaidDiagram = lazy(() => import("@keboola/design/mermaid").then((module
113
113
  console.error("[AIKit] failed to load the MermaidDiagram chunk", error);
114
114
  return { default: ({ code }) => /* @__PURE__ */ jsx("pre", { children: /* @__PURE__ */ jsx("code", { children: code }) }) };
115
115
  }));
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";
116
+ 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
117
  const getText = (node) => {
118
118
  if (typeof node === "string") return node;
119
119
  if (typeof node === "number") return String(node);
@@ -878,7 +878,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
878
878
  else handleCustomFocus();
879
879
  };
880
880
  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),
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-card tw:text-card-foreground tw:shadow-lg", className),
882
882
  "data-testid": "question-root",
883
883
  "data-question-step": currentStep,
884
884
  "data-question-total-steps": totalSteps,
@@ -889,10 +889,10 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
889
889
  children: [/* @__PURE__ */ jsxs("div", {
890
890
  className: "tw:flex tw:min-w-0 tw:flex-1 tw:flex-col tw:gap-1",
891
891
  children: [/* @__PURE__ */ jsx("p", {
892
- className: "tw:m-0 tw:text-base tw:font-semibold tw:leading-6 tw:text-neutral-800",
892
+ className: "tw:m-0 tw:text-base tw:font-semibold tw:leading-6",
893
893
  children: question
894
894
  }), header && /* @__PURE__ */ jsx("p", {
895
- className: "tw:m-0 tw:text-xs tw:leading-4 tw:text-neutral-500",
895
+ className: "tw:m-0 tw:text-xs tw:leading-4 tw:text-muted-foreground",
896
896
  children: header
897
897
  })]
898
898
  }), onClose && /* @__PURE__ */ jsx(Button, {
@@ -909,7 +909,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
909
909
  children: /* @__PURE__ */ jsxs("div", {
910
910
  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
911
  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",
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-accent",
913
913
  onClick: () => handleOptionToggle(option.id),
914
914
  onKeyDown: handleKeyDown(() => handleOptionToggle(option.id)),
915
915
  role: "button",
@@ -925,16 +925,17 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
925
925
  children: [/* @__PURE__ */ jsxs("div", {
926
926
  className: "tw:flex tw:flex-col tw:gap-1.5",
927
927
  children: [/* @__PURE__ */ jsx("span", {
928
- className: "tw:text-sm tw:font-medium tw:leading-none tw:text-neutral-800",
928
+ className: "tw:text-sm tw:font-medium tw:leading-none",
929
929
  children: option.label
930
930
  }), option.description && /* @__PURE__ */ jsx("span", {
931
931
  className: "tw:text-sm tw:font-normal tw:leading-5 tw:text-muted-foreground",
932
932
  children: option.description
933
933
  })]
934
934
  }), 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"),
935
+ "data-testid": "question-option-preview",
936
+ 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
937
  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",
938
+ 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
939
  children: option.preview
939
940
  })
940
941
  })]
@@ -942,7 +943,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
942
943
  }, option.id)), showCustomAnswer && /* @__PURE__ */ jsxs("div", {
943
944
  className: "tw:flex tw:flex-col tw:gap-2",
944
945
  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",
946
+ 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
947
  onClick: handleCustomRowClick,
947
948
  onKeyDown: handleKeyDown(handleCustomRowClick),
948
949
  role: "button",
@@ -953,7 +954,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
953
954
  onClick: (e) => e.stopPropagation(),
954
955
  className: "tw:shrink-0"
955
956
  }), /* @__PURE__ */ jsx("span", {
956
- className: cn("tw:text-sm tw:font-medium tw:leading-none", !multiSelect && isCustomSelected ? "tw:text-primary" : "tw:text-neutral-800"),
957
+ className: cn("tw:text-sm tw:font-medium tw:leading-none", !multiSelect && isCustomSelected && "tw:text-primary"),
957
958
  children: "Other"
958
959
  })]
959
960
  }), /* @__PURE__ */ jsx(TextInput, {
@@ -980,7 +981,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
980
981
  value: progressValue,
981
982
  className: "tw:rounded-none"
982
983
  }), /* @__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"),
984
+ 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
985
  children: [
985
986
  hasSteps && /* @__PURE__ */ jsxs("div", {
986
987
  className: "tw:flex tw:items-center tw:gap-2",
@@ -994,7 +995,7 @@ const Question = ({ question, header, options, multiSelect = true, selectedOptio
994
995
  children: /* @__PURE__ */ jsx(ChevronLeft, { className: cn("tw:size-5", isFirstStep ? "tw:text-primary/25" : "tw:text-primary") })
995
996
  }),
996
997
  /* @__PURE__ */ jsxs("span", {
997
- className: "tw:text-xs tw:leading-4 tw:text-neutral-500",
998
+ className: "tw:text-xs tw:leading-4 tw:text-muted-foreground",
998
999
  children: [
999
1000
  currentStep,
1000
1001
  " of ",
@@ -1317,4 +1318,4 @@ const UsageStats = ({ value, alert = false, children, className, ariaLabel, alig
1317
1318
  //#endregion
1318
1319
  export { AnswerSummary, CollapsibleStepHeader, InlineStepDetail, InlineStepLabel, Markdown, MessageBubble, PlanApproval, PlanRewritingIndicator, PromptInput, Question, QuestionBlock, SuggestedPrompt, ThinkingIndicator, ToolCallApproval, ToolCallChip, UsageStats, UsageStatsRing };
1319
1320
 
1320
- //# sourceMappingURL=AIKit-DiS0CVOW.js.map
1321
+ //# sourceMappingURL=AIKit-DaFT7p92.js.map