@acronis-platform/ui-react 5.5.9 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/components/ui/chart/chart.js +14 -11
  2. package/dist/components/ui/chart/chart.js.map +1 -1
  3. package/dist/components/ui/chart-state/chart-state.js +47 -37
  4. package/dist/components/ui/chart-state/chart-state.js.map +1 -1
  5. package/dist/components/ui/chart-widget/chart-widget.js +21 -23
  6. package/dist/components/ui/chart-widget/chart-widget.js.map +1 -1
  7. package/dist/components/ui/data-table/data-table.js +174 -173
  8. package/dist/components/ui/data-table/data-table.js.map +1 -1
  9. package/dist/components/ui/dialog/dialog.js +52 -38
  10. package/dist/components/ui/dialog/dialog.js.map +1 -1
  11. package/dist/components/ui/dropdown-menu/dropdown-menu.js +8 -2
  12. package/dist/components/ui/dropdown-menu/dropdown-menu.js.map +1 -1
  13. package/dist/components/ui/page-header/page-header.js +4 -4
  14. package/dist/components/ui/page-header/page-header.js.map +1 -1
  15. package/dist/components/ui/pie-chart/pie-chart.js +88 -84
  16. package/dist/components/ui/pie-chart/pie-chart.js.map +1 -1
  17. package/dist/index.js +45 -46
  18. package/dist/llms/chart-state.md +81 -164
  19. package/dist/llms/chart-widget.md +27 -25
  20. package/dist/llms/data-table.md +24 -14
  21. package/dist/llms/dialog-root.md +40 -13
  22. package/dist/llms/dialog.md +109 -14
  23. package/dist/llms/dropdown-menu.md +68 -3
  24. package/dist/llms/page-header.md +68 -11
  25. package/dist/llms/stepper-item.md +10 -7
  26. package/dist/llms.txt +4 -4
  27. package/dist/react.js +45 -46
  28. package/dist/src/components/ui/chart/chart.d.ts +3 -3
  29. package/dist/src/components/ui/chart-state/chart-state.d.ts +5 -14
  30. package/dist/src/components/ui/chart-state/index.d.ts +0 -1
  31. package/dist/src/components/ui/chart-widget/chart-widget.d.ts +10 -15
  32. package/dist/src/components/ui/data-table/data-table.d.ts +11 -5
  33. package/dist/src/components/ui/data-table/data-table.docs.d.ts +10 -4
  34. package/dist/src/components/ui/dialog/dialog.d.ts +10 -0
  35. package/dist/src/components/ui/dialog/dialog.docs.d.ts +7 -1
  36. package/dist/src/components/ui/dropdown-menu/dropdown-menu.d.ts +8 -1
  37. package/dist/src/components/ui/dropdown-menu/index.d.ts +1 -1
  38. package/dist/src/components/ui/page-header/page-header.d.ts +3 -1
  39. package/dist/src/components/ui/pie-chart/pie-chart.d.ts +1 -1
  40. package/dist/ui-react.css +1 -1
  41. package/package.json +13 -13
  42. package/dist/components/ui/chart-state/chart-state-illustrations.js +0 -412
  43. package/dist/components/ui/chart-state/chart-state-illustrations.js.map +0 -1
  44. package/dist/src/components/ui/chart-state/chart-state-illustrations.d.ts +0 -6
@@ -1,6 +1,6 @@
1
1
  # Dialog
2
2
 
3
- > A higher-level "recipe" dialog built on top of the DialogRoot primitive parts. A single `variant` prop selects one of seven canned use-cases (default, rename, save changes, reset password, discard changes, accept, read-only) — each with its own title, body copy and footer buttons — plus a legacy `wide` escape hatch (no Figma preset, free-form footer via the `footer` prop) kept for backward compatibility with pre-Figma call sites. `children` overrides the body slot and `hasLoading` shows a `Loading` overlay. Colors, typography, and container/header/footer geometry resolve to the `--ui-dialog-*`/`--ui-footer-*` token tier (see tokens.yaml). In Figma the matching component set is named "DialogDefault"; the code-facing name is `Dialog`.
3
+ > A higher-level "recipe" dialog built on top of the DialogRoot primitive parts. A single `variant` prop selects one of seven canned use-cases (default, rename, save changes, reset password, discard changes, accept, read-only) — each with its own title, body copy and footer buttons — plus a legacy `wide` escape hatch (no Figma preset, free-form footer via the `footer` prop) kept for backward compatibility with pre-Figma call sites. `children` overrides the body slot, `bodyClassName` styles its wrapper, and `hasLoading` shows a `Loading` overlay. The popup is top-aligned 48px from the viewport edge by default; `verticalAlign="center"` opts into vertical centering. Colors, typography, and container/header/footer geometry resolve to the `--ui-dialog-*`/`--ui-footer-*` token tier (see tokens.yaml). In Figma the matching component set is named "DialogDefault"; the code-facing name is `Dialog`.
4
4
 
5
5
  **Status:** draft · **Category:** overlays · **Since:** v0.58.0
6
6
 
@@ -25,6 +25,28 @@ import { Dialog } from '@acronis-platform/ui-react'
25
25
  <p>Any custom content.</p>
