@epam/ai-dial-ui-kit 0.15.0-dev.5 → 0.15.0-dev.50
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/README.md +194 -1
- package/dist/CHANGELOG.md +86 -0
- package/dist/{DateCellRenderer-BVM-Q8yx.cjs → DateCellRenderer-CZNa4jVJ.cjs} +31 -31
- package/dist/DateCellRenderer-X6vXPDIG.cjs +1 -0
- package/dist/IconButton-DHOFapLo.cjs +1 -0
- package/dist/JsonEditor-Bxui5wJH.cjs +1 -0
- package/dist/{MarkdownEditor-C9-ZMRVi.cjs → MarkdownEditor-BKtFs714.cjs} +1 -1
- package/dist/MarkdownEditor-Bapd1ycU.cjs +1 -0
- package/dist/MarkdownEditorContainer-B5aHwoYF.cjs +1 -0
- package/dist/{Switch-CUKClcEz.cjs → Switch-DE6MrcqJ.cjs} +1 -1
- package/dist/components/Button/constants.js +9 -8
- package/dist/components/Dropdown/Dropdown.js +70 -65
- package/dist/components/Dropdown/DropdownSubMenuItem.js +63 -55
- package/dist/components/Dropdown/constants.js +16 -14
- package/dist/components/DropdownIcon/DropdownIcon.js +43 -32
- package/dist/components/FileManager/FileManager.js +373 -372
- package/dist/components/FileManager/FileManagerProvider.js +266 -264
- package/dist/components/FileManager/hooks/use-grid-context-menu.js +59 -59
- package/dist/components/MarkdownEditor/MarkdownEditor.js +23 -21
- package/dist/components/MarkdownEditor/MarkdownEditorContainer.js +27 -27
- package/dist/components/New/Accordion/Accordion.js +87 -71
- package/dist/components/New/AutocompleteTagInput/AutocompleteTagInput.js +207 -0
- package/dist/components/New/AutocompleteTagInput/utils.js +11 -0
- package/dist/components/New/Avatar/Avatar.js +70 -0
- package/dist/components/New/Badge/Badge.js +45 -0
- package/dist/components/New/BottomSheet/BottomSheet.js +128 -0
- package/dist/components/New/Breadcrumbs/Breadcrumbs.js +159 -0
- package/dist/components/New/Breadcrumbs/constants.js +41 -0
- package/dist/components/New/Button/Button.js +32 -32
- package/dist/components/New/Button/ButtonWrappers.js +103 -37
- package/dist/components/New/Button/constants.js +3 -0
- package/dist/components/New/Button/utils.js +18 -8
- package/dist/components/New/ButtonDropdown/ButtonDropdown.js +26 -16
- package/dist/components/New/Calendar/Calendar.js +253 -222
- package/dist/components/New/Calendar/constants.js +5 -5
- package/dist/components/New/CaptionText/CaptionText.js +18 -15
- package/dist/components/New/CardShell/CardShell.js +5 -3
- package/dist/components/New/Checkbox/Checkbox.js +67 -56
- package/dist/components/New/Checkbox/CheckboxBox.js +5 -3
- package/dist/components/New/CloseButton/CloseButton.js +18 -16
- package/dist/components/New/CollapsibleSidebar/CollapsibleSidebar.js +39 -34
- package/dist/components/New/ConfirmationPopup/ConfirmationPopup.js +38 -37
- package/dist/components/New/ConfirmationPopup/constants.js +8 -11
- package/dist/components/New/Dropdown/Dropdown.js +112 -105
- package/dist/components/New/Dropdown/DropdownSubMenuItem.js +17 -17
- package/dist/components/New/Dropdown/constants.js +22 -17
- package/dist/components/New/EllipsisTooltip/EllipsisTooltip.js +20 -18
- package/dist/components/New/EntityIdentity/EntityIdentity.js +135 -0
- package/dist/components/New/FileDropzone/FileDropzone.js +27 -25
- package/dist/components/New/FileIcon/FileIcon.js +55 -0
- package/dist/components/New/FileIcon/constants.js +134 -0
- package/dist/components/New/FileIcon/icons/FileGlyph.js +150 -0
- package/dist/components/New/FileIcon/icons/FolderGlyph.js +50 -0
- package/dist/components/New/FileName/FileName.js +78 -0
- package/dist/components/New/FilterChips/FilterChips.js +43 -0
- package/dist/components/New/FilterChips/constants.js +5 -0
- package/dist/components/New/FolderName/FolderName.js +16 -0
- package/dist/components/New/FolderPath/FolderPath.js +29 -28
- package/dist/components/New/Highlight/Highlight.js +23 -30
- package/dist/components/New/IconButton/IconButton.js +30 -28
- package/dist/components/New/InfoButton/InfoButton.js +13 -11
- package/dist/components/New/InlineSelect/InlineSelect.js +74 -56
- package/dist/components/New/InteractiveTooltip/InteractiveTooltip.js +41 -39
- package/dist/components/New/InteractiveTooltip/constants.js +2 -2
- package/dist/components/New/Label/Label.js +13 -8
- package/dist/components/New/MarkdownEditor/MarkdownEditor.js +29 -27
- package/dist/components/New/MenuItem/MenuItem.js +29 -27
- package/dist/components/New/MenuItem/constants.js +9 -8
- package/dist/components/New/NoDataContent/NoDataContent.js +21 -19
- package/dist/components/New/Notification/Notification.js +33 -29
- package/dist/components/New/NumberInput/NumberInput.js +42 -33
- package/dist/components/New/PasswordInput/PasswordInput.js +41 -35
- package/dist/components/New/Popup/Popup.js +46 -44
- package/dist/components/New/Popup/constants.js +3 -3
- package/dist/components/New/Radio/Radio.js +75 -64
- package/dist/components/New/RadioGroup/RadioGroup.js +76 -65
- package/dist/components/New/RadioGroupPopupField/RadioGroupPopupField.js +117 -106
- package/dist/components/New/ResizableContainer/ResizableContainer.js +42 -40
- package/dist/components/New/SchemaRenderer/SchemaRenderer.js +164 -0
- package/dist/components/New/SchemaRenderer/components/SchemaAnyOfEditor.js +65 -0
- package/dist/components/New/SchemaRenderer/components/SchemaArrayEditor.js +109 -0
- package/dist/components/New/SchemaRenderer/components/SchemaField.js +83 -0
- package/dist/components/New/SchemaRenderer/components/SchemaFieldContent.js +72 -0
- package/dist/components/New/SchemaRenderer/components/SchemaJsonEditor.js +41 -0
- package/dist/components/New/SchemaRenderer/components/SchemaKeyValueEditor.js +250 -0
- package/dist/components/New/SchemaRenderer/components/SchemaObjectEditor.js +36 -0
- package/dist/components/New/SchemaRenderer/components/SchemaOneOfEditor.js +163 -0
- package/dist/components/New/SchemaRenderer/components/SchemaPrimitiveField.js +150 -0
- package/dist/components/New/SchemaRenderer/components/SchemaSection.js +135 -0
- package/dist/components/New/SchemaRenderer/context.js +17 -0
- package/dist/components/New/Search/Search.js +29 -27
- package/dist/components/New/SegmentedControl/SegmentedControl.js +29 -23
- package/dist/components/New/Select/CollapsedSelectTags.js +127 -0
- package/dist/components/New/Select/MultiSelectTags.js +18 -15
- package/dist/components/New/Select/Select.js +219 -197
- package/dist/components/New/Select/constants.js +23 -20
- package/dist/components/New/SharedEntityIndicator/SharedEntityIndicator.js +34 -0
- package/dist/components/New/SideDrawer/SideDrawer.js +148 -0
- package/dist/components/New/Slider/Slider.js +151 -90
- package/dist/components/New/Slider/utils.js +12 -0
- package/dist/components/New/Switch/Switch.js +69 -58
- package/dist/components/New/Tabs/Tabs.js +125 -61
- package/dist/components/New/Tag/Tag.js +42 -40
- package/dist/components/New/TagInput/TagInput.js +48 -44
- package/dist/components/New/Textarea/Textarea.js +21 -20
- package/dist/components/New/ToggleIconButton/ToggleIconButton.js +26 -24
- package/dist/components/New/Tooltip/TooltipContent.js +11 -9
- package/dist/components/New/Tooltip/constants.js +1 -1
- package/dist/components/New/TransferQueue/TransferQueue.js +124 -0
- package/dist/components/New/TransferQueue/TransferQueueHeader.js +71 -0
- package/dist/components/New/TransferQueue/TransferQueueRow.js +119 -0
- package/dist/components/New/TransferQueue/constants.js +24 -0
- package/dist/components/New/constants/overlay.js +17 -9
- package/dist/components/Popup/constants.js +8 -8
- package/dist/components/ProgressBar/ProgressBar.js +45 -33
- package/dist/components/SchemaRenderer/SchemaRenderer.js +16 -15
- package/dist/components/SchemaRenderer/components/SchemaAdditionalPropertiesEditor.js +46 -31
- package/dist/components/SchemaRenderer/components/SchemaAnyOfEditor.js +2 -2
- package/dist/components/SchemaRenderer/components/SchemaArrayEditor.js +1 -1
- package/dist/components/SchemaRenderer/components/SchemaField.js +23 -23
- package/dist/components/SchemaRenderer/components/SchemaFieldContent.js +19 -19
- package/dist/components/SchemaRenderer/components/SchemaKeyValueEditor.js +223 -135
- package/dist/components/SchemaRenderer/components/SchemaObjectEditor.js +1 -1
- package/dist/components/SchemaRenderer/components/SchemaOneOfEditor.js +13 -13
- package/dist/components/SchemaRenderer/components/SchemaPrimitiveField.js +5 -5
- package/dist/components/Skeleton/Skeleton.js +25 -19
- package/dist/components/Spinner/Spinner.js +7 -5
- package/dist/components/Tooltip/TooltipContent.js +11 -11
- package/dist/components-manifest.json +1837 -84
- package/dist/constants/public-class-names.js +218 -0
- package/dist/constants/schema-renderer.js +33 -0
- package/dist/dial-ui-kit.cjs +2 -2
- package/dist/dial-ui-kit.js +356 -307
- package/dist/editors.cjs +1 -1
- package/dist/file-manager.cjs +1 -1
- package/dist/grid.cjs +1 -1
- package/dist/index.css +2 -2
- package/dist/lazy-_W6FYhKg.cjs +1 -0
- package/dist/merge-classes-BEJXjzkx.cjs +1 -0
- package/dist/migration-guides/0.15.0/legacy-theme-variable-fallbacks-removal.md +69 -0
- package/dist/migration-guides/0.15.0/slider-redesign.md +110 -0
- package/dist/migration-guides/README.md +2 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +419 -399
- package/dist/src/components/FileManager/FileManager.d.ts +2 -0
- package/dist/src/components/FileManager/FileManagerContext.d.ts +1 -0
- package/dist/src/components/FileManager/hooks/use-grid-context-menu.d.ts +2 -1
- package/dist/src/components/MarkdownEditor/MarkdownEditor.d.ts +2 -0
- package/dist/src/components/MarkdownEditor/MarkdownEditorContainer.d.ts +2 -0
- package/dist/src/components/New/Accordion/Accordion.d.ts +6 -1
- package/dist/src/components/New/AutocompleteTagInput/AutocompleteTagInput.d.ts +97 -0
- package/dist/src/components/New/AutocompleteTagInput/utils.d.ts +17 -0
- package/dist/src/components/New/AutocompleteTagInput/utils.spec.d.ts +1 -0
- package/dist/src/components/New/Avatar/Avatar.d.ts +55 -0
- package/dist/src/components/New/Badge/Badge.d.ts +47 -0
- package/dist/src/components/New/BottomSheet/BottomSheet.d.ts +84 -0
- package/dist/src/components/New/Breadcrumbs/Breadcrumbs.d.ts +94 -0
- package/dist/src/components/New/Breadcrumbs/constants.d.ts +60 -0
- package/dist/src/components/New/Button/Button.d.ts +4 -1
- package/dist/src/components/New/Button/ButtonWrappers.d.ts +21 -0
- package/dist/src/components/New/Button/utils.d.ts +15 -0
- package/dist/src/components/New/ButtonDropdown/ButtonDropdown.d.ts +4 -0
- package/dist/src/components/New/Calendar/constants.d.ts +1 -1
- package/dist/src/components/New/ConfirmationPopup/constants.d.ts +0 -1
- package/dist/src/components/New/Dropdown/Dropdown.d.ts +9 -1
- package/dist/src/components/New/Dropdown/constants.d.ts +3 -0
- package/dist/src/components/New/EntityIdentity/EntityIdentity.d.ts +85 -0
- package/dist/src/components/New/FileIcon/FileIcon.d.ts +61 -0
- package/dist/src/components/New/FileIcon/constants.d.ts +16 -0
- package/dist/src/components/New/FileIcon/icons/FileGlyph.d.ts +18 -0
- package/dist/src/components/New/FileIcon/icons/FolderGlyph.d.ts +17 -0
- package/dist/src/components/New/FileName/FileName.d.ts +79 -0
- package/dist/src/components/New/FilterChips/FilterChips.d.ts +69 -0
- package/dist/src/components/New/FilterChips/constants.d.ts +13 -0
- package/dist/src/components/New/FolderName/FolderName.d.ts +37 -0
- package/dist/src/components/New/InlineSelect/InlineSelect.d.ts +16 -1
- package/dist/src/components/New/InteractiveTooltip/constants.d.ts +5 -4
- package/dist/src/components/New/MarkdownEditor/MarkdownEditor.d.ts +3 -0
- package/dist/src/components/New/Notification/Notification.d.ts +18 -0
- package/dist/src/components/New/Popup/constants.d.ts +1 -1
- package/dist/src/components/New/SchemaRenderer/SchemaRenderer.d.ts +38 -0
- package/dist/src/components/New/SchemaRenderer/components/SchemaAnyOfEditor.d.ts +37 -0
- package/dist/src/components/New/SchemaRenderer/components/SchemaArrayEditor.d.ts +35 -0
- package/dist/src/components/New/SchemaRenderer/components/SchemaField.d.ts +33 -0
- package/dist/src/components/New/SchemaRenderer/components/SchemaFieldContent.d.ts +30 -0
- package/dist/src/components/New/SchemaRenderer/components/SchemaJsonEditor.d.ts +29 -0
- package/dist/src/components/New/SchemaRenderer/components/SchemaKeyValueEditor.d.ts +37 -0
- package/dist/src/components/New/SchemaRenderer/components/SchemaObjectEditor.d.ts +32 -0
- package/dist/src/components/New/SchemaRenderer/components/SchemaOneOfEditor.d.ts +39 -0
- package/dist/src/components/New/SchemaRenderer/components/SchemaPrimitiveField.d.ts +38 -0
- package/dist/src/components/New/SchemaRenderer/components/SchemaSection.d.ts +39 -0
- package/dist/src/components/New/SchemaRenderer/context.d.ts +8 -0
- package/dist/src/components/New/SchemaRenderer/types.d.ts +76 -0
- package/dist/src/components/New/Select/CollapsedSelectTags.d.ts +22 -0
- package/dist/src/components/New/Select/MultiSelectTags.d.ts +5 -0
- package/dist/src/components/New/Select/Select.d.ts +9 -0
- package/dist/src/components/New/Select/constants.d.ts +3 -2
- package/dist/src/components/New/SharedEntityIndicator/SharedEntityIndicator.d.ts +35 -0
- package/dist/src/components/New/SideDrawer/SideDrawer.d.ts +100 -0
- package/dist/src/components/New/Slider/Slider.d.ts +20 -1
- package/dist/src/components/New/Slider/utils.d.ts +6 -0
- package/dist/src/components/New/Slider/utils.spec.d.ts +1 -0
- package/dist/src/components/New/Tabs/Tabs.d.ts +54 -6
- package/dist/src/components/New/Tooltip/constants.d.ts +5 -3
- package/dist/src/components/New/TransferQueue/TransferQueue.d.ts +139 -0
- package/dist/src/components/New/TransferQueue/TransferQueueHeader.d.ts +16 -0
- package/dist/src/components/New/TransferQueue/TransferQueueRow.d.ts +10 -0
- package/dist/src/components/New/TransferQueue/constants.d.ts +6 -0
- package/dist/src/components/New/constants/overlay.d.ts +13 -0
- package/dist/src/components/Popup/constants.d.ts +1 -1
- package/dist/src/components/SchemaRenderer/types.d.ts +5 -82
- package/dist/src/components/SchemaRenderer/utils.d.ts +1 -13
- package/dist/src/constants/public-class-names.d.ts +209 -0
- package/dist/src/constants/schema-renderer.d.ts +2 -0
- package/dist/src/index.d.ts +39 -2
- package/dist/src/models/json-schema.d.ts +71 -0
- package/dist/src/types/accordion.d.ts +7 -0
- package/dist/src/types/avatar.d.ts +7 -0
- package/dist/src/types/badge.d.ts +16 -0
- package/dist/src/types/breadcrumbs.d.ts +9 -0
- package/dist/src/types/button.d.ts +1 -0
- package/dist/src/types/entity-type.d.ts +9 -0
- package/dist/src/types/json-schema.d.ts +22 -0
- package/dist/src/types/transfer-queue.d.ts +10 -0
- package/dist/src/utils/__tests__/avatar.spec.d.ts +1 -0
- package/dist/src/utils/avatar.d.ts +12 -0
- package/dist/src/utils/json-schema.d.ts +23 -0
- package/dist/src/utils/sub-menu-floating.d.ts +7 -4
- package/dist/types/accordion.js +4 -0
- package/dist/types/avatar.js +4 -0
- package/dist/types/badge.js +5 -0
- package/dist/types/breadcrumbs.js +4 -0
- package/dist/types/button.js +3 -3
- package/dist/types/entity-type.js +4 -0
- package/dist/types/json-schema.js +7 -0
- package/dist/types/transfer-queue.js +4 -0
- package/dist/use-file-manager-tabs-Bzzwwcgk.cjs +3 -0
- package/dist/utils/avatar.js +22 -0
- package/dist/{components/SchemaRenderer/utils.js → utils/json-schema.js} +122 -95
- package/dist/utils/merge-classes.js +12 -5
- package/dist/utils/sub-menu-floating.js +99 -54
- package/package.json +4 -9
- package/dist/DateCellRenderer-ssp7eaZY.cjs +0 -1
- package/dist/IconButton-DWqoaBWf.cjs +0 -1
- package/dist/JsonEditor-D2jSlRFi.cjs +0 -1
- package/dist/MarkdownEditor-BzEbdj7R.cjs +0 -1
- package/dist/MarkdownEditorContainer-BvwJjkiZ.cjs +0 -1
- package/dist/components/SchemaRenderer/types.js +0 -27
- package/dist/editor-_174x-qy.cjs +0 -1
- package/dist/lazy-DM-7dL0Y.cjs +0 -1
- package/dist/merge-classes-Dipy1Ih1.cjs +0 -1
- package/dist/use-file-manager-tabs-DjdR_mYM.cjs +0 -3
package/README.md
CHANGED
|
@@ -26,6 +26,7 @@ The AI DIAL UI Kit is an production-ready React component library designed to st
|
|
|
26
26
|
- [Development Setup](#development-setup)
|
|
27
27
|
- [Project Structure](#project-structure)
|
|
28
28
|
- [🎨 Theming & Customization](#-theming--customization)
|
|
29
|
+
- [Public class names](#public-class-names)
|
|
29
30
|
- [♿ Accessibility](#-accessibility)
|
|
30
31
|
- [Naming icon-only controls](#naming-icon-only-controls)
|
|
31
32
|
- [Target size (WCAG 2.5.5, Level AAA)](#target-size-wcag-255-level-aaa)
|
|
@@ -48,7 +49,7 @@ The AI DIAL UI Kit is an production-ready React component library designed to st
|
|
|
48
49
|
- 🎨 **Highly Customizable**: Deep theming capabilities with CSS custom properties
|
|
49
50
|
- 🧪 **Well-Tested**: Comprehensive test coverage (70%+) with Vitest and React Testing Library
|
|
50
51
|
- 📚 **Storybook Ready**: Includes interactive component documentation and development playground
|
|
51
|
-
- 🛠️ **Developer Experience**: Leverage ESLint
|
|
52
|
+
- 🛠️ **Developer Experience**: Leverage ESLint and Prettier for maintainable code quality
|
|
52
53
|
- 📦 **Distribution Ready**: Deployed as NPM package ready for easy integration
|
|
53
54
|
|
|
54
55
|
## 📖 Documentation
|
|
@@ -192,6 +193,196 @@ These are defaults, not overrides: a `rounded-*` utility passed to a single
|
|
|
192
193
|
control through `className` still wins, because a consumer's utilities are
|
|
193
194
|
emitted after this package's stylesheet.
|
|
194
195
|
|
|
196
|
+
#### Overlay stacking
|
|
197
|
+
|
|
198
|
+
Overlays render in a portal at the end of `<body>`, so they stack against the
|
|
199
|
+
host's own fixed and sticky chrome — a header, a side sheet, an embedding
|
|
200
|
+
overlay. They sit on a four-step ladder driven by one variable:
|
|
201
|
+
|
|
202
|
+
| Layer | Utility | `z-index` | Components |
|
|
203
|
+
| ----------------- | ----------------------- | -------------------------- | ---------------------------------------------------------------- |
|
|
204
|
+
| Popup | `z-popup` | `var(--z-overlay, 52)` | `Popup` backdrop, both generations |
|
|
205
|
+
| Floating panel | `z-floating` | `--z-overlay` + 1 | `Dropdown` and `Select` overlays, submenus, `Calendar` |
|
|
206
|
+
| Interactive panel | `z-interactive-tooltip` | `--z-overlay` + 2 | `InteractiveTooltip` |
|
|
207
|
+
| Tooltip | `z-tooltip` | `--z-overlay` + 3 | `Tooltip`, both generations |
|
|
208
|
+
|
|
209
|
+
To lift every overlay above a host layer, set the base once:
|
|
210
|
+
|
|
211
|
+
```css
|
|
212
|
+
:root {
|
|
213
|
+
--z-overlay: 1000; /* popup 1000, dropdown 1001, interactive tooltip 1002, tooltip 1003 */
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Each layer is a fixed step above the one below, so raising the base never
|
|
218
|
+
reorders them: a dropdown still opens above the popup it sits in, and a tooltip
|
|
219
|
+
above the dropdown row that triggered it. Set the variable on `:root`, or in the
|
|
220
|
+
class a `ThemeScope` re-applies to its portalled overlays — a portal escapes any
|
|
221
|
+
other wrapper, so a value set only there never reaches the overlay.
|
|
222
|
+
|
|
223
|
+
A single overlay can still be moved on its own: a `z-*` utility passed to a
|
|
224
|
+
`Dropdown`'s `listClassName`, a `Popup`'s `overlayClassName`, an
|
|
225
|
+
`InteractiveTooltip`'s `contentClassName` or a `Calendar`'s `panelClassName`
|
|
226
|
+
replaces the layer's own step rather than landing beside it, because
|
|
227
|
+
`mergeClasses` knows the ladder utilities are z-index.
|
|
228
|
+
|
|
229
|
+
### Public class names
|
|
230
|
+
|
|
231
|
+
Some hosts need to restyle a part of a component the props do not reach — the
|
|
232
|
+
padding of a menu's row list, the radius of a row, the caret badge of an icon
|
|
233
|
+
trigger. The kit's own classes are Tailwind utilities and hashed module locals,
|
|
234
|
+
so a host that reaches for them ends up on selectors that break on the next
|
|
235
|
+
upgrade: `[class*='_selectedItem_']`, `> div:nth-child(2) > button`,
|
|
236
|
+
`[role='none'][aria-label='dropdown']` — the last of which is an accessibility
|
|
237
|
+
contract and, being a plain English string, is not one a localised host can rely
|
|
238
|
+
on either.
|
|
239
|
+
|
|
240
|
+
Every design-system 2.0 component therefore stamps a stable class on the element
|
|
241
|
+
that draws it. They are exported as one record:
|
|
242
|
+
|
|
243
|
+
```tsx
|
|
244
|
+
import { DIAL_KIT_CLASS } from '@epam/ai-dial-ui-kit';
|
|
245
|
+
|
|
246
|
+
DIAL_KIT_CLASS.menuItem; // 'dial-kit-menuitem'
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
```css
|
|
250
|
+
.dial-kit-dropdown-list {
|
|
251
|
+
padding-block: 0;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.dial-kit-menuitem {
|
|
255
|
+
border-radius: 8px;
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Nothing in `dist/index.css` selects on them: they carry no declarations of their
|
|
260
|
+
own and exist only as selectors, so a host's rule needs no `!important` it would
|
|
261
|
+
not otherwise need. Renaming one, or moving it to a different element, is a
|
|
262
|
+
breaking change and goes through the migration-guide process.
|
|
263
|
+
|
|
264
|
+
#### Feedback and status
|
|
265
|
+
|
|
266
|
+
| Key | Class | Element |
|
|
267
|
+
| --------------- | ------------------------- | ---------------------------------------------------------------------------------------- |
|
|
268
|
+
| `spinner` | `dial-kit-spinner` | The `role="status"` root of a `Spinner` |
|
|
269
|
+
| `progressBar` | `dial-kit-progress-bar` | The outermost element of a `ProgressBar` — its wrapper, or the track when it has neither label nor readout |
|
|
270
|
+
| `skeleton` | `dial-kit-skeleton` | The root of a `Skeleton` |
|
|
271
|
+
| `notification` | `dial-kit-notification` | The `Notification` surface, including every toast and section-message wrapper |
|
|
272
|
+
| `noDataContent` | `dial-kit-no-data-content` | The empty-state root of `NoDataContent` |
|
|
273
|
+
| `transferQueue` | `dial-kit-transfer-queue` | The `role="status"` panel of a `TransferQueue`: header, rows and aggregate bar |
|
|
274
|
+
|
|
275
|
+
#### Text
|
|
276
|
+
|
|
277
|
+
| Key | Class | Element |
|
|
278
|
+
| --------------- | ------------------------- | ------------------------------------------------------------------- |
|
|
279
|
+
| `highlight` | `dial-kit-highlight` | The text element of a `Highlight` |
|
|
280
|
+
| `captionText` | `dial-kit-caption-text` | The caption line under a field |
|
|
281
|
+
| `errorText` | `dial-kit-error-text` | A caption in its error variant, additive to `captionText` |
|
|
282
|
+
| `label` | `dial-kit-label` | The `Label` root, wrapping its `label` element and its info button |
|
|
283
|
+
|
|
284
|
+
#### Containers
|
|
285
|
+
|
|
286
|
+
| Key | Class | Element |
|
|
287
|
+
| -------------------- | --------------------------------- | -------------------------------------------------------------------- |
|
|
288
|
+
| `cardShell` | `dial-kit-card-shell` | The `article` element of a `CardShell` |
|
|
289
|
+
| `collapsibleSidebar` | `dial-kit-collapsible-sidebar` | The `aside` element of a `CollapsibleSidebar` |
|
|
290
|
+
| `resizableContainer` | `dial-kit-resizable-container` | The content box inside a `ResizableContainer`'s resize frame |
|
|
291
|
+
| `popup` | `dial-kit-popup` | The `role="dialog"` panel of a `Popup` |
|
|
292
|
+
| `bottomSheet` | `dial-kit-bottom-sheet` | The `role="dialog"` panel of a `BottomSheet` |
|
|
293
|
+
| `sideDrawer` | `dial-kit-side-drawer` | The `role="dialog"` panel of a `SideDrawer`, open or closed |
|
|
294
|
+
| `confirmationPopup` | `dial-kit-confirmation-popup` | A `ConfirmationPopup`'s panel, additive to `popup` |
|
|
295
|
+
| `accordion` | `dial-kit-accordion` | The root of an `Accordion` |
|
|
296
|
+
| `folderPath` | `dial-kit-folder-path` | The breadcrumb root of a `FolderPath` |
|
|
297
|
+
| `breadcrumbs` | `dial-kit-breadcrumbs` | The `nav` element of a `Breadcrumbs` trail |
|
|
298
|
+
| `breadcrumbsItem` | `dial-kit-breadcrumbs-item` | One segment of it: the link, button or span that draws the label |
|
|
299
|
+
|
|
300
|
+
#### Menus and overlays
|
|
301
|
+
|
|
302
|
+
| Key | Class | Element |
|
|
303
|
+
| ------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------ |
|
|
304
|
+
| `dropdown` | `dial-kit-dropdown` | The trigger wrapper of a `Dropdown` |
|
|
305
|
+
| `dropdownList` | `dial-kit-dropdown-list` | The `role="none"` item list inside a dropdown overlay, and a submenu's own list. Both generations |
|
|
306
|
+
| `menuItem` | `dial-kit-menuitem` | One overlay row: a dropdown item, a `Select` option, a submenu trigger or child |
|
|
307
|
+
| `menuItemCheck` | `dial-kit-menuitem-check` | The trailing check of a chosen `MenuItemMark.Check` row |
|
|
308
|
+
| `dropdownIcon` | `dial-kit-dropdown-icon` | The primary icon of a `DialDropdownIcon` trigger |
|
|
309
|
+
| `dropdownIconCaret` | `dial-kit-dropdown-icon-caret` | Its caret badge. Absent when `showCaret` is `false` |
|
|
310
|
+
| `tooltip` | `dial-kit-tooltip` | The bubble of a `Tooltip` |
|
|
311
|
+
| `interactiveTooltip` | `dial-kit-interactive-tooltip` | The panel of an `InteractiveTooltip` |
|
|
312
|
+
| `ellipsisTooltip` | `dial-kit-ellipsis-tooltip` | The text element of an `EllipsisTooltip`, which is also its trigger |
|
|
313
|
+
|
|
314
|
+
#### Fields
|
|
315
|
+
|
|
316
|
+
| Key | Class | Element |
|
|
317
|
+
| ---------------------- | ------------------------------------- | -------------------------------------------------------------- |
|
|
318
|
+
| `search` | `dial-kit-search` | The `Search` field box, additive to `dial-kit-input` |
|
|
319
|
+
| `passwordInput` | `dial-kit-password-input` | The `PasswordInput` field box, additive to `dial-kit-input` |
|
|
320
|
+
| `numberInput` | `dial-kit-number-input` | The `NumberInput` field box, additive to `dial-kit-input` |
|
|
321
|
+
| `tagInput` | `dial-kit-tag-input` | The `TagInput` field box, additive to `dial-kit-input` |
|
|
322
|
+
| `autocompleteTagInput` | `dial-kit-autocomplete-tag-input` | The `AutocompleteTagInput` field box, additive to `dial-kit-input` |
|
|
323
|
+
| `select` | `dial-kit-select` | The root of a `Select` |
|
|
324
|
+
| `inlineSelect` | `dial-kit-inline-select` | The trigger button of an `InlineSelect` |
|
|
325
|
+
| `calendar` | `dial-kit-calendar` | The root of a `Calendar`, in every mode |
|
|
326
|
+
| `schemaRenderer` | `dial-kit-schema-renderer` | The root of a `SchemaRenderer` |
|
|
327
|
+
| `schemaRendererSection` | `dial-kit-schema-renderer-section` | One collapsible `SchemaRenderer` section card, at any depth |
|
|
328
|
+
| `fileDropzone` | `dial-kit-file-dropzone` | The drop area of a `FileDropzone` |
|
|
329
|
+
| `fileIcon` | `dial-kit-file-icon` | The root of a `FileIcon`: glyph or spinner, and the shared badge |
|
|
330
|
+
| `fileName` | `dial-kit-file-name` | The row of a `FileName`: its type icon, the name and any details |
|
|
331
|
+
| `folderName` | `dial-kit-folder-name` | The `FileName` row of a `FolderName`, additive to `fileName` |
|
|
332
|
+
| `sharedEntityIndicator` | `dial-kit-shared-entity-indicator` | The badge of a `SharedEntityIndicator`, including the one on a `FileIcon` |
|
|
333
|
+
| `badge` | `dial-kit-badge` | The root of a `Badge`: the label box, with its icon when it has one |
|
|
334
|
+
| `avatar` | `dial-kit-avatar` | The root of an `Avatar`: the image, or the initials box that replaces it |
|
|
335
|
+
| `entityIdentity` | `dial-kit-entity-identity` | The root row of an `EntityIdentity`: icon, type label, name and version |
|
|
336
|
+
| `radioGroupPopupField` | `dial-kit-radio-group-popup-field` | The root of a `RadioGroupPopupField` |
|
|
337
|
+
|
|
338
|
+
#### Controls
|
|
339
|
+
|
|
340
|
+
| Key | Class | Element |
|
|
341
|
+
| ---------------------- | ------------------------------------- | ---------------------------------------------------------- |
|
|
342
|
+
| `switch` | `dial-kit-switch` | The row of a `Switch`: the control and its label |
|
|
343
|
+
| `checkbox` | `dial-kit-checkbox` | The row of a `Checkbox` |
|
|
344
|
+
| `checkboxBox` | `dial-kit-checkbox-box` | The decorative box a `CheckboxBox` draws |
|
|
345
|
+
| `radio` | `dial-kit-radio` | The row of a `Radio` |
|
|
346
|
+
| `radioGroup` | `dial-kit-radio-group` | The root of a `RadioGroup` |
|
|
347
|
+
| `segmentedControl` | `dial-kit-segmented-control` | The `role="radiogroup"` track of a `SegmentedControl` |
|
|
348
|
+
| `segmentedControlItem` | `dial-kit-segmented-control-item` | One segment of it |
|
|
349
|
+
| `tabs` | `dial-kit-tabs` | The outermost element of a `Tabs` — the heading wrapper, or the tab list when there is no `sectionLabel` |
|
|
350
|
+
| `tabList` | `dial-kit-tab-list` | The `role="tablist"` inside it, in either orientation |
|
|
351
|
+
| `tab` | `dial-kit-tab` | One tab inside it |
|
|
352
|
+
| `tabSelected` | `dial-kit-tab-selected` | The selected tab, in either orientation |
|
|
353
|
+
| `tabsSectionLabel` | `dial-kit-tabs-section-label` | The `sectionLabel` heading above a `Tabs` |
|
|
354
|
+
| `tag` | `dial-kit-tag` | A `Tag` pill, including a `TagInput`'s rows |
|
|
355
|
+
| `filterChips` | `dial-kit-filter-chips` | The `role="group"` row of a `FilterChips`; its chips carry `dial-kit-tag` |
|
|
356
|
+
| `toggleIconButton` | `dial-kit-toggle-icon-button` | A `ToggleIconButton`, additive to `dial-kit-base-icon-button` |
|
|
357
|
+
| `closeButton` | `dial-kit-close-button` | A `CloseButton`, additive to `dial-kit-base-icon-button` |
|
|
358
|
+
| `infoButton` | `dial-kit-info-button` | An `InfoButton`, additive to `dial-kit-base-icon-button` |
|
|
359
|
+
| `buttonDropdown` | `dial-kit-button-dropdown` | The wrapper of a `ButtonDropdown` |
|
|
360
|
+
|
|
361
|
+
#### Components with no entry, and why
|
|
362
|
+
|
|
363
|
+
Some 2.0 components are deliberately absent, because the element a host would
|
|
364
|
+
target already carries a stable class:
|
|
365
|
+
|
|
366
|
+
| Component | Target it already |
|
|
367
|
+
| --------------------------------------------- | ----------------- |
|
|
368
|
+
| `Button` and its six variant wrappers | `dial-kit-base-button` (plus a per-variant class such as `dial-kit-primary-solid-button`) |
|
|
369
|
+
| `IconButton` and its five variant wrappers | `dial-kit-base-icon-button` |
|
|
370
|
+
| `FabButton` | `dial-kit-fab-button` |
|
|
371
|
+
| `Input` | `dial-kit-input` |
|
|
372
|
+
| `Textarea` | `dial-kit-textarea` |
|
|
373
|
+
| `Slider` | `dial-kit-slider` |
|
|
374
|
+
| `MarkdownEditor` | `dial-kit-markdown-editor` |
|
|
375
|
+
| `Grid` | `dial-kit-grid` (exported as `GRID_ROOT_CLASS`) |
|
|
376
|
+
|
|
377
|
+
Four more contribute no element of their own, and are addressed through what
|
|
378
|
+
they render: `ThemeScope` (a `display: contents` wrapper), `MultiSelectTags`
|
|
379
|
+
(`Tag`s), and `TooltipContainer` / `TooltipTrigger`.
|
|
380
|
+
|
|
381
|
+
Two neighbouring elements are reached through props instead, and keep being: a
|
|
382
|
+
`Dropdown`'s floating panel takes `listClassName`, a `Popup`'s backdrop takes
|
|
383
|
+
`overlayClassName`, and the `DialDropdownIcon` trigger button takes
|
|
384
|
+
`buttonClassName`.
|
|
385
|
+
|
|
195
386
|
## ♿ Accessibility
|
|
196
387
|
|
|
197
388
|
### Naming icon-only controls
|
|
@@ -232,6 +423,8 @@ not AAA:
|
|
|
232
423
|
| `Radio` circle | 20×20 rendered | Reaches 24×24 through `dial-kit-minimum-target`; a 44px target would overhang 12px per side and swallow the adjacent label. Clicking the label selects the radio, so the practical target is wider |
|
|
233
424
|
| `Checkbox` box | 20×20 rendered | Reaches 24×24 through `dial-kit-minimum-target`; a 44px target would overhang 12px per side and swallow the adjacent label. Clicking the label toggles the checkbox, so the practical target is wider |
|
|
234
425
|
| `Slider` track row | 24px tall | The pointer target spans the full track width but is only 24px tall; a 44px row would add 20px of dead space to every form the slider sits in, and the thumb is dragged rather than tapped |
|
|
426
|
+
| `Breadcrumbs` segment link | content | Exempt under the 2.5.5 *Inline* exception — a segment is a text link in a line of text, and expanding it would overlap the segments beside it |
|
|
427
|
+
| `Breadcrumbs` overflow button | 16×16 rendered | Reaches 24×24 through `dial-kit-minimum-target`; a 44px target would overhang 14px per side and swallow the segments on either side of it in an inline trail |
|
|
235
428
|
| `SegmentedControl` segment | 32px tall | Sits 4px from its neighbours inside a 40px track, so a 44px target would overhang 6px per side and swallow the adjacent segments; the segment is already wider than 24px on both axes |
|
|
236
429
|
| `ResizableContainer` resize handle | 10px wide pointer strip | The handle has to sit exactly on the panel boundary, so a 44px-wide strip would swallow content on both sides of it — essential to the control. It is a focusable `separator`, so the resize is also available from the keyboard with the arrow keys |
|
|
237
430
|
|
package/dist/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,92 @@ Versions match the git tags on the `development` branch.
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## [0.15.0]
|
|
11
|
+
|
|
12
|
+
### Breaking Changes
|
|
13
|
+
|
|
14
|
+
- **Legacy theme variable fallbacks removed** — 0.14.0 renamed several theme variables but kept the old names in the fallback chain, so every token resolved two variables and a theme could set either. The old names are no longer read: `--bg-control-neutral-hover` → `--bg-control-neutral-hover-muted`, `--stroke-focus-black` → `--stroke-focus`, and `--bg-control-accent-gradient-from` / `-to` / `-hover-from` / `-active-to` → `--bg-gradient-1` / `-2` / `-1-hover` / `-2-active`. A theme that still sets an old name falls back to the kit's default colour; rename the variable.
|
|
15
|
+
See [migration guide](migration-guides/0.15.0/legacy-theme-variable-fallbacks-removal.md).
|
|
16
|
+
|
|
17
|
+
- **`Slider` (2.0) — redrawn thumb and track** — the slider now follows the new 2.0 design: a 12px solid accent thumb (was a 16px white disc with a border) that grows a soft halo on hover, focus and drag, over an accent-tint track (was grey). The props are unchanged, so typecheck cannot flag it, but every `Slider` renders differently and host CSS aimed at the old thumb needs a second look. The 24px pointer row and the `dial-kit-slider` class stay as they were.
|
|
18
|
+
See [migration guide](migration-guides/0.15.0/slider-redesign.md).
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- **`Slider` (2.0) — `showTooltip`, `showTicks`, `leftContent`, `rightContent`** — the rest of the new slider design. `showTooltip` shows the formatted value in a bubble above the thumb; `showTicks` marks every step on the unfilled track for a discrete slider. Both are hidden while disabled. The bubble is `aria-hidden`, because the input already announces the value through `aria-valuetext`. `leftContent` and `rightContent` are the slider container's side slots, centred on the track: an icon on the left, a `NumberInput` or the value as text on the right. The kit does not sync a `NumberInput` placed there; the caller passes it the same `value` and setter. All four are opt-in.
|
|
23
|
+
|
|
24
|
+
- **`SchemaRenderer` (2.0)** — a JSON Schema form built only from 2.0 controls. `DialSchemaRenderer` exists only in 1.0, so a 2.0 screen that renders a schema-driven form had to mix in 1.0 inputs, selects and the 1.0 `Dropdown` surface. The 2.0 renderer keeps the 1.0 props, except `jsonEditorTheme`: the three variants, `oneOf`/`anyOf` with select or radio selectors, arrays with discriminator types, key-value maps, `dial:resource` options, `skipUntouched`, `renderField` and `texts`. Primitives render as `Input`, `NumberInput`, `PasswordInput`, `Select`, `Switch` or `RadioGroup`. Values the schema does not describe are edited as JSON in a monospace `Textarea`, not in Monaco, so the form loads no editor bundle. Section headers are real toggle buttons with `aria-expanded`, and the remove and info buttons sit next to the toggle instead of inside it. Every control has an accessible name, including array items and key-value rows. `renderField` replaces only the control, so the field keeps its label and error. Stamps `DIAL_KIT_CLASS.schemaRenderer` (`dial-kit-schema-renderer`) on the root and `DIAL_KIT_CLASS.schemaRendererSection` (`dial-kit-schema-renderer-section`) on each section card. The schema types, enums and utils are shared with 1.0 from neutral modules; the 1.0 import paths still work. Additive.
|
|
25
|
+
|
|
26
|
+
- **`AutocompleteTagInput` (2.0)** — a tag field that suggests values while typing and still accepts its own. `TagInput` takes only free text and a multiple `Select` only listed values, so a field such as a list of MIME types — where the common ones should be one keystroke away but any `<type>/<subtype>` is valid — had to be hand-built in each app (the DIAL admin's attachment types, the QuickApps editor's). Typing lists up to `maxSuggestions` (default 5) of the `suggestions` whose label, value or description contains the text and which are not already tags; Enter or comma adds the highlighted one, or the typed text when nothing matches; the arrow keys move the highlight, Escape and leaving the field close the list, Backspace on an empty input removes the last tag. The input follows the ARIA combobox pattern and keeps focus while the list is open, the list floats on the `z-floating` layer and takes the field's width, and the tags share the multiple `Select`'s look. `getRemoveTagLabel` names each tag's remove button, so a localised host is not left with the English `Remove <tag>`. Stamps `DIAL_KIT_CLASS.autocompleteTagInput` (`dial-kit-autocomplete-tag-input`) on the field. Additive; nothing else changes.
|
|
27
|
+
|
|
28
|
+
- **Public class names on every design-system 2.0 component** — a host embedding the kit had no honest selector for the parts of a component its props do not reach: the kit's own classes are Tailwind utilities and hashed module locals, so hosts were left on `[class*='_selectedItem_']`, `> div:nth-child(2) > button` and `[role='none'][aria-label='dropdown']` — the last an accessibility contract, and a plain English string a localised host cannot rely on. Every 2.0 component now stamps a stable class on the element that draws it, exported as one record: `DIAL_KIT_CLASS.menuItem` is `'dial-kit-menuitem'`, and so on for 48 elements across the feedback components (`Spinner`, `ProgressBar`, `Skeleton`, `Notification`, `NoDataContent`), the text components (`Highlight`, `CaptionText`/`ErrorText`, `Label`), the containers (`CardShell`, `CollapsibleSidebar`, `ResizableContainer`, `Popup`, `ConfirmationPopup`, `Accordion`, `FolderPath`), the menus and overlays (`Dropdown` and its item list, rows and chosen-row check, `DialDropdownIcon`'s icon and caret badge, `Tooltip`, `InteractiveTooltip`, `EllipsisTooltip`), the fields (`Search`, `PasswordInput`, `NumberInput`, `TagInput`, `Select`, `InlineSelect`, `Calendar`, `FileDropzone`, `RadioGroupPopupField`) and the controls (`Switch`, `Checkbox`, `CheckboxBox`, `Radio`, `RadioGroup`, `SegmentedControl` and its segments, `Tabs` and its tabs, `Tag`, `ToggleIconButton`, `CloseButton`, `InfoButton`, `ButtonDropdown`). `dial-kit-dropdown-list` and `dial-kit-menuitem` are on the 1.0 dropdown family too, since `DialDropdownIcon` opens one.
|
|
29
|
+
|
|
30
|
+
Nothing in `dist/index.css` selects on any of them — they carry no declarations and exist only as selectors, so this is not a visual change and a host rule needs no `!important` it would not otherwise need. A row's class sits on the element that draws the row box, which is the wrapper rather than the inner button for a `MenuItem` with a `rightControl`; a `ProgressBar` with neither label nor readout returns its track as its own root, and the class follows it there. Components whose target element already carries a stable `dial-kit-*` class have no entry, because a second name for one thing is worse than none: `Button` and `IconButton` with their variant wrappers, `FabButton`, `Input`, `Textarea`, `Slider`, `MarkdownEditor` and `Grid`. A `Dropdown`'s floating panel, a `Popup`'s backdrop and the `DialDropdownIcon` trigger button keep being reached through `listClassName`, `overlayClassName` and `buttonClassName`. See the README for the full table. Requested in [ai-dial-chat#8707](https://github.com/epam/ai-dial-chat/issues/8707), the counterpart of the `dial-*` classes that issue adds to the chat libraries.
|
|
31
|
+
|
|
32
|
+
- **Overlay stacking token, `--z-overlay`** — every portalled overlay was a hardcoded Tailwind literal (`z-[52]` for the `Popup` backdrop, `z-[53]` for dropdown and select overlays, submenus and the `Calendar`, `z-[54]` for `InteractiveTooltip`, `z-[55]` for `Tooltip`), so a host whose own overlay or sticky header sits higher had no documented way to lift the kit's menus above it and fell back to `[role='menu']` and `z-[52]` overrides. The four layers are now theme steps — `z-popup`, `z-floating`, `z-interactive-tooltip`, `z-tooltip` — computed from one variable as base, +1, +2 and +3, so setting `--z-overlay` on `:root` (or in a `ThemeScope` class) moves the whole ladder without reordering it. The fallback is `52`, which reproduces today's values exactly: a host that sets nothing sees no change. `mergeClasses` registers the four steps as z-index, so a `z-*` a caller passes through `listClassName`, `overlayClassName`, `contentClassName` or `panelClassName` still replaces the layer's step rather than landing beside it. See the README's _Overlay stacking_ section. Requested in [ai-dial-chat#8943](https://github.com/epam/ai-dial-chat/issues/8943).
|
|
33
|
+
|
|
34
|
+
- **`Dropdown` (2.0) — `listStyle`** — the floating panel renders in a portal at the end of `<body>`, so CSS custom properties a caller sets on its own wrapper never reach the panel's rows or `menuHeader`, and `listClassName` can carry a class but not a runtime value. A wrapping component that themes its menu through `var(--…)` — a composer's model picker colouring its selected row and check — had no way to deliver the values. `listStyle` is an inline style on that panel. Positioning stays the dropdown's own: `floatingStyles` is applied on top, so a caller's `position`, `top` or `transform` cannot unanchor it. Additive; nothing renders differently without it. Requested in [ai-dial-chat#8943](https://github.com/epam/ai-dial-chat/issues/8943).
|
|
35
|
+
|
|
36
|
+
- **`ButtonDropdown` (2.0) — `dropdownProps`**: until now `ButtonDropdown` built its menu `Dropdown` with fixed options, so a caller could neither class the menu panel nor stop the panel from taking the button's width. A short label like "Add" produced a menu as narrow as the button. `dropdownProps` forwards `listClassName` and `matchReferenceWidth` to that `Dropdown`. With `matchReferenceWidth: false` and a `min-w-*` class, the menu gets a width of its own. Additive; a `ButtonDropdown` without it renders exactly as before.
|
|
37
|
+
|
|
38
|
+
- **`Notification` (2.0) — `action` slot** — a notification had nowhere to put a control of its own: a "Try again" or "Reload" button had to be packed into `message`, where it sat inside the text column, wrapped with the copy and could not line up against a title. `action` takes any node and renders it at the inline end of the notification, after the text and before the close button, vertically centred and never shrunk by a long message. It sits inside the live region, so the control is reachable right where the error is announced; the caller supplies its visible label and handler. The slot is additive — a notification without `action` renders exactly as before. Requested in [ai-dial-chat#8979](https://github.com/epam/ai-dial-chat/issues/8979), where a failed chat response offers "Try again" inside its error banner.
|
|
39
|
+
|
|
40
|
+
- **`FilterChips` (2.0)** — a row of filter chips that picks one value out of a few, the chip-shaped sibling of `Tabs` and `SegmentedControl`. It draws `TagAppearance.Selectable` tags: no fill until selected, a semibold label once selected. Each chip is a toggle button carrying its state on `aria-pressed` inside a named `role="group"`, so every chip is its own tab stop and arrowing across the row never changes the filter by accident — unlike a `radiogroup`. `stretch` grows the chips to share the row width equally for a filter row spanning a side panel; without it they hug their labels. There is no disabled chip: an option the user must not pick is left out of `items`. Labels carry no English defaults, so the caller translates them. The row carries the public class `dial-kit-filter-chips` (`DIAL_KIT_CLASS.filterChips`); its chips are `Tag` pills, so they carry `dial-kit-tag`.
|
|
41
|
+
|
|
42
|
+
- **`Tabs` — `tabListClassName`, and a public class on the selected tab** — `className` lands on whichever element is outermost, so a `Tabs` with a `sectionLabel` left its `role="tablist"` unreachable: a caller wanting to repad the list had to choose between that and styling the wrapper. `tabListClassName` reaches the list in either case, and is additive to `className` when there is no heading and the two elements are one. The selected tab now also carries `dial-kit-tab-selected` (`DIAL_KIT_CLASS.tabSelected`) in both orientations, additive to `dial-kit-tab` — a wrapping component could mark a tab but not its selection, since the horizontal row's `dial-kit-tab-selected-underline` carries the gradient rule and the vertical rail draws its selection in Tailwind utilities alone. Like every entry in the record it carries no declarations. Both are additive: nothing renders differently.
|
|
43
|
+
|
|
44
|
+
- **`Breadcrumbs` (2.0)** — the navigation trail of the 2.0 generation, and the first one built without `DialBreadcrumb` underneath it. `items` is a flat list, outermost first; the last entry is the current page, drawn semibold and primary with `aria-current="page"` and never rendered as a control, since a link to the page you are already on does nothing. An earlier entry with an `href` renders as a link, one with only an `onClick` as a button, and one with neither as plain text — the read-only location path, without a separate component for it. The trail never wraps: segments truncate, each revealing its full label through `EllipsisTooltip` only once it is actually clipped, and a trail longer than `maxVisibleItems` (4) collapses its middle into an ellipsis `Dropdown` so the root and the current page always stay on screen. Separators are decorative and `aria-hidden`, so the trail is announced as a list of links rather than a string of chevrons; the chevron mirrors itself in RTL. `ariaLabel` and `overflowAriaLabel` default to English and take an override for translation. `size` picks the trail's type scale: `BreadcrumbsSize.Small` (`dial-small-text`) by default, or `BreadcrumbsSize.Heading` (`dial-h2-text`) for a path that doubles as the page title — that token is semibold on its own, so the heading trail is semibold throughout, the current page included, and there is no `dial-h2-semi-text` to reach for. The `nav` carries `dial-kit-breadcrumbs` (`DIAL_KIT_CLASS.breadcrumbs`) and each segment `dial-kit-breadcrumbs-item`. The 1.0 `DialBreadcrumb` is untouched.
|
|
45
|
+
|
|
46
|
+
- **`FileIcon`, `FileName`, `FolderName` and `SharedEntityIndicator` (2.0)** — the file-manager row pieces of the 2.0 generation, counterparts of `DialFileManagerItemIcon`, `DialFileName`, `DialFolderName` and `DialSharedEntityIndicator`, built without any of them underneath. `FileIcon` draws the new file-type glyphs — one sheet, coloured and marked by kind: images, video, audio, code, text, PDF, spreadsheet, presentation, archive, DIAL and a generic fallback, picked by extension — and a folder glyph of its own, with a shared badge and a `Spinner` while `loading`. The glyphs are inline SVG rather than imported assets, so each one takes its gradient `id` from `useId` — a list of files does not repeat one document-wide id, which blanks every copy's gradient once the first is hidden — and its colours from theme tokens instead of fixed hex. It is a `role="img"` named after the item ("PDF file", "Folder", ", shared" appended when shared; `label` overrides it), where the 1.0 icon called every file "File type icon" and left folders unnamed. `FileName` puts it before a truncating name with an optional `details` line; since the visible name already says what the item is, it hides the icon and announces the shared state through a visually-hidden `sharedLabel` instead, and while `loading` leaves the spinner in the tree so the busy state is still announced. `FolderName` is a `FileName` fixed to the folder type. `SharedEntityIndicator` is the badge on its own, a named `role="img"` whose tooltip is a pointer-only hint. Default icon size is 20px (`DIAL_ICON_SIZE.MD`), where 1.0 used 18px. They carry `dial-kit-file-icon`, `dial-kit-file-name`, `dial-kit-folder-name` (additive to `dial-kit-file-name`) and `dial-kit-shared-entity-indicator`. The 1.0 components are untouched.
|
|
47
|
+
|
|
48
|
+
- **`TransferQueue` (2.0)** — the floating "Importing 5 files" panel for an upload, download, import or export, moved into the kit from `@epam/ai-dial-conversation-panel`'s `ImportExportQueue` so the file manager can use it for uploads too. It is generic: `items` are `{ id, name, status, percent?, message? }` with `TransferQueueItemStatus` (`InProgress`, `Success`, `Warning`, `Failed`, `Canceled`), not the conversation-transfer job the chat library used. Each row draws the 2.0 `FileIcon` for its name, a truncating name, and a trailing status: a named spinner with a cancel control on hover or focus (only when `onCancelItem` is passed; the spinner never takes the pointer, so the control stays clickable in the same cell), a named check, a warning or error icon whose `message` is both its tooltip and its focusable accessible name — a tooltip alone renders nothing on touch — or "Canceled". The header has the caller's `title` verbatim, a failed-item count badge, and collapse (`aria-expanded`/`aria-controls`) and close controls. Collapsed while work runs, the rows give way to one aggregate `ProgressBar` whose `aria-valuetext` counts settled items rather than a percentage. Closing with work in progress or a failure unread asks for confirmation first; once every item succeeds the queue calls `onClose` by itself after `autoCloseDelay` (8000 ms by default, `0` disables), and a warned or canceled row keeps it open. The root is a polite `role="status"` region carrying `dial-kit-transfer-queue` (`DIAL_KIT_CLASS.transferQueue`); positioning is the host's. Every string has an English default in `DEFAULT_TRANSFER_QUEUE_LABELS` and takes an override through `labels`.
|
|
49
|
+
|
|
50
|
+
- **`Accordion` (2.0) — `caretPosition`** — the header always drew its caret after the title, pushed to the far edge, and a caller whose design puts it beside the title had no way to ask for that. `caretPosition` takes `AccordionCaretPosition.Start` (before the title, with a gap) or `AccordionCaretPosition.End` (the default, today's placement). A non-collapsible panel still draws no caret. Additive; nothing renders differently without it. Requested in [ai-dial-chat](https://github.com/epam/ai-dial-chat) while moving its hand-rolled disclosures onto `Accordion`.
|
|
51
|
+
|
|
52
|
+
- **`InlineSelect` (2.0) — `triggerClassName`, `triggerLabelClassName` and `onOpenChange`** — the trigger could not be restyled: `InlineSelect` took no class for it, and a caller whose design puts the value in a bordered pill, themed by its own colour properties, had to keep a hand-rolled trigger beside the kit `Dropdown`. `triggerClassName` is merged onto the trigger button after its own classes, `triggerLabelClassName` onto its label (now a `<span>`, so a type-scale or colour class has something to land on), and `onOpenChange` reports the dropdown opening and closing, for a caller that reacts to it beyond what `aria-expanded` styles. All three are additive; nothing renders differently without them. Requested in [ai-dial-chat](https://github.com/epam/ai-dial-chat) for the share popover's access pill.
|
|
53
|
+
|
|
54
|
+
- **`InlineSelect` (2.0) — controlled `open`, and `listStyle`** — `onOpenChange` reported the dropdown opening, but the caller could not close it: a popover that owns Escape (closing its own menu first and itself only on a second press) had no way to shut the select without shutting itself. `open` makes the open state controlled, the same way `Dropdown`'s already is; without it the select keeps its own. `listStyle` is passed through to the `Dropdown` overlay, which renders in a portal, so custom properties a caller sets on its own wrapper can reach the rows, as they already can for `Dropdown`. Both are additive; nothing renders differently without them.
|
|
55
|
+
|
|
56
|
+
- **`BottomSheet` (2.0)** — a panel that slides up from the bottom edge over a dimmed page, the mobile counterpart of `Popup`, moved into the kit from ai-dial-chat's `BottomSheetShell`, which sat inside one feature library and was imported across a library boundary by another. It is built on the same Floating UI pieces as `Popup` rather than on a hand-written focus trap: a portal, a scroll-locking `FloatingOverlay` on the `z-popup` layer, a `FloatingFocusManager` that moves focus to the panel on open, keeps it inside and returns it on close, and `useDismiss`, so Escape, the close button and a press on the backdrop (unless `closeOnOutsideClick` is false) all call `onClose` while `open` stays the caller's. A `title` gives a 60px header with the title centred as an `<h2>` that names the dialog, a close button at the end and, with `onBack`, a back button at the start whose arrow mirrors in RTL; without a title there is no header and `ariaLabel` names the sheet. `backAriaLabel` and `closeAriaLabel` default to English. The body scrolls past 85% of the viewport height. The panel slides in over 300ms (`animate-slideUp`, a new theme animation) and not at all under `prefers-reduced-motion`. The panel carries `dial-kit-bottom-sheet` (`DIAL_KIT_CLASS.bottomSheet`).
|
|
57
|
+
|
|
58
|
+
- **`Badge` (2.0)** — a short, static label: a topic, a category, or a status that is not a control, moved into the kit from ai-dial-chat's catalog, where `CardTag` and `FeaturedChip` drew two hand-rolled 24px labels. `Tag` is the kit's selectable, dismissable chip at 32px; a badge never responds to the pointer. `BadgeVariant.Outlined` (the default) is the neutral label, bordered on the sunken layer in `dial-tiny-text`; `BadgeVariant.Filled` is a pill in one of the theme's visual colours — `BadgeColor.Blue` (default), `Green`, `Violet`, `Indigo`, `Brown` or `Red` — in the self-uppercasing `dial-caption-lead-semi-text`, so the label is passed in sentence case. `textClassName` replaces the variant's type scale, `icon` adds a decorative icon before the label, and native span attributes pass through. The root carries `dial-kit-badge` (`DIAL_KIT_CLASS.badge`).
|
|
59
|
+
|
|
60
|
+
- **`Avatar` (2.0)** — a person's or an entity's picture, or its initials on a colour picked from its name, moved into the kit from `@epam/ai-dial-chat-shared`'s `InitialsAvatar` and `@epam/ai-dial-navigation-panel`'s `UserAvatar`, which hosts were each reimplementing. `name` gives the initials (through the newly exported `extractInitials`: 1–2 letters, Unicode-aware, punctuation skipped, `?` when there are none) and a colour pair from the theme's visual tokens — the same name always gets the same colours, and they follow the active theme. `initials` overrides the derived ones. `src` shows an image instead; a missing or broken image falls back to the initials, `onImageError` reports the failure, and a new `src` is tried again. `shape` is `AvatarShape.Circle` for a person (the default) or `AvatarShape.Square` for an application or model. `size` sets the width and height and, unless `textClassName` supplies a type-scale class, a font size of 40% of it. With an `alt` the avatar is a `role="img"` named by it, image or initials alike; without one it is decorative and hidden from assistive technology. The root carries `dial-kit-avatar` (`DIAL_KIT_CLASS.avatar`).
|
|
61
|
+
|
|
62
|
+
- **`SideDrawer` (2.0)** — a full-height panel that slides in from the inline end over a dimmed page, moved into the kit from ai-dial-chat, where the catalog's `DetailsPanel` and `StandalonePublishPanel` each carried a near-identical copy with its own backdrop, transform transition, `inert` handling and hand-written Tab trap. Neither `Popup` (a centred modal) nor `CollapsibleSidebar` (an inline rail) covered it. It is built on the same Floating UI pieces as `Popup`: a scroll-locking `FloatingOverlay` on `z-popup`, a `FloatingFocusManager` that moves focus to the panel on open and returns it on close, and `useDismiss` for Escape and a press on the backdrop (unless `closeOnOutsideClick` is false), all calling `onClose` while `open` stays the caller's. Unlike `Popup` the panel stays mounted while closed, so it slides out as well as in and keeps the state of what it holds; closed, it is `inert`, the focus manager and scroll lock are off, and the backdrop lets pointer events through. On desktop it is 540px wide with a rounded, bordered leading edge; on mobile it takes the full width; it slides from the end in either writing direction over 300ms, and not at all under `prefers-reduced-motion`. The header follows `Popup`: `onBack` (with `backDisabled`), the title — a string `header` renders an `<h2>` that names the dialog, a node needs `ariaLabel` — then `headerActions` and the close button, which `closeDisabled` disables and `hideClose` leaves out. The panel carries `dial-kit-side-drawer` (`DIAL_KIT_CLASS.sideDrawer`).
|
|
63
|
+
|
|
64
|
+
- **`BottomSheet` and `SideDrawer` (2.0) — `style` and `overlayStyle`, and `headerClassName` on `BottomSheet`** — both render in a portal at the end of `<body>`, so custom properties a caller sets on its own wrapper never reached the panel, its header or the backdrop, and `className` can carry a class but not a runtime value. A host theming the sheet through `var(--…)` — a panel background, a title colour, a divider, a backdrop tint — had no way to deliver the values. `style` is an inline style on the panel and `overlayStyle` one on the backdrop, merged after its own positioning; `headerClassName` reaches `BottomSheet`'s header row, which `SideDrawer` already exposed. All additive; nothing renders differently without them. Requested in [ai-dial-chat](https://github.com/epam/ai-dial-chat), whose bottom sheets and side panels theme their surfaces through public colour props.
|
|
65
|
+
|
|
66
|
+
- **`Select` (2.0) — `collapseTagOverflow`, a one-row multi-select with a `+N` counter** — a multi-select could only wrap its tags onto more rows, so a field in a dense form or a table cell grew without bound. `collapseTagOverflow` keeps the tags on one row, as it does on `TagInput`, and folds the ones that do not fit into a `+N` tag; hovering it opens an `InteractiveTooltip` listing the hidden tags, each still removable. The count follows the width the field has, not the number of tags: the tags are taken in order while they fit beside the counter, and it is recomputed on resize. Without the prop the tags wrap as before; the prop is ignored with `customMultiSelectTagsRenderer`, and on a mobile screen the tags wrap, since the panel opens on hover. Additive.
|
|
67
|
+
|
|
68
|
+
### Changed
|
|
69
|
+
|
|
70
|
+
- **`StarterButton` (2.0) — a sparkles icon by default** — the design puts a sparkles glyph before every starter label, so each host was passing the same `iconBefore`. `iconBefore` now defaults to a 20px `IconSparkles` at the 1.5 stroke, `aria-hidden`, and stroked with the starter gradient like any other icon. A caller-supplied `iconBefore` replaces it; `iconBefore={null}` keeps a label-only pill. A `StarterButton` that passed no `iconBefore` now draws the icon; no other API changes.
|
|
71
|
+
|
|
72
|
+
- **`Select` (2.0) — multi-select tags are 24px, and the field wraps them with an 8px gap** — the tags in a multi-select field used the 32px pill of `Tag`, taller than the design's field chip. They are now 24px with a `rounded-md` shape, a `layer-sunken` fill and a `stroke-secondary` rim, and the wrapped field pads 8px vertically with 8px between tags, so one row of tags still fills the 40px field. `Tag` itself is unchanged. Visual only; no API changes.
|
|
73
|
+
|
|
74
|
+
### Fixed
|
|
75
|
+
|
|
76
|
+
- **`Textarea` (2.0) — `invalid` no longer reaches the DOM** — the prop was spread onto the `<textarea>`, so React warned about a non-boolean `invalid` attribute on every render. It now only selects the error styling. No visual change.
|
|
77
|
+
|
|
78
|
+
- **`Dropdown` and `Select` — a submenu closes when its menu or the page scrolls** — a submenu is portalled and repositioned by Floating UI's `autoUpdate`, so scrolling the list that holds its trigger, or the page, left the submenu open and dragged it along after the trigger, even once the trigger had scrolled out of the clipped list. The submenu now closes when an ancestor of its trigger scrolls. Scrolling inside the submenu does not close it. The fix is in the shared submenu hook, so it covers the 2.0 and 1.0 `Dropdown` and `Select` submenus. Reported in [ai-dial-chat#9295](https://github.com/epam/ai-dial-chat/issues/9295), on the catalog's Create menu.
|
|
79
|
+
|
|
80
|
+
- **`Select` and `Dropdown` (2.0) — rows keep their 40px when the panel is capped** — the rows are `flex-col` items with a fixed height inside a list that scrolls at the panel's height cap, and a flex item shrinks by default: on a short viewport the rows collapsed to their content, with the check boxes squeezed and the focus ring hugging the text. The shared overlay row no longer shrinks.
|
|
81
|
+
|
|
82
|
+
- **`Button` and `IconButton` (2.0) — a disabled button's tooltip opens** — `tooltipProps` wraps the button in `<Tooltip asChild>`, but a natively `disabled` button receives no pointer or focus events, so its tooltip could never open. That is exactly the state where a "why is this unavailable" hint matters, and callers worked around it with their own `<span>` wrapper, which no keyboard user could reach either. A disabled button that has a visible tooltip is now marked `aria-disabled="true"` instead of `disabled`: it stays in the tab order and answers hover and focus, so the tooltip opens for mouse and keyboard users alike, and it is still announced as unavailable. Its click is swallowed with `preventDefault`, so neither `onClick` nor a `type="submit"` form submission fires. Without a tooltip, or while `hideTooltip` is set, the button stays natively disabled as before. The disabled look is unchanged, since every 2.0 variant already styles `[aria-disabled="true"]`; the two ghost icon-button rules that styled only `:disabled` now style both. Requested in [ai-dial-chat](https://github.com/epam/ai-dial-chat), where the chat-settings dialog explains why "Apply changes" is disabled.
|
|
83
|
+
|
|
84
|
+
- **`InlineSelectTrigger` (2.0) — a `className` no longer wipes out the trigger's own classes** — the props were spread after the merged `className`, so passing `className` replaced it outright: the trigger lost its padding, pill shape, hover tint and focus ring, and the public `dial-kit-inline-select` class. `className` is now merged after the trigger's own classes, the way every other 2.0 component takes it. The trigger's own `aria-haspopup`, `aria-expanded` and `aria-label` also now win over the same attributes passed as props.
|
|
85
|
+
|
|
86
|
+
- **`Accordion` (2.0) — the caret follows the reading direction, and the panel slides open and shut** — the collapsed caret pointed right under `dir="rtl"` too, against the reading direction; it now turns to point left in RTL and still points down once open. The content was also mounted only while expanded, so it appeared and vanished in one frame. It now stays mounted and animates its height (`grid-template-rows` 0fr ↔ 1fr, 200 ms, off under `prefers-reduced-motion`); while collapsed it is `inert`, so nothing in it is focusable or announced, and `aria-controls` always points at the region. The 12px gap under the header moved inside the clipped part, so a collapsed panel is exactly as tall as before. A caller that relied on the content unmounting while collapsed (to defer an expensive render, or to reset child state on close) now needs to render it conditionally itself. Requested in [ai-dial-chat](https://github.com/epam/ai-dial-chat) while moving its conversation stages onto `Accordion`.
|
|
87
|
+
|
|
88
|
+
- **`Select` and `Dropdown` (2.0) — rows are 2px apart, and every option list and submenu has the same vertical inset** — rows were stacked edge to edge, so a selected row's tint and a hovered neighbour's merged into one block; every option list, menu and kit-rendered submenu now stacks its rows with `gap-0.5` (the shared `overlayListClassName`). Separately, the `Dropdown` menu wraps its rows in `py-1` inside the panel's `p-1`, but the `Select` option list and the submenus of both components rendered their rows straight into the panel, so the first and last rows (and the focus ring of a keyboard-focused one) sat flush against its top and bottom edge. The `Select` option list now carries the same `py-1`, and a submenu panel of kit-rendered rows takes `py-2` — the same 8px in total. A `Dropdown` submenu drawn through `renderSubMenu` keeps the plain panel, as a `renderOverlay` body does at the top level.
|
|
89
|
+
|
|
90
|
+
- **`MarkdownEditor` (2.0) — the live preview is part of the card now, instead of a sheet of GitHub's own CSS laid over it** — the 2.0 restyle covered the card and the toolbar and stopped at the split: everything right of it was still `@uiw/react-md-editor`'s default stylesheet. Three things came out of that. The pane divider was the library's `inset` box-shadow in a hardcoded `#d0d7de`, drawn on the preview and then painted over by the markdown body's opaque white — and since that body is only as tall as its content, the divider survived as a hairline starting halfway down the pane, under the last rendered block. The white itself was the second: a `#ffffff` patch over the card's `bg-layer-raised`, which a dark theme would have kept white. And Tailwind's preflight, which the kit ships, had stripped the list markers and the task-list checkbox out of the rendered markdown — a bulleted list came out as indented lines, a `- [ ]` as a 0×0 box. The divider is now a real border on `border-secondary`, the body and its table rows are transparent, code, quotes, tables and headings take kit tokens, and lists and task boxes render again. The preview also inherits the host's font and `text-primary` instead of the library's `-apple-system` stack and `#24292f`; the edit pane keeps its monospace face. Both panes gained a 16px gutter beside the divider, so text no longer butts against it.
|
|
91
|
+
- **`MarkdownEditor` (2.0) — the two panes no longer sit on top of each other in RTL** — live mode pins the preview with a physical `right: 0` while the edit pane is a plain block at the inline start, so under `dir="rtl"` both landed on the right unless the host knew to add the library's own `w-md-editor-rtl` class. The preview is now placed with logical insets and the panes' text aligns to `start`, so the edit pane and the preview swap sides with the document direction — divider, gutters and the quote bar included — with no class for the host to remember.
|
|
92
|
+
- **`DialSchemaRenderer` — required-field errors quote the field label** — the message was `${label} is required`, so with a long schema `title` the reader could not tell where the field name ended and "is required" began. The label is now wrapped in double quotes (`"API key" is required`) wherever the renderer builds the message — the inline field error and the `validateRequired` result alike. The label is still the schema `title` (or the label derived from the property key), never the entered value. Consumers asserting the old text in their tests need to add the quotes. Requested in [ai-dial-admin-frontend#4731](https://github.com/epam/ai-dial-admin-frontend/issues/4731).
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
10
96
|
## [0.14.0]
|
|
11
97
|
|
|
12
98
|
### Breaking Changes
|