ds-leobecker 0.1.0 → 0.2.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 +84 -14
- package/dist/figma-variables.json +761 -0
- package/dist/tokens.json +193 -0
- package/dist/ui/alert.d.ts +9 -0
- package/dist/ui/alert.d.ts.map +1 -0
- package/dist/ui/alert.js +22 -0
- package/dist/ui/badge.d.ts +10 -0
- package/dist/ui/badge.d.ts.map +1 -0
- package/dist/ui/badge.js +20 -0
- package/dist/ui/button.d.ts +12 -0
- package/dist/ui/button.d.ts.map +1 -0
- package/dist/ui/button.js +33 -0
- package/dist/ui/card.d.ts +9 -0
- package/dist/ui/card.d.ts.map +1 -0
- package/dist/ui/card.js +16 -0
- package/dist/ui/checkbox.d.ts +5 -0
- package/dist/ui/checkbox.d.ts.map +1 -0
- package/dist/ui/checkbox.js +8 -0
- package/dist/ui/dialog.d.ts +20 -0
- package/dist/ui/dialog.d.ts.map +1 -0
- package/dist/ui/dialog.js +22 -0
- package/dist/ui/dropdown-menu.d.ts +28 -0
- package/dist/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/ui/dropdown-menu.js +36 -0
- package/dist/ui/form.d.ts +24 -0
- package/dist/ui/form.d.ts.map +1 -0
- package/dist/ui/form.js +65 -0
- package/dist/ui/input.d.ts +4 -0
- package/dist/ui/input.d.ts.map +1 -0
- package/dist/ui/input.js +8 -0
- package/dist/ui/label.d.ts +6 -0
- package/dist/ui/label.d.ts.map +1 -0
- package/dist/ui/label.js +9 -0
- package/dist/ui/popover.d.ts +7 -0
- package/dist/ui/popover.d.ts.map +1 -0
- package/dist/ui/popover.js +10 -0
- package/dist/ui/select.d.ts +14 -0
- package/dist/ui/select.d.ts.map +1 -0
- package/dist/ui/select.js +26 -0
- package/dist/ui/table.d.ts +11 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +20 -0
- package/dist/ui/tabs.d.ts +8 -0
- package/dist/ui/tabs.d.ts.map +1 -0
- package/dist/ui/tabs.js +12 -0
- package/dist/ui/tooltip.d.ts +8 -0
- package/dist/ui/tooltip.d.ts.map +1 -0
- package/dist/ui/tooltip.js +10 -0
- package/package.json +81 -20
- package/src/components/accent-dot.tsx +11 -0
- package/src/components/background-pattern.tsx +36 -0
- package/src/components/badge-dot.tsx +34 -0
- package/src/components/index.ts +7 -0
- package/src/components/pill.tsx +22 -0
- package/src/components/stripe-button.tsx +49 -0
- package/src/index.ts +1 -0
- package/src/lib/utils.ts +6 -0
- package/src/theme.css +63 -5
- package/src/tokens/tokens.json +193 -0
- package/guidelines/components/badge-dot.md +0 -33
- package/guidelines/components/button.md +0 -39
- package/guidelines/components/overview.md +0 -14
- package/guidelines/foundations/color.md +0 -48
- package/guidelines/foundations/motion.md +0 -37
- package/guidelines/foundations/overview.md +0 -7
- package/guidelines/foundations/radius.md +0 -19
- package/guidelines/foundations/spacing.md +0 -36
- package/guidelines/foundations/typography.md +0 -29
- package/guidelines/overview.md +0 -26
- package/guidelines/setup.md +0 -26
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://design-tokens.org/draft/2024",
|
|
3
|
+
"meta": {
|
|
4
|
+
"name": "Leo Becker Design System",
|
|
5
|
+
"version": "0.1.0"
|
|
6
|
+
},
|
|
7
|
+
"color": {
|
|
8
|
+
"raw": {
|
|
9
|
+
"orange-100": { "value": "#f05524" },
|
|
10
|
+
"orange-200": { "value": "#e34a18" },
|
|
11
|
+
"orange-300": { "value": "#d2441c" },
|
|
12
|
+
"teal-1000": { "value": "#00110e" },
|
|
13
|
+
"teal-900": { "value": "#00201c" },
|
|
14
|
+
"teal-800": { "value": "#00302a" },
|
|
15
|
+
"teal-700": { "value": "#00453f" },
|
|
16
|
+
"teal-600": { "value": "#005c54" },
|
|
17
|
+
"teal-500": { "value": "#326f68" },
|
|
18
|
+
"teal-400": { "value": "#6e8a83" },
|
|
19
|
+
"beige-50": { "value": "#e8dcc1" },
|
|
20
|
+
"beige-100": { "value": "#d4c7a8" },
|
|
21
|
+
"beige-200": { "value": "#c4b597" },
|
|
22
|
+
"beige-300": { "value": "#9dafa4" },
|
|
23
|
+
"green-500": { "value": "#79e27e" },
|
|
24
|
+
"red-500": { "value": "#ff4b4b" },
|
|
25
|
+
"yellow-500": { "value": "#f5c542" },
|
|
26
|
+
"blue-500": { "value": "#4b9eff" }
|
|
27
|
+
},
|
|
28
|
+
"semantic": {
|
|
29
|
+
"background": { "value": "{color.raw.teal-1000}", "light": "{color.raw.beige-50}" },
|
|
30
|
+
"background-secondary": { "value": "{color.raw.teal-900}", "light": "{color.raw.beige-100}" },
|
|
31
|
+
"background-tertiary": { "value": "{color.raw.teal-800}", "light": "{color.raw.beige-200}" },
|
|
32
|
+
"foreground": { "value": "{color.raw.beige-200}", "light": "{color.raw.teal-900}" },
|
|
33
|
+
"foreground-strong": { "value": "{color.raw.beige-50}", "light": "{color.raw.teal-1000}" },
|
|
34
|
+
"foreground-muted": { "value": "{color.raw.teal-400}", "light": "{color.raw.teal-500}" },
|
|
35
|
+
"primary": { "value": "{color.raw.orange-100}", "light": "{color.raw.orange-100}" },
|
|
36
|
+
"primary-hover": { "value": "{color.raw.orange-200}", "light": "{color.raw.orange-300}" },
|
|
37
|
+
"primary-foreground": { "value": "{color.raw.teal-1000}", "light": "{color.raw.beige-50}" },
|
|
38
|
+
"border": { "value": "{color.raw.teal-700}", "light": "{color.raw.beige-300}" },
|
|
39
|
+
"border-muted": { "value": "{color.raw.teal-800}", "light": "{color.raw.beige-200}" },
|
|
40
|
+
"input": { "value": "{color.raw.teal-800}", "light": "{color.raw.beige-100}" },
|
|
41
|
+
"ring": { "value": "{color.raw.orange-200}", "light": "{color.raw.orange-200}" },
|
|
42
|
+
"success": { "value": "{color.raw.green-500}", "light": "{color.raw.green-500}" },
|
|
43
|
+
"error": { "value": "{color.raw.red-500}", "light": "{color.raw.red-500}" },
|
|
44
|
+
"warning": { "value": "{color.raw.yellow-500}", "light": "{color.raw.yellow-500}" },
|
|
45
|
+
"info": { "value": "{color.raw.blue-500}", "light": "{color.raw.blue-500}" },
|
|
46
|
+
|
|
47
|
+
"card": { "value": "{color.raw.teal-900}", "light": "{color.raw.beige-50}" },
|
|
48
|
+
"card-foreground": { "value": "{color.raw.beige-200}", "light": "{color.raw.teal-900}" },
|
|
49
|
+
"popover": { "value": "{color.raw.teal-900}", "light": "{color.raw.beige-50}" },
|
|
50
|
+
"popover-foreground": { "value": "{color.raw.beige-200}", "light": "{color.raw.teal-900}" },
|
|
51
|
+
"muted": { "value": "{color.raw.teal-800}", "light": "{color.raw.beige-100}" },
|
|
52
|
+
"muted-foreground": { "value": "{color.raw.teal-400}", "light": "{color.raw.teal-500}" },
|
|
53
|
+
"secondary": { "value": "{color.raw.teal-800}", "light": "{color.raw.beige-100}" },
|
|
54
|
+
"secondary-foreground": { "value": "{color.raw.beige-200}", "light": "{color.raw.teal-900}" },
|
|
55
|
+
"accent": { "value": "{color.raw.orange-100}", "light": "{color.raw.orange-100}" },
|
|
56
|
+
"accent-foreground": { "value": "{color.raw.teal-1000}", "light": "{color.raw.beige-50}" },
|
|
57
|
+
"destructive": { "value": "{color.raw.red-500}", "light": "{color.raw.red-500}" },
|
|
58
|
+
"destructive-foreground": { "value": "{color.raw.beige-50}", "light": "{color.raw.beige-50}" }
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"typography": {
|
|
62
|
+
"fontFamily": {
|
|
63
|
+
"display": { "value": "\"Geist\", \"Geist Fallback\", ui-sans-serif, system-ui, sans-serif" },
|
|
64
|
+
"body": { "value": "\"Geist\", \"Geist Fallback\", ui-sans-serif, system-ui, sans-serif" },
|
|
65
|
+
"mono": { "value": "\"Geist Mono\", \"Geist Mono Fallback\", ui-monospace, SFMono-Regular, Menlo, monospace" }
|
|
66
|
+
},
|
|
67
|
+
"scale": {
|
|
68
|
+
"display": { "fontSize": "clamp(56px, 12vw, 180px)", "fontWeight": 700, "lineHeight": 1, "letterSpacing": "-0.03em" },
|
|
69
|
+
"hero": { "fontSize": "clamp(40px, 8.5vw, 96px)", "fontWeight": 700, "lineHeight": 1, "letterSpacing": "-0.03em" },
|
|
70
|
+
"h2": { "fontSize": "clamp(30px, 4vw, 48px)", "fontWeight": 600, "lineHeight": 1.1, "letterSpacing": "-0.025em" },
|
|
71
|
+
"h3": { "fontSize": "36px", "fontWeight": 600, "lineHeight": 1.15, "letterSpacing": "-0.02em" },
|
|
72
|
+
"h4": { "fontSize": "30px", "fontWeight": 600, "lineHeight": 1.2, "letterSpacing": "-0.02em" },
|
|
73
|
+
"h5": { "fontSize": "24px", "fontWeight": 600, "lineHeight": 1.2, "letterSpacing": "-0.015em" },
|
|
74
|
+
"h6": { "fontSize": "18px", "fontWeight": 600, "lineHeight": 1.3, "letterSpacing": "-0.015em" },
|
|
75
|
+
"body": { "fontSize": "16px", "fontWeight": 400, "lineHeight": 1.5, "letterSpacing": "0" },
|
|
76
|
+
"body-sm": { "fontSize": "14px", "fontWeight": 400, "lineHeight": 1.5, "letterSpacing": "0" },
|
|
77
|
+
"label": { "fontSize": "12px", "fontWeight": 500, "lineHeight": 1.3, "letterSpacing": "0.01em" },
|
|
78
|
+
"badge": { "fontSize": "14px", "fontWeight": 600, "lineHeight": 1.3, "letterSpacing": "0.025em", "textTransform": "uppercase" },
|
|
79
|
+
"meta": { "fontSize": "11px", "fontWeight": 400, "lineHeight": 1.3, "letterSpacing": "0.05em" },
|
|
80
|
+
"code": { "fontSize": "13px", "fontWeight": 400, "lineHeight": 1.5, "letterSpacing": "0" }
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"spacing": {
|
|
84
|
+
"1": { "value": "4px" },
|
|
85
|
+
"2": { "value": "8px" },
|
|
86
|
+
"3": { "value": "12px" },
|
|
87
|
+
"4": { "value": "16px" },
|
|
88
|
+
"5": { "value": "20px" },
|
|
89
|
+
"6": { "value": "24px" },
|
|
90
|
+
"8": { "value": "32px" },
|
|
91
|
+
"10": { "value": "40px" },
|
|
92
|
+
"12": { "value": "48px" },
|
|
93
|
+
"16": { "value": "64px" },
|
|
94
|
+
"20": { "value": "80px" },
|
|
95
|
+
"24": { "value": "96px" }
|
|
96
|
+
},
|
|
97
|
+
"radius": {
|
|
98
|
+
"base": { "value": "0rem", "description": "Brutalist zero radius — sharp corners by default" }
|
|
99
|
+
},
|
|
100
|
+
"shadow": {
|
|
101
|
+
"sm": { "value": "0 1px 2px 0 rgb(0 0 0 / 0.3)" },
|
|
102
|
+
"md": { "value": "0 4px 12px 0 rgb(0 0 0 / 0.25)" },
|
|
103
|
+
"lg": { "value": "0 8px 24px 0 rgb(0 0 0 / 0.35)" },
|
|
104
|
+
"xl": { "value": "0 20px 25px -5px rgb(0 0 0 / 0.4)" },
|
|
105
|
+
"popover": { "value": "0 0 0 1px rgb(0 0 0 / 0.2), 0 3px 6px 0 rgb(0 0 0 / 0.25), 0 9px 24px 0 rgb(0 0 0 / 0.35)" }
|
|
106
|
+
},
|
|
107
|
+
"motion": {
|
|
108
|
+
"easing": {
|
|
109
|
+
"default": { "value": "cubic-bezier(0.4, 0, 0.2, 1)" },
|
|
110
|
+
"out": { "value": "cubic-bezier(0, 0, 0.2, 1)" },
|
|
111
|
+
"in-out": { "value": "cubic-bezier(0.4, 0, 0.2, 1)" },
|
|
112
|
+
"linear": { "value": "linear" }
|
|
113
|
+
},
|
|
114
|
+
"duration": {
|
|
115
|
+
"fast": { "value": "100ms" },
|
|
116
|
+
"base": { "value": "150ms" },
|
|
117
|
+
"medium": { "value": "250ms" },
|
|
118
|
+
"slow": { "value": "500ms" }
|
|
119
|
+
},
|
|
120
|
+
"keyframes": {
|
|
121
|
+
"blink": {
|
|
122
|
+
"0%, 90%, 100%": { "opacity": "0" },
|
|
123
|
+
"95%": { "opacity": "1" }
|
|
124
|
+
},
|
|
125
|
+
"delayed-fade-in": {
|
|
126
|
+
"0%": { "opacity": "0" },
|
|
127
|
+
"100%": { "opacity": "1" }
|
|
128
|
+
},
|
|
129
|
+
"slide-pattern": {
|
|
130
|
+
"from": { "backgroundPosition": "0 0" },
|
|
131
|
+
"to": { "backgroundPosition": "40px 0" }
|
|
132
|
+
},
|
|
133
|
+
"scale-in": {
|
|
134
|
+
"from": { "opacity": "0", "transform": "scale(0.95)" },
|
|
135
|
+
"to": { "opacity": "1", "transform": "scale(1)" }
|
|
136
|
+
},
|
|
137
|
+
"scale-out": {
|
|
138
|
+
"from": { "opacity": "1", "transform": "scale(1)" },
|
|
139
|
+
"to": { "opacity": "0", "transform": "scale(0.95)" }
|
|
140
|
+
},
|
|
141
|
+
"rise-in": {
|
|
142
|
+
"from": { "opacity": "0", "transform": "translateY(24px)" },
|
|
143
|
+
"to": { "opacity": "1", "transform": "translateY(0)" }
|
|
144
|
+
},
|
|
145
|
+
"enter-right": {
|
|
146
|
+
"from": { "opacity": "0", "transform": "translateX(40px)" },
|
|
147
|
+
"to": { "opacity": "1", "transform": "translateX(0)" }
|
|
148
|
+
},
|
|
149
|
+
"enter-left": {
|
|
150
|
+
"from": { "opacity": "0", "transform": "translateX(-40px)" },
|
|
151
|
+
"to": { "opacity": "1", "transform": "translateX(0)" }
|
|
152
|
+
},
|
|
153
|
+
"fade-in": {
|
|
154
|
+
"from": { "opacity": "0" },
|
|
155
|
+
"to": { "opacity": "1" }
|
|
156
|
+
},
|
|
157
|
+
"spin": {
|
|
158
|
+
"to": { "transform": "rotate(360deg)" }
|
|
159
|
+
},
|
|
160
|
+
"shimmer": {
|
|
161
|
+
"0%": { "backgroundPosition": "-200% 0" },
|
|
162
|
+
"100%": { "backgroundPosition": "200% 0" }
|
|
163
|
+
},
|
|
164
|
+
"slide-in-right": {
|
|
165
|
+
"from": { "transform": "translateX(100%)", "opacity": "0" },
|
|
166
|
+
"to": { "transform": "translateX(0)", "opacity": "1" }
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
"animation": {
|
|
170
|
+
"blink": { "value": "blink 3s ease-in-out infinite" },
|
|
171
|
+
"delayed-fade-in": { "value": "delayed-fade-in 100ms ease-out forwards" },
|
|
172
|
+
"slide-pattern": { "value": "slide-pattern 2s linear infinite" },
|
|
173
|
+
"scale-in": { "value": "scale-in 175ms cubic-bezier(0, 0, 0.2, 1)" },
|
|
174
|
+
"scale-out": { "value": "scale-out 175ms cubic-bezier(0, 0, 0.2, 1)" },
|
|
175
|
+
"rise-in": { "value": "rise-in 700ms cubic-bezier(0, 0, 0.2, 1)" },
|
|
176
|
+
"enter-right": { "value": "enter-right 500ms cubic-bezier(0, 0, 0.2, 1)" },
|
|
177
|
+
"enter-left": { "value": "enter-left 500ms cubic-bezier(0, 0, 0.2, 1)" },
|
|
178
|
+
"fade-in": { "value": "fade-in 300ms ease-out" },
|
|
179
|
+
"spin": { "value": "spin 1s linear infinite" },
|
|
180
|
+
"shimmer": { "value": "shimmer 2s linear infinite" },
|
|
181
|
+
"slide-in-right": { "value": "slide-in-right 300ms cubic-bezier(0, 0, 0.2, 1)" }
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
"zIndex": {
|
|
185
|
+
"base": { "value": "1" },
|
|
186
|
+
"dropdown": { "value": "10" },
|
|
187
|
+
"sticky": { "value": "20" },
|
|
188
|
+
"overlay": { "value": "40" },
|
|
189
|
+
"header": { "value": "60" },
|
|
190
|
+
"modal": { "value": "80" },
|
|
191
|
+
"toast": { "value": "100" }
|
|
192
|
+
}
|
|
193
|
+
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# BadgeDot
|
|
2
|
-
|
|
3
|
-
Eyebrow indicator with animated dot + uppercase mono label.
|
|
4
|
-
|
|
5
|
-
## When to Use
|
|
6
|
-
|
|
7
|
-
- Status indicators (active, error, warning)
|
|
8
|
-
- Section labels with visual emphasis
|
|
9
|
-
- Live/online indicators
|
|
10
|
-
|
|
11
|
-
## Variants
|
|
12
|
-
|
|
13
|
-
| Variant | Dot Color | Use |
|
|
14
|
-
|---------|-----------|-----|
|
|
15
|
-
| default | primary (orange) | Generic indicator |
|
|
16
|
-
| success | green | Active, online, complete |
|
|
17
|
-
| error | red | Error, offline, failed |
|
|
18
|
-
| warning | yellow | Attention needed |
|
|
19
|
-
| info | blue | Informational |
|
|
20
|
-
| muted | muted-foreground, no animation | Inactive, disabled |
|
|
21
|
-
|
|
22
|
-
## Usage
|
|
23
|
-
|
|
24
|
-
```tsx
|
|
25
|
-
<BadgeDot label="Live" variant="success" />
|
|
26
|
-
<BadgeDot label="Error" variant="error" />
|
|
27
|
-
<BadgeDot label="Section" />
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Rules
|
|
31
|
-
|
|
32
|
-
- **IMPORTANT:** The dot always animates (blink 3s) except in muted variant.
|
|
33
|
-
- Label is always uppercase mono — this is enforced by the component.
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# Button
|
|
2
|
-
|
|
3
|
-
## shadcn/ui Button (themed)
|
|
4
|
-
|
|
5
|
-
Standard button themed by the DS. Zero radius, Geist font.
|
|
6
|
-
|
|
7
|
-
### Variants
|
|
8
|
-
|
|
9
|
-
| Variant | Background | Text | Border | Hover |
|
|
10
|
-
|---------|-----------|------|--------|-------|
|
|
11
|
-
| default | card | foreground | border | primary border |
|
|
12
|
-
| destructive | destructive | white | destructive | opacity 90% |
|
|
13
|
-
| outline | transparent | foreground | border | muted bg |
|
|
14
|
-
| ghost | transparent | muted-foreground | none | muted bg |
|
|
15
|
-
|
|
16
|
-
## StripeButton (custom)
|
|
17
|
-
|
|
18
|
-
**IMPORTANT:** Use StripeButton for primary CTAs that need the Leo Becker identity. Use shadcn Button for standard actions.
|
|
19
|
-
|
|
20
|
-
### Variants
|
|
21
|
-
|
|
22
|
-
| Variant | When to use |
|
|
23
|
-
|---------|------------|
|
|
24
|
-
| primary | Default CTA |
|
|
25
|
-
| accent | Hero CTA, one per screen max |
|
|
26
|
-
| secondary | Secondary actions alongside accent |
|
|
27
|
-
| ghost | Tertiary, navigation-like actions |
|
|
28
|
-
|
|
29
|
-
### Sizes
|
|
30
|
-
|
|
31
|
-
| Size | Height | Use |
|
|
32
|
-
|------|--------|-----|
|
|
33
|
-
| sm | 22px | Compact toolbars, inline actions |
|
|
34
|
-
| default | 28px | Standard buttons |
|
|
35
|
-
| lg | 34px | Hero CTAs, prominent actions |
|
|
36
|
-
|
|
37
|
-
### Stripe Effect
|
|
38
|
-
|
|
39
|
-
The diagonal stripe appears on hover at 8% opacity. Never remove or customize the stripe — it's a core identity element.
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# Components
|
|
2
|
-
|
|
3
|
-
This design system uses shadcn/ui components themed via CSS variables.
|
|
4
|
-
Custom components are documented individually below.
|
|
5
|
-
|
|
6
|
-
## shadcn/ui Components (themed automatically)
|
|
7
|
-
|
|
8
|
-
Button, Input, Card, Badge, Dialog, Dropdown, Tabs, Toast, Tooltip,
|
|
9
|
-
Checkbox, Switch, Select, Progress, Avatar, Skeleton, Separator,
|
|
10
|
-
Table, Popover, Navigation Menu, and more.
|
|
11
|
-
|
|
12
|
-
## Custom Components
|
|
13
|
-
|
|
14
|
-
Add your DS-specific component docs here.
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
# Color
|
|
2
|
-
|
|
3
|
-
> Auto-generated from `tokens.json`. Do not edit manually.
|
|
4
|
-
|
|
5
|
-
## Raw Palette
|
|
6
|
-
|
|
7
|
-
| Token | Hex | OKLch |
|
|
8
|
-
| ----- | --- | ----- |
|
|
9
|
-
| `orange-100` | `#f05524` | `oklch(0.653 0.201 38.807)` |
|
|
10
|
-
| `orange-200` | `#e34a18` | `oklch(0.619 0.198 38.296)` |
|
|
11
|
-
| `orange-300` | `#d2441c` | `oklch(0.584 0.186 37.281)` |
|
|
12
|
-
| `teal-1000` | `#00110e` | `oklch(0.159 0.030 176.115)` |
|
|
13
|
-
| `teal-900` | `#00201c` | `oklch(0.219 0.041 177.325)` |
|
|
14
|
-
| `teal-800` | `#00302a` | `oklch(0.277 0.053 176.110)` |
|
|
15
|
-
| `teal-700` | `#00453f` | `oklch(0.351 0.065 179.177)` |
|
|
16
|
-
| `teal-600` | `#005c54` | `oklch(0.427 0.079 178.770)` |
|
|
17
|
-
| `teal-500` | `#326f68` | `oklch(0.499 0.069 177.930)` |
|
|
18
|
-
| `teal-400` | `#6e8a83` | `oklch(0.610 0.040 164.746)` |
|
|
19
|
-
| `beige-50` | `#e8dcc1` | `oklch(0.897 0.053 96.455)` |
|
|
20
|
-
| `beige-100` | `#d4c7a8` | `oklch(0.832 0.058 96.076)` |
|
|
21
|
-
| `beige-200` | `#c4b597` | `oklch(0.778 0.057 93.050)` |
|
|
22
|
-
| `beige-300` | `#9dafa4` | `oklch(0.737 0.036 145.641)` |
|
|
23
|
-
| `green-500` | `#79e27e` | `oklch(0.826 0.193 141.291)` |
|
|
24
|
-
| `red-500` | `#ff4b4b` | `oklch(0.671 0.216 26.206)` |
|
|
25
|
-
| `yellow-500` | `#f5c542` | `oklch(0.844 0.173 92.183)` |
|
|
26
|
-
| `blue-500` | `#4b9eff` | `oklch(0.693 0.161 253.127)` |
|
|
27
|
-
|
|
28
|
-
## Semantic Colors
|
|
29
|
-
|
|
30
|
-
| Token | Reference | Resolved Hex | OKLch |
|
|
31
|
-
| ----- | --------- | ------------ | ----- |
|
|
32
|
-
| `background` | `{color.raw.teal-1000}` | `#00110e` | `oklch(0.159 0.030 176.115)` |
|
|
33
|
-
| `background-secondary` | `{color.raw.teal-900}` | `#00201c` | `oklch(0.219 0.041 177.325)` |
|
|
34
|
-
| `background-tertiary` | `{color.raw.teal-800}` | `#00302a` | `oklch(0.277 0.053 176.110)` |
|
|
35
|
-
| `foreground` | `{color.raw.beige-200}` | `#c4b597` | `oklch(0.778 0.057 93.050)` |
|
|
36
|
-
| `foreground-strong` | `{color.raw.beige-50}` | `#e8dcc1` | `oklch(0.897 0.053 96.455)` |
|
|
37
|
-
| `foreground-muted` | `{color.raw.teal-400}` | `#6e8a83` | `oklch(0.610 0.040 164.746)` |
|
|
38
|
-
| `primary` | `{color.raw.orange-100}` | `#f05524` | `oklch(0.653 0.201 38.807)` |
|
|
39
|
-
| `primary-hover` | `{color.raw.orange-200}` | `#e34a18` | `oklch(0.619 0.198 38.296)` |
|
|
40
|
-
| `primary-foreground` | `{color.raw.teal-1000}` | `#00110e` | `oklch(0.159 0.030 176.115)` |
|
|
41
|
-
| `border` | `{color.raw.teal-700}` | `#00453f` | `oklch(0.351 0.065 179.177)` |
|
|
42
|
-
| `border-muted` | `{color.raw.teal-800}` | `#00302a` | `oklch(0.277 0.053 176.110)` |
|
|
43
|
-
| `input` | `{color.raw.teal-800}` | `#00302a` | `oklch(0.277 0.053 176.110)` |
|
|
44
|
-
| `ring` | `{color.raw.orange-200}` | `#e34a18` | `oklch(0.619 0.198 38.296)` |
|
|
45
|
-
| `success` | `{color.raw.green-500}` | `#79e27e` | `oklch(0.826 0.193 141.291)` |
|
|
46
|
-
| `error` | `{color.raw.red-500}` | `#ff4b4b` | `oklch(0.671 0.216 26.206)` |
|
|
47
|
-
| `warning` | `{color.raw.yellow-500}` | `#f5c542` | `oklch(0.844 0.173 92.183)` |
|
|
48
|
-
| `info` | `{color.raw.blue-500}` | `#4b9eff` | `oklch(0.693 0.161 253.127)` |
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# Motion
|
|
2
|
-
|
|
3
|
-
## Easings
|
|
4
|
-
|
|
5
|
-
| Name | Value | Use |
|
|
6
|
-
|------|-------|-----|
|
|
7
|
-
| ease-out | cubic-bezier(0, 0, 0.2, 1) | Enter animations |
|
|
8
|
-
| ease-in-out | cubic-bezier(0.4, 0, 0.2, 1) | Standard transitions |
|
|
9
|
-
|
|
10
|
-
## Durations
|
|
11
|
-
|
|
12
|
-
| Name | Value | Use |
|
|
13
|
-
|------|-------|-----|
|
|
14
|
-
| fast | 100ms | Hovers, tooltips |
|
|
15
|
-
| base | 150ms | Standard transitions |
|
|
16
|
-
| medium | 250ms | Complex animations |
|
|
17
|
-
| slow | 500ms | Page transitions |
|
|
18
|
-
|
|
19
|
-
## Key Animations
|
|
20
|
-
|
|
21
|
-
| Name | Duration | Use |
|
|
22
|
-
|------|----------|-----|
|
|
23
|
-
| blink | 3s infinite | Badge dots, accent dots |
|
|
24
|
-
| shimmer | 2s infinite | Skeleton loading |
|
|
25
|
-
| scale-in | 175ms | Modal entrance |
|
|
26
|
-
| slide-in-right | 300ms | Toast entrance |
|
|
27
|
-
| enter-right/left | 500ms | Panel slides |
|
|
28
|
-
| rise-in | 700ms | Hero entrance |
|
|
29
|
-
| spin | 1s infinite | Loading spinners |
|
|
30
|
-
|
|
31
|
-
## Usage
|
|
32
|
-
|
|
33
|
-
```html
|
|
34
|
-
<div class="animate-blink">...</div>
|
|
35
|
-
<div class="animate-shimmer">...</div>
|
|
36
|
-
<div class="animate-scale-in">...</div>
|
|
37
|
-
```
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# Border Radius
|
|
2
|
-
|
|
3
|
-
## Philosophy
|
|
4
|
-
|
|
5
|
-
Zero radius by default. This is the brutalist foundation of the system. Exceptions exist only where sharp corners would confuse the user about the component's function.
|
|
6
|
-
|
|
7
|
-
## Values
|
|
8
|
-
|
|
9
|
-
| Token | Value | Use |
|
|
10
|
-
|-------|-------|-----|
|
|
11
|
-
| --radius | 0rem | Default for all structural components |
|
|
12
|
-
| --radius-pill | 9999px | Toggle tracks/thumbs, avatars (affordance) |
|
|
13
|
-
| --radius-soft | 4px | Progress bar fills (reads as meter) |
|
|
14
|
-
|
|
15
|
-
## Decision Tree
|
|
16
|
-
|
|
17
|
-
- Is this a toggle or avatar? → Use pill (9999px)
|
|
18
|
-
- Is this a progress bar? → Use soft (4px)
|
|
19
|
-
- Everything else → Use 0 (default)
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# Spacing
|
|
2
|
-
|
|
3
|
-
> Auto-generated from `tokens.json`. Do not edit manually.
|
|
4
|
-
|
|
5
|
-
## Scale
|
|
6
|
-
|
|
7
|
-
| Token | Value |
|
|
8
|
-
| ----- | ----- |
|
|
9
|
-
| `1` | 4px |
|
|
10
|
-
| `2` | 8px |
|
|
11
|
-
| `3` | 12px |
|
|
12
|
-
| `4` | 16px |
|
|
13
|
-
| `5` | 20px |
|
|
14
|
-
| `6` | 24px |
|
|
15
|
-
| `8` | 32px |
|
|
16
|
-
| `10` | 40px |
|
|
17
|
-
| `12` | 48px |
|
|
18
|
-
| `16` | 64px |
|
|
19
|
-
| `20` | 80px |
|
|
20
|
-
| `24` | 96px |
|
|
21
|
-
|
|
22
|
-
## Radius
|
|
23
|
-
|
|
24
|
-
| Token | Value | Description |
|
|
25
|
-
| ----- | ----- | ----------- |
|
|
26
|
-
| `base` | 0rem | Brutalist zero radius — sharp corners by default |
|
|
27
|
-
|
|
28
|
-
## Shadows
|
|
29
|
-
|
|
30
|
-
| Token | Value |
|
|
31
|
-
| ----- | ----- |
|
|
32
|
-
| `sm` | `0 1px 2px 0 rgb(0 0 0 / 0.3)` |
|
|
33
|
-
| `md` | `0 4px 12px 0 rgb(0 0 0 / 0.25)` |
|
|
34
|
-
| `lg` | `0 8px 24px 0 rgb(0 0 0 / 0.35)` |
|
|
35
|
-
| `xl` | `0 20px 25px -5px rgb(0 0 0 / 0.4)` |
|
|
36
|
-
| `popover` | `0 0 0 1px rgb(0 0 0 / 0.2), 0 3px 6px 0 rgb(0 0 0 / 0.25), 0 9px 24px 0 rgb(0 0 0 / 0.35)` |
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# Typography
|
|
2
|
-
|
|
3
|
-
> Auto-generated from `tokens.json`. Do not edit manually.
|
|
4
|
-
|
|
5
|
-
## Font Families
|
|
6
|
-
|
|
7
|
-
| Role | Stack |
|
|
8
|
-
| ---- | ----- |
|
|
9
|
-
| `display` | `"Geist", "Geist Fallback", ui-sans-serif, system-ui, sans-serif` |
|
|
10
|
-
| `body` | `"Geist", "Geist Fallback", ui-sans-serif, system-ui, sans-serif` |
|
|
11
|
-
| `mono` | `"Geist Mono", "Geist Mono Fallback", ui-monospace, SFMono-Regular, Menlo, monospace` |
|
|
12
|
-
|
|
13
|
-
## Type Scale
|
|
14
|
-
|
|
15
|
-
| Name | Size | Weight | Line Height | Letter Spacing | Transform |
|
|
16
|
-
| ---- | ---- | ------ | ----------- | -------------- | --------- |
|
|
17
|
-
| `display` | clamp(56px, 12vw, 180px) | 700 | 1 | -0.03em | --- |
|
|
18
|
-
| `hero` | clamp(40px, 8.5vw, 96px) | 700 | 1 | -0.03em | --- |
|
|
19
|
-
| `h2` | clamp(30px, 4vw, 48px) | 600 | 1.1 | -0.025em | --- |
|
|
20
|
-
| `h3` | 36px | 600 | 1.15 | -0.02em | --- |
|
|
21
|
-
| `h4` | 30px | 600 | 1.2 | -0.02em | --- |
|
|
22
|
-
| `h5` | 24px | 600 | 1.2 | -0.015em | --- |
|
|
23
|
-
| `h6` | 18px | 600 | 1.3 | -0.015em | --- |
|
|
24
|
-
| `body` | 16px | 400 | 1.5 | 0 | --- |
|
|
25
|
-
| `body-sm` | 14px | 400 | 1.5 | 0 | --- |
|
|
26
|
-
| `label` | 12px | 500 | 1.3 | 0.01em | --- |
|
|
27
|
-
| `badge` | 14px | 600 | 1.3 | 0.025em | uppercase |
|
|
28
|
-
| `meta` | 11px | 400 | 1.3 | 0.05em | --- |
|
|
29
|
-
| `code` | 13px | 400 | 1.5 | 0 | --- |
|
package/guidelines/overview.md
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# DS Leo Becker
|
|
2
|
-
|
|
3
|
-
## Design Philosophy
|
|
4
|
-
|
|
5
|
-
Brutalist dark-mode design system for LBK Content House. Every interface built with this system has a distinctive editorial character — sharp corners, teal depths, orange accents, and mono typography for UI chrome.
|
|
6
|
-
|
|
7
|
-
## Principles
|
|
8
|
-
|
|
9
|
-
1. **Zero radius by default** — --radius: 0 for all structural components. Exceptions only for affordance clarity: pill shapes (9999px) on toggles and avatars, soft radius (4px) on progress bars.
|
|
10
|
-
2. **Mono chrome** — All UI labels, meta, badges use Geist Mono uppercase.
|
|
11
|
-
3. **1px borders, two styles** — Solid for component outlines (card, button, input). Dashed for content rhythm (section breaks, separators).
|
|
12
|
-
4. **Stripe hover** — Buttons animate a 45-degree diagonal stripe layer on hover.
|
|
13
|
-
5. **Accent dot** — Animated 8px dot blinks as section/status indicator.
|
|
14
|
-
6. **Texture as background only** — Never place text directly on bg-diagonal or bg-grid.
|
|
15
|
-
|
|
16
|
-
## Rules
|
|
17
|
-
|
|
18
|
-
- **IMPORTANT:** Always use semantic tokens (bg-background, text-foreground), never raw hex values.
|
|
19
|
-
- **IMPORTANT:** Only one accent CTA (StripeButton variant="accent") per screen.
|
|
20
|
-
- Use Geist Mono uppercase for all UI chrome: badges, pills, labels, meta text.
|
|
21
|
-
- Use Geist Sans for all content: headings, body, descriptions.
|
|
22
|
-
|
|
23
|
-
## Reading Order
|
|
24
|
-
|
|
25
|
-
1. **Foundations** — Colors, typography, spacing, motion
|
|
26
|
-
2. **Components** — shadcn/ui themed + custom (BadgeDot, StripeButton, Pill, etc.)
|
package/guidelines/setup.md
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# Setup
|
|
2
|
-
|
|
3
|
-
## Install
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
npm install ds-leobecker
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
## Configure
|
|
10
|
-
|
|
11
|
-
```css
|
|
12
|
-
/* globals.css */
|
|
13
|
-
@import "tailwindcss";
|
|
14
|
-
@import "tw-animate-css";
|
|
15
|
-
@import "ds-leobecker/theme";
|
|
16
|
-
|
|
17
|
-
@layer base {
|
|
18
|
-
* { @apply border-border outline-ring/50; }
|
|
19
|
-
body { @apply bg-background text-foreground; }
|
|
20
|
-
}
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Requirements
|
|
24
|
-
|
|
25
|
-
- Tailwind CSS 4+
|
|
26
|
-
- PostCSS with @tailwindcss/postcss plugin
|