@omni-design/components 0.7.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/.claude/commands/ScanComponents.md +26 -0
- package/.claude/commands/ShareComponent.md +128 -0
- package/.cursorrules +21 -0
- package/CLAUDE.md +1046 -0
- package/README.md +70 -0
- package/dist/OmniDesignProvider.esm.js +2 -0
- package/dist/OmniDesignProvider.esm.js.map +1 -0
- package/dist/OmniDesignProvider.js +2 -0
- package/dist/OmniDesignProvider.js.map +1 -0
- package/dist/index.esm.js +42 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/types/OmniDesignProvider.d.ts +158 -0
- package/dist/types/components/Accordion/Accordion.d.ts +42 -0
- package/dist/types/components/Accordion/AccordionShowcase.d.ts +2 -0
- package/dist/types/components/Accordion/index.d.ts +2 -0
- package/dist/types/components/Alert/Alert.d.ts +14 -0
- package/dist/types/components/Alert/AlertShowcase.d.ts +2 -0
- package/dist/types/components/Alert/index.d.ts +2 -0
- package/dist/types/components/AppBar/AppBar.d.ts +43 -0
- package/dist/types/components/AppBar/AppBarShowcase.d.ts +2 -0
- package/dist/types/components/AppBar/index.d.ts +2 -0
- package/dist/types/components/Autocomplete/Autocomplete.d.ts +26 -0
- package/dist/types/components/Autocomplete/AutocompleteShowcase.d.ts +2 -0
- package/dist/types/components/Autocomplete/index.d.ts +2 -0
- package/dist/types/components/Avatar/Avatar.d.ts +29 -0
- package/dist/types/components/Avatar/AvatarShowcase.d.ts +2 -0
- package/dist/types/components/Avatar/defaultAvatar.d.ts +2 -0
- package/dist/types/components/Avatar/index.d.ts +3 -0
- package/dist/types/components/BackgroundPicker.d.ts +12 -0
- package/dist/types/components/Badge/Badge.d.ts +43 -0
- package/dist/types/components/Badge/BadgeShowcase.d.ts +1 -0
- package/dist/types/components/Badge/index.d.ts +2 -0
- package/dist/types/components/BevelText/BevelText.d.ts +15 -0
- package/dist/types/components/BevelText/BevelTextShowcase.d.ts +2 -0
- package/dist/types/components/BevelText/index.d.ts +2 -0
- package/dist/types/components/BottomNavigation/BottomNavigation.d.ts +15 -0
- package/dist/types/components/BottomNavigation/BottomNavigationShowcase.d.ts +2 -0
- package/dist/types/components/BottomNavigation/index.d.ts +2 -0
- package/dist/types/components/Box/Box.d.ts +36 -0
- package/dist/types/components/Box/BoxShowcase.d.ts +2 -0
- package/dist/types/components/Box/index.d.ts +2 -0
- package/dist/types/components/Breadcrumbs/Breadcrumbs.d.ts +22 -0
- package/dist/types/components/Breadcrumbs/BreadcrumbsShowcase.d.ts +2 -0
- package/dist/types/components/Breadcrumbs/index.d.ts +2 -0
- package/dist/types/components/Button/Button.d.ts +66 -0
- package/dist/types/components/Button/index.d.ts +2 -0
- package/dist/types/components/ButtonGroup/ButtonGroup.d.ts +41 -0
- package/dist/types/components/ButtonGroup/index.d.ts +2 -0
- package/dist/types/components/Card/Card.d.ts +54 -0
- package/dist/types/components/Card/CardShowcase.d.ts +2 -0
- package/dist/types/components/Card/index.d.ts +2 -0
- package/dist/types/components/Checkbox/Checkbox.d.ts +51 -0
- package/dist/types/components/Checkbox/index.d.ts +2 -0
- package/dist/types/components/Chip/Chip.d.ts +42 -0
- package/dist/types/components/Chip/ChipShowcase.d.ts +2 -0
- package/dist/types/components/Chip/index.d.ts +2 -0
- package/dist/types/components/CircularProgress/CircularProgress.d.ts +12 -0
- package/dist/types/components/CircularProgress/CircularProgressShowcase.d.ts +2 -0
- package/dist/types/components/CircularProgress/index.d.ts +2 -0
- package/dist/types/components/CodeBlock/CodeBlock.d.ts +35 -0
- package/dist/types/components/Colors/Colors.d.ts +7 -0
- package/dist/types/components/Colors/index.d.ts +1 -0
- package/dist/types/components/Container/Container.d.ts +70 -0
- package/dist/types/components/Container/index.d.ts +1 -0
- package/dist/types/components/Copyright/Copyright.d.ts +11 -0
- package/dist/types/components/Copyright/CopyrightShowcase.d.ts +2 -0
- package/dist/types/components/Copyright/index.d.ts +2 -0
- package/dist/types/components/CurvedText/CurvedText.d.ts +23 -0
- package/dist/types/components/CurvedText/CurvedTextShowcase.d.ts +2 -0
- package/dist/types/components/CurvedText/index.d.ts +2 -0
- package/dist/types/components/Dialog/Dialog.d.ts +82 -0
- package/dist/types/components/Dialog/DialogShowcase.d.ts +2 -0
- package/dist/types/components/Dialog/index.d.ts +2 -0
- package/dist/types/components/Divider/Divider.d.ts +22 -0
- package/dist/types/components/Divider/DividerShowcase.d.ts +2 -0
- package/dist/types/components/Divider/index.d.ts +2 -0
- package/dist/types/components/Drawer/Drawer.d.ts +30 -0
- package/dist/types/components/Drawer/DrawerShowcase.d.ts +2 -0
- package/dist/types/components/Drawer/index.d.ts +2 -0
- package/dist/types/components/DropZone/DropZone.d.ts +15 -0
- package/dist/types/components/DropZone/index.d.ts +2 -0
- package/dist/types/components/Fab/Fab.d.ts +17 -0
- package/dist/types/components/Fab/FabShowcase.d.ts +2 -0
- package/dist/types/components/Fab/index.d.ts +2 -0
- package/dist/types/components/Footer/Footer.d.ts +14 -0
- package/dist/types/components/Footer/FooterShowcase.d.ts +2 -0
- package/dist/types/components/Footer/index.d.ts +2 -0
- package/dist/types/components/Gradient/Gradient.d.ts +38 -0
- package/dist/types/components/Gradient/GradientShowcase.d.ts +2 -0
- package/dist/types/components/Gradient/gradientUtils.d.ts +185 -0
- package/dist/types/components/Gradient/index.d.ts +3 -0
- package/dist/types/components/Grid/Grid.d.ts +112 -0
- package/dist/types/components/Grid/index.d.ts +1 -0
- package/dist/types/components/Header/Header.d.ts +53 -0
- package/dist/types/components/Header/index.d.ts +1 -0
- package/dist/types/components/Icon/Icon.d.ts +19 -0
- package/dist/types/components/Icon/IconShowcase.d.ts +2 -0
- package/dist/types/components/Icon/index.d.ts +2 -0
- package/dist/types/components/IconBadge/IconBadge.d.ts +10 -0
- package/dist/types/components/IconBadge/IconBadgeShowcase.d.ts +2 -0
- package/dist/types/components/IconBadge/index.d.ts +2 -0
- package/dist/types/components/Input/Input.d.ts +47 -0
- package/dist/types/components/Input/index.d.ts +2 -0
- package/dist/types/components/LinearProgress/LinearProgress.d.ts +9 -0
- package/dist/types/components/LinearProgress/LinearProgressShowcase.d.ts +2 -0
- package/dist/types/components/LinearProgress/index.d.ts +2 -0
- package/dist/types/components/Link/Link.d.ts +16 -0
- package/dist/types/components/Link/LinkShowcase.d.ts +2 -0
- package/dist/types/components/Link/index.d.ts +2 -0
- package/dist/types/components/List/List.d.ts +55 -0
- package/dist/types/components/List/ListShowcase.d.ts +2 -0
- package/dist/types/components/List/index.d.ts +2 -0
- package/dist/types/components/MainLayout/MainLayout.d.ts +28 -0
- package/dist/types/components/MainLayout/index.d.ts +1 -0
- package/dist/types/components/Menu/Menu.d.ts +37 -0
- package/dist/types/components/Menu/MenuShowcase.d.ts +2 -0
- package/dist/types/components/Menu/index.d.ts +2 -0
- package/dist/types/components/Modal/Modal.d.ts +18 -0
- package/dist/types/components/Modal/ModalShowcase.d.ts +2 -0
- package/dist/types/components/Modal/index.d.ts +2 -0
- package/dist/types/components/NumberField/NumberField.d.ts +22 -0
- package/dist/types/components/NumberField/NumberFieldShowcase.d.ts +2 -0
- package/dist/types/components/NumberField/index.d.ts +2 -0
- package/dist/types/components/Pagination/Pagination.d.ts +17 -0
- package/dist/types/components/Pagination/PaginationShowcase.d.ts +2 -0
- package/dist/types/components/Pagination/index.d.ts +2 -0
- package/dist/types/components/Paper/Paper.d.ts +111 -0
- package/dist/types/components/Paper/index.d.ts +1 -0
- package/dist/types/components/Popover/Popover.d.ts +31 -0
- package/dist/types/components/Popover/index.d.ts +1 -0
- package/dist/types/components/PreviewSurface.d.ts +18 -0
- package/dist/types/components/Radio/Radio.d.ts +55 -0
- package/dist/types/components/Radio/RadioShowcase.d.ts +2 -0
- package/dist/types/components/Radio/index.d.ts +2 -0
- package/dist/types/components/Rail/Rail.d.ts +15 -0
- package/dist/types/components/Rail/RailShowcase.d.ts +2 -0
- package/dist/types/components/Rail/index.d.ts +2 -0
- package/dist/types/components/Rating/Rating.d.ts +16 -0
- package/dist/types/components/Rating/RatingShowcase.d.ts +2 -0
- package/dist/types/components/Rating/index.d.ts +2 -0
- package/dist/types/components/Ratio/Ratio.d.ts +20 -0
- package/dist/types/components/Ratio/RatioShowcase.d.ts +2 -0
- package/dist/types/components/Ratio/index.d.ts +2 -0
- package/dist/types/components/SearchField/SearchField.d.ts +19 -0
- package/dist/types/components/SearchField/SearchFieldShowcase.d.ts +2 -0
- package/dist/types/components/SearchField/index.d.ts +2 -0
- package/dist/types/components/Section/Section.d.ts +44 -0
- package/dist/types/components/Section/SectionShowcase.d.ts +2 -0
- package/dist/types/components/Section/index.d.ts +2 -0
- package/dist/types/components/Select/Select.d.ts +23 -0
- package/dist/types/components/Select/SelectShowcase.d.ts +2 -0
- package/dist/types/components/Select/index.d.ts +2 -0
- package/dist/types/components/SettingsPanel.d.ts +2 -0
- package/dist/types/components/Sidebar/Sidebar.d.ts +53 -0
- package/dist/types/components/Sidebar/index.d.ts +1 -0
- package/dist/types/components/Slider/Slider.d.ts +79 -0
- package/dist/types/components/Slider/SliderShowcase.d.ts +2 -0
- package/dist/types/components/Slider/index.d.ts +2 -0
- package/dist/types/components/Snackbar/Snackbar.d.ts +17 -0
- package/dist/types/components/Snackbar/SnackbarShowcase.d.ts +2 -0
- package/dist/types/components/Snackbar/index.d.ts +2 -0
- package/dist/types/components/Spacing/Spacing.d.ts +16 -0
- package/dist/types/components/Spacing/index.d.ts +1 -0
- package/dist/types/components/SpeedDial/SpeedDial.d.ts +17 -0
- package/dist/types/components/SpeedDial/SpeedDialShowcase.d.ts +2 -0
- package/dist/types/components/SpeedDial/index.d.ts +2 -0
- package/dist/types/components/Stack/Stack.d.ts +52 -0
- package/dist/types/components/Stack/StackShowcase.d.ts +2 -0
- package/dist/types/components/Stack/index.d.ts +2 -0
- package/dist/types/components/Stepper/Stepper.d.ts +33 -0
- package/dist/types/components/Stepper/StepperShowcase.d.ts +2 -0
- package/dist/types/components/Stepper/index.d.ts +2 -0
- package/dist/types/components/Switch/Switch.d.ts +65 -0
- package/dist/types/components/Switch/SwitchShowcase.d.ts +2 -0
- package/dist/types/components/Switch/index.d.ts +2 -0
- package/dist/types/components/Table/Table.d.ts +20 -0
- package/dist/types/components/Table/TableShowcase.d.ts +2 -0
- package/dist/types/components/Table/index.d.ts +2 -0
- package/dist/types/components/Tabs/Tabs.d.ts +51 -0
- package/dist/types/components/Tabs/TabsShowcase.d.ts +2 -0
- package/dist/types/components/Tabs/index.d.ts +2 -0
- package/dist/types/components/Tag/Tag.d.ts +57 -0
- package/dist/types/components/Tag/TagShowcase.d.ts +2 -0
- package/dist/types/components/Tag/index.d.ts +2 -0
- package/dist/types/components/TextField/TextField.d.ts +105 -0
- package/dist/types/components/TextField/index.d.ts +1 -0
- package/dist/types/components/ToggleButton/ToggleButton.d.ts +94 -0
- package/dist/types/components/ToggleButton/index.d.ts +1 -0
- package/dist/types/components/ToggleButtonGroup/ToggleButtonGroup.d.ts +48 -0
- package/dist/types/components/Toolbar/Toolbar.d.ts +14 -0
- package/dist/types/components/Toolbar/ToolbarShowcase.d.ts +2 -0
- package/dist/types/components/Toolbar/index.d.ts +2 -0
- package/dist/types/components/Tooltip/Tooltip.d.ts +20 -0
- package/dist/types/components/Tooltip/TooltipShowcase.d.ts +2 -0
- package/dist/types/components/Tooltip/index.d.ts +2 -0
- package/dist/types/components/TreeView/TreeBranch.d.ts +14 -0
- package/dist/types/components/TreeView/TreeView.d.ts +82 -0
- package/dist/types/components/TreeView/TreeViewShowcase.d.ts +2 -0
- package/dist/types/components/TreeView/index.d.ts +3 -0
- package/dist/types/components/Typography/Typography.d.ts +492 -0
- package/dist/types/components/Typography/TypographyShowcase.d.ts +2 -0
- package/dist/types/components/Typography/index.d.ts +2 -0
- package/dist/types/components/_a11y/ContrastCheck.d.ts +15 -0
- package/dist/types/components/_bevelPresets.d.ts +92 -0
- package/dist/types/components/_shadows.d.ts +32 -0
- package/dist/types/components/index.d.ts +74 -0
- package/dist/types/theme/useThemeMode.d.ts +4 -0
- package/docs/components.md +797 -0
- package/docs/getting-started.md +409 -0
- package/docs/token-system.md +468 -0
- package/package.json +126 -0
- package/public/styles/Dark-Mode.css +13867 -0
- package/public/styles/Light-Mode.css +14091 -0
- package/public/styles/README.md +93 -0
- package/public/styles/base.css +261 -0
- package/public/styles/core.css +378 -0
- package/public/styles/foundation.css +72 -0
- package/public/styles/styles.css +6 -0
- package/public/styles/theme.js +234 -0
- package/public/styles/theme.json +12 -0
- package/public/styles/typography-tokens.css +720 -0
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
# Dyno Design System — Token System
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The Dyno token system is a layered CSS variable cascade that maps raw color values
|
|
6
|
+
through semantic tokens to component-ready variables. Every visual property a
|
|
7
|
+
component uses is a CSS variable — no hardcoded values anywhere in the component
|
|
8
|
+
library. This means swapping a brand only requires replacing the token CSS files;
|
|
9
|
+
component code never changes.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## The Four-Layer Cascade
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
Layer 1: base.css — raw primitives (colors, spacing, typography)
|
|
17
|
+
Layer 2: light-mode.css — maps primitives → semantic tokens (light)
|
|
18
|
+
dark-mode.css — maps primitives → semantic tokens (dark)
|
|
19
|
+
Layer 3: themes.css — maps semantic tokens → surface/component variables
|
|
20
|
+
via [data-theme] + [data-surface] selectors
|
|
21
|
+
Layer 4: Component — reads final CSS variables at render time
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Each layer builds on the previous. Only Layer 2 (the mode file) is swapped at
|
|
25
|
+
runtime when the user toggles dark mode. Everything else is static.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Layer 1 — Primitives (base.css)
|
|
30
|
+
|
|
31
|
+
Raw color scales, spacing, radius, and typography values. Never referenced
|
|
32
|
+
directly by components — always aliased through the layers above.
|
|
33
|
+
|
|
34
|
+
```css
|
|
35
|
+
/* Color scale — 12 steps per hue */
|
|
36
|
+
--Primary-Color-1: #210009;
|
|
37
|
+
--Primary-Color-2: #370A20;
|
|
38
|
+
...
|
|
39
|
+
--Primary-Color-12: #FEF8FA;
|
|
40
|
+
|
|
41
|
+
/* Spacing */
|
|
42
|
+
--Sizing-1: 8px;
|
|
43
|
+
--Sizing-2: 16px;
|
|
44
|
+
--Sizing-3: 24px;
|
|
45
|
+
|
|
46
|
+
/* Radius */
|
|
47
|
+
--Card-Radius: 12px;
|
|
48
|
+
--Button-Radius: 8px;
|
|
49
|
+
|
|
50
|
+
/* Effects */
|
|
51
|
+
--Effect-Level-0: none;
|
|
52
|
+
--Effect-Level-1: 0 1px 2px 0 rgba(0,0,0,0.05);
|
|
53
|
+
--Effect-Level-2: 0 1px 3px 0 rgba(0,0,0,0.1), 0 1px 2px 0 rgba(0,0,0,0.06);
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Layer 2 — Mode (light-mode.css / dark-mode.css)
|
|
59
|
+
|
|
60
|
+
Maps primitive color scales to background-specific semantic tokens. One file is
|
|
61
|
+
active at a time — swapped by `OmniDesignProvider` when dark mode is toggled.
|
|
62
|
+
|
|
63
|
+
Tokens are scoped per background level (Background-1 through Background-12),
|
|
64
|
+
where lower numbers are darker and higher numbers are lighter in light mode.
|
|
65
|
+
|
|
66
|
+
The scale is **12 tones**, at fixed lightness values:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
Color-1 2 3 4 5 6 7 8 9 10 11 12
|
|
70
|
+
L = 1 10 19 28 37 58 71 81 90 95 98 99
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Because the lightness of a tone is fixed, a given tone index behaves the same
|
|
74
|
+
way in every palette — which is why several rules below can key on the tone
|
|
75
|
+
index alone rather than measuring each colour.
|
|
76
|
+
|
|
77
|
+
```css
|
|
78
|
+
/* Example — Primary color at Background-12 (lightest surface) */
|
|
79
|
+
--Primary-Buttons-Surfaces-Background-12-Button: var(--Primary-Color-5);
|
|
80
|
+
--Primary-Buttons-Surfaces-Background-12-Button-Text: var(--Primary-Color-1);
|
|
81
|
+
--Primary-Buttons-Surfaces-Background-12-Border: var(--Primary-Color-5);
|
|
82
|
+
--Primary-Buttons-Surfaces-Background-12-Hover: var(--Primary-Color-4);
|
|
83
|
+
--Primary-Buttons-Surfaces-Background-12-Pressed: var(--Primary-Color-3);
|
|
84
|
+
|
|
85
|
+
/* Surfaces */
|
|
86
|
+
--Primary-Background-12-Surface: var(--Primary-Color-12);
|
|
87
|
+
--Primary-Background-12-Surface-Dim: var(--Primary-Color-11);
|
|
88
|
+
--Primary-Background-12-Surface-Bright: var(--Primary-Color-12);
|
|
89
|
+
|
|
90
|
+
/* Containers */
|
|
91
|
+
--Primary-Background-12-Container: var(--Primary-Color-11);
|
|
92
|
+
--Primary-Background-12-Container-Low: var(--Primary-Color-12);
|
|
93
|
+
--Primary-Background-12-Container-Lowest: var(--Primary-Color-12);
|
|
94
|
+
--Primary-Background-12-Container-High: var(--Primary-Color-10);
|
|
95
|
+
--Primary-Background-12-Container-Highest: var(--Primary-Color-9);
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Layer 3 — Themes (themes.css)
|
|
101
|
+
|
|
102
|
+
Maps background-specific tokens to the final component-level CSS variables that
|
|
103
|
+
components actually consume. Scoped to `[data-theme]` + `[data-surface]`
|
|
104
|
+
attribute combinations.
|
|
105
|
+
|
|
106
|
+
### The Surface Model
|
|
107
|
+
|
|
108
|
+
Every surface-rendering component sets two HTML attributes:
|
|
109
|
+
|
|
110
|
+
| Attribute | Purpose | Example values |
|
|
111
|
+
|---|---|---|
|
|
112
|
+
| `data-theme` | Which color theme | `Default`, `Primary`, `Primary-Light`, `Neutral-Dark` |
|
|
113
|
+
| `data-surface` | Which surface type | `Surface`, `Container`, `Container-High` |
|
|
114
|
+
|
|
115
|
+
These two attributes together determine which CSS variables are in scope for all
|
|
116
|
+
child components.
|
|
117
|
+
|
|
118
|
+
### Available Themes
|
|
119
|
+
|
|
120
|
+
| Theme | Background level | Use case |
|
|
121
|
+
|---|---|---|
|
|
122
|
+
| `Default` | 13 (lightest) | App default, white/near-white backgrounds |
|
|
123
|
+
| `Primary-Light` | 13 | Light tinted primary background |
|
|
124
|
+
| `Primary` | 11 | Medium primary background |
|
|
125
|
+
| `Secondary-Light` | 13 | Light tinted secondary background |
|
|
126
|
+
| `Secondary` | 11 | Medium secondary background |
|
|
127
|
+
| `Tertiary-Light` | 13 | Light tinted tertiary background |
|
|
128
|
+
| `Tertiary` | 11 | Medium tertiary background |
|
|
129
|
+
| `Neutral-Light` | 13 | Light neutral background |
|
|
130
|
+
| `Neutral` | 11 | Medium neutral background |
|
|
131
|
+
| `Primary-Dark` | 3 | Dark primary background |
|
|
132
|
+
| `Secondary-Dark` | 3 | Dark secondary background |
|
|
133
|
+
| `Tertiary-Dark` | 3 | Dark tertiary background |
|
|
134
|
+
| `Neutral-Dark` | 3 | Dark neutral background |
|
|
135
|
+
|
|
136
|
+
### Available Surfaces
|
|
137
|
+
|
|
138
|
+
| Surface | Effect level | Use case |
|
|
139
|
+
|---|---|---|
|
|
140
|
+
| `Surface` | Level 1 | Base page/section background |
|
|
141
|
+
| `Surface-Dim` | Level 1 | Slightly dimmed surface |
|
|
142
|
+
| `Surface-Bright` | Level 1 | Slightly brightened surface |
|
|
143
|
+
| `Container` | Level 2 | Cards, panels, dialogs |
|
|
144
|
+
| `Container-Low` | Level 2 | Slightly recessed container |
|
|
145
|
+
| `Container-Lowest` | Level 2 | Most recessed container |
|
|
146
|
+
| `Container-High` | Level 2 | Slightly elevated container |
|
|
147
|
+
| `Container-Highest` | Level 2 | Most elevated container |
|
|
148
|
+
|
|
149
|
+
### What themes.css defines per theme + surface combination
|
|
150
|
+
|
|
151
|
+
```css
|
|
152
|
+
[data-theme="Default"][data-surface^="Surface"],
|
|
153
|
+
[data-theme="Default"] [data-surface^="Surface"] {
|
|
154
|
+
/* Backgrounds */
|
|
155
|
+
--Background: var(--Surface);
|
|
156
|
+
--Surface: var(--Primary-Background-12-Surface);
|
|
157
|
+
--Surface-Dim: var(--Primary-Background-12-Surface-Dim);
|
|
158
|
+
--Surface-Bright: var(--Primary-Background-12-Surface-Bright);
|
|
159
|
+
|
|
160
|
+
/* Typography */
|
|
161
|
+
--Text: var(--Text-Surfaces-Primary-Color-12);
|
|
162
|
+
--Text-Quiet: var(--Quiet-Surfaces-Primary-Color-12);
|
|
163
|
+
--Border: var(--Border-Surfaces-Primary-Color-12);
|
|
164
|
+
--Border-Variant: var(--Border-Variant-Surfaces-Primary-Color-12);
|
|
165
|
+
--Eyebrow: var(--Text-Surfaces-Secondary-Color-12);
|
|
166
|
+
|
|
167
|
+
/* Buttons — 10 roles x 7 slots */
|
|
168
|
+
--Buttons-Primary-Button: var(--Buttons-Primary-Surfaces-Background-12-Button);
|
|
169
|
+
--Buttons-Primary-Text: var(--Buttons-Primary-Surfaces-Background-12-Text);
|
|
170
|
+
--Buttons-Primary-Border: var(--Buttons-Primary-Surfaces-Background-12-Border);
|
|
171
|
+
--Buttons-Primary-Hover: var(--Buttons-Primary-Surfaces-Background-12-Hover);
|
|
172
|
+
--Buttons-Primary-Pressed: var(--Buttons-Primary-Surfaces-Background-12-Pressed);
|
|
173
|
+
--Buttons-Primary-Highlight: 180, 149, 198; /* bevel — RGB triplet */
|
|
174
|
+
--Buttons-Primary-Lowlight: 48, 28, 60; /* bevel — RGB triplet */
|
|
175
|
+
/* ...Secondary, Tertiary, Neutral, Info, Success, Warning, Error, BlackWhite... */
|
|
176
|
+
|
|
177
|
+
/* Icons */
|
|
178
|
+
--Icons-Primary: var(--Icon-Surfaces-Primary-Color-12);
|
|
179
|
+
--Icons-Neutral: var(--Icon-Surfaces-Neutral-Color-12);
|
|
180
|
+
/* ...etc... */
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
[data-theme="Default"][data-surface^="Container"],
|
|
184
|
+
[data-theme="Default"] [data-surface^="Container"] {
|
|
185
|
+
/* Containers */
|
|
186
|
+
--Background: var(--Container);
|
|
187
|
+
--Container: var(--Primary-Background-12-Container);
|
|
188
|
+
--Container-Low: var(--Primary-Background-12-Container-Low);
|
|
189
|
+
--Container-Lowest: var(--Primary-Background-12-Container-Lowest);
|
|
190
|
+
--Container-High: var(--Primary-Background-12-Container-High);
|
|
191
|
+
--Container-Highest: var(--Primary-Background-12-Container-Highest);
|
|
192
|
+
|
|
193
|
+
/* Typography, buttons, icons — same pattern as Surface but Container-specific values */
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Layer 4 — Components
|
|
200
|
+
|
|
201
|
+
Components only ever reference the final CSS variables — never raw colors or
|
|
202
|
+
background-specific tokens. This is what makes them fully theme-adaptive.
|
|
203
|
+
|
|
204
|
+
```jsx
|
|
205
|
+
// Button reads final variables — works under any theme/surface
|
|
206
|
+
<button style={{
|
|
207
|
+
background: 'var(--Buttons-Primary-Button)',
|
|
208
|
+
color: 'var(--Buttons-Primary-Text)',
|
|
209
|
+
border: '1px solid var(--Buttons-Primary-Border)',
|
|
210
|
+
}}>
|
|
211
|
+
Click me
|
|
212
|
+
</button>
|
|
213
|
+
|
|
214
|
+
// On hover (CSS)
|
|
215
|
+
// background: var(--Buttons-Primary-Hover)
|
|
216
|
+
// On press
|
|
217
|
+
// background: var(--Buttons-Primary-Pressed)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Full Token Chain Example
|
|
223
|
+
|
|
224
|
+
Tracing `--Buttons-Primary-Button` under `data-theme="Default"` in light mode:
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
Component reads:
|
|
228
|
+
var(--Buttons-Primary-Button)
|
|
229
|
+
↓ themes.css [data-theme="Default"]
|
|
230
|
+
var(--Buttons-Primary-Surfaces-Background-12-Button)
|
|
231
|
+
↓ light-mode.css
|
|
232
|
+
var(--Primary-Color-5)
|
|
233
|
+
↓ base.css
|
|
234
|
+
#90385F
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
The same component under `data-theme="Primary-Dark"` in dark mode resolves to a
|
|
238
|
+
completely different hex value — the component code is identical.
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Buttons
|
|
243
|
+
|
|
244
|
+
### Roles and slots
|
|
245
|
+
|
|
246
|
+
Ten roles — `Default, Primary, Secondary, Tertiary, Neutral, Info, Success,
|
|
247
|
+
Warning, Error, BlackWhite` — each with seven slots:
|
|
248
|
+
|
|
249
|
+
```css
|
|
250
|
+
--Buttons-<Role>-Button /* fill */
|
|
251
|
+
--Buttons-<Role>-Text /* label, derived FROM the fill */
|
|
252
|
+
--Buttons-<Role>-Border /* the fill — a solid button's edge is its own colour */
|
|
253
|
+
--Buttons-<Role>-Hover
|
|
254
|
+
--Buttons-<Role>-Pressed
|
|
255
|
+
--Buttons-<Role>-Highlight /* bevel — RGB TRIPLET, not hex */
|
|
256
|
+
--Buttons-<Role>-Lowlight /* bevel — RGB TRIPLET, not hex */
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Highlight and Lowlight are bare `R, G, B` triplets because the components wrap
|
|
260
|
+
them: `rgb(var(--Buttons-Primary-Highlight))`. Emitting hex there is valid CSS
|
|
261
|
+
that silently produces no bevel.
|
|
262
|
+
|
|
263
|
+
### Which tone each role sits on
|
|
264
|
+
|
|
265
|
+
| Role | Light mode | Dark mode |
|
|
266
|
+
|---|---|---|
|
|
267
|
+
| Primary | the brand's extracted tone | **Light-mode Color-8** |
|
|
268
|
+
| Secondary / Tertiary | the extracted tone, exactly | Light-mode Color-8 |
|
|
269
|
+
| Neutral | Color-8 | Light-mode Color-8 |
|
|
270
|
+
| Info / Success / Warning / Error | **Color-5, fixed** | Light-mode Color-8 |
|
|
271
|
+
|
|
272
|
+
Dark-mode buttons deliberately reach across the mode boundary and use the
|
|
273
|
+
**light** ramp's Color-8. Every palette then measures 9.5–10.4:1 against its
|
|
274
|
+
(dark) label.
|
|
275
|
+
|
|
276
|
+
State buttons are pinned to Color-5 because the tone decides the label:
|
|
277
|
+
|
|
278
|
+
```
|
|
279
|
+
Color-5 white 7.2:1 ✓ black 2.8:1 ✗
|
|
280
|
+
Color-6 white 3.4:1 ✗ black 6.0:1 ✓
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
A state colour should mean the same thing in every brand, so it must not move.
|
|
284
|
+
|
|
285
|
+
### `black-white`
|
|
286
|
+
|
|
287
|
+
A button that resolves itself against whatever it is placed on — black on a
|
|
288
|
+
light surface, white on a dark one — with no prop change:
|
|
289
|
+
|
|
290
|
+
```jsx
|
|
291
|
+
<Button variant="black-white">Works on any theme or surface</Button>
|
|
292
|
+
<Button variant="black-white-outline">Also anywhere</Button>
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
The face is chosen by the **background's tone**: white on tones 1–5, black from
|
|
296
|
+
6 up. Labels measure ~20.5:1 throughout.
|
|
297
|
+
|
|
298
|
+
There is no `black-white-light`. That variant reads `--<Color>-Color-11`, and
|
|
299
|
+
black-white is a resolved pair rather than a palette, so it has no tones.
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## The Hover/Pressed State Chain
|
|
304
|
+
|
|
305
|
+
> The token is `Pressed`. It was once `Active`; nothing reads `-Active` any
|
|
306
|
+
> more, and a stale `--Buttons-<Color>-Active` declaration resolves to nothing
|
|
307
|
+
> — leaving a button with no pressed feedback at all.
|
|
308
|
+
|
|
309
|
+
States are **not** a fixed blend. Each is a step along the palette, and the
|
|
310
|
+
direction is chosen by the button's own **label**:
|
|
311
|
+
|
|
312
|
+
### Direction — decided by the LABEL
|
|
313
|
+
|
|
314
|
+
**The state moves away from the text sitting on it.**
|
|
315
|
+
|
|
316
|
+
- Label **lighter** than the fill (light text) → step **darker**
|
|
317
|
+
- Label **darker** than the fill (dark text) → step **lighter**
|
|
318
|
+
|
|
319
|
+
The label is read from `Text.Surfaces.{palette}.Color-N` — the token the button
|
|
320
|
+
actually renders — and compared to the fill by relative luminance.
|
|
321
|
+
|
|
322
|
+
> Keying on the tone index instead (1-5 darker, 6-12 lighter) assumes every
|
|
323
|
+
> palette's text table flips at tone 6. Measured, 23 of 24 palette/mode
|
|
324
|
+
> combinations do — and the exception is where it broke: an olive primary whose
|
|
325
|
+
> Color-6 carries a *light* label, so "lighter" stepped into the text and took a
|
|
326
|
+
> 4.54:1 button to 2.17:1.
|
|
327
|
+
|
|
328
|
+
### Pressed
|
|
329
|
+
|
|
330
|
+
| Fill tone | Pressed |
|
|
331
|
+
| --- | --- |
|
|
332
|
+
| 2-11 | one full tone in the direction above |
|
|
333
|
+
| **1** | **half a step lighter** |
|
|
334
|
+
| **12** | `Color-11` — darker, inverted |
|
|
335
|
+
|
|
336
|
+
**Both ends invert, because neither has headroom.** Tone 12 is already
|
|
337
|
+
near-white, so stepping lighter goes nowhere. Tone 1 used to step to `#000000`,
|
|
338
|
+
which from a fill already at `#040404` is 1.02:1 against itself — no feedback at
|
|
339
|
+
all.
|
|
340
|
+
|
|
341
|
+
Tone 1 moves only **half** a step because `Color-1 → Color-2` is L=1 → L=10, a
|
|
342
|
+
tenfold luminance change; the same step at the light end is L=98 → L=99. A full
|
|
343
|
+
step there reads as the button changing colour rather than responding.
|
|
344
|
+
|
|
345
|
+
```
|
|
346
|
+
before #040404 → hover #020202 (Δ1.012) pressed #000000 (Δ1.023)
|
|
347
|
+
after #040404 → hover #0a0a0a (Δ1.036) pressed #101010 (Δ1.077)
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### Hover — a 50% blend of the fill and its Pressed value
|
|
351
|
+
|
|
352
|
+
Hover sits between the resting fill and Pressed, so the two states read as one
|
|
353
|
+
progression rather than two unrelated colours.
|
|
354
|
+
|
|
355
|
+
### The guarantee
|
|
356
|
+
|
|
357
|
+
Because the state always moves away from the label, **if the resting pair passes,
|
|
358
|
+
the states pass.** It holds for every tone but the two endpoints, where the
|
|
359
|
+
inversion costs a little and both stay far above 4.5 (Color-1: 15.79 → 14.63;
|
|
360
|
+
Color-12: 9.66 → 9.37).
|
|
361
|
+
|
|
362
|
+
**Source of truth:** `staticTokenStructures.ts` → `buildHoverForPalette()`.
|
|
363
|
+
Mirrored in the CSS writer, the Figma export and the studio preview — all four
|
|
364
|
+
must agree. Full derivation: `docs/hover-active-calculation.md` in the studio.
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## Effects
|
|
369
|
+
|
|
370
|
+
Box shadows are also tokenized and assigned per surface type:
|
|
371
|
+
|
|
372
|
+
```css
|
|
373
|
+
[data-surface^="Surface"] { --Effects: var(--Effect-Level-1); }
|
|
374
|
+
[data-surface^="Container"] { --Effects: var(--Effect-Level-2); }
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
Components apply effects via `box-shadow: var(--Effects)`.
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## Using the System in a Consumer App
|
|
382
|
+
|
|
383
|
+
### Setup (once at app root)
|
|
384
|
+
|
|
385
|
+
```jsx
|
|
386
|
+
import { OmniDesignProvider } from '@omni/components';
|
|
387
|
+
|
|
388
|
+
function App() {
|
|
389
|
+
return (
|
|
390
|
+
<OmniDesignProvider themeURL="https://your-theme-cdn.com/brand">
|
|
391
|
+
<YourApp />
|
|
392
|
+
</OmniDesignProvider>
|
|
393
|
+
);
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### How the CSS loads
|
|
398
|
+
|
|
399
|
+
The Provider reads `theme.json` and inserts each brand sheet as a
|
|
400
|
+
`<link rel="stylesheet">` tag (URL sources) or `<style>` tag (raw CSS
|
|
401
|
+
strings). Sheets load in cascade order — `foundation → core → mode →
|
|
402
|
+
base → styles` — and the browser blocks paint until each `<link>` is
|
|
403
|
+
applied.
|
|
404
|
+
|
|
405
|
+
While loading, the Provider's root element carries
|
|
406
|
+
`data-omni-css="loading"` and is `visibility: hidden`. It flips to
|
|
407
|
+
`"ready"` once every sheet resolves. Consumers can read the same value
|
|
408
|
+
via `useOmniDesign().cssStatus` to render a fallback during a slow
|
|
409
|
+
network load.
|
|
410
|
+
|
|
411
|
+
### Using components
|
|
412
|
+
|
|
413
|
+
Components automatically inherit the theme from their nearest `data-theme`
|
|
414
|
+
ancestor. No manual theme wiring required.
|
|
415
|
+
|
|
416
|
+
```jsx
|
|
417
|
+
import { Card, Button } from '@omni/components';
|
|
418
|
+
|
|
419
|
+
// Inherits theme from OmniDesignProvider
|
|
420
|
+
<Card>
|
|
421
|
+
<Button color="primary">Click me</Button>
|
|
422
|
+
</Card>
|
|
423
|
+
|
|
424
|
+
// Explicit theme override on Card
|
|
425
|
+
<Card variant="solid" color="primary">
|
|
426
|
+
<Button color="secondary">Click me</Button>
|
|
427
|
+
</Card>
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
### Manual surface control (advanced)
|
|
431
|
+
|
|
432
|
+
For layouts that need explicit surface nesting:
|
|
433
|
+
|
|
434
|
+
```jsx
|
|
435
|
+
<div data-theme="Primary" data-surface="Surface">
|
|
436
|
+
<div data-theme="Primary" data-surface="Container">
|
|
437
|
+
<Button color="primary" />
|
|
438
|
+
</div>
|
|
439
|
+
</div>
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
---
|
|
443
|
+
|
|
444
|
+
## Generating a Custom Brand
|
|
445
|
+
|
|
446
|
+
Dino generates a complete token CSS package from a brand image:
|
|
447
|
+
|
|
448
|
+
1. Upload image → Dino extracts color palette
|
|
449
|
+
2. Builds 13-step color scales per hue (Primary, Secondary, Tertiary, Neutral)
|
|
450
|
+
3. Generates `base.css`, `light-mode.css`, `dark-mode.css`, `themes.css`
|
|
451
|
+
4. Publishes to a `themeURL` with a `theme.json` manifest
|
|
452
|
+
5. Consumer points `OmniDesignProvider` at the new `themeURL`
|
|
453
|
+
6. All components re-skin automatically — zero code changes
|
|
454
|
+
|
|
455
|
+
The `theme.json` manifest:
|
|
456
|
+
|
|
457
|
+
```json
|
|
458
|
+
{
|
|
459
|
+
"foundation": "base.css",
|
|
460
|
+
"lightMode": "light-mode.css",
|
|
461
|
+
"darkMode": "dark-mode.css",
|
|
462
|
+
"styles": "themes.css",
|
|
463
|
+
"defaultTheme": "Default",
|
|
464
|
+
"defaultStyle": "Modern",
|
|
465
|
+
"defaultSurface": "Surface",
|
|
466
|
+
"darkTheme": "Neutral-Dark"
|
|
467
|
+
}
|
|
468
|
+
```
|
package/package.json
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@omni-design/components",
|
|
3
|
+
"version": "0.7.0",
|
|
4
|
+
"description": "DynoDesign adaptive component library \u2014 token-driven React components with customizable CSS theming",
|
|
5
|
+
"author": "Lise Noble",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"module": "dist/index.esm.js",
|
|
9
|
+
"types": "./dist/types/components/index.d.ts",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"public/styles",
|
|
13
|
+
"docs",
|
|
14
|
+
".cursorrules",
|
|
15
|
+
"CLAUDE.md",
|
|
16
|
+
"README.md",
|
|
17
|
+
".claude"
|
|
18
|
+
],
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/types/components/index.d.ts",
|
|
22
|
+
"import": "./dist/index.esm.js",
|
|
23
|
+
"require": "./dist/index.js"
|
|
24
|
+
},
|
|
25
|
+
"./provider": {
|
|
26
|
+
"types": "./dist/types/OmniDesignProvider.d.ts",
|
|
27
|
+
"import": "./dist/OmniDesignProvider.esm.js",
|
|
28
|
+
"require": "./dist/OmniDesignProvider.js"
|
|
29
|
+
},
|
|
30
|
+
"./public/styles/foundation.css": "./public/styles/foundation.css",
|
|
31
|
+
"./public/styles/core.css": "./public/styles/core.css",
|
|
32
|
+
"./public/styles/Light-Mode.css": "./public/styles/Light-Mode.css",
|
|
33
|
+
"./public/styles/Dark-Mode.css": "./public/styles/Dark-Mode.css",
|
|
34
|
+
"./public/styles/base.css": "./public/styles/base.css",
|
|
35
|
+
"./public/styles/styles.css": "./public/styles/styles.css",
|
|
36
|
+
"./public/styles/typography-tokens.css": "./public/styles/typography-tokens.css"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"start": "react-scripts start",
|
|
40
|
+
"dev-api": "node dev-server.js",
|
|
41
|
+
"build:app": "react-scripts build",
|
|
42
|
+
"build:lib": "rollup -c rollup.config.js && npm run build:types",
|
|
43
|
+
"build": "npm run build:lib",
|
|
44
|
+
"test": "react-scripts test",
|
|
45
|
+
"test:coverage": "react-scripts test --coverage --watchAll=false",
|
|
46
|
+
"test:a11y": "react-scripts test --testPathPattern=test --watchAll=false",
|
|
47
|
+
"storybook": "storybook dev -p 6006",
|
|
48
|
+
"build-storybook": "storybook build",
|
|
49
|
+
"deploy-storybook": "storybook-to-ghpages",
|
|
50
|
+
"prepublishOnly": "npm run build:lib",
|
|
51
|
+
"predeploy": "npm run build:app",
|
|
52
|
+
"deploy": "gh-pages -d build",
|
|
53
|
+
"build:types": "npx -y -p typescript@5.9 tsc -p tsconfig.dts.json"
|
|
54
|
+
},
|
|
55
|
+
"peerDependencies": {
|
|
56
|
+
"@emotion/react": ">=11.0.0",
|
|
57
|
+
"@emotion/styled": ">=11.0.0",
|
|
58
|
+
"@mui/icons-material": ">=5.0.0",
|
|
59
|
+
"@mui/material": ">=5.0.0",
|
|
60
|
+
"react": ">=17.0.0",
|
|
61
|
+
"react-dom": ">=17.0.0"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@babel/core": "^7.29.0",
|
|
65
|
+
"@babel/preset-env": "^7.29.0",
|
|
66
|
+
"@babel/preset-react": "^7.28.5",
|
|
67
|
+
"@emotion/react": "^11.14.0",
|
|
68
|
+
"@emotion/styled": "^11.14.1",
|
|
69
|
+
"@mui/icons-material": "^7.3.9",
|
|
70
|
+
"@mui/material": "^7.3.9",
|
|
71
|
+
"@rollup/plugin-babel": "^7.0.0",
|
|
72
|
+
"@rollup/plugin-commonjs": "^25.0.8",
|
|
73
|
+
"@rollup/plugin-node-resolve": "^15.3.1",
|
|
74
|
+
"@rollup/plugin-terser": "^0.4.4",
|
|
75
|
+
"@storybook/addon-a11y": "^8.6.18",
|
|
76
|
+
"@storybook/addon-essentials": "^8.6.12",
|
|
77
|
+
"@storybook/preset-create-react-app": "^8.6.18",
|
|
78
|
+
"@storybook/react": "^8.0.0",
|
|
79
|
+
"@storybook/react-webpack5": "^8.6.18",
|
|
80
|
+
"@storybook/storybook-deployer": "^2.8.16",
|
|
81
|
+
"@testing-library/jest-dom": "^6.0.0",
|
|
82
|
+
"@testing-library/react": "^14.0.0",
|
|
83
|
+
"@testing-library/user-event": "^14.0.0",
|
|
84
|
+
"babel-loader": "^10.1.1",
|
|
85
|
+
"gh-pages": "^6.3.0",
|
|
86
|
+
"jest-axe": "^8.0.0",
|
|
87
|
+
"prop-types": "^15.8.1",
|
|
88
|
+
"rollup": "^4.59.0",
|
|
89
|
+
"rollup-plugin-peer-deps-external": "^2.2.4",
|
|
90
|
+
"storybook": "^8.6.18",
|
|
91
|
+
"webpack": "^5.105.4"
|
|
92
|
+
},
|
|
93
|
+
"keywords": [
|
|
94
|
+
"design-system",
|
|
95
|
+
"react",
|
|
96
|
+
"components",
|
|
97
|
+
"tokens",
|
|
98
|
+
"theming",
|
|
99
|
+
"accessibility",
|
|
100
|
+
"dynodesign"
|
|
101
|
+
],
|
|
102
|
+
"repository": {
|
|
103
|
+
"type": "git",
|
|
104
|
+
"url": "https://github.com/lwnoble/omni-design"
|
|
105
|
+
},
|
|
106
|
+
"dependencies": {
|
|
107
|
+
"@dynodesign/components": "^0.4.1",
|
|
108
|
+
"@mui/x-tree-view": "^8.27.2",
|
|
109
|
+
"eslint-plugin-react-hooks": "^7.0.1",
|
|
110
|
+
"react-router-dom": "^7.13.1",
|
|
111
|
+
"react-scripts": "^5.0.1"
|
|
112
|
+
},
|
|
113
|
+
"homepage": "/",
|
|
114
|
+
"browserslist": {
|
|
115
|
+
"production": [
|
|
116
|
+
">0.2%",
|
|
117
|
+
"not dead",
|
|
118
|
+
"not op_mini all"
|
|
119
|
+
],
|
|
120
|
+
"development": [
|
|
121
|
+
"last 1 chrome version",
|
|
122
|
+
"last 1 firefox version",
|
|
123
|
+
"last 1 safari version"
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
}
|