|
45 | 45 | * 1. Color — light theme |
46 | 46 | * |
47 | 47 | * Brand palette: a barely-perceptible blue tint on neutral surfaces ties |
48 | | - * the light mode to the navy dark theme (brand hue 258 °). Primary is the |
| 48 | + * the light mode to the navy dark theme (brand hue 258°). Primary is the |
49 | 49 | * same brand blue used across jonmatum.dev / jonmatum.com. |
| 50 | + * |
| 51 | + * Pure-white card/surface/popover surfaces float above the blue-tinted |
| 52 | + * background, creating the visual lift characteristic of enterprise SaaS |
| 53 | + * (Linear, Vercel, Stripe). Foreground is aligned to the brand hue for |
| 54 | + * subtle warmth without visible color cast. |
50 | 55 | * ───────────────────────────────────────────────────────────────────── */ |
51 | 56 | --background: oklch(0.975 0.004 265); |
52 | | - --foreground: oklch(0.205 0.015 265); |
| 57 | + --foreground: oklch(0.19 0.018 258); |
53 | 58 |
|
54 | | - --surface: oklch(0.99 0.002 265); |
55 | | - --surface-foreground: oklch(0.205 0.015 265); |
| 59 | + --surface: oklch(1 0 0); |
| 60 | + --surface-foreground: oklch(0.19 0.018 258); |
56 | 61 |
|
57 | | - --card: oklch(0.993 0.002 265); |
58 | | - --card-foreground: oklch(0.205 0.015 265); |
| 62 | + --card: oklch(1 0 0); |
| 63 | + --card-foreground: oklch(0.19 0.018 258); |
59 | 64 |
|
60 | | - --popover: oklch(0.993 0.002 265); |
61 | | - --popover-foreground: oklch(0.205 0.015 265); |
| 65 | + --popover: oklch(1 0 0); |
| 66 | + --popover-foreground: oklch(0.19 0.018 258); |
62 | 67 |
|
63 | | - --muted: oklch(0.955 0.006 265); |
64 | | - --muted-foreground: oklch(0.46 0.015 265); |
| 68 | + --muted: oklch(0.953 0.007 265); |
| 69 | + --muted-foreground: oklch(0.44 0.018 258); |
65 | 70 |
|
66 | | - --accent: oklch(0.94 0.012 258); |
67 | | - --accent-foreground: oklch(0.205 0.015 265); |
| 71 | + --accent: oklch(0.943 0.016 258); |
| 72 | + --accent-foreground: oklch(0.19 0.018 258); |
68 | 73 |
|
69 | 74 | --primary: oklch(0.52 0.2 258); |
70 | 75 | --primary-foreground: oklch(0.985 0 0); |
71 | 76 |
|
72 | | - --secondary: oklch(0.95 0.006 265); |
73 | | - --secondary-foreground: oklch(0.24 0.015 265); |
| 77 | + --secondary: oklch(0.952 0.007 265); |
| 78 | + --secondary-foreground: oklch(0.22 0.018 258); |
74 | 79 |
|
75 | 80 | --destructive: oklch(0.577 0.245 27.325); |
76 | 81 | --destructive-foreground: oklch(0.985 0 0); |
|
79 | 84 | --success-foreground: oklch(0.985 0 0); |
80 | 85 |
|
81 | 86 | --warning: oklch(0.78 0.17 85); |
82 | | - --warning-foreground: oklch(0.205 0.015 265); |
| 87 | + --warning-foreground: oklch(0.19 0.018 258); |
83 | 88 |
|
84 | 89 | --info: oklch(0.539 0.13 230); |
85 | 90 | --info-foreground: oklch(0.985 0 0); |
86 | 91 |
|
87 | | - --border: oklch(0.915 0.004 265); |
88 | | - --input: oklch(0.9 0.006 265); |
| 92 | + /* Visible borders for data-dense enterprise UIs (tables, forms, panels). |
| 93 | + Slightly more chroma than the old value ties them to the brand hue. */ |
| 94 | + --border: oklch(0.895 0.009 265); |
| 95 | + --input: oklch(0.895 0.009 265); |
89 | 96 | --ring: oklch(0.52 0.2 258); |
90 | 97 |
|
91 | 98 | /* Overlay — modal backdrop scrim. Kept consistently dark in both themes |
|
96 | 103 |
|
97 | 104 | /* Sidebar — blue-tinted surface reinforces brand hue; primary wired to the |
98 | 105 | brand blue so active nav items use the same accent as dark mode. */ |
99 | | - --sidebar: oklch(0.96 0.008 265); |
100 | | - --sidebar-foreground: oklch(0.205 0.015 265); |
| 106 | + --sidebar: oklch(0.963 0.008 258); |
| 107 | + --sidebar-foreground: oklch(0.19 0.018 258); |
101 | 108 | --sidebar-primary: oklch(0.52 0.2 258); |
102 | 109 | --sidebar-primary-foreground: oklch(0.985 0 0); |
103 | 110 | --sidebar-accent: oklch(0.935 0.012 258); |
104 | | - --sidebar-accent-foreground: oklch(0.205 0.015 265); |
105 | | - --sidebar-border: oklch(0.9 0.006 265); |
| 111 | + --sidebar-accent-foreground: oklch(0.19 0.018 258); |
| 112 | + --sidebar-border: oklch(0.895 0.009 265); |
106 | 113 | --sidebar-ring: oklch(0.52 0.2 258); |
107 | 114 |
|
108 | 115 | /* Chart colors — 5 perceptually distinct hues for categorical data. */ |
|
115 | 122 | /* ───────────────────────────────────────────────────────────────────── |
116 | 123 | * 2. Radius — scale driven by a single `--radius` base so brand |
117 | 124 | * overrides only need to change one variable. |
| 125 | + * |
| 126 | + * 8 px base (0.5 rem) matches the professional enterprise convention |
| 127 | + * used by Linear, Vercel, and Stripe — friendly but not bubbly. |
118 | 128 | * ───────────────────────────────────────────────────────────────────── */ |
119 | | - --radius: 0.75rem; |
120 | | - --radius-xs: calc(var(--radius) - 6px); |
121 | | - --radius-sm: calc(var(--radius) - 4px); |
122 | | - --radius-md: calc(var(--radius) - 2px); |
123 | | - --radius-lg: var(--radius); |
| 129 | + --radius: 0.5rem; |
| 130 | + --radius-xs: calc(var(--radius) - 4px); |
| 131 | + --radius-sm: calc(var(--radius) - 2px); |
| 132 | + --radius-md: var(--radius); |
| 133 | + --radius-lg: calc(var(--radius) + 2px); |
124 | 134 | --radius-xl: calc(var(--radius) + 4px); |
125 | 135 | --radius-2xl: calc(var(--radius) + 8px); |
126 | 136 | --radius-full: 9999px; |
127 | 137 |
|
128 | 138 | /* ───────────────────────────────────────────────────────────────────── |
129 | 139 | * 3. Typography |
| 140 | + * |
| 141 | + * Inter is listed first so consumers who load it via next/font/google |
| 142 | + * get it automatically without any additional configuration. |
130 | 143 | * ───────────────────────────────────────────────────────────────────── */ |
131 | 144 | --font-sans: |
132 | | - ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, |
133 | | - 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji'; |
| 145 | + 'Inter', 'Inter Variable', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, |
| 146 | + 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', |
| 147 | + 'Segoe UI Emoji'; |
134 | 148 | --font-mono: |
135 | 149 | ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', 'Courier New', |
136 | 150 | monospace; |
|
158 | 172 | --tracking-normal: 0; |
159 | 173 | --tracking-wide: 0.02em; |
160 | 174 | --tracking-wider: 0.04em; |
| 175 | + --tracking-widest: 0.08em; |
| 176 | + |
| 177 | + /* Font weights — exposed as CSS variables so custom components can use |
| 178 | + them without hardcoding numeric values. Tailwind utilities (font-bold |
| 179 | + etc.) still work as normal. */ |
| 180 | + --font-weight-normal: 400; |
| 181 | + --font-weight-medium: 500; |
| 182 | + --font-weight-semibold: 600; |
| 183 | + --font-weight-bold: 700; |
161 | 184 |
|
162 | 185 | /* ───────────────────────────────────────────────────────────────────── |
163 | 186 | * 4. Motion — Material-inspired standard easings, Radix-inspired speeds. |
|
177 | 200 | * 5. Elevation — shadows tuned for a white surface. Dark theme overrides |
178 | 201 | * these with higher opacity so they remain visible on dark surfaces. |
179 | 202 | * ───────────────────────────────────────────────────────────────────── */ |
180 | | - --shadow-xs: 0 1px 2px 0 oklch(0 0 0 / 0.06); |
181 | | - --shadow-sm: 0 1px 3px 0 oklch(0 0 0 / 0.08), 0 1px 2px -1px oklch(0 0 0 / 0.12); |
182 | | - --shadow-md: 0 4px 8px -2px oklch(0 0 0 / 0.1), 0 2px 4px -2px oklch(0 0 0 / 0.08); |
183 | | - --shadow-lg: 0 12px 20px -4px oklch(0 0 0 / 0.12), 0 4px 8px -4px oklch(0 0 0 / 0.08); |
184 | | - --shadow-xl: 0 20px 28px -6px oklch(0 0 0 / 0.14), 0 10px 14px -6px oklch(0 0 0 / 0.08); |
185 | | - --shadow-2xl: 0 25px 50px -12px oklch(0 0 0 / 0.3); |
| 203 | + --shadow-xs: 0 1px 2px 0 oklch(0 0 0 / 0.05); |
| 204 | + --shadow-sm: 0 1px 3px 0 oklch(0 0 0 / 0.07), 0 1px 2px -1px oklch(0 0 0 / 0.1); |
| 205 | + --shadow-md: 0 4px 8px -2px oklch(0 0 0 / 0.09), 0 2px 4px -2px oklch(0 0 0 / 0.06); |
| 206 | + --shadow-lg: 0 12px 20px -4px oklch(0 0 0 / 0.1), 0 4px 8px -4px oklch(0 0 0 / 0.06); |
| 207 | + --shadow-xl: 0 20px 28px -6px oklch(0 0 0 / 0.12), 0 10px 14px -6px oklch(0 0 0 / 0.07); |
| 208 | + --shadow-2xl: 0 25px 50px -12px oklch(0 0 0 / 0.28); |
186 | 209 |
|
187 | 210 | /* ───────────────────────────────────────────────────────────────────── |
188 | 211 | * 6. Density — used by components for padding / gap. Consumer apps can |
|
200 | 223 | * ───────────────────────────────────────────────────────────────────── */ |
201 | 224 | [data-theme='dark'] { |
202 | 225 | /* Background matches the #0b0f14 navy-black brand color from jonmatum.dev. |
203 | | - All layered surfaces step up in lightness to stay visually distinct. */ |
| 226 | + All layered surfaces step up in lightness to stay visually distinct. |
| 227 | + Card is explicitly lighter than surface so elevation is perceptible |
| 228 | + even at low ambient light levels. */ |
204 | 229 | --background: oklch(0.095 0.015 265); |
205 | | - --foreground: oklch(0.93 0.006 265); |
| 230 | + --foreground: oklch(0.94 0.007 258); |
206 | 231 |
|
207 | | - --surface: oklch(0.145 0.014 265); |
208 | | - --surface-foreground: oklch(0.93 0.006 265); |
| 232 | + --surface: oklch(0.148 0.015 258); |
| 233 | + --surface-foreground: oklch(0.94 0.007 258); |
209 | 234 |
|
210 | | - --card: oklch(0.155 0.016 262); |
211 | | - --card-foreground: oklch(0.93 0.006 265); |
| 235 | + --card: oklch(0.165 0.018 258); |
| 236 | + --card-foreground: oklch(0.94 0.007 258); |
212 | 237 |
|
213 | | - --popover: oklch(0.155 0.016 262); |
214 | | - --popover-foreground: oklch(0.93 0.006 265); |
| 238 | + --popover: oklch(0.165 0.018 258); |
| 239 | + --popover-foreground: oklch(0.94 0.007 258); |
215 | 240 |
|
216 | 241 | --muted: oklch(0.2 0.015 262); |
217 | | - --muted-foreground: oklch(0.62 0.01 265); |
| 242 | + --muted-foreground: oklch(0.63 0.012 258); |
218 | 243 |
|
219 | 244 | --accent: oklch(0.22 0.022 258); |
220 | | - --accent-foreground: oklch(0.93 0.006 265); |
| 245 | + --accent-foreground: oklch(0.94 0.007 258); |
221 | 246 |
|
222 | 247 | --primary: oklch(0.558 0.19 258); |
223 | 248 | --primary-foreground: oklch(0.985 0 0); |
224 | 249 |
|
225 | 250 | --secondary: oklch(0.2 0.015 262); |
226 | | - --secondary-foreground: oklch(0.93 0.006 265); |
| 251 | + --secondary-foreground: oklch(0.94 0.007 258); |
227 | 252 |
|
228 | 253 | --destructive: oklch(0.576 0.191 22.216); |
229 | 254 | --destructive-foreground: oklch(0.985 0 0); |
|
237 | 262 | --info: oklch(0.542 0.12 230); |
238 | 263 | --info-foreground: oklch(0.985 0 0); |
239 | 264 |
|
240 | | - --border: oklch(0.22 0.016 262); |
241 | | - --input: oklch(0.26 0.018 262); |
| 265 | + --border: oklch(0.225 0.018 258); |
| 266 | + --input: oklch(0.265 0.02 258); |
242 | 267 | --ring: oklch(0.558 0.19 258); |
243 | 268 |
|
244 | 269 | /* Scrim stays dark in both themes. */ |
245 | 270 | --overlay: oklch(0 0 0 / 0.6); |
246 | 271 |
|
247 | 272 | --sidebar: oklch(0.075 0.012 265); |
248 | | - --sidebar-foreground: oklch(0.93 0.006 265); |
| 273 | + --sidebar-foreground: oklch(0.94 0.007 258); |
249 | 274 | --sidebar-primary: oklch(0.558 0.19 258); |
250 | 275 | --sidebar-primary-foreground: oklch(0.985 0 0); |
251 | 276 | --sidebar-accent: oklch(0.18 0.02 258); |
252 | | - --sidebar-accent-foreground: oklch(0.93 0.006 265); |
| 277 | + --sidebar-accent-foreground: oklch(0.94 0.007 258); |
253 | 278 | --sidebar-border: oklch(0.2 0.014 262); |
254 | 279 | --sidebar-ring: oklch(0.558 0.19 258); |
255 | 280 |
|
|
0 commit comments