26
26
  </Dialog>
27
27
 
28
+ {/* Full-height body with independent scroll panes */}
29
+ <Dialog
30
+ variant="wide"
31
+ size="large"
32
+ title="Add a widget"
33
+ className="h-[90vh] max-w-[min(71rem,calc(100dvw-96px))]"
34
+ bodyClassName="flex-1 min-h-0 p-0 justify-start overflow-hidden"
35
+ defaultOpen
36
+ >
37
+ <div className="flex min-h-0 min-w-0 flex-1">
38
+ <aside
39
+ tabIndex={0}
40
+ className="w-28 shrink-0 overflow-y-auto border-e border-border sm:w-60"
41
+ >
42
+ Categories
43
+ </aside>
44
+ <section tabIndex={0} className="min-h-0 min-w-0 flex-1 overflow-y-auto">
45
+ Widget cards
46
+ </section>
47
+ </div>
48
+ </Dialog>
49
+
28
50
  {/* Interpolate the real object name into the canned title/body */}
29
51
  <Dialog variant="rename" objectName="Q3 Report.xlsx" open onOpenChange={setOpen} />
30
52
 
@@ -49,6 +71,10 @@ same `DialogRoot` + `DialogHeader` + `DialogFooter` boilerplate each time. In
49
71
  Figma the matching component set is named "DialogDefault"; the code-facing
50
72
  name is `Dialog`.
51
73
 
74
+ The popup is horizontally centered and top-aligned 48px from the viewport edge
75
+ by default, matching the full-screen product mockups. Set
76
+ `verticalAlign="center"` for flows that need vertical centering.
77
+
52
78
  > **Status: draft.** Container/header/footer geometry and color resolve to the
53
79
  > `--ui-dialog-*`/`--ui-footer-*` token tier (reconciled against the Figma
54
80
  > "DialogDefault" node). `size="large"` (832px) is the one exception — a legacy
@@ -63,16 +89,19 @@ name is `Dialog`.
63
89
  - You have a legacy call site that needs a wider popup and fully custom footer
64
90
  buttons — use `variant="wide"` (see below). This is a backward-compatibility
65
91
  escape hatch, not a recommended pattern for new work.
92
+ - You need a full-bleed or fixed-height body while keeping the recipe's header
93
+ and footer — use `bodyClassName` to adjust the body wrapper and compose the
94
+ panes inside `children`.
66
95
  - You need a body-only dialog with no title bar and/or no action bar — set
67
96
  `hasHeader`/`hasFooter` to `false`. Both default to `true`; this is beyond
68
97
  the strict Figma contract (all seven canned variants always show both).
69
98
 
70
99
  ## When not to use
71
100
 
72
- - You need a bespoke layout or extra parts none of the seven variants (or the
73
- `wide` escape hatch) cover — this is a gap to raise with the design system
74
- team (the underlying `DialogRoot` primitive is internal-only, not a public
75
- escape hatch).
101
+ - You need a completely bespoke dialog structure or extra parts the recipe
102
+ cannot express — this is a gap to raise with the design system team (the
103
+ underlying `DialogRoot` primitive is internal-only, not a public escape
104
+ hatch).
76
105
  - For transient, non-blocking feedback — use a toast.
77
106
  - For contextual hints anchored to an element — use a tooltip or popover.
78
107
 
@@ -95,15 +124,15 @@ name is `Dialog`.
95
124
 
96
125
  ## Parts
97
126
 
98
- | Part | Element (default) | Purpose |
99
- | ----------------- | ------------------ | ---------------------------------------------------- |
100
- | `container` | `div[role=dialog]` | The portaled, centered popup card. |
101
- | `header` | `div` | Top bar; title + close button. |
102
- | `title` | `h2` | Accessible dialog name (`aria-labelledby`). |
103
- | `close-button` | `button` | Icon button that dismisses the dialog. |
104
- | `body` | `div` | Variant copy or the `children` override. |
105
- | `footer` | `div` | Right-aligned action bar; or the free-form `footer`. |
106
- | `loading-overlay` | `div` | Spinner scrim shown while `hasLoading`. |
127
+ | Part | Element (default) | Purpose |
128
+ | ----------------- | ------------------ | ------------------------------------------------------- |
129
+ | `container` | `div[role=dialog]` | The portaled popup card; centered (or top-aligned). |
130
+ | `header` | `div` | Top bar; title + close button. |
131
+ | `title` | `h2` | Accessible dialog name (`aria-labelledby`). |
132
+ | `close-button` | `button` | Icon button that dismisses the dialog. |
133
+ | `body` | `div` | Variant copy or `children`; styled via `bodyClassName`. |
134
+ | `footer` | `div` | Right-aligned action bar; or the free-form `footer`. |
135
+ | `loading-overlay` | `div` | Spinner scrim shown while `hasLoading`. |
107
136
 
108
137
  ## Example
109
138
 
@@ -118,6 +147,28 @@ import { Dialog } from '@acronis-platform/ui-react';
118
147
  <p>Any custom body content.</p>
119
148
  </Dialog>;
120
149
 
