@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.
Files changed (223) hide show
  1. package/.claude/commands/ScanComponents.md +26 -0
  2. package/.claude/commands/ShareComponent.md +128 -0
  3. package/.cursorrules +21 -0
  4. package/CLAUDE.md +1046 -0
  5. package/README.md +70 -0
  6. package/dist/OmniDesignProvider.esm.js +2 -0
  7. package/dist/OmniDesignProvider.esm.js.map +1 -0
  8. package/dist/OmniDesignProvider.js +2 -0
  9. package/dist/OmniDesignProvider.js.map +1 -0
  10. package/dist/index.esm.js +42 -0
  11. package/dist/index.esm.js.map +1 -0
  12. package/dist/index.js +42 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/types/OmniDesignProvider.d.ts +158 -0
  15. package/dist/types/components/Accordion/Accordion.d.ts +42 -0
  16. package/dist/types/components/Accordion/AccordionShowcase.d.ts +2 -0
  17. package/dist/types/components/Accordion/index.d.ts +2 -0
  18. package/dist/types/components/Alert/Alert.d.ts +14 -0
  19. package/dist/types/components/Alert/AlertShowcase.d.ts +2 -0
  20. package/dist/types/components/Alert/index.d.ts +2 -0
  21. package/dist/types/components/AppBar/AppBar.d.ts +43 -0
  22. package/dist/types/components/AppBar/AppBarShowcase.d.ts +2 -0
  23. package/dist/types/components/AppBar/index.d.ts +2 -0
  24. package/dist/types/components/Autocomplete/Autocomplete.d.ts +26 -0
  25. package/dist/types/components/Autocomplete/AutocompleteShowcase.d.ts +2 -0
  26. package/dist/types/components/Autocomplete/index.d.ts +2 -0
  27. package/dist/types/components/Avatar/Avatar.d.ts +29 -0
  28. package/dist/types/components/Avatar/AvatarShowcase.d.ts +2 -0
  29. package/dist/types/components/Avatar/defaultAvatar.d.ts +2 -0
  30. package/dist/types/components/Avatar/index.d.ts +3 -0
  31. package/dist/types/components/BackgroundPicker.d.ts +12 -0
  32. package/dist/types/components/Badge/Badge.d.ts +43 -0
  33. package/dist/types/components/Badge/BadgeShowcase.d.ts +1 -0
  34. package/dist/types/components/Badge/index.d.ts +2 -0
  35. package/dist/types/components/BevelText/BevelText.d.ts +15 -0
  36. package/dist/types/components/BevelText/BevelTextShowcase.d.ts +2 -0
  37. package/dist/types/components/BevelText/index.d.ts +2 -0
  38. package/dist/types/components/BottomNavigation/BottomNavigation.d.ts +15 -0
  39. package/dist/types/components/BottomNavigation/BottomNavigationShowcase.d.ts +2 -0
  40. package/dist/types/components/BottomNavigation/index.d.ts +2 -0
  41. package/dist/types/components/Box/Box.d.ts +36 -0
  42. package/dist/types/components/Box/BoxShowcase.d.ts +2 -0
  43. package/dist/types/components/Box/index.d.ts +2 -0
  44. package/dist/types/components/Breadcrumbs/Breadcrumbs.d.ts +22 -0
  45. package/dist/types/components/Breadcrumbs/BreadcrumbsShowcase.d.ts +2 -0
  46. package/dist/types/components/Breadcrumbs/index.d.ts +2 -0
  47. package/dist/types/components/Button/Button.d.ts +66 -0
  48. package/dist/types/components/Button/index.d.ts +2 -0
  49. package/dist/types/components/ButtonGroup/ButtonGroup.d.ts +41 -0
  50. package/dist/types/components/ButtonGroup/index.d.ts +2 -0
  51. package/dist/types/components/Card/Card.d.ts +54 -0
  52. package/dist/types/components/Card/CardShowcase.d.ts +2 -0
  53. package/dist/types/components/Card/index.d.ts +2 -0
  54. package/dist/types/components/Checkbox/Checkbox.d.ts +51 -0
  55. package/dist/types/components/Checkbox/index.d.ts +2 -0
  56. package/dist/types/components/Chip/Chip.d.ts +42 -0
  57. package/dist/types/components/Chip/ChipShowcase.d.ts +2 -0
  58. package/dist/types/components/Chip/index.d.ts +2 -0
  59. package/dist/types/components/CircularProgress/CircularProgress.d.ts +12 -0
  60. package/dist/types/components/CircularProgress/CircularProgressShowcase.d.ts +2 -0
  61. package/dist/types/components/CircularProgress/index.d.ts +2 -0
  62. package/dist/types/components/CodeBlock/CodeBlock.d.ts +35 -0
  63. package/dist/types/components/Colors/Colors.d.ts +7 -0
  64. package/dist/types/components/Colors/index.d.ts +1 -0
  65. package/dist/types/components/Container/Container.d.ts +70 -0
  66. package/dist/types/components/Container/index.d.ts +1 -0
  67. package/dist/types/components/Copyright/Copyright.d.ts +11 -0
  68. package/dist/types/components/Copyright/CopyrightShowcase.d.ts +2 -0
  69. package/dist/types/components/Copyright/index.d.ts +2 -0
  70. package/dist/types/components/CurvedText/CurvedText.d.ts +23 -0
  71. package/dist/types/components/CurvedText/CurvedTextShowcase.d.ts +2 -0
  72. package/dist/types/components/CurvedText/index.d.ts +2 -0
  73. package/dist/types/components/Dialog/Dialog.d.ts +82 -0
  74. package/dist/types/components/Dialog/DialogShowcase.d.ts +2 -0
  75. package/dist/types/components/Dialog/index.d.ts +2 -0
  76. package/dist/types/components/Divider/Divider.d.ts +22 -0
  77. package/dist/types/components/Divider/DividerShowcase.d.ts +2 -0
  78. package/dist/types/components/Divider/index.d.ts +2 -0
  79. package/dist/types/components/Drawer/Drawer.d.ts +30 -0
  80. package/dist/types/components/Drawer/DrawerShowcase.d.ts +2 -0
  81. package/dist/types/components/Drawer/index.d.ts +2 -0
  82. package/dist/types/components/DropZone/DropZone.d.ts +15 -0
  83. package/dist/types/components/DropZone/index.d.ts +2 -0
  84. package/dist/types/components/Fab/Fab.d.ts +17 -0
  85. package/dist/types/components/Fab/FabShowcase.d.ts +2 -0
  86. package/dist/types/components/Fab/index.d.ts +2 -0
  87. package/dist/types/components/Footer/Footer.d.ts +14 -0
  88. package/dist/types/components/Footer/FooterShowcase.d.ts +2 -0
  89. package/dist/types/components/Footer/index.d.ts +2 -0
  90. package/dist/types/components/Gradient/Gradient.d.ts +38 -0
  91. package/dist/types/components/Gradient/GradientShowcase.d.ts +2 -0
  92. package/dist/types/components/Gradient/gradientUtils.d.ts +185 -0
  93. package/dist/types/components/Gradient/index.d.ts +3 -0
  94. package/dist/types/components/Grid/Grid.d.ts +112 -0
  95. package/dist/types/components/Grid/index.d.ts +1 -0
  96. package/dist/types/components/Header/Header.d.ts +53 -0
  97. package/dist/types/components/Header/index.d.ts +1 -0
  98. package/dist/types/components/Icon/Icon.d.ts +19 -0
  99. package/dist/types/components/Icon/IconShowcase.d.ts +2 -0
  100. package/dist/types/components/Icon/index.d.ts +2 -0
  101. package/dist/types/components/IconBadge/IconBadge.d.ts +10 -0
  102. package/dist/types/components/IconBadge/IconBadgeShowcase.d.ts +2 -0
  103. package/dist/types/components/IconBadge/index.d.ts +2 -0
  104. package/dist/types/components/Input/Input.d.ts +47 -0
  105. package/dist/types/components/Input/index.d.ts +2 -0
  106. package/dist/types/components/LinearProgress/LinearProgress.d.ts +9 -0
  107. package/dist/types/components/LinearProgress/LinearProgressShowcase.d.ts +2 -0
  108. package/dist/types/components/LinearProgress/index.d.ts +2 -0
  109. package/dist/types/components/Link/Link.d.ts +16 -0
  110. package/dist/types/components/Link/LinkShowcase.d.ts +2 -0
  111. package/dist/types/components/Link/index.d.ts +2 -0
  112. package/dist/types/components/List/List.d.ts +55 -0
  113. package/dist/types/components/List/ListShowcase.d.ts +2 -0
  114. package/dist/types/components/List/index.d.ts +2 -0
  115. package/dist/types/components/MainLayout/MainLayout.d.ts +28 -0
  116. package/dist/types/components/MainLayout/index.d.ts +1 -0
  117. package/dist/types/components/Menu/Menu.d.ts +37 -0
  118. package/dist/types/components/Menu/MenuShowcase.d.ts +2 -0
  119. package/dist/types/components/Menu/index.d.ts +2 -0
  120. package/dist/types/components/Modal/Modal.d.ts +18 -0
  121. package/dist/types/components/Modal/ModalShowcase.d.ts +2 -0
  122. package/dist/types/components/Modal/index.d.ts +2 -0
  123. package/dist/types/components/NumberField/NumberField.d.ts +22 -0
  124. package/dist/types/components/NumberField/NumberFieldShowcase.d.ts +2 -0
  125. package/dist/types/components/NumberField/index.d.ts +2 -0
  126. package/dist/types/components/Pagination/Pagination.d.ts +17 -0
  127. package/dist/types/components/Pagination/PaginationShowcase.d.ts +2 -0
  128. package/dist/types/components/Pagination/index.d.ts +2 -0
  129. package/dist/types/components/Paper/Paper.d.ts +111 -0
  130. package/dist/types/components/Paper/index.d.ts +1 -0
  131. package/dist/types/components/Popover/Popover.d.ts +31 -0
  132. package/dist/types/components/Popover/index.d.ts +1 -0
  133. package/dist/types/components/PreviewSurface.d.ts +18 -0
  134. package/dist/types/components/Radio/Radio.d.ts +55 -0
  135. package/dist/types/components/Radio/RadioShowcase.d.ts +2 -0
  136. package/dist/types/components/Radio/index.d.ts +2 -0
  137. package/dist/types/components/Rail/Rail.d.ts +15 -0
  138. package/dist/types/components/Rail/RailShowcase.d.ts +2 -0
  139. package/dist/types/components/Rail/index.d.ts +2 -0
  140. package/dist/types/components/Rating/Rating.d.ts +16 -0
  141. package/dist/types/components/Rating/RatingShowcase.d.ts +2 -0
  142. package/dist/types/components/Rating/index.d.ts +2 -0
  143. package/dist/types/components/Ratio/Ratio.d.ts +20 -0
  144. package/dist/types/components/Ratio/RatioShowcase.d.ts +2 -0
  145. package/dist/types/components/Ratio/index.d.ts +2 -0
  146. package/dist/types/components/SearchField/SearchField.d.ts +19 -0
  147. package/dist/types/components/SearchField/SearchFieldShowcase.d.ts +2 -0
  148. package/dist/types/components/SearchField/index.d.ts +2 -0
  149. package/dist/types/components/Section/Section.d.ts +44 -0
  150. package/dist/types/components/Section/SectionShowcase.d.ts +2 -0
  151. package/dist/types/components/Section/index.d.ts +2 -0
  152. package/dist/types/components/Select/Select.d.ts +23 -0
  153. package/dist/types/components/Select/SelectShowcase.d.ts +2 -0
  154. package/dist/types/components/Select/index.d.ts +2 -0
  155. package/dist/types/components/SettingsPanel.d.ts +2 -0
  156. package/dist/types/components/Sidebar/Sidebar.d.ts +53 -0
  157. package/dist/types/components/Sidebar/index.d.ts +1 -0
  158. package/dist/types/components/Slider/Slider.d.ts +79 -0
  159. package/dist/types/components/Slider/SliderShowcase.d.ts +2 -0
  160. package/dist/types/components/Slider/index.d.ts +2 -0
  161. package/dist/types/components/Snackbar/Snackbar.d.ts +17 -0
  162. package/dist/types/components/Snackbar/SnackbarShowcase.d.ts +2 -0
  163. package/dist/types/components/Snackbar/index.d.ts +2 -0
  164. package/dist/types/components/Spacing/Spacing.d.ts +16 -0
  165. package/dist/types/components/Spacing/index.d.ts +1 -0
  166. package/dist/types/components/SpeedDial/SpeedDial.d.ts +17 -0
  167. package/dist/types/components/SpeedDial/SpeedDialShowcase.d.ts +2 -0
  168. package/dist/types/components/SpeedDial/index.d.ts +2 -0
  169. package/dist/types/components/Stack/Stack.d.ts +52 -0
  170. package/dist/types/components/Stack/StackShowcase.d.ts +2 -0
  171. package/dist/types/components/Stack/index.d.ts +2 -0
  172. package/dist/types/components/Stepper/Stepper.d.ts +33 -0
  173. package/dist/types/components/Stepper/StepperShowcase.d.ts +2 -0
  174. package/dist/types/components/Stepper/index.d.ts +2 -0
  175. package/dist/types/components/Switch/Switch.d.ts +65 -0
  176. package/dist/types/components/Switch/SwitchShowcase.d.ts +2 -0
  177. package/dist/types/components/Switch/index.d.ts +2 -0
  178. package/dist/types/components/Table/Table.d.ts +20 -0
  179. package/dist/types/components/Table/TableShowcase.d.ts +2 -0
  180. package/dist/types/components/Table/index.d.ts +2 -0
  181. package/dist/types/components/Tabs/Tabs.d.ts +51 -0
  182. package/dist/types/components/Tabs/TabsShowcase.d.ts +2 -0
  183. package/dist/types/components/Tabs/index.d.ts +2 -0
  184. package/dist/types/components/Tag/Tag.d.ts +57 -0
  185. package/dist/types/components/Tag/TagShowcase.d.ts +2 -0
  186. package/dist/types/components/Tag/index.d.ts +2 -0
  187. package/dist/types/components/TextField/TextField.d.ts +105 -0
  188. package/dist/types/components/TextField/index.d.ts +1 -0
  189. package/dist/types/components/ToggleButton/ToggleButton.d.ts +94 -0
  190. package/dist/types/components/ToggleButton/index.d.ts +1 -0
  191. package/dist/types/components/ToggleButtonGroup/ToggleButtonGroup.d.ts +48 -0
  192. package/dist/types/components/Toolbar/Toolbar.d.ts +14 -0
  193. package/dist/types/components/Toolbar/ToolbarShowcase.d.ts +2 -0
  194. package/dist/types/components/Toolbar/index.d.ts +2 -0
  195. package/dist/types/components/Tooltip/Tooltip.d.ts +20 -0
  196. package/dist/types/components/Tooltip/TooltipShowcase.d.ts +2 -0
  197. package/dist/types/components/Tooltip/index.d.ts +2 -0
  198. package/dist/types/components/TreeView/TreeBranch.d.ts +14 -0
  199. package/dist/types/components/TreeView/TreeView.d.ts +82 -0
  200. package/dist/types/components/TreeView/TreeViewShowcase.d.ts +2 -0
  201. package/dist/types/components/TreeView/index.d.ts +3 -0
  202. package/dist/types/components/Typography/Typography.d.ts +492 -0
  203. package/dist/types/components/Typography/TypographyShowcase.d.ts +2 -0
  204. package/dist/types/components/Typography/index.d.ts +2 -0
  205. package/dist/types/components/_a11y/ContrastCheck.d.ts +15 -0
  206. package/dist/types/components/_bevelPresets.d.ts +92 -0
  207. package/dist/types/components/_shadows.d.ts +32 -0
  208. package/dist/types/components/index.d.ts +74 -0
  209. package/dist/types/theme/useThemeMode.d.ts +4 -0
  210. package/docs/components.md +797 -0
  211. package/docs/getting-started.md +409 -0
  212. package/docs/token-system.md +468 -0
  213. package/package.json +126 -0
  214. package/public/styles/Dark-Mode.css +13867 -0
  215. package/public/styles/Light-Mode.css +14091 -0
  216. package/public/styles/README.md +93 -0
  217. package/public/styles/base.css +261 -0
  218. package/public/styles/core.css +378 -0
  219. package/public/styles/foundation.css +72 -0
  220. package/public/styles/styles.css +6 -0
  221. package/public/styles/theme.js +234 -0
  222. package/public/styles/theme.json +12 -0
  223. 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
+ }