@omni-design/components 0.14.0 → 0.14.2
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/index.esm.js +4 -4
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/types/components/FieldGroup/FieldGroup.d.ts +16 -0
- package/dist/types/components/FieldGroup/index.d.ts +1 -0
- package/dist/types/components/FormHelper/FormHelper.d.ts +29 -0
- package/dist/types/components/FormHelper/index.d.ts +1 -0
- package/dist/types/components/FormLabel/FormLabel.d.ts +16 -0
- package/dist/types/components/FormLabel/index.d.ts +1 -0
- package/dist/types/components/InputMessage/InputMessage.d.ts +20 -0
- package/dist/types/components/InputMessage/index.d.ts +1 -0
- package/dist/types/components/Player/Player.d.ts +33 -0
- package/dist/types/components/Player/index.d.ts +1 -0
- package/dist/types/components/Radio/Radio.d.ts +2 -1
- package/dist/types/components/Select/Select.d.ts +2 -1
- package/dist/types/components/Sheet/Sheet.d.ts +12 -0
- package/dist/types/components/Sheet/SheetShowcase.d.ts +2 -0
- package/dist/types/components/Sheet/index.d.ts +2 -0
- package/dist/types/components/SpeedDial/SpeedDial.d.ts +3 -1
- package/dist/types/components/Swatch/Swatch.d.ts +2 -1
- package/dist/types/components/TextAreaField/TextAreaField.d.ts +11 -0
- package/dist/types/components/TextAreaField/index.d.ts +1 -0
- package/dist/types/components/Toolbar/Toolbar.d.ts +4 -1
- package/dist/types/components/TransferList/TransferList.d.ts +17 -0
- package/dist/types/components/TransferList/TransferListShowcase.d.ts +2 -0
- package/dist/types/components/TransferList/index.d.ts +2 -0
- package/dist/types/components/Typography/Typography.d.ts +11 -0
- package/dist/types/components/Typography/index.d.ts +1 -1
- package/dist/types/components/colorChoices.d.ts +16 -0
- package/dist/types/components/index.d.ts +7 -1
- package/dist/types/docs/DocPanels.d.ts +21 -0
- package/dist/types/docs/components.d.ts +67 -12
- package/dist/types/docs/componentsForms.d.ts +292 -124
- package/dist/types/docs/componentsNav.d.ts +23 -11
- package/dist/types/docs/componentsRest.d.ts +346 -2
- package/dist/types/docs/componentsSurfaces.d.ts +262 -71
- package/dist/types/docs/examples.d.ts +21 -0
- package/dist/types/docs/examples.lead.d.ts +4 -0
- package/dist/types/docs/samples.core.d.ts +68 -39
- package/dist/types/docs/samples.forms.d.ts +42 -22
- package/dist/types/docs/samples.nav.d.ts +13 -6
- package/dist/types/docs/samples.surfaces.d.ts +40 -12
- package/docs/figma-parity.md +143 -0
- package/package.json +1 -1
- package/public/styles/base.css +5 -0
- package/public/styles/theme.json +1 -0
|
@@ -13,6 +13,24 @@ export namespace FORM_SAMPLES {
|
|
|
13
13
|
function checked(): JSX.Element;
|
|
14
14
|
function disabled(): JSX.Element;
|
|
15
15
|
}
|
|
16
|
+
namespace NumberField {
|
|
17
|
+
export function variant(): JSX.Element;
|
|
18
|
+
export function size_1(): JSX.Element;
|
|
19
|
+
export { size_1 as size };
|
|
20
|
+
export function labelPosition(): JSX.Element;
|
|
21
|
+
export function fullWidth(): JSX.Element;
|
|
22
|
+
export function disabled_1(): JSX.Element;
|
|
23
|
+
export { disabled_1 as disabled };
|
|
24
|
+
}
|
|
25
|
+
namespace RadioGroup {
|
|
26
|
+
export function orientation(): JSX.Element;
|
|
27
|
+
export function size_2(): JSX.Element;
|
|
28
|
+
export { size_2 as size };
|
|
29
|
+
export function labelPlacement_1(): JSX.Element;
|
|
30
|
+
export { labelPlacement_1 as labelPlacement };
|
|
31
|
+
export function disabled_2(): JSX.Element;
|
|
32
|
+
export { disabled_2 as disabled };
|
|
33
|
+
}
|
|
16
34
|
let SwitchInput: {
|
|
17
35
|
variant: () => JSX.Element;
|
|
18
36
|
size: () => JSX.Element;
|
|
@@ -22,45 +40,47 @@ export namespace FORM_SAMPLES {
|
|
|
22
40
|
disabled: () => JSX.Element;
|
|
23
41
|
};
|
|
24
42
|
namespace Input {
|
|
25
|
-
export function
|
|
26
|
-
export
|
|
27
|
-
export
|
|
28
|
-
export
|
|
43
|
+
export function variant_1(): JSX.Element;
|
|
44
|
+
export { variant_1 as variant };
|
|
45
|
+
export function size_3(): JSX.Element;
|
|
46
|
+
export { size_3 as size };
|
|
47
|
+
export function labelPosition_1(): JSX.Element;
|
|
48
|
+
export { labelPosition_1 as labelPosition };
|
|
29
49
|
export function validation(): JSX.Element;
|
|
30
|
-
export function
|
|
31
|
-
export {
|
|
50
|
+
export function disabled_3(): JSX.Element;
|
|
51
|
+
export { disabled_3 as disabled };
|
|
32
52
|
}
|
|
33
53
|
namespace TextField {
|
|
34
54
|
export function error(): JSX.Element;
|
|
35
|
-
export function
|
|
36
|
-
export {
|
|
55
|
+
export function size_4(): JSX.Element;
|
|
56
|
+
export { size_4 as size };
|
|
37
57
|
}
|
|
38
58
|
namespace SearchField {
|
|
39
59
|
export function color_1(): JSX.Element;
|
|
40
60
|
export { color_1 as color };
|
|
41
61
|
export function showClearButton(): JSX.Element;
|
|
42
|
-
export function
|
|
43
|
-
export {
|
|
62
|
+
export function size_5(): JSX.Element;
|
|
63
|
+
export { size_5 as size };
|
|
44
64
|
}
|
|
45
65
|
namespace Select {
|
|
46
|
-
export function
|
|
47
|
-
export {
|
|
48
|
-
export function
|
|
49
|
-
export {
|
|
66
|
+
export function labelPosition_2(): JSX.Element;
|
|
67
|
+
export { labelPosition_2 as labelPosition };
|
|
68
|
+
export function size_6(): JSX.Element;
|
|
69
|
+
export { size_6 as size };
|
|
50
70
|
export function mode(): JSX.Element;
|
|
51
71
|
}
|
|
52
72
|
namespace Autocomplete {
|
|
53
|
-
export function
|
|
54
|
-
export {
|
|
55
|
-
export function
|
|
56
|
-
export {
|
|
73
|
+
export function labelPosition_3(): JSX.Element;
|
|
74
|
+
export { labelPosition_3 as labelPosition };
|
|
75
|
+
export function size_7(): JSX.Element;
|
|
76
|
+
export { size_7 as size };
|
|
57
77
|
}
|
|
58
78
|
namespace DropZone {
|
|
59
79
|
export function multiple(): JSX.Element;
|
|
60
|
-
export function
|
|
61
|
-
export {
|
|
62
|
-
export function
|
|
63
|
-
export {
|
|
80
|
+
export function size_8(): JSX.Element;
|
|
81
|
+
export { size_8 as size };
|
|
82
|
+
export function disabled_4(): JSX.Element;
|
|
83
|
+
export { disabled_4 as disabled };
|
|
64
84
|
}
|
|
65
85
|
namespace Avatar {
|
|
66
86
|
export function color_2(): JSX.Element;
|
|
@@ -13,14 +13,18 @@ export namespace NAV_SAMPLES {
|
|
|
13
13
|
export function backOnlyMobile(): JSX.Element;
|
|
14
14
|
}
|
|
15
15
|
let Pagination: {
|
|
16
|
+
color: () => JSX.Element;
|
|
16
17
|
size: () => JSX.Element;
|
|
17
18
|
'showFirstButton / showLastButton': () => JSX.Element;
|
|
18
19
|
};
|
|
19
20
|
namespace Stepper {
|
|
21
|
+
export function variant_1(): JSX.Element;
|
|
22
|
+
export { variant_1 as variant };
|
|
20
23
|
export function orientation_1(): JSX.Element;
|
|
21
24
|
export { orientation_1 as orientation };
|
|
22
25
|
export function size_2(): JSX.Element;
|
|
23
26
|
export { size_2 as size };
|
|
27
|
+
export function color(): JSX.Element;
|
|
24
28
|
export function clickable(): JSX.Element;
|
|
25
29
|
export function dashedIncomplete(): JSX.Element;
|
|
26
30
|
}
|
|
@@ -43,23 +47,26 @@ export namespace NAV_SAMPLES {
|
|
|
43
47
|
function menuType(): JSX.Element;
|
|
44
48
|
}
|
|
45
49
|
namespace Rail {
|
|
46
|
-
export function
|
|
47
|
-
export {
|
|
50
|
+
export function variant_2(): JSX.Element;
|
|
51
|
+
export { variant_2 as variant };
|
|
48
52
|
export function expandable(): JSX.Element;
|
|
49
53
|
export function expandedWidth(): JSX.Element;
|
|
50
54
|
export function labelStyle(): JSX.Element;
|
|
51
55
|
}
|
|
52
56
|
namespace BottomNavigation {
|
|
53
57
|
export function showLabels(): JSX.Element;
|
|
54
|
-
export function variant_2(): JSX.Element;
|
|
55
|
-
export { variant_2 as variant };
|
|
56
|
-
}
|
|
57
|
-
namespace Sidebar {
|
|
58
58
|
export function variant_3(): JSX.Element;
|
|
59
59
|
export { variant_3 as variant };
|
|
60
60
|
}
|
|
61
|
+
namespace Sidebar {
|
|
62
|
+
export function variant_4(): JSX.Element;
|
|
63
|
+
export { variant_4 as variant };
|
|
64
|
+
}
|
|
61
65
|
namespace Toolbar {
|
|
62
66
|
export function type(): JSX.Element;
|
|
67
|
+
export function color_1(): JSX.Element;
|
|
68
|
+
export { color_1 as color };
|
|
69
|
+
export function surface(): JSX.Element;
|
|
63
70
|
export function orientation_3(): JSX.Element;
|
|
64
71
|
export { orientation_3 as orientation };
|
|
65
72
|
}
|
|
@@ -1,17 +1,35 @@
|
|
|
1
1
|
export namespace SURFACE_SAMPLES {
|
|
2
|
+
namespace Container {
|
|
3
|
+
function disableGutters(): JSX.Element;
|
|
4
|
+
}
|
|
5
|
+
namespace Stack {
|
|
6
|
+
function direction(): JSX.Element;
|
|
7
|
+
function enforceMinGap(): JSX.Element;
|
|
8
|
+
}
|
|
9
|
+
namespace Box {
|
|
10
|
+
function radius(): JSX.Element;
|
|
11
|
+
}
|
|
12
|
+
namespace SpeedDial {
|
|
13
|
+
export function direction_1(): JSX.Element;
|
|
14
|
+
export { direction_1 as direction };
|
|
15
|
+
export function size(): JSX.Element;
|
|
16
|
+
export function openOnHover(): JSX.Element;
|
|
17
|
+
export function showTooltips(): JSX.Element;
|
|
18
|
+
}
|
|
2
19
|
namespace Card {
|
|
3
|
-
function variant(): JSX.Element;
|
|
4
|
-
function
|
|
5
|
-
|
|
6
|
-
function
|
|
7
|
-
function
|
|
8
|
-
function
|
|
20
|
+
export function variant(): JSX.Element;
|
|
21
|
+
export function size_1(): JSX.Element;
|
|
22
|
+
export { size_1 as size };
|
|
23
|
+
export function orientation(): JSX.Element;
|
|
24
|
+
export function clickable(): JSX.Element;
|
|
25
|
+
export function elevated(): JSX.Element;
|
|
26
|
+
export function selected(): JSX.Element;
|
|
9
27
|
}
|
|
10
28
|
namespace Accordion {
|
|
11
29
|
export function variant_1(): JSX.Element;
|
|
12
30
|
export { variant_1 as variant };
|
|
13
|
-
export function
|
|
14
|
-
export {
|
|
31
|
+
export function size_2(): JSX.Element;
|
|
32
|
+
export { size_2 as size };
|
|
15
33
|
export function defaultExpanded(): JSX.Element;
|
|
16
34
|
export function disabled(): JSX.Element;
|
|
17
35
|
}
|
|
@@ -28,8 +46,8 @@ export namespace SURFACE_SAMPLES {
|
|
|
28
46
|
}
|
|
29
47
|
namespace Modal {
|
|
30
48
|
export function open(): JSX.Element;
|
|
31
|
-
export function
|
|
32
|
-
export {
|
|
49
|
+
export function size_3(): JSX.Element;
|
|
50
|
+
export { size_3 as size };
|
|
33
51
|
export function layout(): JSX.Element;
|
|
34
52
|
export function closeOnBackdrop(): JSX.Element;
|
|
35
53
|
export function showCloseButton(): JSX.Element;
|
|
@@ -46,10 +64,20 @@ export namespace SURFACE_SAMPLES {
|
|
|
46
64
|
export function open_2(): JSX.Element;
|
|
47
65
|
export { open_2 as open };
|
|
48
66
|
export function anchor(): JSX.Element;
|
|
49
|
-
export function
|
|
50
|
-
export {
|
|
67
|
+
export function size_4(): JSX.Element;
|
|
68
|
+
export { size_4 as size };
|
|
51
69
|
export function hideBackdrop(): JSX.Element;
|
|
52
70
|
}
|
|
71
|
+
namespace Sheet {
|
|
72
|
+
export function surface(): JSX.Element;
|
|
73
|
+
export function elevated_1(): JSX.Element;
|
|
74
|
+
export { elevated_1 as elevated };
|
|
75
|
+
}
|
|
76
|
+
namespace TransferList {
|
|
77
|
+
export function mode(): JSX.Element;
|
|
78
|
+
export function disabled_1(): JSX.Element;
|
|
79
|
+
export { disabled_1 as disabled };
|
|
80
|
+
}
|
|
53
81
|
namespace Snackbar {
|
|
54
82
|
export function open_3(): JSX.Element;
|
|
55
83
|
export { open_3 as open };
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Figma ↔ library parity
|
|
2
|
+
|
|
3
|
+
What the file has, what the library has, and where they disagree. Built by
|
|
4
|
+
reading the Figma file directly rather than from memory — each row names what
|
|
5
|
+
was read and when.
|
|
6
|
+
|
|
7
|
+
Rows are only here because something is **missing or different**. A component
|
|
8
|
+
that agrees is not listed; silence means parity.
|
|
9
|
+
|
|
10
|
+
Last read: 2026-10-05
|
|
11
|
+
|
|
12
|
+
**Summary.** 24 components documented in this pass. The library is ahead of the
|
|
13
|
+
file almost everywhere the two differ: six sets have properties with a single
|
|
14
|
+
value built, three components have a page but no set, and one — ToggleButton —
|
|
15
|
+
has no way to exist in Figma at all. Two things need fixing in the FILE rather
|
|
16
|
+
than the code, and they are at the top of the next section.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Needs fixing in the file
|
|
21
|
+
|
|
22
|
+
Two of these are not gaps but mistakes — they will misread for anything that
|
|
23
|
+
parses the variant names, including the converter.
|
|
24
|
+
|
|
25
|
+
| Set | Problem | Why it matters |
|
|
26
|
+
| --- | --- | --- |
|
|
27
|
+
| `SpeedDial` | **Ten values in `State` for five states**: `default \| hover \| pressed \| focus-visible \| disabled` AND `Default \| Hover \| Active \| Focus-Visible \| Disabled` | Two naming conventions in one property, with `pressed` and `Active` being the same state twice. Nothing can read this reliably. |
|
|
28
|
+
| `Button` vs `Button-Group-Segments` | `Status=unselected` against `Status=not-selected` | One concept, two spellings, in two sets meant to pair. The converter has to special-case it forever unless one moves. |
|
|
29
|
+
| `Radio Group` | Pins `Icons=Warning` | Nothing in a radio group reads an Icons mode. Looks like drift; the plugin's Theme panel will now show it as its own dropdown there. |
|
|
30
|
+
|
|
31
|
+
## Figma is missing variants the library has
|
|
32
|
+
|
|
33
|
+
These are cases where the library offers something the file cannot express, or
|
|
34
|
+
where the file has a property with only one value built. The library is not
|
|
35
|
+
wrong in these rows — the file has not been built out.
|
|
36
|
+
|
|
37
|
+
| Component | Figma set | What Figma has | What the library has | Note |
|
|
38
|
+
| --- | --- | --- | --- | --- |
|
|
39
|
+
| CircularProgress | `Progress Dial` | **1 variant.** `Size=Large`, `Color=Default` | `size` small/medium/large (24/40/56) + a number, 9 colors, `thickness`, `showValue` | Both properties exist with one value each, so nothing can be checked against the file. The set's frame is 80×80; the library's `large` is 56 — unresolved, because the frame may include a label. |
|
|
40
|
+
| LinearProgress | `Progress Bar` | **1 variant.** `Type=Progress`, `Size=Large` | `size` small/medium/large (4/6/8px), 9 colors | 8px matches the library's `large`. `Type` holds only "Progress" — whatever else it was for is unbuilt. |
|
|
41
|
+
| ButtonGroup / ToggleButtonGroup | `ToggleButtonGroup` | `Fit: Default \| Fill` | `fit: hug \| fill \| equal` | **`equal` cannot exist in Figma.** It means the group hugs while every segment matches the widest; auto-layout children only share space when the parent has width to share, and a hugging parent has none. Code-only by necessity. |
|
|
42
|
+
| ToggleButtonGroup | `Button-Group-Segments` | `Style: outline \| ghost` | `variant: outlined \| light \| ghost` | **`light` has no counterpart.** Decide whether it is code-only by design or a gap in the file. |
|
|
43
|
+
| Button | — | `Type: text \| iconOnly \| letterNumber \| Avatar` | same | Agrees. |
|
|
44
|
+
| ToggleButtonGroup | `Button-Group-Segments` | `Type: text \| letterNumber \| iconOnly` | — | No `Avatar` type, unlike the Button set. A segment cannot carry an avatar in the file; the library does not stop you. |
|
|
45
|
+
| Player | *(no set)* | A 400×32 sketch frame: a ToggleButtonGroup, a Slider and an icon Button, 554px of content in a 400px box, with placeholder text | A full audio bar: track info, transport, scrubber, time | Built to the shape the sketch points at, not matched to it. There is nothing to reconcile until a set exists. |
|
|
46
|
+
| Stepper | `Count Step` | The number binds `Dynamic-Typography/Dynamic-Button-Number-Font-Size` (line-height bound to the SAME variable, i.e. 1em) | The library reads `--Button-Numbers` (Component-Size) | **Two different variables for one number — still open.** The file's is platform-dependent; the library's is per size mode. The CSS emits no dynamic button-number size, so the library cannot read the file's one today. Needs a decision: emit it, or rebind the text to `Button/Button-Numbers`. The line-height half is settled — bound to the font size means 1em, which is what the library draws. |
|
|
47
|
+
| Stepper | `Step-Line` (9383:42912) | `Status: complete \| incomplete \| incomplete-solid`, `Orientation` | `dashedIncomplete` | **Corrected — this row previously said the file had no dashed form. It does.** The dashed variant is the one named `incomplete-solid`: dash `[2,2]` across, `[4,4]` down. **The name is inverted** — `incomplete` is the SOLID line and `incomplete-solid` is the dashed one, so a converter reading the variant name emits the opposite of what it draws. Worth renaming in the file to `incomplete-dashed`. |
|
|
48
|
+
| Stepper | `Step-Line` | stroke `Border` (Buttons) when complete, `Quiet` (Surface) when not | was `--Buttons-{C}-Button` / `--Border` | **FIXED in the library.** The travelled segment follows the palette's border tone, not a full-strength fill; the untravelled one follows the page. Two different collections, which is the part that is easy to miss. |
|
|
49
|
+
| Stepper | `Step Holder` | `itemSpacing: 0`, no padding; children at x=0 / 32 / 273 against 32px circles | 8px either side of the connector, 4px above/below vertically | **FIXED in the library.** The line now meets the circle. These were margins, so the `gap: 0` already in the size table never applied. |
|
|
50
|
+
| Stepper | `Count Step` | Unselected circles fill `Background` | was `transparent` | **FIXED in the library.** Identical on a plain surface; differs on a Container, where transparent lets the container tone through the ring. |
|
|
51
|
+
| Stepper | `Count Step` | Hover/Pressed bind Buttons `Hover`/`Pressed` at **every** status | library used surface `--Hover`/`--Pressed` unless current | **FIXED in the library.** Hovering a complete or incomplete step picked up the page's grey instead of the palette's. |
|
|
52
|
+
| Stepper | `Count Step` | Label binds `Labels/Label-Font-Family` + the `Dynamic-Label` ramp | library rendered `Caption` / `BodySmall` | **FIXED in the library.** Now the `Label` type style at every size, since the ramp is already per size mode. Gaps too: `Sizing-Half` below, `Sizing-1` beside. |
|
|
53
|
+
| Stepper | `Count Step` | Current step's digit binds `Outline-Text` on a solid `Button` fill | library keeps `--Buttons-{C}-Text` | **FILE FIX NEEDED, not a library one.** Per invariant 3 the label is derived from the fill. `Outline-Text` is tuned for text on the SURFACE; it reads on this brand's default palette (dark on pink) and would be dark-on-dark on a palette whose Button is dark. The COMPLETE step is correct — no fill means it really is an outline button, and the library now matches it. |
|
|
54
|
+
| Stepper | `Count Step` | Completed step's label binds `Border`, a Buttons token | library now matches | **Contrast question for the file.** `Border` is a 3:1 non-text token carrying text, where text needs 4.5:1. It is consistent in the file (Default and Disabled both, with Hover/Pressed/Focus going to `Text`), so it reads as a deliberate resting tone rather than a slip — but it is the one value here that ships a known shortfall. Say the word and the library reverts to `--Text`. |
|
|
55
|
+
| Stepper | `Count Step` | `Status=current, State=Disabled` **existed twice** | — | **FIXED IN THE FILE** — the set now reads 15 clean variants and `componentPropertyDefinitions` no longer throws. Kept here for the record. |
|
|
56
|
+
| Stepper | `Count Step` | `layoutSizingHorizontal: FIXED` at `Button-Height`, `clipsContent: false`; `Bottom Label` sits at **x = -6** (44px of text on a 32px column) | library sized the column to the LABEL | **FIXED in the library.** This was the rest of the gap. Removing the connector's margins was necessary and not sufficient — a long label widened the step column and pushed the line away from the circle regardless. The column is now one circle wide and the label overflows evenly, adding height but never width. In the assembled row the steps sit at x 48 / 185 / 321, all 32 wide, with the lines FILLing between. |
|
|
57
|
+
| Stepper | `Count Step` | Complete ring is **2px**; current and incomplete are 1px | library used one width everywhere | **FIXED in the library.** The consolidation was right about the current step, which is filled and says so with its fill, and wrong about the complete one, which is an outline and has only its ring. **The 2 is a literal in Figma, bound to nothing**, so it cannot follow a brand that moves its border width — worth a variable. |
|
|
58
|
+
| Stepper | `Count Step` | Digit binds `Buttons/Button-Font-Family` | library read `var(--Font-Family-Button, inherit)` | **FIXED in the library**, and the cause is worth knowing beyond the Stepper. `typography-tokens.css` declares `--Font-Family-Button: var(--Platform-Font-Families-Body)` **with no fallback**, while `--Font-Family-Body` gets `var(--Platform-Font-Families-Body, var(--Set-Font-Family-Body))`. Nothing defines `--Platform-Font-Families-Body` outside a brand's own device blocks, so in the bundled CSS the Button one is the guaranteed-invalid value and the digit fell straight through to the page font. Now `var(--Font-Family-Button, var(--Font-Family-Body, inherit))`. **`--Font-Family-Subtitle` and one copy of `--Font-Family-Body` have the same missing fallback** — not chased here, but the same failure is waiting. |
|
|
59
|
+
| Stepper | `Count Step` | Digit also binds `Dynamic-Button-Letter-Spacing` | library sets none | Open. Minor, and it waits on the same decision as the font size: the CSS emits no Dynamic button ramp. |
|
|
60
|
+
| FAB | `FAB` (6778:17180) | Axes are `State` only, plus `Extended` and `Animate` booleans | library offered `solid \| outline \| ghost` | **FIXED in the library.** There is no shape axis in the system, so outline and ghost FABs were library inventions. Both now normalise to solid with a development warning. `Fab`'s own sizes were already right. |
|
|
61
|
+
| FAB | `FAB/FAB-Width` | **32 / 48 / 56** (small / medium / large) | `Fab` matches; **SpeedDial did not** | **FIXED in the library.** SpeedDial carried its own table at 48 / 56 / 56 and remapped `fabSize` a step up, so `small` rendered a medium Fab and `medium` a large one — every dial one size bigger than it was asked for. |
|
|
62
|
+
| FAB | `FAB/FAB-Icon` | 16 / 24 / 32 | matches | — |
|
|
63
|
+
| SpeedDial | `SpeedDial` (6843:25091) | Dial FAB and **every child FAB in the slot** bind the SAME `FAB/FAB-Width` | library held actions at a flat 32 | **FIXED in the library.** The old note argued a dial the size of its own fan reads as four buttons in a line; the file disagrees and the file is the system. WCAG 2.5.8 still clears — 32 is past the 24px minimum, which is what made the flat floor unnecessary rather than protective. |
|
|
64
|
+
| SpeedDial | `FAB/SpeedDial-Gap` | 8 / 12 / 16 | matches | Confirmed against the collection. |
|
|
65
|
+
| SpeedDial | `openOnHover#9383:264` | default **true** | library defaulted false | **FIXED in the library.** The false default argued that a FAB lives on touch where hover does not exist — but `pointerCanHover()` already gates every hover path behind `(hover: hover) and (pointer: fine)`, so the risk was handled in code and the default had nothing left to protect. |
|
|
66
|
+
| FAB | `Theme-Container` | `State=Default` fills **`Buttons/Default/Button`** while Hover / Pressed / Focus fill the mode-relative `Hover` / `Pressed` / `Button` | — | **FILE QUESTION.** `Buttons/Default/Button` is a different variable from `Button`: it pins the Default palette instead of reading the inherited Buttons mode. So a FAB on a themed surface stays Default-colored at rest and picks the theme up on hover. Looks like the wrong variable was picked in the dropdown. |
|
|
67
|
+
| FAB | Icon fill | `Quiet` at rest, `Text` on Hover / Pressed / Focus | — | **FILE QUESTION.** The icon sits on a solid `Button` fill, so per invariant 3 it wants the token paired with that fill, not a surface tone. `Quiet` on a saturated button is the same class of problem as the Stepper's digit. |
|
|
68
|
+
| SpeedDial | `Direction` | up \| down \| left \| right | matches | — |
|
|
69
|
+
| FAB | `Extended` / `Animate` booleans | `Extended` reveals a label pill; `Animate` swaps in a 3-variant `FAB-Animation` ring (stroke 0 / 8 / 8) | `extended` exists; **no `animate`** | Library gap. The pulse ring has no equivalent in code. Low priority — say the word and it goes in. |
|
|
70
|
+
| Stepper | `Step-Line` | The line's frame is **Button-Height** tall (horizontal) / wide (vertical), with the 2px rule centred in it | library centred the rule on the indicator, then briefly on the dot | **FIXED in the library.** Measured: in the noCount stepper the dot's Ellipse sits at relY 10 of a 32 row (centre 16) and the rule centres on 16 too. The dot is not centred on itself — it is centred in a Button-Height band, which is what lets a 12px dot and a 32px circle share one rule. An intermediate fix halved the dot and ran the line along the bottom edge of every dot. |
|
|
71
|
+
| Stepper | `Button/Button-Height` | **24 / 32 / 56** | library used 24 / 32 / **40** | **FIXED in the library.** Large was a number the lib chose rather than read. |
|
|
72
|
+
| Stepper | — | The labels overflow the component's own box by design | — | Not a divergence, but a contract a consumer needs: a step's slot is one circle wide and its label is wider, so the first and last captions sit outside the stepper's bounds. The file does the same, framing a 305px stepper in a 353px parent. Both docs frames clipped it until they were given padding. |
|
|
73
|
+
| Toolbar | `Nav Item` selected | Icon-Holder fill and label both bind `Text`, **from the SURFACE collection**; default label binds `Quiet`, also Surface | `Rail` used `--Buttons-{C}-Button` / `--Buttons-{C}-Text` | **FIXED in the library.** There is no Buttons token anywhere on Nav Item — resolved in the file, not inferred. The library had reasoned that Figma's bare `Button` and `Text` must be Buttons-collection names, since that collection is its own namespace while CSS is one flat one; the first half is true and the conclusion was not. A nav item is a mark on the surface, not a button wearing a palette, which is also how `BottomNavigation` has always drawn it. The `variant` prop no longer reaches the fill. |
|
|
74
|
+
| Toolbar | `Nav Item` — contained vs outside | the caption sits BELOW the holder, on the surface | library used one label colour for both | **FIXED in the library.** Where the label sits decides its colour: contained fills the whole item so the label reverses out to `--Background`; outside fills only the circle so the caption stays on the surface in `--Text`. |
|
|
75
|
+
| Toolbar | `Other/Nav-Bar Height` | **GONE.** Replaced by `Other/ToolBar` (80 / 80 / 80) and `Other/ToolBarShort` (64 / 64 / 64) | library carried a literal `83px` and `base.css` still emits `--Nav-Bar-Height: 83px` | **FIXED in the library** — the pill radius reads `var(--ToolBar, var(--Nav-Bar-Height, 80px))` so it survives the rename either way. **Two follow-ups outside the library:** `base.css` should emit `--ToolBar` / `--ToolBarShort`, and the studio's `figmaVariableNames.json` fixture still lists `Other/Nav-Bar Height` and knows nothing of the two new ones. Per invariant 8 a deleted Figma variable cannot be recovered by re-importing, so this is worth confirming was a rename rather than a delete. |
|
|
76
|
+
| Toolbar | `Nav-Bar` floating padding | `Sizing-2` left/right horizontally; `Sizing-2` on all four sides vertically; **no** vertical padding on the horizontal bar | `Button-Height` (32) across and a literal `12px` down | **FIXED in the library.** Neither number was stated anywhere in the design. |
|
|
77
|
+
| Toolbar | `Nav Item` caption | `Labels/Mobile-Nav-Label-*` with the Body family at `Body-Semibold-Font-Weight` | both `BottomNavigation` and `Rail` rendered `LabelExtraSmall` | **FIXED in the library** — new `mobile-nav-label` type style and a `MobileNavLabel` export. The two resolve to the SAME six values today (Body family, 11px, 600, 16.5px, 0.0455em, none), which is why the wrong token looked right. They are device-scoped differently — Mobile-Nav-Label is 11 Desktop / 10 iOS / 12 Android, and 400 rather than 600 on the System face for mobile — so they do not stay equal. |
|
|
78
|
+
| Toolbar | `Nav-Bar` `Style` | Fixed \| Floating \| **Floating +Raised FAB** \| **Right FAB** | `variant: fixed \| floating` plus `fabAction` / `fabPosition` | Covered, modelled differently: the FAB is a thing you pass rather than a shape the bar takes. The header comment claimed the set had only the first two — corrected. Heights differ per style in the file (80 / 80 / 88 / 96) and the library does not vary them; worth a look if the raised FAB reads short. |
|
|
79
|
+
| Toolbar | `Nav-Bar` `Labels` | a VARIANT axis `Default \| No Labels` **and** a BOOLEAN `Labels#8239:2`, both present | one `showLabels` | **FILE QUESTION.** Two properties for one decision — a converter reading the set has to guess which wins. Worth collapsing to one. |
|
|
80
|
+
| Toolbar | `Other/Rail-Width` | 72 / 80 / 96 | `Rail` reads it size-scoped | Matches. The vertical Nav-Bar measures 96 because the ToolBar page sits in the large mode. |
|
|
81
|
+
| Toolbar | `Nav Item` geometry | item 40 wide, Icon-Holder min `Button/Button-Height`, icon 24, gap 4 | `ITEM_WIDTH 40`, `HOLDER_MIN 32`, `var(--Icon-Size, 24px)`, `var(--Sizing-Half, 4px)` | Matches. |
|
|
82
|
+
| Toolbar | `Nav Item` selected | Icon-Holder fills `Text`, caption `Text`; default caption `Quiet` | matches | **Worth a second look in the file:** the selected pill is filled with the surface's TEXT token, so whatever sits on it needs the inverse. The icon inside binds nothing, so it inherits. |
|
|
83
|
+
| Stepper | `Stepper` (8379:13867) | `Style: count \| noCount`, `Orientation`, and a `Step Slot` SLOT | `variant`, `orientation`, `children` | Matches. The slot is how the file repeats the middle steps; in code that is just `children`. |
|
|
84
|
+
| Stepper | `Count Step` | Pins no Buttons mode — the circle inherits, so it draws **Default** | `color` defaulted to `primary` | **FIXED in the library.** Now defaults to `default`. Nothing selected a palette, so the file and the library painted two different real colors from the same system, which read as a design choice rather than the wrong token. |
|
|
85
|
+
| SpeedDial | `SpeedDial` | No size axis | `size` small/medium/large | **Added to the library 2026-10-05.** Dial 48/56/56 off the FAB ramp; actions stay 32 at every size; gap 8/12/16 = **`FAB/SpeedDial-Gap`**, added to Component-Size 2026-10-05 and written by the payload. Resolved. |
|
|
86
|
+
| SpeedDial | `SpeedDial` | No `openOnHover` | `openOnHover`, default false | **Added to the library 2026-10-05, to be added to the file.** Opens the fan on hover, on a fine pointer only, built to WCAG 1.4.13. |
|
|
87
|
+
| SpeedDial | `SpeedDial` | 20 variants. `Direction: left \| right \| down \| up`, 3 Child Slots | `actions` of any length, `variant`, `color`, `direction`, `speed`, `showTooltips` | Built for exactly **three** actions — three Child Slots. No `variant` axis (solid/outline) and no color axis. |
|
|
88
|
+
| Footer | *(lone component)* | One COMPONENT, 1177×629. No variants, no properties | `brand`, `columns`, `address`, `socialLinks`, `copyright`, `color` | One worked example rather than an axis to match. |
|
|
89
|
+
| Copyright | *(lone component)* | One COMPONENT, 1177×53. No variants | `companyName`, `year`, `rights`, `color` | Nothing to match. |
|
|
90
|
+
| ToggleButton | *(no set)* | A page with two FRAMES and no component set | `selected`, `onChange`, `value`, icon children | **The clearest gap in the file.** A single on/off button is a real control with five states, and there is nothing to build against. Everything else routes selection through ToggleButtonGroup, which cannot express a group of one. |
|
|
91
|
+
| Section / Stack / Container | *(no set)* | Nothing, correctly | surface and theme; flex direction and gap; max width | These are frame properties in Figma — a theme mode, auto-layout, a frame size — so there is nothing to build. Listed so the absence reads as deliberate. |
|
|
92
|
+
| Box | *(no set)* | A page with no component set | `theme`, `surface`, `radius`, `elevation`, `component` | A box IS a frame with a theme and surface mode, so there is nothing to build. |
|
|
93
|
+
| NumberField | `Field Button` only | The stepper: `Increment: Up \| Down × State`, 48×32, **no size axis** | `size` small/medium/large | The stepper is 48 wide at every size because the file has one width. Should vary per size when the file grows that axis. |
|
|
94
|
+
|
|
95
|
+
## Spelled differently in two places
|
|
96
|
+
|
|
97
|
+
| Concept | Where | Where | Note |
|
|
98
|
+
| --- | --- | --- | --- |
|
|
99
|
+
| The five interaction states | `SpeedDial` uses **both** `default \| hover \| pressed \| focus-visible \| disabled` **and** `Default \| Hover \| Active \| Focus-Visible \| Disabled` | — | **Ten values for five states**, in one property on one set. `pressed` and `Active` are the same state under two names. Worth fixing in the file: nothing can read this reliably. |
|
|
100
|
+
|
|
101
|
+
| Concept | Button set | Button-Group-Segments | Note |
|
|
102
|
+
| --- | --- | --- | --- |
|
|
103
|
+
| The unselected state | `Status=unselected` | `Status=not-selected` | One idea, two spellings, in two sets that are meant to pair. The converter has to special-case it forever unless one moves. |
|
|
104
|
+
|
|
105
|
+
## No Figma counterpart, correctly
|
|
106
|
+
|
|
107
|
+
These need no set, and the absence is deliberate rather than an oversight.
|
|
108
|
+
Listed so nobody goes looking.
|
|
109
|
+
|
|
110
|
+
| Component | Why |
|
|
111
|
+
| --- | --- |
|
|
112
|
+
| Section, Stack, Container, Grid, Box | Frame properties in Figma — a theme mode, auto-layout, a frame size, a layout grid. There is nothing to build. |
|
|
113
|
+
| Typography | Held as text styles and a 201-variable collection, not a set. |
|
|
114
|
+
| Gradient | A fill on a frame. |
|
|
115
|
+
| CurvedText | A path effect on a text layer. |
|
|
116
|
+
| MiniSwatch | A layer inside the Select and Menu sets rather than a component. |
|
|
117
|
+
|
|
118
|
+
## Not exported, and still has a Figma page
|
|
119
|
+
|
|
120
|
+
| Component | Figma | Note |
|
|
121
|
+
| --- | --- | --- |
|
|
122
|
+
| TransferList | Has a page | In the library but not exported — one of the three `KNOWN_GAPS` in `publicIndex.test.js`. Exporting it is an API decision, so it is flagged rather than done. |
|
|
123
|
+
| Sheet | Has a page | Same. |
|
|
124
|
+
| Progress | — | Same; superseded by CircularProgress and LinearProgress, which are exported and now documented. |
|
|
125
|
+
|
|
126
|
+
## Still undocumented
|
|
127
|
+
|
|
128
|
+
| Component | Why it was left |
|
|
129
|
+
| --- | --- |
|
|
130
|
+
| BarChart, LineChart, PieChart | Data visualisation, with their own accessibility story (`ChartTable`, hit targets, motion tokens). Worth doing carefully rather than quickly. Figma's page is "Data Visualization". |
|
|
131
|
+
| Colors, Spacing | These display the palette and the scale — documentation components rather than things to compose with. They may belong in Foundations instead. |
|
|
132
|
+
| MainLayout | An app shell. |
|
|
133
|
+
|
|
134
|
+
## Resolved
|
|
135
|
+
|
|
136
|
+
| Component | Was | Now |
|
|
137
|
+
| --- | --- | --- |
|
|
138
|
+
| Switch | Library 28×16 / 40×24 at small and medium | 35×20 / 42×24, matching the Component-Size collection. Large matched all along, which is why it read as consistent. |
|
|
139
|
+
| Switch | Handle derived as `trackH − 4` (16 at small); icon 8/16/16 | Handle 15/20/28 and icon 12/16/24, both read from the collection. |
|
|
140
|
+
| Switch | `variant="default"` painted `--Icons-Default` (neutral) | Paints `--Icons-Primary`, the mode the set pins. |
|
|
141
|
+
| Switch | Seven of nine variants unregistered, so they fell through to the default | All nine registered. |
|
|
142
|
+
| Button | `Fit: default \| fullWidth` variant | Removed. Fill is native sizing; the converter reads sizing now. |
|
|
143
|
+
| Radio Group | Figma set mapped to Radio's docs | Mapped to RadioGroup's, which now has a page. |
|
package/package.json
CHANGED
package/public/styles/base.css
CHANGED
|
@@ -272,6 +272,11 @@
|
|
|
272
272
|
--Switch-Height: 24px;
|
|
273
273
|
--Sm-Switch-Height: 20px;
|
|
274
274
|
--Lg-Switch-Height: 32px;
|
|
275
|
+
/* The handle is published, not the track minus its inset: that derivation
|
|
276
|
+
holds at medium and large and gives 16 at small where the file says 15. */
|
|
277
|
+
--Switch-Handle: 20px;
|
|
278
|
+
--Sm-Switch-Handle: 15px;
|
|
279
|
+
--Lg-Switch-Handle: 28px;
|
|
275
280
|
--Divider: 1px;
|
|
276
281
|
--Sm-Divider: 0.5px;
|
|
277
282
|
--Lg-Divider: 2px;
|