@keboola/design 12.0.0 → 13.0.1

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 (169) hide show
  1. package/AGENTS.md +12 -7
  2. package/CHANGELOG.md +101 -0
  3. package/COMPONENT-API.md +15 -5
  4. package/dist/{AIKit-BD4r7ff-.js → AIKit-VB7CXeQk.js} +23 -11
  5. package/dist/AIKit-VB7CXeQk.js.map +1 -0
  6. package/dist/{AlertModal-Th2khjPi.js → AlertModal-mbSnuuka.js} +5 -5
  7. package/dist/AlertModal-mbSnuuka.js.map +1 -0
  8. package/dist/{Badge-DIjhwPvh.js → Badge-Dz0cj6rj.js} +2 -2
  9. package/dist/{Badge-DIjhwPvh.js.map → Badge-Dz0cj6rj.js.map} +1 -1
  10. package/dist/{BrandEditor-BU23Vl8V.js → BrandEditor-P8OZX2hi.js} +7 -7
  11. package/dist/{BrandEditor-BU23Vl8V.js.map → BrandEditor-P8OZX2hi.js.map} +1 -1
  12. package/dist/{Breadcrumb-p9HtMLCc.js → Breadcrumb-BUoAZyhO.js} +2 -2
  13. package/dist/{Breadcrumb-p9HtMLCc.js.map → Breadcrumb-BUoAZyhO.js.map} +1 -1
  14. package/dist/{Button-Ca4Q3VJU.js → Button-B21oVcPU.js} +3 -4
  15. package/dist/Button-B21oVcPU.js.map +1 -0
  16. package/dist/{Card-Cr9MBNHu.js → Card-BQmBWHXl.js} +32 -4
  17. package/dist/Card-BQmBWHXl.js.map +1 -0
  18. package/dist/{ClipboardButton-DHa1trtI.js → ClipboardButton-srUgWgwH.js} +2 -2
  19. package/dist/{ClipboardButton-DHa1trtI.js.map → ClipboardButton-srUgWgwH.js.map} +1 -1
  20. package/dist/{CodeEditor-BSo-oLFG.js → CodeEditor-jZMw1ioj.js} +2 -2
  21. package/dist/{CodeEditor-BSo-oLFG.js.map → CodeEditor-jZMw1ioj.js.map} +1 -1
  22. package/dist/{ColorInput-DSMqrs2-.js → ColorInput-B3gBZ8Ya.js} +2 -2
  23. package/dist/{ColorInput-DSMqrs2-.js.map → ColorInput-B3gBZ8Ya.js.map} +1 -1
  24. package/dist/{ColorModeSwitch-D7EuWyJz.js → ColorModeSwitch-BBzn1D0u.js} +3 -3
  25. package/dist/{ColorModeSwitch-D7EuWyJz.js.map → ColorModeSwitch-BBzn1D0u.js.map} +1 -1
  26. package/dist/{Combobox-CxRAYOBt.js → Combobox-BNhW0TDB.js} +22 -10
  27. package/dist/Combobox-BNhW0TDB.js.map +1 -0
  28. package/dist/{Command-BU_cVurn.js → Command-BQPiZCNz.js} +2 -2
  29. package/dist/{Command-BU_cVurn.js.map → Command-BQPiZCNz.js.map} +1 -1
  30. package/dist/{CopyField-6_c-NdLO.js → CopyField-Ba7h8MqZ.js} +3 -3
  31. package/dist/CopyField-Ba7h8MqZ.js.map +1 -0
  32. package/dist/{DateInput-DyEErfJf.js → DateInput-D0nWUasV.js} +2 -2
  33. package/dist/{DateInput-DyEErfJf.js.map → DateInput-D0nWUasV.js.map} +1 -1
  34. package/dist/{DateRangeInput-Dg7-VUd9.js → DateRangeInput-i6wE45-V.js} +2 -2
  35. package/dist/{DateRangeInput-Dg7-VUd9.js.map → DateRangeInput-i6wE45-V.js.map} +1 -1
  36. package/dist/{DateRangePicker-BoPnh4aH.js → DateRangePicker-BAnuz6vO.js} +2 -2
  37. package/dist/{DateRangePicker-BoPnh4aH.js.map → DateRangePicker-BAnuz6vO.js.map} +1 -1
  38. package/dist/{DropdownMenu-gRM-A8qU.js → DropdownMenu-C5FLPkvR.js} +12 -24
  39. package/dist/DropdownMenu-C5FLPkvR.js.map +1 -0
  40. package/dist/{FieldItem-2wMXQ0Qw.js → FieldItem-BHViBJS3.js} +2 -2
  41. package/dist/{FieldItem-2wMXQ0Qw.js.map → FieldItem-BHViBJS3.js.map} +1 -1
  42. package/dist/{FileUpload-C83tXuE2.js → FileUpload-Ch2hrIWq.js} +2 -2
  43. package/dist/{FileUpload-C83tXuE2.js.map → FileUpload-Ch2hrIWq.js.map} +1 -1
  44. package/dist/{Form-95rVLfX8.js → Form-VkzfVPyT.js} +5 -5
  45. package/dist/{Form-95rVLfX8.js.map → Form-VkzfVPyT.js.map} +1 -1
  46. package/dist/{FormGroup-CmNiAtU6.js → FormGroup-CmCppxOn.js} +3 -3
  47. package/dist/{FormGroup-CmNiAtU6.js.map → FormGroup-CmCppxOn.js.map} +1 -1
  48. package/dist/{FullScreenModal-CD7mYeTz.js → FullScreenModal-Cwnm8WdM.js} +2 -2
  49. package/dist/{FullScreenModal-CD7mYeTz.js.map → FullScreenModal-Cwnm8WdM.js.map} +1 -1
  50. package/dist/{InputGroup-B4QOPxHl.js → InputGroup-CrlMRz4X.js} +2 -2
  51. package/dist/{InputGroup-B4QOPxHl.js.map → InputGroup-CrlMRz4X.js.map} +1 -1
  52. package/dist/{MermaidDiagram-BQvz6bhv.js → MermaidDiagram-B30x2yV7.js} +2 -2
  53. package/dist/{MermaidDiagram-BQvz6bhv.js.map → MermaidDiagram-B30x2yV7.js.map} +1 -1
  54. package/dist/{Modal-Driyqs_N.js → Modal-BkSuS9Yz.js} +2 -2
  55. package/dist/{Modal-Driyqs_N.js.map → Modal-BkSuS9Yz.js.map} +1 -1
  56. package/dist/{MultiActionButtonGroup-BPnmzBtw.js → MultiActionButtonGroup-AWLj1Tg7.js} +2 -2
  57. package/dist/{MultiActionButtonGroup-BPnmzBtw.js.map → MultiActionButtonGroup-AWLj1Tg7.js.map} +1 -1
  58. package/dist/{PageToolbar-DOAtAnfL.js → PageToolbar-C06RKIif.js} +3 -3
  59. package/dist/{PageToolbar-DOAtAnfL.js.map → PageToolbar-C06RKIif.js.map} +1 -1
  60. package/dist/{Pagination-LaSg-5cl.js → Pagination-DH3f6LN0.js} +2 -2
  61. package/dist/{Pagination-LaSg-5cl.js.map → Pagination-DH3f6LN0.js.map} +1 -1
  62. package/dist/{Popconfirm-SLz0zodk.js → Popconfirm-Dhzn7sy6.js} +2 -2
  63. package/dist/{Popconfirm-SLz0zodk.js.map → Popconfirm-Dhzn7sy6.js.map} +1 -1
  64. package/dist/{RadioGroup-CBPRLRN0.js → RadioGroup-CYEp8Wnx.js} +3 -116
  65. package/dist/RadioGroup-CYEp8Wnx.js.map +1 -0
  66. package/dist/{SearchInput-CEfQDNl3.js → SearchInput-D3qMkHaW.js} +2 -2
  67. package/dist/{SearchInput-CEfQDNl3.js.map → SearchInput-D3qMkHaW.js.map} +1 -1
  68. package/dist/{SectionNav-B_qf0AXi.js → SectionNav-BTBiitiQ.js} +4 -4
  69. package/dist/{SectionNav-B_qf0AXi.js.map → SectionNav-BTBiitiQ.js.map} +1 -1
  70. package/dist/{Select-ByRvkZ3D.js → Select-B4uK0QVm.js} +4 -3
  71. package/dist/Select-B4uK0QVm.js.map +1 -0
  72. package/dist/{Sheet-C-yXk5Da.js → Sheet-D0fAE14T.js} +2 -2
  73. package/dist/{Sheet-C-yXk5Da.js.map → Sheet-D0fAE14T.js.map} +1 -1
  74. package/dist/{Sidebar-Ds0E6PbR.js → Sidebar-BTv636Cq.js} +4 -4
  75. package/dist/{Sidebar-Ds0E6PbR.js.map → Sidebar-BTv636Cq.js.map} +1 -1
  76. package/dist/{Slider-DWdu9NuM.js → Slider-B0ou9r0B.js} +2 -2
  77. package/dist/{Slider-DWdu9NuM.js.map → Slider-B0ou9r0B.js.map} +1 -1
  78. package/dist/{Tabs-Dt9oLYHC.js → Tabs-CTDmye1N.js} +2 -2
  79. package/dist/{Tabs-Dt9oLYHC.js.map → Tabs-CTDmye1N.js.map} +1 -1
  80. package/dist/{TextInput-CDG2XpBl.js → TextInput-BWYXbfs4.js} +2 -2
  81. package/dist/{TextInput-CDG2XpBl.js.map → TextInput-BWYXbfs4.js.map} +1 -1
  82. package/dist/{ThemeProvider-DXsxFg1U.js → ThemeProvider-VF38VfUa.js} +3 -3
  83. package/dist/{ThemeProvider-DXsxFg1U.js.map → ThemeProvider-VF38VfUa.js.map} +1 -1
  84. package/dist/{ZoomableSvg-BzXVfgnI.js → ZoomableSvg-C65nta_r.js} +3 -3
  85. package/dist/{ZoomableSvg-BzXVfgnI.js.map → ZoomableSvg-C65nta_r.js.map} +1 -1
  86. package/dist/editors.js +3 -3
  87. package/dist/flint.js +1 -1
  88. package/dist/index.d.ts +375 -375
  89. package/dist/index.js +40 -40
  90. package/dist/internal/blocks/AIKit.js +1 -1
  91. package/dist/internal/blocks/BrandEditor.js +1 -1
  92. package/dist/internal/blocks/ChartPanel.js +1 -1
  93. package/dist/internal/blocks/ChipEditor.js +2 -2
  94. package/dist/internal/blocks/ClipboardButton.js +1 -1
  95. package/dist/internal/blocks/ColorInput.js +1 -1
  96. package/dist/internal/blocks/ColorModeSwitch.js +1 -1
  97. package/dist/internal/blocks/Command.js +1 -1
  98. package/dist/internal/blocks/CopyField.js +1 -1
  99. package/dist/internal/blocks/DateInput.js +1 -1
  100. package/dist/internal/blocks/DateRangeInput.js +1 -1
  101. package/dist/internal/blocks/EmptyConfigurationActionCard.js +1 -1
  102. package/dist/internal/blocks/ExportMenu.js +2 -2
  103. package/dist/internal/blocks/Form/connectors/ComboboxField.js +2 -2
  104. package/dist/internal/blocks/Form/connectors/ComboboxField.js.map +1 -1
  105. package/dist/internal/blocks/Form/connectors/MultiComboboxField.js +1 -1
  106. package/dist/internal/blocks/Form/connectors/MultiComboboxField.js.map +1 -1
  107. package/dist/internal/blocks/Form.js +1 -1
  108. package/dist/internal/blocks/FormGroup.js +1 -1
  109. package/dist/internal/blocks/MultiActionButtonGroup.js +1 -1
  110. package/dist/internal/blocks/MultiCombobox.js +4 -5
  111. package/dist/internal/blocks/MultiCombobox.js.map +1 -1
  112. package/dist/internal/blocks/NumberInput.js +1 -1
  113. package/dist/internal/blocks/PageToolbar.js +1 -1
  114. package/dist/internal/blocks/PasswordInput.js +1 -1
  115. package/dist/internal/blocks/SearchInput.js +1 -1
  116. package/dist/internal/blocks/SearchInputWithNavigation.js +2 -2
  117. package/dist/internal/blocks/SectionNav.js +1 -1
  118. package/dist/internal/blocks/SplitButton.js +2 -2
  119. package/dist/internal/blocks/StatCard.js +1 -1
  120. package/dist/internal/blocks/TextInput.js +1 -1
  121. package/dist/internal/blocks/Textarea.js +1 -1
  122. package/dist/internal/blocks/TimeInput.js +1 -1
  123. package/dist/internal/components/AlertModal.js +1 -1
  124. package/dist/internal/components/Badge.js +1 -1
  125. package/dist/internal/components/Breadcrumb.js +1 -1
  126. package/dist/internal/components/Button.js +1 -1
  127. package/dist/internal/components/Card.js +1 -1
  128. package/dist/internal/components/CollapsiblePanel.js +1 -1
  129. package/dist/internal/components/CollapsiblePanel.js.map +1 -1
  130. package/dist/internal/components/Combobox.js +1 -1
  131. package/dist/internal/components/DateRangePicker.js +1 -1
  132. package/dist/internal/components/DropdownMenu.js +1 -1
  133. package/dist/internal/components/FileUpload.js +1 -1
  134. package/dist/internal/components/FullScreenModal.js +1 -1
  135. package/dist/internal/components/InputGroup.js +1 -1
  136. package/dist/internal/components/Modal.js +1 -1
  137. package/dist/internal/components/Pagination.js +1 -1
  138. package/dist/internal/components/Popconfirm.js +1 -1
  139. package/dist/internal/components/RadioGroup.js +1 -1
  140. package/dist/internal/components/Select.js +1 -1
  141. package/dist/internal/components/Sheet.js +1 -1
  142. package/dist/internal/components/Sidebar.js +1 -1
  143. package/dist/internal/components/Slider.js +1 -1
  144. package/dist/internal/components/Tabs.js +1 -1
  145. package/dist/internal/components/ThemeProvider.js +2 -2
  146. package/dist/internal/components/ZoomableSvg.js +1 -1
  147. package/dist/internal/utils/accessibleName.js +11 -0
  148. package/dist/internal/utils/accessibleName.js.map +1 -0
  149. package/dist/markdown-editor.js +5 -5
  150. package/dist/mermaid.js +1 -1
  151. package/dist/rjsf.js +8 -8
  152. package/dist/styles-DBGXH5-_.js +127 -0
  153. package/dist/styles-DBGXH5-_.js.map +1 -0
  154. package/dist/styles.css +1 -1
  155. package/dist/testing.js +3 -4
  156. package/dist/testing.js.map +1 -1
  157. package/package.json +23 -23
  158. package/src/theme.css +6 -1
  159. package/dist/AIKit-BD4r7ff-.js.map +0 -1
  160. package/dist/AlertModal-Th2khjPi.js.map +0 -1
  161. package/dist/Button-Ca4Q3VJU.js.map +0 -1
  162. package/dist/Card-Cr9MBNHu.js.map +0 -1
  163. package/dist/Combobox-CxRAYOBt.js.map +0 -1
  164. package/dist/CopyField-6_c-NdLO.js.map +0 -1
  165. package/dist/DropdownMenu-gRM-A8qU.js.map +0 -1
  166. package/dist/RadioGroup-CBPRLRN0.js.map +0 -1
  167. package/dist/Select-ByRvkZ3D.js.map +0 -1
  168. package/dist/internal/components/StatusDot.js +0 -60
  169. package/dist/internal/components/StatusDot.js.map +0 -1
