@12min/ds 0.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,12 +1,3 @@
1
- ```text
2
- ██╗ ██████╗ ███╗ ███╗ ██╗ ███╗ ██╗ ██████╗ ███████╗
3
- ███║ ╚════██╗ ████╗ ████║ ██║ ████╗ ██║ ██╔══██╗ ██╔════╝
4
- ╚██║ █████╔╝ ██╔████╔██║ ██║ ██╔██╗ ██║ █████╗ ██║ ██║ ███████╗
5
- ██║ ██╔═══╝ ██║╚██╔╝██║ ██║ ██║╚██╗██║ ╚════╝ ██║ ██║ ╚════██║
6
- ██║ ███████╗ ██║ ╚═╝ ██║ ██║ ██║ ╚████║ ██████╔╝ ███████║
7
- ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝
8
- ```
9
-
10
1
  # `@12min/ds`
11
2
 
12
3
  Single source of truth for 12min's visual language — tokens, styles, and components shared across web and mobile.
@@ -15,12 +6,15 @@ Single source of truth for 12min's visual language — tokens, styles, and compo
15
6
 
16
7
  ## What's included
17
8
 
18
- | | Now | Phase 2 |
19
- |---|---|---|
20
- | Color tokens | ✅ | |
21
- | CSS theme (`theme.css`) | ✅ | |
22
- | Semantic themes (light / dark) | ✅ | |
23
- | Core components (Button, Input, Card, Modal) | | ✅ |
9
+ | | Status |
10
+ |---|---|
11
+ | Color palette (`marianBlue`, `midnight`, `gray`, `mustard`, `ketchup`, `mint`) | ✅ |
12
+ | Typography tokens (14-entry scale) | ✅ |
13
+ | CSS theme (`theme.css`) colors + `@utility text-*` blocks | ✅ |
14
+ | Semantic themes (light / dark) | ✅ |
15
+ | Components — Button, Chip, Alert, ProgressBar, Input, Checkbox, RadioItem, RadioGroup, ActionItem, Stepper, RatingScale | ✅ |
16
+ | `DSThemeProvider` + `useTheme` (native programmatic dark mode) | ✅ |
17
+ | Storybook 8 | ✅ |
24
18
 
25
19
  ---
26
20
 
@@ -37,26 +31,14 @@ pnpm add @12min/ds
37
31
  pnpm add tailwindcss@^4.0.0
38
32
 
39
33
  # mobile
40
- bun add nativewind@5.0.0-preview.3
41
- bun add --dev tailwindcss@^4.0.0
34
+ pnpm add nativewind@5.0.0-preview.3
35
+ pnpm add --dev tailwindcss@^4.0.0
42
36
  ```
43
37
 
44
38
  ---
45
39
 
46
40
  ## Usage
47
41
 
48
- ### Tokens
49
-
50
- Raw token values as TypeScript — use anywhere, including `StyleSheet.create`.
51
-
52
- ```ts
53
- import { colors } from '@12min/ds/tokens'
54
-
55
- const styles = StyleSheet.create({
56
- button: { backgroundColor: colors.brand.primary },
57
- })
58
- ```
59
-
60
42
  ### Web — Tailwind v4
61
43
 
62
44
  Import the generated theme in your global CSS entry point:
@@ -67,15 +49,28 @@ Import the generated theme in your global CSS entry point:
67
49
  @import "@12min/ds/tailwind/theme.css";
68
50
  ```
69
51
 
70
- All tokens are now available as Tailwind utilities:
52
+ All palette tokens are available as Tailwind utilities, and typography utilities are pre-built:
53
+
54
+ ```tsx
55
+ <div className="bg-marian-blue-600 text-white">
56
+ <p className="text-body-default">Body text</p>
57
+ <h1 className="text-h1">Heading</h1>
58
+ ```
59
+
60
+ Import components from `@12min/ds`:
71
61
 
72
62
  ```tsx
73
- <div className="bg-brand-primary text-neutral-0">
74
- <div className="bg-success text-neutral-0">
75
- <div className="bg-error-light">
63
+ import { Button, Input, RadioItem, RadioGroup } from '@12min/ds'
64
+
65
+ <Button variant="primary" size="md">Continue</Button>
66
+
67
+ <RadioGroup label="Pick your profile">
68
+ <RadioItem label="Leader" selected={selected === 'leader'} onClick={() => setSelected('leader')} />
69
+ <RadioItem label="Student" selected={selected === 'student'} onClick={() => setSelected('student')} />
70
+ </RadioGroup>
76
71
  ```
