@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.
- package/AGENTS.md +25 -14
- package/CHANGELOG.md +254 -0
- package/COMPONENT-API.md +1 -1
- package/dist/{AIKit-DiS0CVOW.js → AIKit-DaFT7p92.js} +23 -22
- package/dist/AIKit-DaFT7p92.js.map +1 -0
- package/dist/{Alert-DfZq9kGe.js → Alert-CseY3yAj.js} +3 -3
- package/dist/{Alert-DfZq9kGe.js.map → Alert-CseY3yAj.js.map} +1 -1
- package/dist/{AlertModal-Dp_XuJBW.js → AlertModal-DQAGpsEy.js} +3 -3
- package/dist/{AlertModal-Dp_XuJBW.js.map → AlertModal-DQAGpsEy.js.map} +1 -1
- package/dist/{AppShell-B5GQN6Zs.js → AppShell-BUoxM3fv.js} +29 -10
- package/dist/AppShell-BUoxM3fv.js.map +1 -0
- package/dist/{BrandEditor-DyzgfVkl.js → BrandEditor-BnTLMRMp.js} +6 -6
- package/dist/{BrandEditor-DyzgfVkl.js.map → BrandEditor-BnTLMRMp.js.map} +1 -1
- package/dist/{BrandLogo-CJkRd0F8.js → BrandLogo-V2pRUAeO.js} +2 -2
- package/dist/{BrandLogo-CJkRd0F8.js.map → BrandLogo-V2pRUAeO.js.map} +1 -1
- package/dist/{Breadcrumb-Frst8MTA.js → Breadcrumb-CQTPn_KB.js} +3 -3
- package/dist/{Breadcrumb-Frst8MTA.js.map → Breadcrumb-CQTPn_KB.js.map} +1 -1
- package/dist/{Button-6xBX0nNl.js → Button-CPsEQuTN.js} +2 -2
- package/dist/{Button-6xBX0nNl.js.map → Button-CPsEQuTN.js.map} +1 -1
- package/dist/{Card-BAoZ35CV.js → Card-Cd5HSBmv.js} +2 -2
- package/dist/{Card-BAoZ35CV.js.map → Card-Cd5HSBmv.js.map} +1 -1
- package/dist/{Checkbox-GJ8-srt4.js → Checkbox-5VNCcV7E.js} +3 -3
- package/dist/{Checkbox-GJ8-srt4.js.map → Checkbox-5VNCcV7E.js.map} +1 -1
- package/dist/{Clipboard-CBJZiviP.js → Clipboard-B7rckqV_.js} +2 -2
- package/dist/{Clipboard-CBJZiviP.js.map → Clipboard-B7rckqV_.js.map} +1 -1
- package/dist/{ClipboardButton-ClcluT0C.js → ClipboardButton-CQ6Aewpg.js} +3 -3
- package/dist/{ClipboardButton-ClcluT0C.js.map → ClipboardButton-CQ6Aewpg.js.map} +1 -1
- package/dist/{CodeEditor-DyaN-Ij2.js → CodeEditor-CUse8znx.js} +237 -95
- package/dist/CodeEditor-CUse8znx.js.map +1 -0
- package/dist/{ColorInput-B8z4j4Y_.js → ColorInput-Q1D9Vcc_.js} +3 -3
- package/dist/{ColorInput-B8z4j4Y_.js.map → ColorInput-Q1D9Vcc_.js.map} +1 -1
- package/dist/{ColorModeSwitch-dZFZyqy1.js → ColorModeSwitch-B5PXCVqB.js} +3 -3
- package/dist/{ColorModeSwitch-dZFZyqy1.js.map → ColorModeSwitch-B5PXCVqB.js.map} +1 -1
- package/dist/{Combobox-Dgm6Z4ib.js → Combobox-CyoRA7oY.js} +5 -5
- package/dist/Combobox-CyoRA7oY.js.map +1 -0
- package/dist/{Command-C0aZfVTq.js → Command-Ds68v2rX.js} +3 -3
- package/dist/{Command-C0aZfVTq.js.map → Command-Ds68v2rX.js.map} +1 -1
- package/dist/{CopyField-BJ96zvXs.js → CopyField-DI66uY_g.js} +2 -2
- package/dist/{CopyField-BJ96zvXs.js.map → CopyField-DI66uY_g.js.map} +1 -1
- package/dist/{DateInput-B3UdzRfW.js → DateInput-BPj2pzsn.js} +4 -4
- package/dist/{DateInput-B3UdzRfW.js.map → DateInput-BPj2pzsn.js.map} +1 -1
- package/dist/{DatePicker-Dw3DpbUh.js → DatePicker-DyEGuW9m.js} +2 -2
- package/dist/{DatePicker-Dw3DpbUh.js.map → DatePicker-DyEGuW9m.js.map} +1 -1
- package/dist/{DateRangeInput-DTuySEiq.js → DateRangeInput-u9DxNbHW.js} +4 -4
- package/dist/{DateRangeInput-DTuySEiq.js.map → DateRangeInput-u9DxNbHW.js.map} +1 -1
- package/dist/{DateRangePicker-DCmMHg4s.js → DateRangePicker-CYYhX6S7.js} +6 -6
- package/dist/{DateRangePicker-DCmMHg4s.js.map → DateRangePicker-CYYhX6S7.js.map} +1 -1
- package/dist/{DropdownMenu-t90tVw6l.js → DropdownMenu-DpMEcyCq.js} +2 -2
- package/dist/{DropdownMenu-t90tVw6l.js.map → DropdownMenu-DpMEcyCq.js.map} +1 -1
- package/dist/{FieldItem-D-h1NeBo.js → FieldItem-qQKGU9lF.js} +3 -3
- package/dist/{FieldItem-D-h1NeBo.js.map → FieldItem-qQKGU9lF.js.map} +1 -1
- package/dist/{FieldItem-CAPj9lj3.d.ts → FieldItem-vhIJW4pj.d.ts} +2 -10
- package/dist/{FileUpload-BRv0TaZk.js → FileUpload-C336MVnU.js} +2 -2
- package/dist/{FileUpload-BRv0TaZk.js.map → FileUpload-C336MVnU.js.map} +1 -1
- package/dist/{Form-DHvcFoEi.js → Form-CTygENDc.js} +8 -8
- package/dist/{Form-DHvcFoEi.js.map → Form-CTygENDc.js.map} +1 -1
- package/dist/{FormGroup-C41n65cE.js → FormGroup-BnwP0jNu.js} +3 -3
- package/dist/{FormGroup-C41n65cE.js.map → FormGroup-BnwP0jNu.js.map} +1 -1
- package/dist/{FullScreenModal-Cb3PGgh4.js → FullScreenModal-j-M4aPFd.js} +3 -3
- package/dist/{FullScreenModal-Cb3PGgh4.js.map → FullScreenModal-j-M4aPFd.js.map} +1 -1
- package/dist/{HoverCard-WfDkLK1s.js → HoverCard-yQq-O49c.js} +2 -2
- package/dist/{HoverCard-WfDkLK1s.js.map → HoverCard-yQq-O49c.js.map} +1 -1
- package/dist/{InputGroup-CdTq8H7c.js → InputGroup-D7zlmqPB.js} +3 -3
- package/dist/{InputGroup-CdTq8H7c.js.map → InputGroup-D7zlmqPB.js.map} +1 -1
- package/dist/{Kbd-CxHAo1oo.js → Kbd-D6LpR7G2.js} +2 -2
- package/dist/{Kbd-CxHAo1oo.js.map → Kbd-D6LpR7G2.js.map} +1 -1
- package/dist/{MermaidDiagram-ChL3WIQT.js → MermaidDiagram-JlvuGcY-.js} +6 -87
- package/dist/MermaidDiagram-JlvuGcY-.js.map +1 -0
- package/dist/{Modal-wqG8nJiK.js → Modal-o4ATIexE.js} +3 -3
- package/dist/{Modal-wqG8nJiK.js.map → Modal-o4ATIexE.js.map} +1 -1
- package/dist/{MultiActionButtonGroup-BiIIubiL.js → MultiActionButtonGroup-GTeFk-L8.js} +3 -3
- package/dist/{MultiActionButtonGroup-BiIIubiL.js.map → MultiActionButtonGroup-GTeFk-L8.js.map} +1 -1
- package/dist/{Navbar-BfaPeLUL.js → Navbar-CAQs4BZz.js} +2 -2
- package/dist/{Navbar-BfaPeLUL.js.map → Navbar-CAQs4BZz.js.map} +1 -1
- package/dist/{PageToolbar-OQg3mPF-.js → PageToolbar-bG2YtSa3.js} +3 -3
- package/dist/{PageToolbar-OQg3mPF-.js.map → PageToolbar-bG2YtSa3.js.map} +1 -1
- package/dist/{Pagination-Cjfda8KG.js → Pagination-BB3X7ooY.js} +2 -2
- package/dist/{Pagination-Cjfda8KG.js.map → Pagination-BB3X7ooY.js.map} +1 -1
- package/dist/{Popconfirm-D7_vfxFd.js → Popconfirm-C2Ky5hJO.js} +3 -3
- package/dist/{Popconfirm-D7_vfxFd.js.map → Popconfirm-C2Ky5hJO.js.map} +1 -1
- package/dist/{Popover-CzeHjvrB.js → Popover-DsbI2HKu.js} +2 -2
- package/dist/{Popover-CzeHjvrB.js.map → Popover-DsbI2HKu.js.map} +1 -1
- package/dist/{RadioGroup-sIveSsNa.js → RadioGroup-BMxuZEbT.js} +3 -3
- package/dist/{RadioGroup-sIveSsNa.js.map → RadioGroup-BMxuZEbT.js.map} +1 -1
- package/dist/{Search-3UiqNZRj.js → Search-DFeECt5D.js} +2 -2
- package/dist/{Search-3UiqNZRj.js.map → Search-DFeECt5D.js.map} +1 -1
- package/dist/{SearchInput-C7dF_Ir-.js → SearchInput-CCpdUego.js} +3 -3
- package/dist/{SearchInput-C7dF_Ir-.js.map → SearchInput-CCpdUego.js.map} +1 -1
- package/dist/{SectionNav-8NoTOKO8.js → SectionNav-Bw_MVL0_.js} +4 -4
- package/dist/{SectionNav-8NoTOKO8.js.map → SectionNav-Bw_MVL0_.js.map} +1 -1
- package/dist/{Select-Is0VkePH.js → Select-D6IZVvwL.js} +5 -5
- package/dist/Select-D6IZVvwL.js.map +1 -0
- package/dist/{Sheet-Dw9BDvjI.js → Sheet-BIzs2K2H.js} +3 -3
- package/dist/{Sheet-Dw9BDvjI.js.map → Sheet-BIzs2K2H.js.map} +1 -1
- package/dist/{Sidebar-Dcb4rinA.js → Sidebar-r1TW4g_b.js} +5 -5
- package/dist/{Sidebar-Dcb4rinA.js.map → Sidebar-r1TW4g_b.js.map} +1 -1
- package/dist/{Slider-BOPfMOMm.js → Slider-CjxyfEty.js} +3 -3
- package/dist/{Slider-BOPfMOMm.js.map → Slider-CjxyfEty.js.map} +1 -1
- package/dist/{Switch-CX2A0v50.js → Switch-BueTV03C.js} +2 -2
- package/dist/{Switch-CX2A0v50.js.map → Switch-BueTV03C.js.map} +1 -1
- package/dist/{Tabs-UMQuDoW8.js → Tabs-l72-WuhK.js} +2 -2
- package/dist/{Tabs-UMQuDoW8.js.map → Tabs-l72-WuhK.js.map} +1 -1
- package/dist/{TextInput-CMuN1WfY.js → TextInput-DhdRk8qm.js} +3 -3
- package/dist/{TextInput-CMuN1WfY.js.map → TextInput-DhdRk8qm.js.map} +1 -1
- package/dist/{ThemeProvider-QncUrfJn.js → ThemeProvider-DZfGdf1v.js} +5 -4
- package/dist/{ThemeProvider-QncUrfJn.js.map → ThemeProvider-DZfGdf1v.js.map} +1 -1
- package/dist/{TimePicker-D9zktB8A.js → TimePicker-B6d2rAbX.js} +2 -2
- package/dist/{TimePicker-D9zktB8A.js.map → TimePicker-B6d2rAbX.js.map} +1 -1
- package/dist/{Toast-DQSbs3oA.js → Toast-CxXUulYN.js} +2 -2
- package/dist/{Toast-DQSbs3oA.js.map → Toast-CxXUulYN.js.map} +1 -1
- package/dist/{ZoomableSvg-CZEu6sAq.js → ZoomableSvg-CNIzRHKH.js} +4 -4
- package/dist/{ZoomableSvg-CZEu6sAq.js.map → ZoomableSvg-CNIzRHKH.js.map} +1 -1
- package/dist/{context-KxxeMHbR.js → context-BrNtMc1H.js} +3 -33
- package/dist/context-BrNtMc1H.js.map +1 -0
- package/dist/defaults-CTfvj2KB.js +34 -0
- package/dist/defaults-CTfvj2KB.js.map +1 -0
- package/dist/editors.d.ts +12 -2
- package/dist/editors.js +20 -12
- package/dist/editors.js.map +1 -1
- package/dist/flint.d.ts +15 -0
- package/dist/flint.js +212 -0
- package/dist/flint.js.map +1 -0
- package/dist/index.d.ts +49 -7
- package/dist/index.js +57 -55
- package/dist/internal/blocks/AIKit.js +1 -1
- package/dist/internal/blocks/AppShell.js +2 -2
- package/dist/internal/blocks/BrandEditor.js +1 -1
- package/dist/internal/blocks/ChartPanel.js +1 -1
- package/dist/internal/blocks/ClipboardButton.js +1 -1
- package/dist/internal/blocks/ColorInput.js +1 -1
- package/dist/internal/blocks/ColorModeSwitch.js +1 -1
- package/dist/internal/blocks/Command.js +1 -1
- package/dist/internal/blocks/CopyField.js +1 -1
- package/dist/internal/blocks/DateInput.js +1 -1
- package/dist/internal/blocks/DateRangeInput.js +1 -1
- package/dist/{DiagramSkeleton-lwBS2YBa.js → internal/blocks/DiagramShared/DiagramSkeleton.js} +3 -3
- package/dist/internal/blocks/DiagramShared/DiagramSkeleton.js.map +1 -0
- package/dist/internal/blocks/EmptyConfigurationActionCard.js +1 -1
- package/dist/internal/blocks/ErrorState.js +1 -1
- package/dist/internal/blocks/ExportMenu.js +3 -3
- package/dist/internal/blocks/Form/connectors/MultiComboboxField.js +1 -1
- package/dist/internal/blocks/Form.js +1 -1
- package/dist/internal/blocks/FormGroup.js +1 -1
- package/dist/internal/blocks/MultiActionButtonGroup.js +1 -1
- package/dist/internal/blocks/MultiCombobox.js +4 -3
- package/dist/internal/blocks/MultiCombobox.js.map +1 -1
- package/dist/internal/blocks/NumberInput.js +1 -1
- package/dist/internal/blocks/PageToolbar.js +1 -1
- package/dist/internal/blocks/PasswordInput.js +2 -2
- package/dist/internal/blocks/SearchInput.js +1 -1
- package/dist/internal/blocks/SearchInputWithNavigation.js +3 -3
- package/dist/internal/blocks/SectionNav.js +1 -1
- package/dist/internal/blocks/SplitButton.js +2 -2
- package/dist/internal/blocks/StatCard.js +1 -1
- package/dist/internal/blocks/TextInput.js +1 -1
- package/dist/internal/blocks/Textarea.js +1 -1
- package/dist/internal/blocks/TimeInput.js +3 -3
- package/dist/internal/components/Alert.js +1 -1
- package/dist/internal/components/AlertModal.js +1 -1
- package/dist/internal/components/Avatar.js +1 -1
- package/dist/internal/components/BrandLogo.js +1 -1
- package/dist/internal/components/Breadcrumb.js +1 -1
- package/dist/internal/components/Button.js +1 -1
- package/dist/internal/components/Card.js +1 -1
- package/dist/internal/components/Checkbox.js +1 -1
- package/dist/internal/components/Clipboard.js +1 -1
- package/dist/internal/components/CollapsiblePanel.js +1 -1
- package/dist/internal/components/Combobox.js +1 -1
- package/dist/internal/components/DatePicker.js +1 -1
- package/dist/internal/components/DateRangePicker.js +1 -1
- package/dist/internal/components/DropdownMenu.js +1 -1
- package/dist/internal/components/FileUpload.js +1 -1
- package/dist/internal/components/FullScreenModal.js +1 -1
- package/dist/internal/components/HoverCard.js +1 -1
- package/dist/internal/components/InputGroup.js +1 -1
- package/dist/internal/components/Kbd.js +1 -1
- package/dist/internal/components/Modal.js +1 -1
- package/dist/internal/components/Navbar.js +1 -1
- package/dist/internal/components/Pagination.js +1 -1
- package/dist/internal/components/Popconfirm.js +1 -1
- package/dist/internal/components/Popover.js +1 -1
- package/dist/internal/components/RadioGroup.js +1 -1
- package/dist/internal/components/Search.js +1 -1
- package/dist/internal/components/Select.js +1 -1
- package/dist/internal/components/Sheet.js +1 -1
- package/dist/internal/components/Sidebar.js +1 -1
- package/dist/internal/components/Slider.js +1 -1
- package/dist/internal/components/Switch.js +1 -1
- package/dist/internal/components/Tabs.js +1 -1
- package/dist/internal/components/ThemeProvider.js +3 -2
- package/dist/internal/components/TimePicker.js +1 -1
- package/dist/internal/components/Toast.js +2 -2
- package/dist/internal/components/Tooltip.js +1 -1
- package/dist/internal/components/Truncated.js +16 -8
- package/dist/internal/components/Truncated.js.map +1 -1
- package/dist/internal/components/ZoomableSvg.js +1 -1
- package/dist/internal/utils.js +1 -1
- package/dist/markdown-editor.js +7 -7
- package/dist/mermaid.js +1 -1
- package/dist/rjsf.js +11 -11
- package/dist/{styles-DSUP_-9Z.js → styles-BAFscjSV.js} +4 -3
- package/dist/styles-BAFscjSV.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/svgTransforms-C9njt92h.js +89 -0
- package/dist/svgTransforms-C9njt92h.js.map +1 -0
- package/dist/testing.js +3 -2
- package/dist/testing.js.map +1 -1
- package/dist/{themeTokens-BNg98Mu9.js → themeTokens-7T1AFLhq.js} +13 -6
- package/dist/{themeTokens-BNg98Mu9.js.map → themeTokens-7T1AFLhq.js.map} +1 -1
- package/dist/{toast-CjkURw0M.js → toast-BweSoKn3.js} +3 -3
- package/dist/toast-BweSoKn3.js.map +1 -0
- package/dist/types-BPcAjMG0.d.ts +10 -0
- package/dist/{useColorSchemeState-CYqcUfSH.js → useColorSchemeState-BJEk6esG.js} +2 -2
- package/dist/{useColorSchemeState-CYqcUfSH.js.map → useColorSchemeState-BJEk6esG.js.map} +1 -1
- package/dist/{utils-D0c5VAyF.js → utils-B-g7d_Jb.js} +2 -2
- package/dist/{utils-D0c5VAyF.js.map → utils-B-g7d_Jb.js.map} +1 -1
- package/dist/vega.d.ts +46 -0
- package/dist/vega.js +26 -0
- package/dist/vega.js.map +1 -0
- package/dist/vegaTheme-FBXgAdHK.js +146 -0
- package/dist/vegaTheme-FBXgAdHK.js.map +1 -0
- package/package.json +26 -7
- package/src/styles.css +27 -4
- package/dist/AIKit-DiS0CVOW.js.map +0 -1
- package/dist/AppShell-B5GQN6Zs.js.map +0 -1
- package/dist/CodeEditor-DyaN-Ij2.js.map +0 -1
- package/dist/Combobox-Dgm6Z4ib.js.map +0 -1
- package/dist/DiagramSkeleton-lwBS2YBa.js.map +0 -1
- package/dist/MermaidDiagram-ChL3WIQT.js.map +0 -1
- package/dist/Select-Is0VkePH.js.map +0 -1
- package/dist/context-KxxeMHbR.js.map +0 -1
- package/dist/styles-DSUP_-9Z.js.map +0 -1
- 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/
|
|
31
|
-
| `@keboola/design/
|
|
32
|
-
| `@keboola/design/
|
|
33
|
-
| `@keboola/design/
|
|
34
|
-
| `@keboola/design/
|
|
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,
|
|
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
|
|
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 `
|
|
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-
|
|
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-
|
|
5
|
-
import { ClipboardButton } from "./ClipboardButton-
|
|
6
|
-
import { FullScreenModal, FullScreenModalBody, FullScreenModalHeader } from "./FullScreenModal-
|
|
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-
|
|
9
|
-
import { Command } from "./Command-
|
|
10
|
-
import { TextInput } from "./TextInput-
|
|
11
|
-
import { Checkbox } from "./Checkbox-
|
|
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
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
1321
|
+
//# sourceMappingURL=AIKit-DaFT7p92.js.map
|