package/AGENTS.md CHANGED
@@ -79,6 +79,8 @@ This file answers **which** component to use; [`COMPONENT-API.md`](./COMPONENT-A
79
79
 
80
80
  **Never** use `Popover` for destructive confirmations (use `Popconfirm`) or hover-only previews (use `HoverCard`). **Never** hand-roll a confirmation from `Modal` + buttons — use `AlertModal`, which owns the confirm/cancel actions and the async loading state.
81
81
 
82
+ **Filters in a menu are menu items:** `DropdownMenu.RadioItem indicator="check"` for one value, `DropdownMenu.CheckboxItem indicator="checkbox"` for several, both `indicatorAlign="end"`. Never `RadioGroup` or `Checkbox` in a `DropdownMenu` or `Popover`.
83
+
82
84
  ### Inputs
83
85
 
84
86
  | Use | When |
@@ -93,7 +95,7 @@ This file answers **which** component to use; [`COMPONENT-API.md`](./COMPONENT-A
93
95
 
94
96
  **Never** build custom label + input combinations — compose `Label` + `FormGroup.TextInput` + `FormGroup.Help` inside `FormGroup`.
95
97
 
96
- **Every select-shaped control needs an accessible name, and it goes on the control itself** — pass `id` and point a `<Label htmlFor>` at it where the field has a visible label, `aria-labelledby` where that label is some other node, and `aria-label` for a bare control — a toolbar filter, a repeated row. A name set on a surrounding wrapper (an `InputGroup`, a `<div>`) reaches nothing: the role is on the trigger or the input. `Select` and `Select.Trigger` **will not compile** without one of the three (the JSDoc on the prop says why); `Combobox` and `MultiCombobox` will, and then fall back to their `placeholder`, which the name calculation reaches only as a last resort. The `field.*` connectors need none of it: `FieldItem` owns the label and hands the control its `id`.
98
+ **Every select-shaped control needs an accessible name, and it goes on the control itself** — pass `id` and point a `<Label htmlFor>` at it where the field has a visible label, `aria-labelledby` where that label is some other node, and `aria-label` for a bare control — a toolbar filter, a repeated row. A name set on a surrounding wrapper (an `InputGroup`, a `<div>`) reaches nothing: the role is on the trigger or the input. `Select`, `Select.Trigger`, `Combobox`, `Combobox.Input` and `MultiCombobox` **will not compile** without one of the three (the JSDoc on the prop says why); a component that wraps one passes it on — a required `id` where every caller renders a `<Label htmlFor>`, `WithAccessibleName<Props>` where some caller has no visible label. The `field.*` connectors need none of it: `FieldItem` owns the label and hands the control its `id`.
97
99
 
98
100
  `FileUpload` composes `FileUpload.DropZone` (the dashed box, owning the drag / error visuals) with `FileUpload.FileList` (selected files; `invalid` tints the rows). It deliberately ships **no** rejection copy — the wording is product copy, so read the current rejections with `useFileUploadRejections()` inside `FileUpload` and write the sentence yourself. Reach for `useFileDropTarget` only when there is no box to render: it returns `getRootProps()` / `isDragActive` for an affordance you style, and `noClick` / `noKeyboard` keep an already-interactive subtree (a composer, a form) from opening the file dialog on every click.
99
101
 
@@ -107,15 +109,16 @@ This file answers **which** component to use; [`COMPONENT-API.md`](./COMPONENT-A
107
109
  | `Toaster` | Mount once at app root |
108
110
  | `Alert` | Persistent contextual message in page layout |
109
111
  | `FormGroup state="error"` | Field-level validation errors inline below input |
110
- | `StatusDot` | One entity's state as a coloured dot beside its name |
111
112
 
112
113
  **Never** use `Alert` for ephemeral success (use `toast()`) or `toast()` for blocking errors (use `Alert`).
113
114
 
114
- **Never** paint a state with a hue of your own — no `tw:bg-amber-400` span, no `color` prop taking a
115
- hue. `StatusDot`'s `status` (`success` / `warning` / `info` / `destructive` / `neutral`) is its whole
116
- colour API, so it reads the themeable status tokens and a customer brand recolours every dot at once.
117
- Colour never carries the meaning alone: pair the dot with the text, or give it a `label` so a screen
118
- reader gets the state too.
115
+ **Never** paint a state with a hue of your own — no `tw:text-amber-600`, no `color` prop taking a
116
+ hue. Use the status tokens (`success` / `warning` / `info` / `destructive`, `muted-foreground` for no
117
+ state yet), so a customer brand recolours every state at once. Colour never carries the meaning
118
+ alone: name the state in text, or in an `aria-label` where there is no room for text.
119
+
120
+ **Don't** put a dot or bullet before text that already names the state ("Failed", "Up to date") —
121
+ colour the text instead. A column of dots reads as a bulleted list.
119
122
 
120
123
  ### Loading
121
124
 
@@ -252,6 +255,8 @@ Vertical rhythm: prefer `tw:gap-*` on a flex column parent over `tw:mt-*` on chi
252
255
 
253
256
  The `label` prop implies `orientation="horizontal"` — labels are not rendered vertically.
254
257
 
258
+ **Separate inline items with `tw:gap-x-*`, not a typed `·` / `|` / `/` / `—`** — it wraps onto the wrong line and a screen reader reads it out.
259
+
255
260
  ### Date/time, color, multi-select, code
256
261
 
257
262
  | Use | When |
package/CHANGELOG.md CHANGED
@@ -1,5 +1,106 @@
1
1
  # @keboola/design
2
2
 
3
+ ## 13.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - `AGENTS.md`: a multiple choice in a menu is `DropdownMenu.CheckboxItem` with the `checkbox` indicator, right-aligned; a single choice keeps the check.
8
+
9
+ - `DropdownMenu.RadioItem`'s `radio` indicator draws the form `RadioGroup` radio, from the same styles, under both argo and legacy.
10
+
11
+ - Changed default variant of Badge component to "pill"
12
+
13
+ ## 13.0.0
14
+
15
+ ### Major Changes
16
+
17
+ - Remove the `keboolaLegacyTopnav` brand (`keboola-legacy-topnav`). No app renders the top-nav layout any more; use `keboolaLegacySidebar`. The `shell: 'topnav'` option stays: a brand that sets it still gets the `AppShell` top-bar geometry.
18
+
19
+ - Remove `StatusDot` and `statusDotVariants`
20
+
21
+ Nothing on the platform renders it. Colour the text that names the state with a status token (`tw:text-success`, `tw:text-destructive`, …) instead of putting a dot in front of it.
22
+
23
+ ### Minor Changes
24
+
25
+ - `AlertModal.Content` takes `icon={false}` for a dialog that wants no glyph at all. The header's first column collapses rather than sitting empty, so the title and body start at the edge; `variant` still colours the confirm button.
26
+
27
+ - `Card` takes `asChild` and becomes the link it wraps — `<Card asChild><a href>…</a></Card>` or a router `<Link>`. An `<a href>` card lifts, steps its border and deepens its shadow on hover (no motion under `prefers-reduced-motion`), shows the focus ring on `focus-visible` and a pointer cursor; `interactive` opts any other card in, or an anchor card out. New `Card.Description` renders the muted line under `Card.Title`.
28
+
29
+ - `Combobox`, `MultiCombobox` and `Combobox.Input` require an accessible name — `aria-label`,
30
+ `aria-labelledby`, or an `id` a `<Label htmlFor>` points at — as `Select` does.
31
+
32
+ ```tsx
33
+ // A visible label — point it at the control.
34
+ <Label htmlFor="bucket">Bucket</Label>
35
+ <Combobox id="bucket" items={buckets} value={bucket} onValueChange={setBucket} />
36
+
37
+ // A bare control (toolbar filter, repeated row) — name it directly.
38
+ <MultiCombobox aria-label="Status" items={STATUSES} value={statuses} onValueChange={setStatuses} />
39
+ ```
40
+
41
+ - The `placeholder` is not a name: the name calculation reaches it only as a last resort, and it
42
+ disappears once a value is picked.
43
+ - The requirement sits on the input, which carries the `combobox` role, so the compound
44
+ `Combobox.Input` has it too.
45
+ - `ComboboxField` and `MultiComboboxField` take no `id`, `aria-label` or `aria-labelledby`:
46
+ `FieldItem` renders the label and hands the control its `id`.
47
+ - `WithAccessibleName<Props>` is exported for a component that wraps one of these controls and
48
+ passes the requirement on.
49
+
50
+ - `forwardAccessibleName` is exported next to `WithAccessibleName`, for a component that wraps
51
+ `Combobox`, `MultiCombobox` or `Select` and passes their accessible-name requirement on.
52
+
53
+ ```tsx
54
+ const TablePicker = ({
55
+ tables,
56
+ value,
57
+ onChange,
58
+ ...accessibleName
59
+ }: Props) => (
60
+ <Combobox
61
+ {...forwardAccessibleName(accessibleName)}
62
+ items={tables}
63
+ value={value}
64
+ onValueChange={onChange}
65
+ />
66
+ );
67
+ ```
68
+
69
+ - It returns the rest of the wrapper's destructure unchanged, for spreading onto the control.
70
+ - A prop left in that rest besides `id`, `aria-label` and `aria-labelledby` fails type-check,
71
+ where a plain spread would pass it to the control unnoticed.
72
+
73
+ ### Patch Changes
74
+
75
+ - Filled `Button`s (`primary`, `secondary`, `danger`, `kai`) paint to their outer edge, so they line up with an `outline` Button beside them. `kai` drops its 1px outer ring and keeps the soft glow.
76
+
77
+ - `CopyField.Reveal` takes a `subject`, so the eye can say "Show password" instead of "Show value"
78
+
79
+ - `CollapsiblePanel` keeps its chevron inside the panel when the header holds long text.
80
+ - The header content can shrink, so a `truncate` inside it cuts the text instead of pushing the chevron out.
81
+
82
+ - `MultiCombobox` selected-value chips are back to the badge's own height; the truncation tooltip no
83
+ longer resets the chip label's line-height.
84
+
85
+ - `Combobox` and `MultiCombobox` option rows now wrap a long label onto more lines instead of
86
+ truncating it, and a selected-value chip whose label is cut off shows the full label in a tooltip
87
+ on hover.
88
+
89
+ - `dompurify` requires 3.4.16 or newer, the release that fixes event handlers left armed in subtrees an `afterSanitize` hook removes
90
+
91
+ - `AGENTS.md`: filters in a menu are `DropdownMenu.RadioItem` / `CheckboxItem` with `indicator="check"`, never `RadioGroup` or `Checkbox`.
92
+
93
+ - `PromptInput` leaves the controls in its slots alone: with `commands` or `mentions`, Enter on a
94
+ focused `prefix`/`suffix` button (or a button in a menu it portals out) clicks it, and a click in
95
+ such a layer keeps the focus there instead of moving it to the textarea.
96
+
97
+ - `AGENTS.md`: status text that already names its state takes a status colour, not a leading dot or bullet; inline items are separated by a `tw:gap-x-*` flex row, not a typed `·` / `|` / `/` / `—`.
98
+
99
+ - `ToolCallStatusHeader` shows its label in full foreground ink while `needsConfirmation` is set, so the name of the action being approved is as easy to see as the content below it. The warning tint, icon and "Confirmation required" chip still mark the state.
100
+
101
+ - Updated dependencies:
102
+ - @keboola/brand-registry@2.0.0
103
+
3
104
  ## 12.0.0
4
105
 
5
106
  ### Major Changes
package/COMPONENT-API.md CHANGED
@@ -465,12 +465,14 @@ Source: `src/blocks/Form/connectors/OtpInputField.tsx`
465
465
 
466
466
  Source: `src/components/Card/Card.tsx`
467
467
 
468
- > Subcomponents that EXIST: `Card.Header`, `Card.Title`, `Card.Content`. There is NO `Card.Description` and NO `Card.Footer`. Plus native `<div>` attributes.
468
+ > Subcomponents that EXIST: `Card.Header`, `Card.Title`, `Card.Description`, `Card.Content`. There is NO `Card.Footer`. Plus native `<div>` attributes. A clickable tile is `<Card asChild><a href>…</a></Card>` (or a router `<Link>`): the whole card is the link, its accessible name is its text, and it must hold NO nested buttons or links. Not the DS `Link`: it defaults to `target="_blank"` and stops click propagation — fine only for an external tile.
469
469
 
470
- | Prop | Type | Required | Default | Description |
471
- | ---------- | -------------------------------------------------- | -------- | ------- | ----------- |
472
- | `bordered` | `boolean \| null` | no | `false` | |
473
- | `padding` | `"small" \| "medium" \| "large" \| "none" \| null` | no | `small` | |
470
+ | Prop | Type | Required | Default | Description |
471
+ | ------------- | -------------------------------------------------- | -------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
472
+ | `asChild` | `boolean` | no | `false` | Render as a Radix `Slot`: the child (`<a href>`, a router `<Link>`) becomes the card. The card is then one link — nest no buttons or links inside it. |
473
+ | `bordered` | `boolean \| null` | no | `false` | |
474
+ | `interactive` | `boolean` | no | — | Hover lift, focus ring and pointer cursor. Defaults to on when the card renders an `<a href>`; `false` opts that out, `true` opts any other element in. |
475
+ | `padding` | `"small" \| "medium" \| "large" \| "none" \| null` | no | `small` | |
474
476
 
475
477
  ### `Card.Header`
476
478
 
@@ -493,6 +495,14 @@ Source: `src/components/Card/CardTitle.tsx`
493
495
  | ---- | -------------- | -------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
494
496
  | `as` | `HeadingLevel` | no | `h3` | Heading tag to render. Defaults to `h3`; set explicitly to avoid a heading-order skip (e.g. `as="h2"` when the Card sits directly under a page's `h1`). |
495
497
 
498
+ ### `Card.Description`
499
+
500
+ Source: `src/components/Card/CardDescription.tsx`
501
+
502
+ > Muted small `<p>` under `Card.Title`; place both in `Card.Header layout="stack"`. No own props — native `<p>` attributes.
503
+
504
+ _No own props — see note above for passthrough attributes._
505
+
496
506
  ### `Card.Content`
497
507
 
498
508
  Source: `src/components/Card/CardContent.tsx`
@@ -1,16 +1,16 @@
1
1
  import { cn } from "./classNames-BzrkDnOD.js";
2
2
  import { Tooltip, TooltipProvider } from "./utils-Bd28bWgm.js";
3
3
  import { AlertCircle, ArrowDown, ArrowLeft, ArrowRight, ArrowUp, Ban, BarChart3, Bell, Bug, Calendar, Check, ChevronDown, ChevronLeft, ChevronRight, ChevronUp, Circle, CircleAlert, CircleCheck, CircleHelp, CirclePause, CirclePlay, CirclePlus, CircleStop, CircleX, Clock, Cog, Copy, Database, Download, Ellipsis, ExternalLink, Eye, File, FilePen, FileText, Flag, Folder, Gauge, GitBranch, GitMerge, GitPullRequest, Globe, Hand, History, Hourglass, Info, Key, Layers, LineChart, Link, List, ListChecks, Loader2, Lock, Mail, Maximize2, Minimize2, Minus, Pencil, Play, Plus, RefreshCw, Rocket, RotateCcw, RotateCw, Save, Search, Send, Settings, Sparkles, Star, Table, ThumbsDown, ThumbsUp, Trash2, TriangleAlert, Upload, User, Users, WandSparkles, Warehouse, Workflow, X, XCircle, Zap } from "./icons-wcA70iQx.js";
4
- import { Button } from "./Button-Ca4Q3VJU.js";
4
+ import { Button } from "./Button-B21oVcPU.js";
5
5
  import { ButtonGroup } from "./internal/components/ButtonGroup.js";
6
- import { ClipboardButton } from "./ClipboardButton-DHa1trtI.js";
7
- import { FullScreenModal, FullScreenModalBody, FullScreenModalHeader } from "./FullScreenModal-CD7mYeTz.js";
6
+ import { ClipboardButton } from "./ClipboardButton-srUgWgwH.js";
7
+ import { FullScreenModal, FullScreenModalBody, FullScreenModalHeader } from "./FullScreenModal-Cwnm8WdM.js";
8
8
  import { Truncated } from "./internal/components/Truncated.js";
9
9
  import { HoverCard } from "./HoverCard-B8OKu9XZ.js";
10
- import { Command } from "./Command-BU_cVurn.js";
11
- import { TextInput } from "./TextInput-CDG2XpBl.js";
10
+ import { Command } from "./Command-BQPiZCNz.js";
11
+ import { TextInput } from "./TextInput-BWYXbfs4.js";
12
12
  import { Checkbox } from "./Checkbox-8yIIgY7g.js";
13
- import { Badge } from "./Badge-DIjhwPvh.js";
13
+ import { Badge } from "./Badge-Dz0cj6rj.js";
14
14
  import { Textarea } from "./internal/blocks/Textarea.js";
15
15
  import { Table as Table$1 } from "./Table-BaVT5Tkn.js";
16
16
  import { DiagramSkeleton } from "./internal/blocks/DiagramShared/DiagramSkeleton.js";
@@ -1462,7 +1462,13 @@ const CMDK_HIJACKED_KEYS = /* @__PURE__ */ new Set([
1462
1462
  "End",
1463
1463
  "Enter"
1464
1464
  ]);
1465
- const isCmdkNavigation = (event) => event.key !== "Enter" || !(event.metaKey || event.ctrlKey || event.altKey);
1465
+ /**
1466
+ * Whether the composer's always-mounted cmdk root would act on this keystroke, cancelling its default.
1467
+ *
1468
+ * - cmdk acts on every `CMDK_HIJACKED_KEYS` key regardless of modifiers, except a modified Enter.
1469
+ * - The textarea and the form stop these from bubbling, or a focused button never clicks on Enter.
1470
+ */
1471
+ const isCmdkNavigation = (event) => CMDK_HIJACKED_KEYS.has(event.key) && (event.key !== "Enter" || !(event.metaKey || event.ctrlKey || event.altKey));
1466
1472
  /**
1467
1473
  * The `@token` the caret sits at the end of, if any.
1468
1474
  *
@@ -1645,14 +1651,19 @@ const PromptInput = ({ onSend, onAbort, onContinue, prefix, variant, suffix, att
1645
1651
  if (panelOpen) return;
1646
1652
  if (event.key === "ArrowUp" || event.key === "ArrowDown") return;
1647
1653
  if (event.key === "Enter" && matchesFilter(menuItems, menuFilter).length > 0) return;
1648
- } else if (hasMenus && CMDK_HIJACKED_KEYS.has(event.key) && isCmdkNavigation(event)) event.stopPropagation();
1654
+ } else if (hasMenus && isCmdkNavigation(event)) event.stopPropagation();
1649
1655
  if (event.key === "Enter" && !event.shiftKey && !event.ctrlKey && !event.metaKey) {
1650
1656
  event.preventDefault();
1651
1657
  if (status !== "streaming") handleSubmit();
1652
1658
  }
1653
1659
  };
1660
+ const handleOnFormKeyDown = (event) => {
1661
+ if (hasMenus && event.target !== textareaRef.current && isCmdkNavigation(event)) event.stopPropagation();
1662
+ };
1654
1663
  const handleOnMouseDown = (event) => {
1655
- if (event.target === textareaRef.current) return;
1664
+ const { currentTarget, target } = event;
1665
+ if (target === textareaRef.current) return;
1666
+ if (!(target instanceof Node && currentTarget.contains(target))) return;
1656
1667
  event.preventDefault();
1657
1668
  textareaRef.current?.focus();
1658
1669
  };
@@ -1661,6 +1672,7 @@ const PromptInput = ({ onSend, onAbort, onContinue, prefix, variant, suffix, att
1661
1672
  children: /* @__PURE__ */ jsxs("form", {
1662
1673
  "data-testid": "prompt-input",
1663
1674
  "data-status": status,
1675
+ onKeyDown: handleOnFormKeyDown,
1664
1676
  onMouseDown: handleOnMouseDown,
1665
1677
  onSubmit: handleOnSubmit,
1666
1678
  className: cn(promptInputVariants({ variant }), disabled && "tw:bg-none tw:border-border tw:shadow-[inset_0_100vw_rgb(var(--muted))] tw:cursor-default", className),
@@ -2204,7 +2216,7 @@ const ToolCallStatusHeader = ({ icon: IconComponent, iconSpin, status, text, nee
2204
2216
  className: "tw:flex tw:min-w-0 tw:flex-1 tw:items-center tw:gap-1.5",
2205
2217
  children: [/* @__PURE__ */ jsx(IconComponent, { className: cn("tw:size-3.5 tw:shrink-0", statusIconInk[status], iconSpin && "tw:animate-spin") }), /* @__PURE__ */ jsx("span", {
2206
2218
  "data-testid": "tool-status-text",
2207
- className: cn("tw:truncate tw:pr-0.5 tw:text-xs tw:font-medium", statusInk[status]),
2219
+ className: cn("tw:truncate tw:pr-0.5 tw:text-xs tw:font-medium", needsConfirmation ? "tw:text-foreground" : statusInk[status]),
2208
2220
  children: text
2209
2221
  })]
2210
2222
  }), (needsConfirmation || isCollapsible) && /* @__PURE__ */ jsxs("div", {
@@ -2325,4 +2337,4 @@ const UsageStats = ({ value, alert = false, children, className, ariaLabel, alig
2325
2337
  //#endregion
2326
2338
  export { AnswerActions, AnswerSummary, ChatInlineIcon, CollapsibleStepHeader, DIAGRAM_LANGUAGES, FileDownloadChip, InlineStepDetail, InlineStepGroup, InlineStepLabel, Markdown, MarkdownTable, MessageBubble, PROMPT_INPUT_CONTAINER, PlanApproval, PlanRewritingIndicator, PromptInput, Question, QuestionBlock, SuggestedPrompt, ThinkingIndicator, ToolCallApproval, ToolCallChip, ToolCallStatusHeader, UsageBar, UsageStats, UsageStatsRing, clampPercentage, findMentionToken, findSlashToken, formatPercentage, getChatInlineIconName };
2327
2339
 
2328
- //# sourceMappingURL=AIKit-BD4r7ff-.js.map
2340
+ //# sourceMappingURL=AIKit-VB7CXeQk.js.map