77
72
 
78
- ### Mobile — NativeWind v5
73
+ ### Mobile — React Native + NativeWind v5
79
74
 
80
75
  Point Metro at the published theme file:
81
76
 
@@ -88,36 +83,73 @@ module.exports = withNativeWind(config, {
88
83
  })
89
84
  ```
90
85
 
91
- Same class names, compiled to `StyleSheet` at build time:
86
+ Wrap your app in `DSThemeProvider` for programmatic dark mode:
92
87
 
93
88
  ```tsx
94
- <View className="bg-brand-primary dark:bg-neutral-900">
95
- <Text className="text-neutral-0">Hello</Text>
96
- </View>
89
+ import { DSThemeProvider, Button, Input } from '@12min/ds'
90
+
91
+ export default function App() {
92
+ const colorScheme = useColorScheme()
93
+ return (
94
+ <DSThemeProvider colorScheme={colorScheme ?? 'light'}>
95
+ <Button variant="primary" onPress={handlePress}>Continue</Button>
96
+ <Input placeholder="Email" state="default" />
97
+ </DSThemeProvider>
98
+ )
99
+ }
100
+ ```
101
+
102
+ Access theme tokens directly via `useTheme()`:
103
+
104
+ ```tsx
105
+ import { useTheme } from '@12min/ds'
106
+
107
+ const { theme } = useTheme()
108
+ // theme.primary, theme.background, theme.error, ...
97
109
  ```
98
110
 
99
- ### Semantic themes (optional)
111
+ ### Tokens (framework-agnostic)
100
112
 
101
- For programmatic access to token values — useful for chart libraries, animations, or any non-Tailwind consumer:
113
+ Raw token values as TypeScript — useful for chart libraries, animations, or any non-Tailwind consumer:
102
114
 
103
115
  ```ts
116
+ import { colors, typography } from '@12min/ds/tokens'
104
117
  import { lightTheme, darkTheme } from '@12min/ds'
105
- import { useColorScheme } from 'react-native'
106
118
 
107
- const scheme = useColorScheme()
108
- const theme = scheme === 'dark' ? darkTheme : lightTheme
109
-
110
- // theme.primary === '#FF6B35'
111
- // theme.background, theme.surface, theme.error, ...
119
+ // colors.marianBlue[600] === '#475CBB'
120
+ // typography.bodyDefault.fontSize === 14
121
+ // lightTheme.primary === '#475CBB'
112
122
  ```
113
123
 
114
124
  ---
115
125
 
126
+ ## Components
127
+
128
+ All components are available on both web and native from the same `@12min/ds` import.
129
+
130
+ | Component | Props |
131
+ |---|---|
132
+ | `Button` | `variant` (primary/secondary/ghost), `size` (sm/md/lg), `disabled` |
133
+ | `Chip` | `children`, `checked`, `onPress`/`onClick` |
134
+ | `Alert` | `variant` (info/success), `title`, `description` |
135
+ | `ProgressBar` | `value` (0–100) |
136
+ | `Input` | `state` (default/filled/error/disabled), `leadingIcon`, `placeholder` |
137
+ | `Checkbox` | `checked`, `onChange`, `disabled` |
138
+ | `RadioItem` | `label`, `description`, `selected`, `icon`, `onPress`/`onClick` |
139
+ | `RadioGroup` | `label` (for a11y), `className`/`style` — wraps `RadioItem` list |
140
+ | `ActionItem` | `label`, `description`, `selected`, `icon`, `onPress`/`onClick` |
141
+ | `Stepper` | `steps`, `currentStep` |
142
+ | `RatingScale` | `value`, `onChange`, `options` (default: 5 emoji options) |
143
+
144
+ > Native components accept a `style` prop for layout overrides. Web components accept `className`.
145
+
146
+ ---
147
+
116
148
  ## Development
117
149
 
118
150
  ### Requirements
119
151
 
120
- - Node 20+
152
+ - Node 22+
121
153
  - pnpm 10+
122
154
 
123
155
  ```sh
@@ -132,13 +164,15 @@ pnpm install
132
164
  | `pnpm dev` | Watch mode (tsup) |
133
165
  | `pnpm generate:theme` | Regenerate `src/tailwind/theme.css` from tokens |
134
166
  | `pnpm typecheck` | TypeScript — library code |
