@titan-design/react-ui 0.10.0 → 0.12.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 (190) hide show
  1. package/dist/bodymap.js +173 -343
  2. package/dist/bodymap.js.map +1 -1
  3. package/dist/bodymap.mjs +173 -343
  4. package/dist/bodymap.mjs.map +1 -1
  5. package/dist/index.d.mts +416 -18
  6. package/dist/index.d.ts +416 -18
  7. package/dist/index.js +2512 -1307
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +2480 -1299
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/{pages-DyEx-lBf.d.ts → pages-B1hqnGIC.d.ts} +149 -15
  12. package/dist/{pages-D7hOD4Vj.d.mts → pages-CvsFqNtx.d.mts} +149 -15
  13. package/dist/pages.d.mts +1 -1
  14. package/dist/pages.d.ts +1 -1
  15. package/dist/pages.js +1644 -1575
  16. package/dist/pages.js.map +1 -1
  17. package/dist/pages.mjs +1645 -1576
  18. package/dist/pages.mjs.map +1 -1
  19. package/dist/theme/index.d.mts +409 -415
  20. package/dist/theme/index.d.ts +409 -415
  21. package/dist/theme/index.js +234 -408
  22. package/dist/theme/index.js.map +1 -1
  23. package/dist/theme/index.mjs +227 -399
  24. package/dist/theme/index.mjs.map +1 -1
  25. package/dist/theme/tokens-css.js +141 -140
  26. package/dist/theme/tokens-css.js.map +1 -1
  27. package/dist/theme/tokens-css.mjs +141 -140
  28. package/dist/theme/tokens-css.mjs.map +1 -1
  29. package/package.json +8 -3
  30. package/src/arch/Architecture.stories.tsx +9 -9
  31. package/src/components/custom/DateTime/DateTime.stories.tsx +1 -1
  32. package/src/components/custom/Fatigue/DualGhostSpark.stories.tsx +258 -0
  33. package/src/components/custom/Fatigue/DualGhostSpark.test.tsx +138 -0
  34. package/src/components/custom/Fatigue/DualGhostSpark.tsx +208 -0
  35. package/src/components/custom/Fatigue/FatigueLights.stories.tsx +74 -0
  36. package/src/components/custom/Fatigue/FatigueLights.test.tsx +33 -0
  37. package/src/components/custom/Fatigue/FatigueLights.tsx +83 -0
  38. package/src/components/custom/Fatigue/GhostBand.test.tsx +235 -0
  39. package/src/components/custom/Fatigue/GhostBand.tsx +246 -0
  40. package/src/components/custom/Fatigue/GhostBloom.tsx +132 -0
  41. package/src/components/custom/Fatigue/GhostSpark.stories.tsx +175 -0
  42. package/src/components/custom/Fatigue/GhostSpark.test.tsx +45 -0
  43. package/src/components/custom/Fatigue/GhostSpark.tsx +126 -0
  44. package/src/components/custom/Fatigue/LiveFatigueCard.stories.tsx +126 -0
  45. package/src/components/custom/Fatigue/LiveFatigueCard.test.tsx +28 -0
  46. package/src/components/custom/Fatigue/LiveFatigueCard.tsx +86 -0
  47. package/src/components/custom/Fatigue/LiveFatiguePanel.stories.tsx +95 -0
  48. package/src/components/custom/Fatigue/LiveFatiguePanel.tsx +151 -0
  49. package/src/components/custom/Fatigue/README.md +93 -0
  50. package/src/components/custom/Fatigue/RomProgressionChart.stories.tsx +94 -0
  51. package/src/components/custom/Fatigue/RomProgressionChart.test.tsx +31 -0
  52. package/src/components/custom/Fatigue/RomProgressionChart.tsx +132 -0
  53. package/src/components/custom/Fatigue/SilverRedPalette.stories.tsx +226 -0
  54. package/src/components/custom/Fatigue/VelocityHero.stories.tsx +70 -0
  55. package/src/components/custom/Fatigue/VelocityHero.test.tsx +26 -0
  56. package/src/components/custom/Fatigue/VelocityHero.tsx +46 -0
  57. package/src/components/custom/Fatigue/VerdictHero.stories.tsx +59 -0
  58. package/src/components/custom/Fatigue/VerdictHero.test.tsx +49 -0
  59. package/src/components/custom/Fatigue/VerdictHero.tsx +79 -0
  60. package/src/components/custom/Fatigue/fatigue-mock.test.ts +59 -0
  61. package/src/components/custom/Fatigue/fatigue-mock.ts +268 -0
  62. package/src/components/custom/Fatigue/fatigue-model.ts +129 -0
  63. package/src/components/custom/Fatigue/fatigue-tokens.test.ts +70 -0
  64. package/src/components/custom/Fatigue/fatigue-tokens.ts +180 -0
  65. package/src/components/custom/Fatigue/index.ts +41 -0
  66. package/src/components/custom/Fatigue/tempo-pacing.test.ts +176 -0
  67. package/src/components/custom/Fatigue/tempo-pacing.ts +112 -0
  68. package/src/components/custom/Sidebar/Sidebar.tsx +4 -4
  69. package/src/components/custom/Table/Table.tsx +2 -2
  70. package/src/components/custom/Workout/ActiveWorkoutPage.tsx +3 -3
  71. package/src/components/custom/Workout/BaseBadge.test.tsx +6 -1
  72. package/src/components/custom/Workout/BaseBadge.tsx +1 -1
  73. package/src/components/custom/Workout/BodyMap.tsx +2 -2
  74. package/src/components/custom/Workout/BodyMapDetailPanel.tsx +2 -2
  75. package/src/components/custom/Workout/DeviationBar.test.tsx +2 -1
  76. package/src/components/custom/Workout/DeviationBar.tsx +3 -2
  77. package/src/components/custom/Workout/DualVelocityStrip.test.tsx +685 -0
  78. package/src/components/custom/Workout/ExerciseCard.test.tsx +7 -7
  79. package/src/components/custom/Workout/ExerciseCard.tsx +5 -3
  80. package/src/components/custom/Workout/ExerciseDetailPage.tsx +11 -5
  81. package/src/components/custom/Workout/InputBar.tsx +2 -2
  82. package/src/components/custom/Workout/LiveAuraFrame.stories.tsx +1 -1
  83. package/src/components/custom/Workout/LiveAuraFrame.test.tsx +1 -1
  84. package/src/components/custom/Workout/LiveAuraFrame.tsx +3 -3
  85. package/src/components/custom/Workout/MesoCard.tsx +3 -1
  86. package/src/components/custom/Workout/MuscleGroupChip.tsx +4 -3
  87. package/src/components/custom/Workout/PrHistoryModal.tsx +2 -2
  88. package/src/components/custom/Workout/ProgramPlanningPage.tsx +1 -1
  89. package/src/components/custom/Workout/README.md +62 -16
  90. package/src/components/custom/Workout/ReadinessCheck.tsx +2 -2
  91. package/src/components/custom/Workout/RestTimer.tsx +2 -2
  92. package/src/components/custom/Workout/S3SetTypes.stories.tsx +3 -3
  93. package/src/components/custom/Workout/SegmentedBar.stories.tsx +3 -3
  94. package/src/components/custom/Workout/SessionHeader.stories.tsx +2 -2
  95. package/src/components/custom/Workout/SessionHeader.tsx +1 -1
  96. package/src/components/custom/Workout/SessionRail.stories.tsx +2 -2
  97. package/src/components/custom/Workout/SessionRail.test.tsx +43 -0
  98. package/src/components/custom/Workout/SessionRail.tsx +63 -18
  99. package/src/components/custom/Workout/SetBar.tsx +3 -3
  100. package/src/components/custom/Workout/SetRow.test.tsx +12 -9
  101. package/src/components/custom/Workout/SetRow.tsx +9 -2
  102. package/src/components/custom/Workout/StatusDot.tsx +5 -4
  103. package/src/components/custom/Workout/StrengthTrendChart.tsx +1 -1
  104. package/src/components/custom/Workout/TrainingStatusPage.tsx +2 -2
  105. package/src/components/custom/Workout/VelocityStrip.compact.stories.tsx +191 -0
  106. package/src/components/custom/Workout/VelocityStrip.dual.stories.tsx +186 -0
  107. package/src/components/custom/Workout/VelocityStrip.expanded.stories.tsx +296 -0
  108. package/src/components/custom/Workout/VelocityStrip.hero.stories.tsx +259 -0
  109. package/src/components/custom/Workout/VelocityStrip.stories.tsx +217 -250
  110. package/src/components/custom/Workout/VelocityStrip.test.tsx +199 -79
  111. package/src/components/custom/Workout/VelocityStrip.tsx +953 -609
  112. package/src/components/custom/Workout/VolumeLandmarkBar.tsx +3 -3
  113. package/src/components/custom/Workout/WeightBadge.test.tsx +6 -1
  114. package/src/components/custom/Workout/WeightBadge.tsx +2 -1
  115. package/src/components/custom/Workout/WorkoutCard.tsx +3 -1
  116. package/src/components/custom/Workout/WorkoutPill.tsx +5 -2
  117. package/src/components/custom/Workout/ZoneTrack.tsx +4 -4
  118. package/src/components/custom/Workout/index.ts +3 -0
  119. package/src/components/custom/Workout/setHeadingKit.tsx +14 -8
  120. package/src/components/custom/Workout/velocity-story-kit.tsx +438 -0
  121. package/src/components/custom/charts/SetBarChart.test.tsx +275 -0
  122. package/src/components/custom/charts/SetBarChart.tsx +651 -0
  123. package/src/components/custom/charts/live-rep-growth.ts +91 -0
  124. package/src/components/custom/index.ts +1 -0
  125. package/src/components/custom/stepper/Stepper.stories.tsx +1 -1
  126. package/src/components/custom/stepper/Stepper.tsx +3 -3
  127. package/src/components/shell/DeviceMenu.tsx +2 -2
  128. package/src/components/shell/SideNav.tsx +1 -1
  129. package/src/components/shell/TopBar.tsx +1 -1
  130. package/src/components/ui/autocomplete/Autocomplete.stories.tsx +1 -1
  131. package/src/components/ui/autocomplete/Autocomplete.tsx +1 -1
  132. package/src/components/ui/avatar/Avatar.tsx +2 -2
  133. package/src/components/ui/badge/Badge.tsx +2 -2
  134. package/src/components/ui/card/Card.tsx +3 -3
  135. package/src/components/ui/checkbox/Checkbox.tsx +1 -1
  136. package/src/components/ui/collapse/Collapse.tsx +1 -1
  137. package/src/components/ui/data-row/DataRow.stories.tsx +1 -1
  138. package/src/components/ui/drawer/Drawer.tsx +3 -3
  139. package/src/components/ui/form-field/FormField.tsx +1 -1
  140. package/src/components/ui/help-tip/HelpTip.tsx +1 -1
  141. package/src/components/ui/menu/Menu.tsx +2 -2
  142. package/src/components/ui/pill/Pill.tsx +2 -2
  143. package/src/components/ui/popover/Popover.stories.tsx +2 -2
  144. package/src/components/ui/popover/Popover.tsx +1 -1
  145. package/src/components/ui/progress/Progress.tsx +3 -3
  146. package/src/components/ui/radio/Radio.stories.tsx +1 -1
  147. package/src/components/ui/radio/Radio.tsx +4 -4
  148. package/src/components/ui/select/Select.tsx +3 -3
  149. package/src/components/ui/surface/Surface.stories.tsx +3 -3
  150. package/src/components/ui/surface/Surface.test.tsx +32 -19
  151. package/src/components/ui/surface/Surface.tsx +3 -3
  152. package/src/components/ui/surface/SurfaceContext.ts +19 -29
  153. package/src/components/ui/surface/surface.contract.test.ts +57 -44
  154. package/src/components/ui/switch/Switch.tsx +1 -1
  155. package/src/components/ui/tabs/Tabs.tsx +2 -2
  156. package/src/components/ui/toolbar-button/ToolbarButton.stories.tsx +5 -5
  157. package/src/components/ui/toolbar-button/ToolbarButton.test.tsx +1 -1
  158. package/src/components/ui/toolbar-button/ToolbarButton.tsx +36 -22
  159. package/src/stories/PresetShowcase.stories.tsx +21 -21
  160. package/src/test/raw-color-patterns.test.ts +71 -0
  161. package/src/theme/ColorPalettes.stories.tsx +874 -0
  162. package/src/theme/ColorPrimitives.stories.tsx +348 -0
  163. package/src/theme/Depth.stories.tsx +312 -0
  164. package/src/theme/DepthCalibration.stories.tsx +655 -0
  165. package/src/theme/ThemeProvider.tsx +1 -1
  166. package/src/theme/barrel.ts +7 -14
  167. package/src/theme/color-stories.coverage.test.ts +125 -0
  168. package/src/theme/color-story-kit.tsx +170 -0
  169. package/src/theme/color-utils.ts +197 -0
  170. package/src/theme/config.ts +0 -8
  171. package/src/theme/depth-calibration.test.tsx +97 -0
  172. package/src/theme/elevation.test.ts +62 -1
  173. package/src/theme/elevation.ts +34 -8
  174. package/src/theme/global.css +47 -53
  175. package/src/theme/grey-ramp.test.ts +166 -0
  176. package/src/theme/materials.test.ts +106 -0
  177. package/src/theme/materials.ts +211 -0
  178. package/src/theme/presets/audiobook.ts +4 -4
  179. package/src/theme/presets/types.ts +3 -3
  180. package/src/theme/semantic-contrast.test.ts +83 -0
  181. package/src/theme/tokens/primitives.ts +62 -115
  182. package/src/theme/tokens/semantic.ts +130 -82
  183. package/src/utils/colors.ts +1 -1
  184. package/tailwind.config.js +2 -5
  185. package/src/components/custom/Workout/VelocityStrip.modalities.stories.tsx +0 -254
  186. package/src/components/custom/Workout/VelocityStrip.responsive.stories.tsx +0 -145
  187. package/src/theme/ColorSystem.stories.tsx +0 -508
  188. package/src/theme/Colors.stories.tsx +0 -323
  189. package/src/theme/shadows.stories.tsx +0 -523
  190. package/src/theme/shadows.ts +0 -439