150
+ // Full-bleed, fixed-height body with independent scroll panes
151
+ <Dialog
152
+ variant="wide"
153
+ size="large"
154
+ title="Add a widget"
155
+ open
156
+ className="h-[90vh] max-w-[min(71rem,calc(100dvw-96px))]"
157
+ bodyClassName="flex-1 min-h-0 p-0 justify-start overflow-hidden"
158
+ >
159
+ <div className="flex min-h-0 min-w-0 flex-1">
160
+ <aside
161
+ tabIndex={0}
162
+ className="w-28 shrink-0 overflow-y-auto border-e border-border sm:w-60"
163
+ >
164
+ Categories
165
+ </aside>
166
+ <section tabIndex={0} className="min-h-0 min-w-0 flex-1 overflow-y-auto">
167
+ Widget cards
168
+ </section>
169
+ </div>
170
+ </Dialog>;
171
+
121
172
  // Busy state
122
173
  <Dialog variant="save changes" hasLoading open />;
123
174
 
@@ -146,6 +197,11 @@ import { Dialog } from '@acronis-platform/ui-react';
146
197
  <p>Body-only content — no title bar, no close button.</p>
147
198
  </Dialog>;
148
199
 
200
+ // Opt into vertical centering when a flow calls for it
201
+ <Dialog variant="default" verticalAlign="center" open>
202
+ <p>Any custom body content.</p>
203
+ </Dialog>;
204
+
149
205
  // Legacy wide variant — free-form footer, kept for backward compatibility
150
206
  import { Button, DialogClose } from '@acronis-platform/ui-react';
151
207
 
@@ -174,6 +230,7 @@ import { Button, DialogClose } from '@acronis-platform/ui-react';
174
230
  | `loadingLabel` | `string` | `'Data is loading…'` | no | Overrides the loading overlay's accessible label. Ignored when `hasLoading` is `false`. |
175
231
  | `hasHeader` | `boolean` | `true` | no | Shows the header (title + close button). When `false`, the title is still rendered off-screen so the dialog keeps an accessible name — only the visible bar and close button are omitted. Beyond the strict Figma contract (all seven canned variants always show the header) — a ui-react-only extension, like `wide`/`size="large"`. |
176
232
  | `hasFooter` | `boolean` | `true` | no | Shows the footer (action buttons). Beyond the strict Figma contract (all seven canned variants always show the footer) — a ui-react-only extension, like `wide`/`size="large"`. When `false`, `footer` is not rendered either. |
233
+ | `bodyClassName` | `string` | — | no | Adds classes to the Dialog body wrapper (React: `bodyClassName`) so a caller can adjust its padding, alignment, flex sizing, and overflow for full-bleed or fixed-height layouts. Classes merge with the defaults; `className` continues to style the popup container. |
177
234
  | `title` | `string` | — | no | Overrides the variant's default title, for localization or copy changes. |
178
235
  | `objectName` | `string` | — | no | The real name of the object being acted on (e.g. a file or resource name). Interpolated into the `rename`/`discard changes`/`accept` variants' canned title/body in place of the generic placeholder text (e.g. `rename` → "Rename {objectName}" and the field's prefilled value); ignored by variants that don't reference an object name. |
179
236
  | `objectNameLabel` | `string` | `'Object name'` | no | Overrides the accessible name of the `rename` variant's text field. Ignored by every other variant. |
@@ -185,6 +242,7 @@ import { Button, DialogClose } from '@acronis-platform/ui-react';
185
242
  | `default-open` | `boolean` | `false` | no | Initial open state when uncontrolled (React `defaultOpen`). |
186
243
  | `modal` | `boolean | 'trap-focus'` | `true` | no | Modal behavior — traps focus and locks background scroll while open. `'trap-focus'` keeps the focus trap but allows background interaction. |
187
244
  | `size` | `'sm' | 'large'` | `'sm'` | no | Popup max-width (forwarded to the underlying content). Defaults to `sm` (512px, the Figma-defined size), or to `large` (832px) when `variant` is `wide`. `large` predates the Figma node and has no design token — a legacy backward-compatibility size, not a design-system width scale. |
245
+ | `verticalAlign` | `'center' | 'top'` | `'top'` | no | Vertical placement of the popup (forwarded to the underlying content). `top` (the default) pins it 48px from the top edge of the viewport; `center` centers it vertically, keeping its content height. A ui-react-only extension beyond the Figma contract, like `size="large"`. |
188
246
  | `portal` | `boolean` | `true` | no | Render the content inside a portal (forwarded to the underlying content). Required for correct stacking; disable only when supplying your own portal ancestor. |