167
+ | `pnpm test:unit` | Run unit tests (vitest) |
168
+ | `pnpm storybook` | Start Storybook on port 6006 |
135
169
  | `pnpm lint` | ESLint |
136
170
 
137
171
  ### Adding or changing tokens
138
172
 
139
- 1. Edit `src/tokens/colors.ts`
173
+ 1. Edit `src/tokens/colors.ts` or `src/tokens/typography.ts`
140
174
  2. Run `pnpm generate:theme` to regenerate `theme.css`
141
- 3. Verify the output in `src/tailwind/theme.css`
175
+ 3. If adding a new semantic token, update `src/themes/types.ts` first, then both `lightTheme.ts` and `darkTheme.ts`
142
176
  4. Run `pnpm build` before committing
143
177
 
144
178
  `theme.css` is gitignored — it is always generated from source.
@@ -159,8 +193,7 @@ pnpm version major # 0.1.0 → 1.0.0
159
193
  git push origin main --tags
160
194
  ```
161
195
 
162
- The GitHub Actions release workflow publishes to npm automatically on `v*` tags.
163
- See [`docs/next-steps.md §5`](docs/next-steps.md) for the full workflow file.
196
+ The GitHub Actions CI runs typecheck, build, and unit tests on every push to `main` and on pull requests.
164
197
 
165
198
  ---
166
199
 
@@ -0,0 +1,90 @@
1
+ interface Theme {
2
+ bg: {
3
+ primary: string;
4
+ primaryHover: string;
5
+ primaryPressed: string;
6
+ primarySubtle: string;
7
+ primarySubtleHover: string;
8
+ primarySubtlePressed: string;
9
+ surface: string;
10
+ surfaceRaised: string;
11
+ surfaceHover: string;
12
+ surfacePressed: string;
13
+ overlay: string;
14
+ overlaySubtle: string;
15
+ overlaySubtleHover: string;
16
+ overlaySubtlePressed: string;
17
+ success: string;
18
+ successSubtle: string;
19
+ error: string;
20
+ errorSubtle: string;
21
+ warning: string;
22
+ warningSubtle: string;
23
+ info: string;
24
+ infoSubtle: string;
25
+ highlight: string;
26
+ accent: string;
27
+ accentSubtle: string;
28
+ disabled: string;
29
+ };
30
+ text: {
31
+ primary: string;
32
+ secondary: string;
33
+ inverse: string;
34
+ brand: string;
35
+ link: string;
36
+ placeholder: string;
37
+ success: string;
38
+ error: string;
39
+ warning: string;
40
+ info: string;
41
+ highlight: string;
42
+ accent: string;
43
+ disabled: string;
44
+ onSuccess: string;
45
+ onError: string;
46
+ onWarning: string;
47
+ onHighlight: string;
48
+ };
49
+ border: {
50
+ default: string;
51
+ strong: string;
52
+ subtle: string;
53
+ focus: string;
54
+ accent: string;
55
+ success: string;
56
+ error: string;
57
+ warning: string;
58
+ info: string;
59
+ disabled: string;
60
+ };
61
+ icon: {
62
+ primary: string;
63
+ secondary: string;
64
+ inverse: string;
65
+ brand: string;
66
+ accent: string;
67
+ success: string;
68
+ error: string;
69
+ warning: string;
70
+ info: string;
71
+ highlight: string;
72
+ disabled: string;
73
+ };
74
+ interactive: {
75
+ hover: string;
76
+ pressed: string;
77
+ selected: string;
78
+ selectedSubtle: string;
79
+ };
80
+ }
81
+
82
+ declare const lightTheme: Theme;
83
+
84
+ declare const darkTheme: Theme;
85
+
86
+ type ChipSize = 'sm' | 'md';
87
+
88
+ type CheckboxSize = 'xs' | 'sm' | 'md';
89
+
90
+ export { type ChipSize as C, type Theme as T, type CheckboxSize as a, darkTheme as d, lightTheme as l };
@@ -0,0 +1,90 @@
1
+ interface Theme {
2
+ bg: {
3
+ primary: string;
4
+ primaryHover: string;
5
+ primaryPressed: string;
6
+ primarySubtle: string;
7
+ primarySubtleHover: string;
8
+ primarySubtlePressed: string;
9
+ surface: string;
10
+ surfaceRaised: string;
11
+ surfaceHover: string;
12
+ surfacePressed: string;
13
+ overlay: string;
14
+ overlaySubtle: string;
15
+ overlaySubtleHover: string;
16
+ overlaySubtlePressed: string;
17
+ success: string;
18
+ successSubtle: string;
19
+ error: string;
20
+ errorSubtle: string;
21
+ warning: string;
22
+ warningSubtle: string;
23
+ info: string;
24
+ infoSubtle: string;
25
+ highlight: string;
26
+ accent: string;
27
+ accentSubtle: string;
28
+ disabled: string;
29
+ };
30
+ text: {
31
+ primary: string;
32
+ secondary: string;
33
+ inverse: string;
34
+ brand: string;
35
+ link: string;
36
+ placeholder: string;
37
+ success: string;
38
+ error: string;
39
+ warning: string;
40
+ info: string;
41
+ highlight: string;
42
+ accent: string;
43
+ disabled: string;
44
+ onSuccess: string;
45
+ onError: string;
46
+ onWarning: string;
47
+ onHighlight: string;
48
+ };
49
+ border: {
50
+ default: string;
51
+ strong: string;
52
+ subtle: string;
53
+ focus: string;
54
+ accent: string;
55
+ success: string;
56
+ error: string;
57
+ warning: string;
58
+ info: string;
59
+ disabled: string;
60
+ };
61
+ icon: {
62
+ primary: string;
63
+ secondary: string;
64
+ inverse: string;
65
+ brand: string;
66
+ accent: string;
67
+ success: string;
68
+ error: string;
69
+ warning: string;
70
+ info: string;
71
+ highlight: string;
72
+ disabled: string;
73
+ };
74
+ interactive: {
75
+ hover: string;
76
+ pressed: string;
77
+ selected: string;
78
+ selectedSubtle: string;
79
+ };
80
+ }
81
+
82
+ declare const lightTheme: Theme;
83
+
84
+ declare const darkTheme: Theme;
85
+
86
+ type ChipSize = 'sm' | 'md';
87
+
88
+ type CheckboxSize = 'xs' | 'sm' | 'md';
89
+
90
+ export { type ChipSize as C, type Theme as T, type CheckboxSize as a, darkTheme as d, lightTheme as l };
@@ -0,0 +1,247 @@
1
+ // src/tokens/colors.ts
2
+ var colors = {
3
+ marianBlue: {
4
+ 50: "#FAFBFF",
5
+ 100: "#F6F8FF",
6
+ 200: "#E1E7FF",
7
+ 300: "#C3CCF7",
8
+ 400: "#94A5F2",
9
+ 500: "#697DD6",
10
+ 600: "#4357AD",
11
+ 700: "#31428B",
12
+ 800: "#25326A",
13
+ 900: "#131937"
14
+ },
15
+ midnight: {
16
+ 50: "#707070",
17
+ 100: "#5C5C5C",
18
+ 200: "#525252",
19
+ 300: "#474747",
20
+ 400: "#3D3D3D",
21
+ 500: "#333333",
22
+ 600: "#292929",
23
+ 700: "#161616",
24
+ 800: "#141414",
25
+ 900: "#0A0A0A"
26
+ },
27
+ gray: {
28
+ 15: "#F4F5F8",
29
+ 25: "#EDEEF1",
30
+ 35: "#DDE0E6",
31
+ 50: "#B1B5BE",
32
+ 100: "#A6ABB5",
33
+ 200: "#9BA0AB",
34
+ 300: "#9095A2",
35
+ 400: "#858B99",
36
+ 500: "#7A8190",
37
+ 600: "#6F7685",
38
+ 700: "#5E6471",
39
+ 800: "#5D636F",
40
+ 900: "#545964"
41
+ },
42
+ amber: {
43
+ 50: "#FFFBEB",
44
+ 100: "#FEF3C7",
45
+ 200: "#FDE68A",
46
+ 300: "#FCD34D",
47
+ 400: "#FBBF24",
48
+ 500: "#F59E0B",
49
+ 600: "#D97706",
50
+ 700: "#B45309",
51
+ 800: "#92400E",
52
+ 900: "#78350F",
53
+ text: "#BA5C0A"
54
+ },
55
+ yellow: {
56
+ 50: "#FFF2D6",
57
+ 100: "#FFECC2",
58
+ 200: "#FFE5AD",
59
+ 300: "#FFDF99",
60
+ 400: "#FFD885",
61
+ 500: "#FFD270",
62
+ 600: "#FFCB5C",
63
+ 700: "#FFC140",
64
+ 800: "#FFBE33",
65
+ 900: "#FFB81F"
66
+ },
67
+ ketchup: {
68
+ 50: "#FEF2F2",
69
+ 100: "#FEE2E2",
70
+ 200: "#FECACA",
71
+ 300: "#FCA5A5",
72
+ 400: "#F87171",
73
+ 500: "#EF4444",
74
+ 600: "#DC2626",
75
+ 700: "#B91C1C",
76
+ 800: "#991B1B",
77
+ 900: "#7F1D1D",
78
+ text: "#D91F3C"
79
+ },
80
+ green: {
81
+ 50: "#F2FDF4",
82
+ 100: "#E5FBE9",
83
+ 200: "#C7F4D0",
84
+ 300: "#99E5AC",
85
+ 400: "#5FCD80",
86
+ 500: "#36B260",
87
+ 600: "#258F4B",
88
+ 700: "#1B6F3B",
89
+ 800: "#145430",
90
+ 900: "#0E3622",
91
+ text: "#0E8745"
92
+ },
93
+ blue: {
94
+ 50: "#EFF6FF",
95
+ 100: "#DBEAFE",
96
+ 200: "#BFDBFE",
97
+ 300: "#93C5FD",
98
+ 400: "#60A5FA",
99
+ 500: "#3B82F6",
100
+ 600: "#2563EB",
101
+ 700: "#1D4ED8",
102
+ 800: "#1E40AF",
103
+ 900: "#1E3A8A",
104
+ text: "#1E40AF"
105
+ },
106
+ // Single brand accent green — the vibrant tone that was previously green/300
107
+ // before the green scale was retuned to muted values in the Figma v2 palette.
108
+ brandGreen: "#6DFFB4",
109
+ overlayBlack: {
110
+ 5: "#0000000D",
111
+ 8: "#00000014",
112
+ 12: "#0000001F",
113
+ 16: "#00000029"
114
+ },
115
+ overlayWhite: {
116
+ 5: "#FFFFFF0D",
117
+ 8: "#FFFFFF14",
118
+ 12: "#FFFFFF1F",
119
+ 16: "#FFFFFF29"
120
+ },
121
+ white: "#FFFFFF",
122
+ black: "#000000"
123
+ };
124
+
125
+ // src/tokens/typography.ts
126
+ var typography = {
127
+ display1: { fontFamily: "Poppins", fontSize: 32, fontWeight: "700", lineHeight: 40, letterSpacing: -1, textTransform: "none" },
128
+ display2: { fontFamily: "Poppins", fontSize: 32, fontWeight: "700", lineHeight: 40, letterSpacing: -1, textTransform: "none" },
129
+ h1: { fontFamily: "Poppins", fontSize: 24, fontWeight: "700", lineHeight: 32, letterSpacing: -1, textTransform: "none" },
130
+ h2: { fontFamily: "Poppins", fontSize: 20, fontWeight: "700", lineHeight: 28, letterSpacing: 0, textTransform: "none" },
131
+ h3: { fontFamily: "Poppins", fontSize: 16, fontWeight: "600", lineHeight: 24, letterSpacing: 0, textTransform: "none" },
132
+ bodyLarge: { fontFamily: "Inter", fontSize: 16, fontWeight: "500", lineHeight: 24, letterSpacing: 0, textTransform: "none" },
133
+ bodyDefault: { fontFamily: "Inter", fontSize: 14, fontWeight: "500", lineHeight: 20, letterSpacing: 0, textTransform: "none" },
134
+ bodySmall: { fontFamily: "Inter", fontSize: 12, fontWeight: "400", lineHeight: 16, letterSpacing: 0.2, textTransform: "none" },
135
+ labelLarge: { fontFamily: "Inter", fontSize: 16, fontWeight: "600", lineHeight: 20, letterSpacing: 0, textTransform: "none" },
136
+ labelDefault: { fontFamily: "Inter", fontSize: 14, fontWeight: "600", lineHeight: 20, letterSpacing: 0, textTransform: "none" },
137
+ labelSmall: { fontFamily: "Inter", fontSize: 12, fontWeight: "600", lineHeight: 16, letterSpacing: 0.2, textTransform: "none" },
138
+ labelTiny: { fontFamily: "Inter", fontSize: 10, fontWeight: "600", lineHeight: 14, letterSpacing: 0, textTransform: "none" },
139
+ caption: { fontFamily: "Inter", fontSize: 12, fontWeight: "500", lineHeight: 16, letterSpacing: 0.5, textTransform: "none" },
140
+ captionUppercase: { fontFamily: "Inter", fontSize: 12, fontWeight: "500", lineHeight: 16, letterSpacing: 0.5, textTransform: "uppercase" },
141
+ overline: { fontFamily: "Inter", fontSize: 10, fontWeight: "600", lineHeight: 16, letterSpacing: 8, textTransform: "uppercase" },
142
+ buttonLarge: { fontFamily: "Inter", fontSize: 16, fontWeight: "600", lineHeight: 20, letterSpacing: 0, textTransform: "none" },
143
+ buttonDefault: { fontFamily: "Inter", fontSize: 14, fontWeight: "600", lineHeight: 20, letterSpacing: 0, textTransform: "none" },
144
+ buttonSmall: { fontFamily: "Inter", fontSize: 12, fontWeight: "600", lineHeight: 16, letterSpacing: 0, textTransform: "none" }
145
+ };
146
+
147
+ // src/tokens/spacing.ts
148
+ var spacing = {
149
+ unit: 4,
150
+ gap: {
151
+ "0.5": 2,
152
+ "1": 4,
153
+ "2": 8,
154
+ "3": 12,
155
+ "4": 16,
156
+ "5": 20,
157
+ "6": 24,
158
+ "8": 32,
159
+ "10": 40,
160
+ "12": 48,
161
+ "14": 56,
162
+ "16": 64,
163
+ "18": 72,
164
+ "20": 80,
165
+ "22": 88,
166
+ "24": 96
167
+ },
168
+ screen: {
169
+ x: 16,
170
+ y: 24
171
+ }
172
+ };
173
+
174
+ // src/tokens/grid.ts
175
+ var grid = {
176
+ // 8px square baseline — line-height/* steps 16/24/32/40 snap; 20 and 28 land on a half-cell
177
+ baseline: 8,
178
+ breakpoints: {
179
+ mobile: 0,
180
+ tablet: 768,
181
+ desktop: 1024
182
+ },
183
+ columns: {
184
+ mobile: 4,
185
+ tablet: 8,
186
+ desktop: 12
187
+ },
188
+ gutter: {
189
+ mobile: 8,
190
+ tablet: 16,
191
+ desktop: 24
192
+ },
193
+ margin: {
194
+ mobile: 20,
195
+ tablet: 24,
196
+ desktop: 32
197
+ }
198
+ };
199
+
200
+ // src/tokens/radius.ts
201
+ var radius = {
202
+ none: 0,
203
+ sm: 8,
204
+ md: 12,
205
+ lg: 16,
206
+ xl: 20,
207
+ "2xl": 24,
208
+ full: 9999,
209
+ button: 16,
210
+ card: 20,
211
+ input: 12,
212
+ chip: 9999,
213
+ badge: 8
214
+ };
215
+
216
+ // src/tokens/borderWidth.ts
217
+ var borderWidth = {
218
+ default: 1,
219
+ strong: 1.5,
220
+ heavy: 2
221
+ };
222
+
223
+ // src/tokens/shadow.ts
224
+ var shadow = {
225
+ sm: { offsetX: 0, offsetY: 1, blur: 3, spread: 0, color: "#000000", opacity: { light: 0.08, dark: 0.4 } },
226
+ md: { offsetX: 0, offsetY: 4, blur: 12, spread: 0, color: "#000000", opacity: { light: 0.1, dark: 0.5 } },
227
+ lg: { offsetX: 0, offsetY: 8, blur: 24, spread: -4, color: "#000000", opacity: { light: 0.12, dark: 0.6 } }
228
+ };
229
+
230
+ // src/tokens/opacity.ts
231
+ var opacity = {
232
+ disabled: 0.4,
233
+ hover: 0.08,
234
+ pressed: 0.12
235
+ };
236
+
237
+ export {
238
+ colors,
239
+ typography,
240
+ spacing,
241
+ grid,
242
+ radius,
243
+ borderWidth,
244
+ shadow,
245
+ opacity
246
+ };
247
+ //# sourceMappingURL=chunk-ZK7NW4WW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tokens/colors.ts","../src/tokens/typography.ts","../src/tokens/spacing.ts","../src/tokens/grid.ts","../src/tokens/radius.ts","../src/tokens/borderWidth.ts","../src/tokens/shadow.ts","../src/tokens/opacity.ts"],"sourcesContent":["export const colors = {\n marianBlue: {\n 50: '#FAFBFF',\n 100: '#F6F8FF',\n 200: '#E1E7FF',\n 300: '#C3CCF7',\n 400: '#94A5F2',\n 500: '#697DD6',\n 600: '#4357AD',\n 700: '#31428B',\n 800: '#25326A',\n 900: '#131937',\n },\n\n midnight: {\n 50: '#707070',\n 100: '#5C5C5C',\n 200: '#525252',\n 300: '#474747',\n 400: '#3D3D3D',\n 500: '#333333',\n 600: '#292929',\n 700: '#161616',\n 800: '#141414',\n 900: '#0A0A0A',\n },\n\n gray: {\n 15: '#F4F5F8',\n 25: '#EDEEF1',\n 35: '#DDE0E6',\n 50: '#B1B5BE',\n 100: '#A6ABB5',\n 200: '#9BA0AB',\n 300: '#9095A2',\n 400: '#858B99',\n 500: '#7A8190',\n 600: '#6F7685',\n 700: '#5E6471',\n 800: '#5D636F',\n 900: '#545964',\n },\n\n amber: {\n 50: '#FFFBEB',\n 100: '#FEF3C7',\n 200: '#FDE68A',\n 300: '#FCD34D',\n 400: '#FBBF24',\n 500: '#F59E0B',\n 600: '#D97706',\n 700: '#B45309',\n 800: '#92400E',\n 900: '#78350F',\n text: '#BA5C0A',\n },\n\n yellow: {\n 50: '#FFF2D6',\n 100: '#FFECC2',\n 200: '#FFE5AD',\n 300: '#FFDF99',\n 400: '#FFD885',\n 500: '#FFD270',\n 600: '#FFCB5C',\n 700: '#FFC140',\n 800: '#FFBE33',\n 900: '#FFB81F',\n },\n\n ketchup: {\n 50: '#FEF2F2',\n 100: '#FEE2E2',\n 200: '#FECACA',\n 300: '#FCA5A5',\n 400: '#F87171',\n 500: '#EF4444',\n 600: '#DC2626',\n 700: '#B91C1C',\n 800: '#991B1B',\n 900: '#7F1D1D',\n text: '#D91F3C',\n },\n\n green: {\n 50: '#F2FDF4',\n 100: '#E5FBE9',\n 200: '#C7F4D0',\n 300: '#99E5AC',\n 400: '#5FCD80',\n 500: '#36B260',\n 600: '#258F4B',\n 700: '#1B6F3B',\n 800: '#145430',\n 900: '#0E3622',\n text: '#0E8745',\n },\n\n blue: {\n 50: '#EFF6FF',\n 100: '#DBEAFE',\n 200: '#BFDBFE',\n 300: '#93C5FD',\n 400: '#60A5FA',\n 500: '#3B82F6',\n 600: '#2563EB',\n 700: '#1D4ED8',\n 800: '#1E40AF',\n 900: '#1E3A8A',\n text: '#1E40AF',\n },\n\n // Single brand accent green — the vibrant tone that was previously green/300\n // before the green scale was retuned to muted values in the Figma v2 palette.\n brandGreen: '#6DFFB4',\n\n overlayBlack: {\n 5: '#0000000D',\n 8: '#00000014',\n 12: '#0000001F',\n 16: '#00000029',\n },\n\n overlayWhite: {\n 5: '#FFFFFF0D',\n 8: '#FFFFFF14',\n 12: '#FFFFFF1F',\n 16: '#FFFFFF29',\n },\n\n white: '#FFFFFF',\n black: '#000000',\n} as const\n\nexport type Colors = typeof colors\n","export const typography = {\n display1: { fontFamily: 'Poppins', fontSize: 32, fontWeight: '700', lineHeight: 40, letterSpacing: -1, textTransform: 'none' },\n display2: { fontFamily: 'Poppins', fontSize: 32, fontWeight: '700', lineHeight: 40, letterSpacing: -1, textTransform: 'none' },\n h1: { fontFamily: 'Poppins', fontSize: 24, fontWeight: '700', lineHeight: 32, letterSpacing: -1, textTransform: 'none' },\n h2: { fontFamily: 'Poppins', fontSize: 20, fontWeight: '700', lineHeight: 28, letterSpacing: 0, textTransform: 'none' },\n h3: { fontFamily: 'Poppins', fontSize: 16, fontWeight: '600', lineHeight: 24, letterSpacing: 0, textTransform: 'none' },\n bodyLarge: { fontFamily: 'Inter', fontSize: 16, fontWeight: '500', lineHeight: 24, letterSpacing: 0, textTransform: 'none' },\n bodyDefault: { fontFamily: 'Inter', fontSize: 14, fontWeight: '500', lineHeight: 20, letterSpacing: 0, textTransform: 'none' },\n bodySmall: { fontFamily: 'Inter', fontSize: 12, fontWeight: '400', lineHeight: 16, letterSpacing: 0.2, textTransform: 'none' },\n labelLarge: { fontFamily: 'Inter', fontSize: 16, fontWeight: '600', lineHeight: 20, letterSpacing: 0, textTransform: 'none' },\n labelDefault: { fontFamily: 'Inter', fontSize: 14, fontWeight: '600', lineHeight: 20, letterSpacing: 0, textTransform: 'none' },\n labelSmall: { fontFamily: 'Inter', fontSize: 12, fontWeight: '600', lineHeight: 16, letterSpacing: 0.2, textTransform: 'none' },\n labelTiny: { fontFamily: 'Inter', fontSize: 10, fontWeight: '600', lineHeight: 14, letterSpacing: 0, textTransform: 'none' },\n caption: { fontFamily: 'Inter', fontSize: 12, fontWeight: '500', lineHeight: 16, letterSpacing: 0.5, textTransform: 'none' },\n captionUppercase: { fontFamily: 'Inter', fontSize: 12, fontWeight: '500', lineHeight: 16, letterSpacing: 0.5, textTransform: 'uppercase' },\n overline: { fontFamily: 'Inter', fontSize: 10, fontWeight: '600', lineHeight: 16, letterSpacing: 8, textTransform: 'uppercase' },\n buttonLarge: { fontFamily: 'Inter', fontSize: 16, fontWeight: '600', lineHeight: 20, letterSpacing: 0, textTransform: 'none' },\n buttonDefault: { fontFamily: 'Inter', fontSize: 14, fontWeight: '600', lineHeight: 20, letterSpacing: 0, textTransform: 'none' },\n buttonSmall: { fontFamily: 'Inter', fontSize: 12, fontWeight: '600', lineHeight: 16, letterSpacing: 0, textTransform: 'none' },\n} as const\n\nexport type Typography = typeof typography\n","export const spacing = {\n unit: 4,\n gap: {\n '0.5': 2,\n '1': 4,\n '2': 8,\n '3': 12,\n '4': 16,\n '5': 20,\n '6': 24,\n '8': 32,\n '10': 40,\n '12': 48,\n '14': 56,\n '16': 64,\n '18': 72,\n '20': 80,\n '22': 88,\n '24': 96,\n },\n screen: {\n x: 16,\n y: 24,\n },\n} as const\n\nexport type Spacing = typeof spacing\n","export const grid = {\n // 8px square baseline — line-height/* steps 16/24/32/40 snap; 20 and 28 land on a half-cell\n baseline: 8,\n breakpoints: {\n mobile: 0,\n tablet: 768,\n desktop: 1024,\n },\n columns: {\n mobile: 4,\n tablet: 8,\n desktop: 12,\n },\n gutter: {\n mobile: 8,\n tablet: 16,\n desktop: 24,\n },\n margin: {\n mobile: 20,\n tablet: 24,\n desktop: 32,\n },\n} as const\n\nexport type Grid = typeof grid\n","export const radius = {\n none: 0,\n sm: 8,\n md: 12,\n lg: 16,\n xl: 20,\n '2xl': 24,\n full: 9999,\n\n button: 16,\n card: 20,\n input: 12,\n chip: 9999,\n badge: 8,\n} as const\n\nexport type Radius = typeof radius\n","export const borderWidth = {\n default: 1,\n strong: 1.5,\n heavy: 2,\n} as const\n\nexport type BorderWidth = typeof borderWidth\n","export const shadow = {\n sm: { offsetX: 0, offsetY: 1, blur: 3, spread: 0, color: '#000000', opacity: { light: 0.08, dark: 0.40 } },\n md: { offsetX: 0, offsetY: 4, blur: 12, spread: 0, color: '#000000', opacity: { light: 0.10, dark: 0.50 } },\n lg: { offsetX: 0, offsetY: 8, blur: 24, spread: -4, color: '#000000', opacity: { light: 0.12, dark: 0.60 } },\n} as const\n\nexport type Shadow = typeof shadow\n","export const opacity = {\n disabled: 0.4,\n hover: 0.08,\n pressed: 0.12,\n} as const\n\nexport type Opacity = typeof opacity\n"],"mappings":"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","names":[]}