@@ -1,323 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite'
2
- import { View, Text } from 'react-native'
3
- import { primitiveColors, discreteRainbow, primitiveRamps, categoricalPalette } from './tokens/primitives'
4
- import { semanticColorsLight, semanticColorsDark } from './tokens/semantic'
5
-
6
- const meta: Meta = {
7
- title: 'Foundations/Color/Palette',
8
- tags: ['autodocs'],
9
- }
10
-
11
- export default meta
12
-
13
- interface ColorSwatchProps {
14
- name: string
15
- value: string
16
- textColor?: string
17
- }
18
-
19
- function ColorSwatch({ name, value, textColor = '#FFFFFF' }: ColorSwatchProps) {
20
- const displayValue = value.startsWith('rgba') ? value : value.toUpperCase()
21
-
22
- return (
23
- <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>
24
- <View
25
- style={{
26
- width: 48,
27
- height: 48,
28
- borderRadius: 8,
29
- backgroundColor: value,
30
- borderWidth: 1,
31
- borderColor: '#374151',
32
- }}
33
- />
34
- <View>
35
- <Text className="font-semibold text-text-primary text-sm">
36
- {name}
37
- </Text>
38
- <Text className="text-text-secondary text-xs">
39
- {displayValue}
40
- </Text>
41
- </View>
42
- </View>
43
- )
44
- }
45
-
46
- function ColorScale({ name, colors }: { name: string; colors: Record<string | number, string> }) {
47
- return (
48
- <View style={{ marginBottom: 32 }}>
49
- <Text className="text-lg font-bold text-text-primary mb-3">
50
- {name}
51
- </Text>
52
- <View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 8 }}>
53
- {Object.entries(colors).map(([shade, color]) => (
54
- <View key={shade} style={{ alignItems: 'center' }}>
55
- <View
56
- style={{
57
- width: 64,
58
- height: 64,
59
- borderRadius: 8,
60
- backgroundColor: color,
61
- borderWidth: 1,
62
- borderColor: '#374151',
63
- }}
64
- />
65
- <Text className="text-text-secondary text-xs mt-1">
66
- {shade}
67
- </Text>
68
- </View>
69
- ))}
70
- </View>
71
- </View>
72
- )
73
- }
74
-
75
- export const PrimitiveColors: StoryObj = {
76
- render: () => (
77
- <View style={{ padding: 24 }}>
78
- <Text className="text-2xl font-bold text-text-primary mb-6">
79
- Primitive Colors
80
- </Text>
81
- <Text className="text-text-secondary mb-6">
82
- Raw color values. Chromatic hues live as OKLCH tonal ramps (see the Tonal Ramps story);
83
- these are the achromatic and support scales. Use semantic tokens when building components.
84
- </Text>
85
-
86
- <ColorScale name="Blue" colors={primitiveColors.blue} />
87
- <ColorScale name="Red" colors={primitiveColors.red} />
88
- <ColorScale name="Red Vivid" colors={primitiveColors.redVivid} />
89
- <ColorScale name="Neutral" colors={primitiveColors.neutral} />
90
- <ColorScale name="Charcoal (Dark Backgrounds)" colors={primitiveColors.charcoal} />
91
- </View>
92
- ),
93
- }
94
-
95
- export const BrandColors: StoryObj = {
96
- render: () => (
97
- <View style={{ padding: 24 }}>
98
- <Text className="text-2xl font-bold text-text-primary mb-6">
99
- Brand Colors
100
- </Text>
101
-
102
- <View style={{ gap: 16 }}>
103
- <ColorSwatch name="brand-primary" value={semanticColorsLight['brand-primary']} />
104
- <ColorSwatch name="brand-primary-light" value={semanticColorsLight['brand-primary-light']} />
105
- <ColorSwatch name="brand-primary-dark" value={semanticColorsLight['brand-primary-dark']} />
106
- <ColorSwatch name="brand-secondary" value={semanticColorsLight['brand-secondary']} />
107
- <ColorSwatch name="brand-secondary-light" value={semanticColorsLight['brand-secondary-light']} />
108
- <ColorSwatch name="brand-secondary-dark" value={semanticColorsLight['brand-secondary-dark']} />
109
- </View>
110
- </View>
111
- ),
112
- }
113
-
114
- export const StatusColors: StoryObj = {
115
- render: () => (
116
- <View style={{ padding: 24 }}>
117
- <Text className="text-2xl font-bold text-text-primary mb-6">
118
- Status Colors
119
- </Text>
120
-
121
- <View style={{ gap: 16 }}>
122
- <ColorSwatch name="status-success" value={semanticColorsLight['status-success']} />
123
- <ColorSwatch name="status-error" value={semanticColorsLight['status-error']} />
124
- <ColorSwatch name="status-warning" value={semanticColorsLight['status-warning']} />
125
- <ColorSwatch name="status-info" value={semanticColorsLight['status-info']} />
126
- </View>
127
- </View>
128
- ),
129
- }
130
-
131
- export const TextColors: StoryObj = {
132
- render: () => (
133
- <View style={{ padding: 24 }}>
134
- <Text className="text-2xl font-bold text-text-primary mb-6">
135
- Text Colors (Dark Mode)
136
- </Text>
137
-
138
- <View style={{ gap: 16 }}>
139
- <ColorSwatch name="text-primary" value={semanticColorsDark['text-primary']} />
140
- <ColorSwatch name="text-secondary" value={semanticColorsDark['text-secondary']} />
141
- <ColorSwatch name="text-tertiary" value={semanticColorsDark['text-tertiary']} />
142
- <ColorSwatch name="text-disabled" value={semanticColorsDark['text-disabled']} />
143
- <ColorSwatch name="text-link" value={semanticColorsDark['text-link']} />
144
- </View>
145
- </View>
146
- ),
147
- }
148
-
149
- export const SurfaceColors: StoryObj = {
150
- render: () => (
151
- <View style={{ padding: 24 }}>
152
- <Text className="text-2xl font-bold text-text-primary mb-6">
153
- Surface Colors (Dark Mode)
154
- </Text>
155
-
156
- <View style={{ gap: 16 }}>
157
- <ColorSwatch name="surface-base" value={semanticColorsDark['surface-base']} />
158
- <ColorSwatch name="surface-elevated" value={semanticColorsDark['surface-elevated']} />
159
- <ColorSwatch name="surface-raised" value={semanticColorsDark['surface-raised']} />
160
- <ColorSwatch name="surface-input" value={semanticColorsDark['surface-input']} />
161
- <ColorSwatch name="background-base" value={semanticColorsDark['background-base']} />
162
- <ColorSwatch name="background-default" value={semanticColorsDark['background-default']} />
163
- </View>
164
- </View>
165
- ),
166
- }
167
-
168
- export const ResultColors: StoryObj = {
169
- render: () => (
170
- <View style={{ padding: 24 }}>
171
- <Text className="text-2xl font-bold text-text-primary mb-6">
172
- Result/Outcome Colors
173
- </Text>
174
- <Text className="text-text-secondary mb-6">
175
- Colors for indicating positive, negative, or neutral outcomes.
176
- </Text>
177
-
178
- <View style={{ gap: 16 }}>
179
- <ColorSwatch name="result-improve" value={semanticColorsLight['result-improve']} />
180
- <ColorSwatch name="result-improve-light" value={semanticColorsLight['result-improve-light']} />
181
- <ColorSwatch name="result-degrade" value={semanticColorsLight['result-degrade']} />
182
- <ColorSwatch name="result-degrade-light" value={semanticColorsLight['result-degrade-light']} />
183
- <ColorSwatch name="result-inconclusive" value={semanticColorsLight['result-inconclusive']} />
184
- <ColorSwatch name="result-inconclusive-light" value={semanticColorsLight['result-inconclusive-light']} />
185
- <ColorSwatch name="result-neutral" value={semanticColorsLight['result-neutral']} />
186
- </View>
187
- </View>
188
- ),
189
- }
190
-
191
- export const DataVisualizationColors: StoryObj = {
192
- render: () => (
193
- <View style={{ padding: 24 }}>
194
- <Text className="text-2xl font-bold text-text-primary mb-6">
195
- Data Visualization Colors
196
- </Text>
197
- <Text className="text-text-secondary mb-6">
198
- Colors optimized for charts and data visualization. Based on Paul Tol&apos;s color schemes.
199
- </Text>
200
-
201
- <View style={{ gap: 16 }}>
202
- <ColorSwatch name="data-1" value={semanticColorsLight['data-1']} />
203
- <ColorSwatch name="data-2" value={semanticColorsLight['data-2']} />
204
- <ColorSwatch name="data-3" value={semanticColorsLight['data-3']} textColor="#000000" />
205
- <ColorSwatch name="data-4" value={semanticColorsLight['data-4']} />
206
- <ColorSwatch name="data-5" value={semanticColorsLight['data-5']} />
207
- <ColorSwatch name="data-6" value={semanticColorsLight['data-6']} />
208
- <ColorSwatch name="data-7" value={semanticColorsLight['data-7']} textColor="#000000" />
209
- <ColorSwatch name="data-8" value={semanticColorsLight['data-8']} textColor="#000000" />
210
- <ColorSwatch name="data-9" value={semanticColorsLight['data-9']} textColor="#000000" />
211
- <ColorSwatch name="data-10" value={semanticColorsLight['data-10']} />
212
- </View>
213
-
214
- <Text className="text-lg font-bold text-text-primary mt-8 mb-3">
215
- Full Discrete Rainbow Palette
216
- </Text>
217
- <View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 4 }}>
218
- {discreteRainbow.map((color, index) => (
219
- <View
220
- key={index}
221
- style={{
222
- width: 32,
223
- height: 32,
224
- borderRadius: 4,
225
- backgroundColor: color,
226
- borderWidth: 1,
227
- borderColor: '#374151',
228
- }}
229
- />
230
- ))}
231
- </View>
232
- </View>
233
- ),
234
- }
235
-
236
- function CategoricalRow({ name, colors }: { name: string; colors: readonly string[] }) {
237
- return (
238
- <View style={{ marginBottom: 24 }}>
239
- <Text className="text-lg font-bold text-text-primary mb-3">
240
- {name} <Text className="text-text-secondary text-sm">({colors.length})</Text>
241
- </Text>
242
- <View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 8 }}>
243
- {colors.map((color, index) => (
244
- <View key={index} style={{ alignItems: 'center' }}>
245
- <View
246
- style={{
247
- width: 56,
248
- height: 56,
249
- borderRadius: 8,
250
- backgroundColor: color,
251
- borderWidth: 1,
252
- borderColor: '#374151',
253
- }}
254
- />
255
- <Text className="text-text-secondary text-xs mt-1">{color.toUpperCase()}</Text>
256
- </View>
257
- ))}
258
- </View>
259
- </View>
260
- )
261
- }
262
-
263
- export const TonalRamps: StoryObj = {
264
- render: () => (
265
- <View style={{ padding: 24 }}>
266
- <Text className="text-2xl font-bold text-text-primary mb-6">
267
- Tonal Ramps (Foundations)
268
- </Text>
269
- <Text className="text-text-secondary mb-6">
270
- Seven OKLCH-generated hue ramps, 11 perceptual steps each (50 → 950). Built with hue-torsion and a
271
- chroma arc; amber absorbs the former yellow (lemon → warm body) and cyan absorbs the former steel.
272
- </Text>
273
-
274
- <ColorScale name="Red" colors={primitiveRamps.red} />
275
- <ColorScale name="Orange" colors={primitiveRamps.orange} />
276
- <ColorScale name="Amber" colors={primitiveRamps.amber} />
277
- <ColorScale name="Green" colors={primitiveRamps.green} />
278
- <ColorScale name="Cyan" colors={primitiveRamps.cyan} />
279
- <ColorScale name="Blue" colors={primitiveRamps.blue} />
280
- <ColorScale name="Magenta" colors={primitiveRamps.magenta} />
281
- </View>
282
- ),
283
- }
284
-
285
- export const CategoricalPalette: StoryObj = {
286
- render: () => (
287
- <View style={{ padding: 24 }}>
288
- <Text className="text-2xl font-bold text-text-primary mb-6">
289
- Categorical Palette
290
- </Text>
291
- <Text className="text-text-secondary mb-6">
292
- Ordered, colorblind-safe qualitative series (worst-case deut/protanopia floor 8 through the first
293
- six colors; the 7th is extended — pair it with a legend). Series index is stable. Use{' '}
294
- <Text className="font-semibold">default</Text> on neutral/light surfaces (also legible under black
295
- text) and <Text className="font-semibold">dark</Text> where white text sits on the swatch.
296
- </Text>
297
-
298
- <CategoricalRow name="Default" colors={categoricalPalette.default} />
299
- <CategoricalRow name="Dark (white text)" colors={categoricalPalette.dark} />
300
- </View>
301
- ),
302
- }
303
-
304
- export const BorderColors: StoryObj = {
305
- render: () => (
306
- <View style={{ padding: 24 }}>
307
- <Text className="text-2xl font-bold text-text-primary mb-6">
308
- Border Colors (Dark Mode)
309
- </Text>
310
-
311
- <View style={{ gap: 16 }}>
312
- <ColorSwatch name="border-default" value={semanticColorsDark['border-default']} />
313
- <ColorSwatch name="border-subtle" value={semanticColorsDark['border-subtle']} />
314
- <ColorSwatch name="border-strong" value={semanticColorsDark['border-strong']} />
315
- <ColorSwatch name="border-focus" value={semanticColorsDark['border-focus']} />
316
- <ColorSwatch name="border-input" value={semanticColorsDark['border-input']} />
317
- <ColorSwatch name="border-input-hover" value={semanticColorsDark['border-input-hover']} />
318
- <ColorSwatch name="border-input-focus" value={semanticColorsDark['border-input-focus']} />
319
- <ColorSwatch name="border-input-error" value={semanticColorsDark['border-input-error']} />
320
- </View>
321
- </View>
322
- ),
323
- }