189
247
  | `keepMounted` | `boolean` | — | no | Keep the content mounted while closed (forwarded to the underlying content's portal). |
190
248
 
@@ -241,6 +299,33 @@ Scenario: The wide variant is a free-form escape hatch
241
299
  secondary/primary pair
242
300
  ```
243
301
 
302
+ ### Placement
303
+
304
+ ```gherkin
305
+ Scenario: The popup is top-aligned by default
306
+ Given a Dialog with no verticalAlign (or verticalAlign = "top")
307
+ When it opens
308
+ Then the popup's top edge sits 48px below the top of the viewport
309
+ And it stays horizontally centered
310
+ And it keeps its content height (still capped at 100dvh - 96px)
311
+ ```
312
+
313
+ ```gherkin
314
+ Scenario: verticalAlign = "center" opts into vertical centering
315
+ Given a Dialog with verticalAlign = "center"
316
+ When it opens
317
+ Then the popup is centered vertically in the viewport
318
+ And it stays horizontally centered
319
+ ```
320
+
321
+ ```gherkin
322
+ Scenario: A narrow viewport keeps the popup's 48px edge margin
323
+ Given a viewport narrower than the Dialog's 256px minimum width plus 96px
324
+ When the Dialog opens
325
+ Then its minimum width shrinks to the available viewport width minus 96px
326
+ And the popup keeps at least 48px between each horizontal edge and viewport edge
327
+ ```
328
+
244
329
  ### Body slot
245
330
 
246
331
  ```gherkin
@@ -251,6 +336,16 @@ Scenario: Children override the canned body
251
336
  And the header title and footer buttons are unchanged
252
337
  ```
253
338
 
339
+ ```gherkin
340
+ Scenario: bodyClassName styles the body wrapper independently of the popup
341
+ Given an open Dialog with a fixed popup height
342
+ And bodyClassName sets flex-1, min-h-0, zero padding, and start alignment
343
+ When it opens
344
+ Then those classes apply to the body wrapper while className stays on the popup
345
+ And the body fills the space between the header and footer
346
+ And the caller can give its body panes independent overflow behavior
347
+ ```
348
+
254
349
  ### Object name interpolation
255
350
 
256
351
  ```gherkin
@@ -35,6 +35,9 @@ token tier from `@acronis-platform/tokens-pd`.
35
35
 
36
36
  - A compact list of **actions** triggered from a `ButtonMenu` (row actions,
37
37
  account menu, "more" overflow).
38
+ - The menu is non-modal by default, so the rest of the page remains scrollable
39
+ and interactive. Set `modal` to `true` when the page should be blocked while
40
+ the menu is open.
38
41
 
39
42
  ## When not to use
40
43
 
@@ -83,12 +86,40 @@ import {
83
86
  </DropdownMenu>;
84
87
  ```
85
88
 
89
+ ## Explain a disabled action
90
+
91
+ Attach the tooltip trigger to the disabled menu item itself. The row stays the
92
+ menu's single keyboard focus target, while pointer hover and menu focus can open
93
+ the tooltip. Include the reason in the item's accessible name or description;
94
+ the visual tooltip is supplemental.
95
+
96
+ ```tsx
97
+ import {
98
+ DropdownMenuItem,
99
+ Tooltip,
100
+ TooltipContent,
101
+ TooltipTrigger,
102
+ } from '@acronis-platform/ui-react';
103
+
104
+ <Tooltip>
105
+ <TooltipTrigger
106
+ aria-label="Export report is unavailable. Requires administrator access."
107
+ render={<DropdownMenuItem disabled>Export report</DropdownMenuItem>}
108
+ />
109
+ <TooltipContent>
110
+ Export report is unavailable. Requires administrator access.
111
+ </TooltipContent>
112
+ </Tooltip>;
113
+ ```
114
+
86
115
  ## Props
87
116
 
88
117
  | Prop | Type | Default | Required | Description |
89
118
  |------|------|---------|----------|-------------|
90
119
  | `open` | `boolean` | — | no | Controlled open state. Pair with the change event. |
91
120
  | `default-open` | `boolean` | `false` | no | Initial open state when uncontrolled. |
121
+ | `modal` | `boolean` | `false` | no | Whether opening the menu blocks interaction outside it and locks page scrolling. Defaults to non-modal behavior. |
122
+ | `disabled` | `boolean` | `false` | no | On an item — prevents the action from running while preserving disabled menuitem semantics and keyboard focus. |
92
123
  | `side` | `'top' | 'bottom' | 'left' | 'right' | 'inline-start' | 'inline-end'` | `'bottom'` | no | On the content — which side of the trigger to render on. |
93
124
  | `align` | `'start' | 'center' | 'end'` | — | no | On the content — alignment along the chosen side. |
94
125
  | `side-offset` | `number` | `4` | no | On the content — distance in px from the trigger. |
@@ -113,6 +144,20 @@ state (or the consumer controls it via `open`).
113
144
 
114
145
  ### Opening & closing
115
146
 
147
+ ```gherkin
148
+ Scenario: The menu is non-modal by default
149
+ Given a menu without an explicit modal setting
150
+ When the menu opens
151
+ Then page scrolling and interaction outside the menu remain available
152
+ ```
153
+
154
+ ```gherkin
155
+ Scenario: Opting into modal behavior
156
+ Given a menu configured with modal=true
157
+ When the menu opens
158
+ Then page scrolling and interaction outside the menu are blocked
159
+ ```
160
+
116
161
  ```gherkin
117
162
  Scenario: Opening from the trigger
118
163
  Given a closed menu
@@ -141,7 +186,15 @@ Scenario: Roving navigation and typeahead
141
186
  Given an open menu
142
187
  When the user presses Arrow keys
143
188
  Then highlight moves between items (data-[highlighted])
144
- And typing characters jumps to the matching item
189
+ And typing characters jumps to a matching item
190
+ ```
191
+
192
+ ```gherkin
193
+ Scenario: Explaining a disabled action
194
+ Given an open menu with a disabled item and an explanatory tooltip
195
+ When the pointer hovers its tooltip trigger or keyboard focus reaches it
196
+ Then the tooltip opens
197
+ And the item remains disabled and its action does not run
145
198
  ```
146
199
 
147
200
  ### Submenus
@@ -165,6 +218,13 @@ roles, roving focus, typeahead, and dismissal.
165
218
  - Items are `role="menuitem"`. The shortcut hint is decorative text inside its
166
219
  item. Groups (`DropdownMenuGroup`) visually section items; non-first groups
167
220
  render a top-border separator.
221
+ - Disabled items expose `aria-disabled="true"`, remain in keyboard menu
222
+ navigation, and cannot be activated.
223
+ - To explain a disabled action, prefer attaching the tooltip trigger to the
224
+ disabled menu item itself. This keeps the menu item as the single keyboard
225
+ focus target instead of adding another interactive control inside a menu item.
226
+ - A tooltip is supplemental visual information. Keep the disabled reason in the
227
+ trigger's accessible name or description as well.
168
228
 
169
229
  ## Keyboard
170
230
 
@@ -172,16 +232,21 @@ roles, roving focus, typeahead, and dismissal.
172
232
  to the first item.
173
233
  - **Arrow Up / Down** move the highlight (roving); **Home / End** jump to
174
234
  first / last; **typeahead** jumps to a matching item.
175
- - **Arrow Right** opens a submenu from its trigger; **Arrow Left** / **Escape**
235
+ - **Arrow Right** opens a submenu from its trigger; **Arrow Left / Escape**
176
236
  closes it (Escape closes the whole menu from the root and returns focus to the
177
237
  trigger).
178
- - **Enter / Space** activates the highlighted item.
238
+ - **Enter / Space** activates the highlighted enabled item. A disabled item
239
+ stays focusable but its action does not run.
240
+ - If the tooltip trigger is the disabled menu item, keyboard navigation focuses
241
+ the trigger and opens the tooltip.
179
242
  - **Focus ring** (`--ui-focus-primary`, 3px inset) appears only on keyboard
180
243
  navigation (`focus-visible:not(:hover)`), not on pointer interaction.
181
244
 
182
245
  ## Screen reader
183
246
 
184
247
  - Opening announces the menu and its first item ("Profile, menu item 1 of 4").
248
+ - The disabled reason is available in the menu item's accessible name or
249
+ description; the visual tooltip supplements that text.
185
250
 
186
251
  ## Contrast
187
252
 
@@ -43,15 +43,15 @@ a tags slot, an actions slot) and an optional description row, capped at
43
43
 
44
44
  ## Parts
45
45
 
46
- | Export | Element | Purpose |
47
- | -------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
48
- | `PageHeader` | `div` | The banner region. |
49
- | `PageHeaderRow` | `div` | Title row: title, optional edit button, tags, actions. |
50
- | `PageHeaderTitle` | `h1` | The page title. |
51
- | `PageHeaderTags` | `div` | Optional tags slot (e.g. `Tag` chips). Collapses to the first tag + a "+#" tag (hover tooltip lists the hidden labels) when the full set doesn't fit. |
52
- | `PageHeaderActions` | `div` | Trailing action buttons. Secondary-variant buttons collapse under a "More" `ButtonIcon` dropdown when the full set doesn't fit; primary buttons never collapse. |
53
- | `PageHeaderDescriptionRow` | `div` | Optional description row (max 512px). |
54
- | `PageHeaderDescription` | `p` | Muted supporting text. |
46
+ | Export | Element | Purpose |
47
+ | -------------------------- | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
48
+ | `PageHeader` | `div` | The `banner` landmark by default; accepts a native `role` override. |
49
+ | `PageHeaderRow` | `div` | Title row: title, optional edit button, tags, actions. |
50
+ | `PageHeaderTitle` | `h1` by default | The page title; use `as="h2"` for an embedded section under an existing page title. |
51
+ | `PageHeaderTags` | `div` | Optional tags slot (e.g. `Tag` chips). Collapses to the first tag + a "+#" tag (hover tooltip lists the hidden labels) when the full set doesn't fit. |
52
+ | `PageHeaderActions` | `div` | Trailing action buttons. Secondary-variant buttons collapse under a "More" `ButtonIcon` dropdown when the full set doesn't fit; primary buttons never collapse. |
53
+ | `PageHeaderDescriptionRow` | `div` | Optional description row (max 512px). |
54
+ | `PageHeaderDescription` | `p` | Muted supporting text. |
55
55
 
56
56
  ## Example
57
57
 
@@ -72,6 +72,33 @@ a tags slot, an actions slot) and an optional description row, capped at
72
72
  </PageHeader>
73
73
  ```
74
74
 
75
+ ## Page-level and embedded headers
76
+
77
+ Keep both defaults for a page-level header: the root is a `banner` landmark and
78
+ `PageHeaderTitle` renders as `<h1>`. For a header inside an existing page-level
79
+ banner, set `role="none"` on the embedded root to avoid adding a second banner,
80
+ and use `<h2>` for the embedded title. `role="none"` suppresses the extra
81
+ landmark while the `<h2>` remains a heading. Choose the heading level from the
82
+ surrounding document hierarchy; both levels keep the same visual style.
83
+
84
+ ```tsx
85
+ <>
86
+ <PageHeader>
87
+ <PageHeaderRow>
88
+ <PageHeaderTitle>Reports</PageHeaderTitle>
89
+ </PageHeaderRow>
90
+ </PageHeader>
91
+
92
+ <section>
93
+ <PageHeader role="none">
94
+ <PageHeaderRow>
95
+ <PageHeaderTitle as="h2">Recent reports</PageHeaderTitle>
96
+ </PageHeaderRow>
97
+ </PageHeader>
98
+ </section>
99
+ </>
100
+ ```
101
+
75
102
  ### Editable title/description (full-page wizards)
76
103
 
77
104
  ```tsx
@@ -92,6 +119,13 @@ a tags slot, an actions slot) and an optional description row, capped at
92
119
  </div>
93
120
  ```
94
121
 
122
+ ## Props
123
+
124
+ | Prop | Type | Default | Required | Description |
125
+ |------|------|---------|----------|-------------|
126
+ | `PageHeader.role` | `string` | `banner` | no | Native role override for the root div. PageHeader is a banner landmark by default. Set role="none" when composing an embedded PageHeader beneath an existing page-level banner to avoid adding a second banner landmark; this does not change the heading semantics of its contents. |
127
+ | `PageHeaderTitle.as` | `'h1' | 'h2'` | `h1` | no | The heading element used for PageHeaderTitle. Use h1 for a page's primary title and h2 when the title is nested under an existing page title, such as an embedded view. Both levels share the same visual style. |
128
+
95
129
  ## Behavior
96
130
 
97
131
  ```gherkin
@@ -160,8 +194,31 @@ Scenario: Actions fit
160
194
 
161
195
  ## Accessibility
162
196
 
163
- - The region is a `banner` landmark and the title is an `<h1>` — one page title per
164
- page; ensure it fits the document outline.
197
+ - By default, the root is a `banner` landmark and the title renders as `<h1>`.
198
+ Keep these defaults for a page-level header. When composing an embedded view
199
+ beneath an existing page-level banner, set `role="none"` on its PageHeader root
200
+ to suppress the extra landmark, and set the title to `<h2>` to reflect the
201
+ surrounding document hierarchy. The role override does not remove the `<h2>`
202
+ heading semantics; both heading levels share the same visual style.
203
+
204
+ ```tsx
205
+ <>
206
+ <PageHeader>
207
+ <PageHeaderRow>
208
+ <PageHeaderTitle>Reports</PageHeaderTitle>
209
+ </PageHeaderRow>
210
+ </PageHeader>
211
+
212
+ <section>
213
+ <PageHeader role="none">
214
+ <PageHeaderRow>
215
+ <PageHeaderTitle as="h2">Recent reports</PageHeaderTitle>
216
+ </PageHeaderRow>
217
+ </PageHeader>
218
+ </section>
219
+ </>
220
+ ```
221
+
165
222
  - If a breadcrumb is composed above PageHeader, it's a separate `Breadcrumb` with
166
223
  its own `<nav aria-label="breadcrumb">` — not a PageHeader part, so it carries
167
224
  its own accessibility contract (see the Breadcrumb spec).
@@ -16,13 +16,13 @@ import { StepperItem } from '@acronis-platform/ui-react'
16
16
  <StepperItem
17
17
  variant="completed"
18
18
  label="Create an account"
19
- avatar={<Avatar color="green"><CheckIcon size={16} /></Avatar>}
19
+ avatar={<Avatar color="green" className="[box-shadow:none]"><CheckIcon size={16} /></Avatar>}
20
20
  render={<button type="button" onClick={goToStep(1)} />}
21
21
  />
22
22
  <StepperItem
23
23
  variant="current"
24
24
  label="Choose a plan"
25
- avatar={<Avatar color="blue"><AvatarFallback>2</AvatarFallback></Avatar>}
25
+ avatar={<Avatar color="blue" className="[box-shadow:none] text-[var(--ui-stepper-item-current-label-color)]"><AvatarFallback>2</AvatarFallback></Avatar>}
26
26
  />
27
27
  ```
28
28
 
@@ -105,10 +105,13 @@ two caveats the caller applies via `className`, both shown above:
105
105
  as an unwanted halo on `current`'s blue fill and on `completed`'s
106
106
  hover/active fills. See "Design status" below.
107
107
 
108
- Only six `variant` x `state` combinations exist in the design, and the
109
- component reproduces exactly that: `current` is always highlighted with a
110
- border, `future` is always disabled, and only `completed` reads `state`
111
- (`idle`, `hover`, `active`, `focus`).
108
+ The label uses the Stepper typography treatment.
109
+
110
+ The Figma component set draws three top-level `type` variants: `current`,
111
+ `completed`, and `future`. The React API also has a four-value `state` prop, but
112
+ only `completed` responds to it. Figma's nested Completed instance exposes only
113
+ `idle`; the other completed states are token-backed implementation states, not
114
+ drawn variant symbols.
112
115
 
113
116
  `current` is the only variant that paints a visible border, but every variant
114
117
  reserves the same border box (transparent on `completed` and `future`), so the
@@ -149,7 +152,7 @@ above (the same pattern `Timeline`'s marker already used).
149
152
  | `variant` | `'current' | 'completed' | 'future'` | `current` | no | The step's structural role in the sequence. `current` is where the user is and always renders highlighted with a border; `completed` is already passed and is the only variant whose look responds to `state`; `future` is not reachable yet and always renders disabled and non-interactive. Defaults to `current` for prop ergonomics — in a real sequence every step declares its own. |
150
153
  | `state` | `'idle' | 'hover' | 'active' | 'focus'` | `idle` | no | The interaction look. Only observable when `variant` is `completed` (`idle`, `hover`, and `active` each paint their own fill token — `idle`'s resolves to `transparent` in the shipped brands, so it reads as no fill; `focus` draws a 3px ring — its token is byte-identical to `--ui-focus-primary`, i.e. the same look `focus-visible` already draws automatically on a composed control). Ignored for `current`, which is always highlighted, and for `future`, which is always disabled. It is a declarative prop, not a CSS pseudo-state, because the design models it as distinct token roles and a consumer may need to force it. |
151
154
  | `avatar` | `Element` | — | yes | The step's marker — an avatar element supplied and styled entirely by the caller (color scheme, initials / icon / image, size overrides). The step renders it verbatim and never restyles it. |
152
- | `label` | `ReactNode` | — | no | The step name. Truncates rather than wrapping. |
155
+ | `label` | `ReactNode` | — | no | The step name. Truncates rather than wrapping and uses the Stepper typography treatment. |
153
156
  | `render` | `RenderProp` | — | no | Base UI composition prop — replaces the rendered `<div>` with another element or component while merging props and classes. Use it to make a completed step a real `<button>` (or a router link) that jumps back. React-only; other frameworks use their own polymorphism. |
154
157
 
155
158
  ## Events
package/dist/llms.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # Acronis UI Kit for React — LLM Reference
2
2
 
3
- > `@acronis-platform/ui-react` v5.5.9
3
+ > `@acronis-platform/ui-react` v7.0.0
4
4
 
5
5
  Machine-readable component reference compiled from framework-agnostic specs.
6
6
  Each entry links to a self-contained markdown file with props, behavior,
@@ -34,8 +34,8 @@ accessibility notes, and usage examples.
34
34
  - [CardWidgetCarousel](./llms/card-widget-carousel.md): A horizontal scroll carousel that holds a row of action-widget cards and exposes floating Previous/Next chevron buttons to navigate the view. The carousel shell manages scroll; the individual cards are passed as `children`. Ships with a companion `CardWidget` component (same barrel) — a status-colored card with icon box, optional skeleton, and footer slot.
35
35
  - [CategoryBar](./llms/category-bar.md): A single horizontal bar split into proportional colored segments — one part-to-whole across a handful of categories in one row (onboarding stages, certification status, a pass/fail split). Each segment's width is its value over the sum of all values; segment colors are caller-supplied via `config`. A plain flex composition (not a recharts chart) with one CVA axis (`size`), an optional count/% legend, and per-segment hover tooltips. Design-pending v1 — no chart token tier exists yet.
36
36
  - [Chart](./llms/chart.md): A theming layer over recharts — a `ChartContainer` that supplies series colors and recharts class overrides, plus tooltip and legend chrome (`ChartTooltipContent`, `ChartLegendContent`). The chart type (bar / line / area / pie / …) is composed from recharts primitives by the caller. Ported from the legacy shadcn-uikit `chart`.
37
- - [ChartState](./llms/chart-state.md): A shared loading / empty / error placeholder for the chart types, rendered in place of the chart inside the same sized slot. A compact status block — a leading glyph over a centered label, with an optional retry action for the error state. The `empty` state draws the silhouette the design defines for each chart type (`variant`), plus an optional "Widget description" line; `loading` and `error` share one treatment. Distinct from `WidgetPlaceholder`, which is the composable skeleton for a widget that isn't a chart — see behavior.md.
38
- - [ChartWidget](./llms/chart-widget.md): The dashboard card a chart sits in: a `Card` with the standard widget header (title, optional filter chip and the ⋯ actions menu) and an optional metric readout above the plot. Adds the one thing a `Card` doesn't know about — the body's loading / empty / error placeholder — and re-implements nothing else: its `header` is `CardHeaderProps`, spread. It declares no size: the grid sizes the card and the widget passes that height down, so a `size-full` chart fills whatever the header leaves. The per-type chart components stay card-less, so a chart is still usable outside a widget.
37
+ - [ChartState](./llms/chart-state.md): Shared loading / empty / warning / error / number visuals for a chart slot. Empty, warning, and error use the Breakpoints visual treatment: a 64px status circle with a 24px glyph and centered message. Number shows a centered KPI value; loading uses the shared spinner. Consumers select the state and may localize its content through `description`. Distinct from `WidgetPlaceholder`, which is the composable skeleton for a non-chart widget.
38
+ - [ChartWidget](./llms/chart-widget.md): The dashboard card a chart sits in: a `Card` with the standard widget header (title, optional filter chip and the ⋯ actions menu) and an optional metric readout above the plot. Adds the one thing a `Card` doesn't know about — the body's loading / empty / warning / error / number state — and re-implements nothing else. The consumer selects the state explicitly; the widget does not infer it from chart data. its `header` is `CardHeaderProps`, spread. It declares no size: the grid sizes the card and the widget passes that height down, so a `size-full` chart fills whatever the header leaves. The per-type chart components stay card-less, so a chart is still usable outside a widget.
39
39
  - [Chip](./llms/chip.md): A compact, interactive label for a selection, a removable token, or an inline action. The `removable` variant carries a trailing × button; `selectable` is a toggle that shows an active style when selected; `operational` is a plain action chip with a strong-link label. All three accept an optional leading icon.
40
40
  - [ComposedChart](./llms/composed-chart.md): A typed composed (mixed) chart over the shared `Chart` primitives. Plots a `series` list over one shared category axis, where each entry picks its own render `type` (bar / line / area), inside a `ChartContainer` with tooltip and legend chrome. No variant axes — the mix is data-driven via `series[].type`. Series render in the caller's `series` order (later entries paint on top). Ported from the apps/demo `ComposedChartPlayground`.
41
41
  - [ConfidenceCone](./llms/confidence-cone.md): A forecast confidence-cone over the shared `Chart` primitives: a solid line for the known/actual period, a dashed line for the forecast, and a shaded band (the "cone") between a lower and upper bound that typically widens with the horizon, visualizing growing uncertainty. Distinct from the conversion `FunnelChart`. Design-pending v1 (no `--ui-chart-*` palette, no `apps/demo` playground — built net-new).
@@ -137,7 +137,7 @@ accessibility notes, and usage examples.
137
137
 
138
138
  ## Overlays
139
139
 
140
- - [Dialog](./llms/dialog.md): A higher-level "recipe" dialog built on top of the DialogRoot primitive parts. A single `variant` prop selects one of seven canned use-cases (default, rename, save changes, reset password, discard changes, accept, read-only) — each with its own title, body copy and footer buttons — plus a legacy `wide` escape hatch (no Figma preset, free-form footer via the `footer` prop) kept for backward compatibility with pre-Figma call sites. `children` overrides the body slot and `hasLoading` shows a `Loading` overlay. Colors, typography, and container/header/footer geometry resolve to the `--ui-dialog-*`/`--ui-footer-*` token tier (see tokens.yaml). In Figma the matching component set is named "DialogDefault"; the code-facing name is `Dialog`.
140
+ - [Dialog](./llms/dialog.md): A higher-level "recipe" dialog built on top of the DialogRoot primitive parts. A single `variant` prop selects one of seven canned use-cases (default, rename, save changes, reset password, discard changes, accept, read-only) — each with its own title, body copy and footer buttons — plus a legacy `wide` escape hatch (no Figma preset, free-form footer via the `footer` prop) kept for backward compatibility with pre-Figma call sites. `children` overrides the body slot, `bodyClassName` styles its wrapper, and `hasLoading` shows a `Loading` overlay. The popup is top-aligned 48px from the viewport edge by default; `verticalAlign="center"` opts into vertical centering. Colors, typography, and container/header/footer geometry resolve to the `--ui-dialog-*`/`--ui-footer-*` token tier (see tokens.yaml). In Figma the matching component set is named "DialogDefault"; the code-facing name is `Dialog`.
141
141
  - [DialogRoot](./llms/dialog-root.md): A modal overlay that interrupts the user to show focused content or request a decision. A set of composable parts (trigger, overlay, content, header, title, close, body, description, footer) built on the Base UI Dialog primitive. Initial version ported from the legacy shadcn-uikit `Dialog`; design reconciliation against Figma is pending. Internal-only as of the Dialog (recipe) merge — not exported from the package root. `Dialog` (sourceDir: dialog, see the `dialog` spec) is the sole public entry point; it composes these parts internally.
142
142
  - [DropdownMenu](./llms/dropdown-menu.md): A menu of actions anchored to a trigger (typically a `ButtonMenu`), opened on demand. Composable parts — trigger, content, group (section), item, shortcut, submenu — built on the Base UI Menu primitive. Themed by the `--ui-button-menu-dropdown-*` token tier from @acronis-platform/tokens-pd.
143
143
  - [Popover](./llms/popover.md): A floating panel anchored to a trigger, shown on demand for secondary content or quick actions. Built on the Base UI Popover primitive (positioning, focus management, outside-press / Esc dismissal). Ported from the legacy shadcn-uikit `Popover`; container chrome themed by the `--ui-popover-*` tier, with optional `PopoverBody`/`PopoverFooter` parts for the body-rhythm and default action-row recipe shown in Figma.