@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.
- package/dist/components/ui/chart/chart.js +14 -11
- package/dist/components/ui/chart/chart.js.map +1 -1
- package/dist/components/ui/chart-state/chart-state.js +47 -37
- package/dist/components/ui/chart-state/chart-state.js.map +1 -1
- package/dist/components/ui/chart-widget/chart-widget.js +21 -23
- package/dist/components/ui/chart-widget/chart-widget.js.map +1 -1
- package/dist/components/ui/data-table/data-table.js +174 -173
- package/dist/components/ui/data-table/data-table.js.map +1 -1
- package/dist/components/ui/dialog/dialog.js +52 -38
- package/dist/components/ui/dialog/dialog.js.map +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu.js +8 -2
- package/dist/components/ui/dropdown-menu/dropdown-menu.js.map +1 -1
- package/dist/components/ui/page-header/page-header.js +4 -4
- package/dist/components/ui/page-header/page-header.js.map +1 -1
- package/dist/components/ui/pie-chart/pie-chart.js +88 -84
- package/dist/components/ui/pie-chart/pie-chart.js.map +1 -1
- package/dist/index.js +45 -46
- package/dist/llms/chart-state.md +81 -164
- package/dist/llms/chart-widget.md +27 -25
- package/dist/llms/data-table.md +24 -14
- package/dist/llms/dialog-root.md +40 -13
- package/dist/llms/dialog.md +109 -14
- package/dist/llms/dropdown-menu.md +68 -3
- package/dist/llms/page-header.md +68 -11
- package/dist/llms/stepper-item.md +10 -7
- package/dist/llms.txt +4 -4
- package/dist/react.js +45 -46
- package/dist/src/components/ui/chart/chart.d.ts +3 -3
- package/dist/src/components/ui/chart-state/chart-state.d.ts +5 -14
- package/dist/src/components/ui/chart-state/index.d.ts +0 -1
- package/dist/src/components/ui/chart-widget/chart-widget.d.ts +10 -15
- package/dist/src/components/ui/data-table/data-table.d.ts +11 -5
- package/dist/src/components/ui/data-table/data-table.docs.d.ts +10 -4
- package/dist/src/components/ui/dialog/dialog.d.ts +10 -0
- package/dist/src/components/ui/dialog/dialog.docs.d.ts +7 -1
- package/dist/src/components/ui/dropdown-menu/dropdown-menu.d.ts +8 -1
- package/dist/src/components/ui/dropdown-menu/index.d.ts +1 -1
- package/dist/src/components/ui/page-header/page-header.d.ts +3 -1
- package/dist/src/components/ui/pie-chart/pie-chart.d.ts +1 -1
- package/dist/ui-react.css +1 -1
- package/package.json +13 -13
- package/dist/components/ui/chart-state/chart-state-illustrations.js +0 -412
- package/dist/components/ui/chart-state/chart-state-illustrations.js.map +0 -1
- package/dist/src/components/ui/chart-state/chart-state-illustrations.d.ts +0 -6
package/dist/llms/dialog.md
CHANGED
|
@@ -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
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
package/dist/llms/page-header.md
CHANGED
|
@@ -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
|
|
47
|
-
| -------------------------- |
|
|
48
|
-
| `PageHeader` | `div`
|
|
49
|
-
| `PageHeaderRow` | `div`
|
|
50
|
-
| `PageHeaderTitle` | `h1`
|
|
51
|
-
| `PageHeaderTags` | `div`
|
|
52
|
-
| `PageHeaderActions` | `div`
|
|
53
|
-
| `PageHeaderDescriptionRow` | `div`
|
|
54
|
-
| `PageHeaderDescription` | `p`
|
|
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
|
-
-
|
|
164
|
-
page
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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`
|
|
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):
|
|
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
|
|
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.
|