@eloovor-design/tokens 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +33 -2
- package/base.css +27 -0
- package/package.json +44 -4
- package/tailwind-preset.js +106 -0
- package/themes/eloovor.css +62 -0
- package/themes/template.css +61 -0
- package/tokens.css +129 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Anand Sandilya
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,34 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @eloovor-design/tokens
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Color tokens, brand themes, base styles and the Tailwind CSS 3 preset for [eloovor-design](https://design.eloovor.com).
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
bun add @eloovor-design/tokens
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
```js
|
|
10
|
+
// tailwind.config.js
|
|
11
|
+
import preset from '@eloovor-design/tokens';
|
|
12
|
+
|
|
13
|
+
export default { presets: [preset], content: ['./src/**/*.{ts,tsx}'] };
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
```css
|
|
17
|
+
/* src/index.css */
|
|
18
|
+
@import '@eloovor-design/tokens/tokens.css';
|
|
19
|
+
@import '@eloovor-design/tokens/themes/eloovor.css'; /* or your own theme */
|
|
20
|
+
@import '@eloovor-design/tokens/base.css';
|
|
21
|
+
|
|
22
|
+
@tailwind base;
|
|
23
|
+
@tailwind components;
|
|
24
|
+
@tailwind utilities;
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
| File | What it is |
|
|
28
|
+
| -------------------- | ----------------------------------------------------------------- |
|
|
29
|
+
| `tokens.css` | The shared base: every color role in light and dark, radius |
|
|
30
|
+
| `themes/*.css` | A brand: color ramps, the hues neutrals lean toward, fonts |
|
|
31
|
+
| `base.css` | Border, page and selection defaults the components assume |
|
|
32
|
+
| `tailwind-preset.js` | Tailwind names for the tokens, radius, shadows, fonts, animations |
|
|
33
|
+
|
|
34
|
+
To make your own theme, copy `themes/template.css` into your app. The components come from the shadcn registry; setup, the theme contract and the rules are in the [repository README](https://github.com/anand-san/eloovor-design#readme).
|
package/base.css
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* eloovor-design base element styles. Import it with the other @imports at
|
|
3
|
+
* the top of the app's CSS; `@layer base` puts it after Tailwind's preflight.
|
|
4
|
+
* Components assume borders default to the border token and the page sits
|
|
5
|
+
* on the background token.
|
|
6
|
+
*/
|
|
7
|
+
@layer base {
|
|
8
|
+
*,
|
|
9
|
+
::before,
|
|
10
|
+
::after {
|
|
11
|
+
border-color: hsl(var(--border));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
html,
|
|
15
|
+
body {
|
|
16
|
+
background-color: hsl(var(--background));
|
|
17
|
+
color: hsl(var(--foreground));
|
|
18
|
+
font-family: var(--font-sans);
|
|
19
|
+
-webkit-font-smoothing: antialiased;
|
|
20
|
+
-moz-osx-font-smoothing: grayscale;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
::selection {
|
|
24
|
+
background-color: hsl(var(--highlight) / 0.55);
|
|
25
|
+
color: hsl(var(--highlight-foreground));
|
|
26
|
+
}
|
|
27
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,46 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eloovor-design/tokens",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Design tokens, themes and the Tailwind preset for eloovor-design",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/anand-san/eloovor-design.git",
|
|
10
|
+
"directory": "packages/tokens"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://design.eloovor.com",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"design-tokens",
|
|
15
|
+
"tailwindcss",
|
|
16
|
+
"tailwind-preset",
|
|
17
|
+
"design-system"
|
|
18
|
+
],
|
|
19
|
+
"exports": {
|
|
20
|
+
".": "./tailwind-preset.js",
|
|
21
|
+
"./tailwind-preset": "./tailwind-preset.js",
|
|
22
|
+
"./tokens.css": "./tokens.css",
|
|
23
|
+
"./themes/*": "./themes/*",
|
|
24
|
+
"./base.css": "./base.css"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"tokens.css",
|
|
28
|
+
"base.css",
|
|
29
|
+
"themes",
|
|
30
|
+
"tailwind-preset.js",
|
|
31
|
+
"README.md",
|
|
32
|
+
"LICENSE"
|
|
33
|
+
],
|
|
34
|
+
"sideEffects": [
|
|
35
|
+
"*.css"
|
|
36
|
+
],
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"tailwindcss-animate": "^1.0.7"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"tailwindcss": "^3.4.0"
|
|
42
|
+
},
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import tailwindcssAnimate from 'tailwindcss-animate';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Tailwind names for the eloovor-design tokens (tokens.css plus a theme from
|
|
5
|
+
* themes/). An app's tailwind.config.js uses this as a preset and adds only
|
|
6
|
+
* its own domain colors and motion.
|
|
7
|
+
*/
|
|
8
|
+
const token = name => `hsl(var(--${name}))`;
|
|
9
|
+
const ramp = name =>
|
|
10
|
+
Object.fromEntries(
|
|
11
|
+
[50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950].map(step => [
|
|
12
|
+
step,
|
|
13
|
+
token(`${name}-${step}`),
|
|
14
|
+
]),
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
/** @type {import('tailwindcss').Config} */
|
|
18
|
+
export default {
|
|
19
|
+
darkMode: ['class'],
|
|
20
|
+
theme: {
|
|
21
|
+
extend: {
|
|
22
|
+
// Radius by role: sm for chips, md for fields, lg for small cards,
|
|
23
|
+
// xl for section cards, 2xl for dialogs. Buttons are pills.
|
|
24
|
+
borderRadius: {
|
|
25
|
+
sm: 'calc(var(--radius) - 4px)',
|
|
26
|
+
md: 'calc(var(--radius) - 2px)',
|
|
27
|
+
lg: 'var(--radius)',
|
|
28
|
+
xl: 'calc(var(--radius) + 4px)',
|
|
29
|
+
'2xl': 'calc(var(--radius) + 8px)',
|
|
30
|
+
},
|
|
31
|
+
// The faces come from the theme (--font-sans, --font-display)
|
|
32
|
+
fontFamily: {
|
|
33
|
+
sans: ['var(--font-sans)'],
|
|
34
|
+
display: ['var(--font-display)'],
|
|
35
|
+
},
|
|
36
|
+
// Ink-tinted shadows, only for things that float: menus, dialogs, toasts
|
|
37
|
+
boxShadow: {
|
|
38
|
+
sm: '0 1px 2px hsl(var(--shadow-color) / 0.06)',
|
|
39
|
+
DEFAULT:
|
|
40
|
+
'0 1px 3px hsl(var(--shadow-color) / 0.08), 0 1px 2px hsl(var(--shadow-color) / 0.04)',
|
|
41
|
+
md: '0 4px 12px -2px hsl(var(--shadow-color) / 0.1), 0 2px 4px hsl(var(--shadow-color) / 0.04)',
|
|
42
|
+
lg: '0 12px 32px -8px hsl(var(--shadow-color) / 0.18), 0 2px 6px hsl(var(--shadow-color) / 0.06)',
|
|
43
|
+
xl: '0 24px 56px -12px hsl(var(--shadow-color) / 0.26), 0 4px 12px hsl(var(--shadow-color) / 0.08)',
|
|
44
|
+
},
|
|
45
|
+
colors: {
|
|
46
|
+
background: token('background'),
|
|
47
|
+
foreground: token('foreground'),
|
|
48
|
+
surface: token('surface'),
|
|
49
|
+
card: { DEFAULT: token('card'), foreground: token('card-foreground') },
|
|
50
|
+
popover: {
|
|
51
|
+
DEFAULT: token('popover'),
|
|
52
|
+
foreground: token('popover-foreground'),
|
|
53
|
+
},
|
|
54
|
+
muted: {
|
|
55
|
+
DEFAULT: token('muted'),
|
|
56
|
+
foreground: token('muted-foreground'),
|
|
57
|
+
},
|
|
58
|
+
primary: {
|
|
59
|
+
DEFAULT: token('primary'),
|
|
60
|
+
foreground: token('primary-foreground'),
|
|
61
|
+
},
|
|
62
|
+
brand: {
|
|
63
|
+
DEFAULT: token('brand'),
|
|
64
|
+
foreground: token('brand-foreground'),
|
|
65
|
+
...ramp('brand'),
|
|
66
|
+
},
|
|
67
|
+
highlight: {
|
|
68
|
+
DEFAULT: token('highlight'),
|
|
69
|
+
foreground: token('highlight-foreground'),
|
|
70
|
+
...ramp('highlight'),
|
|
71
|
+
},
|
|
72
|
+
destructive: {
|
|
73
|
+
DEFAULT: token('destructive'),
|
|
74
|
+
foreground: token('destructive-foreground'),
|
|
75
|
+
},
|
|
76
|
+
success: {
|
|
77
|
+
DEFAULT: token('success'),
|
|
78
|
+
foreground: token('success-foreground'),
|
|
79
|
+
},
|
|
80
|
+
warning: {
|
|
81
|
+
DEFAULT: token('warning'),
|
|
82
|
+
foreground: token('warning-foreground'),
|
|
83
|
+
},
|
|
84
|
+
info: { DEFAULT: token('info'), foreground: token('info-foreground') },
|
|
85
|
+
border: token('border'),
|
|
86
|
+
input: token('input'),
|
|
87
|
+
ring: token('ring'),
|
|
88
|
+
},
|
|
89
|
+
animation: {
|
|
90
|
+
'accordion-down': 'accordion-down 0.2s ease-out',
|
|
91
|
+
'accordion-up': 'accordion-up 0.2s ease-out',
|
|
92
|
+
},
|
|
93
|
+
keyframes: {
|
|
94
|
+
'accordion-down': {
|
|
95
|
+
from: { height: '0' },
|
|
96
|
+
to: { height: 'var(--radix-accordion-content-height)' },
|
|
97
|
+
},
|
|
98
|
+
'accordion-up': {
|
|
99
|
+
from: { height: 'var(--radix-accordion-content-height)' },
|
|
100
|
+
to: { height: '0' },
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
plugins: [tailwindcssAnimate],
|
|
106
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Eloovor theme: "ink and highlighter".
|
|
3
|
+
*
|
|
4
|
+
* The logo violet does the work of a pen: primary actions, focus,
|
|
5
|
+
* selection. Neutrals are that same ink, thinned, so greys lean slightly
|
|
6
|
+
* violet instead of reading as dead grey. Marigold is the highlighter: a
|
|
7
|
+
* fill for the few things that should jump out, like matched keywords or
|
|
8
|
+
* Elo's suggestions. It is never used for text on white.
|
|
9
|
+
*
|
|
10
|
+
* Import after tokens.css. Fonts are loaded by the app
|
|
11
|
+
* (@fontsource-variable/figtree, @fontsource-variable/bricolage-grotesque).
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
:root,
|
|
15
|
+
.force-light-mode,
|
|
16
|
+
.dark .force-light-mode {
|
|
17
|
+
--tint-hue: 252;
|
|
18
|
+
--ink-hue: 255;
|
|
19
|
+
|
|
20
|
+
--font-sans:
|
|
21
|
+
'Figtree Variable', ui-sans-serif, system-ui, -apple-system, 'Segoe UI',
|
|
22
|
+
sans-serif;
|
|
23
|
+
--font-display:
|
|
24
|
+
'Bricolage Grotesque Variable', 'Figtree Variable', ui-sans-serif,
|
|
25
|
+
system-ui, sans-serif;
|
|
26
|
+
|
|
27
|
+
/* Brand ramp, built around the logo violet #574a7d (brand-600) */
|
|
28
|
+
--brand-50: 255 33% 97%;
|
|
29
|
+
--brand-100: 255 33% 94%;
|
|
30
|
+
--brand-200: 255 30% 87%;
|
|
31
|
+
--brand-300: 255 29% 77%;
|
|
32
|
+
--brand-400: 255 26% 64%;
|
|
33
|
+
--brand-500: 255 24% 51%;
|
|
34
|
+
--brand-600: 255 26% 39%;
|
|
35
|
+
--brand-700: 255 28% 32%;
|
|
36
|
+
--brand-800: 255 30% 25%;
|
|
37
|
+
--brand-900: 255 32% 19%;
|
|
38
|
+
--brand-950: 255 36% 12%;
|
|
39
|
+
|
|
40
|
+
/* Highlight ramp: marigold */
|
|
41
|
+
--highlight-50: 46 100% 96%;
|
|
42
|
+
--highlight-100: 45 97% 89%;
|
|
43
|
+
--highlight-200: 44 95% 79%;
|
|
44
|
+
--highlight-300: 42 93% 68%;
|
|
45
|
+
--highlight-400: 40 91% 58%;
|
|
46
|
+
--highlight-500: 37 88% 50%;
|
|
47
|
+
--highlight-600: 33 85% 42%;
|
|
48
|
+
--highlight-700: 29 80% 35%;
|
|
49
|
+
--highlight-800: 26 70% 29%;
|
|
50
|
+
--highlight-900: 24 64% 23%;
|
|
51
|
+
--highlight-950: 22 70% 12%;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.dark {
|
|
55
|
+
--tint-hue: 255;
|
|
56
|
+
--ink-hue: 250;
|
|
57
|
+
|
|
58
|
+
--primary: 255 48% 78%; /* lavender, dark text on it */
|
|
59
|
+
--brand: 255 44% 74%;
|
|
60
|
+
--highlight: 42 86% 62%;
|
|
61
|
+
--ring: 255 48% 72%;
|
|
62
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Starting point for a new app's theme. Copy it into the app, rename it,
|
|
3
|
+
* and replace the values. It works as is, with a teal brand, a lemon
|
|
4
|
+
* highlighter and system fonts.
|
|
5
|
+
*
|
|
6
|
+
* Import after tokens.css. Everything else (surfaces, feedback colors,
|
|
7
|
+
* lines, radius) comes from the base and follows these hues.
|
|
8
|
+
*
|
|
9
|
+
* Checks before shipping a theme:
|
|
10
|
+
* - --brand-600 on white and white on --brand-600 are at least 4.5:1.
|
|
11
|
+
* - --highlight-300 behind --highlight-950 text is at least 4.5:1.
|
|
12
|
+
* - --tint-hue is the brand hue, or near it, so greys feel related.
|
|
13
|
+
* - Look at every Storybook story in light and dark.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
:root,
|
|
17
|
+
.force-light-mode,
|
|
18
|
+
.dark .force-light-mode {
|
|
19
|
+
/* Neutrals lean toward this hue; text and light shadows use --ink-hue */
|
|
20
|
+
--tint-hue: 190;
|
|
21
|
+
--ink-hue: 195;
|
|
22
|
+
|
|
23
|
+
/* Optional. Load the font files in the app. */
|
|
24
|
+
/* --font-sans: 'Inter Variable', ui-sans-serif, system-ui, sans-serif; */
|
|
25
|
+
/* --font-display: 'Fraunces Variable', var(--font-sans); */
|
|
26
|
+
|
|
27
|
+
/* Brand ramp. --brand-600 is the primary button. */
|
|
28
|
+
--brand-50: 185 45% 96%;
|
|
29
|
+
--brand-100: 186 45% 91%;
|
|
30
|
+
--brand-200: 187 42% 82%;
|
|
31
|
+
--brand-300: 188 40% 69%;
|
|
32
|
+
--brand-400: 189 38% 53%;
|
|
33
|
+
--brand-500: 190 45% 40%;
|
|
34
|
+
--brand-600: 191 55% 31%;
|
|
35
|
+
--brand-700: 192 55% 25%;
|
|
36
|
+
--brand-800: 193 52% 20%;
|
|
37
|
+
--brand-900: 194 50% 16%;
|
|
38
|
+
--brand-950: 196 55% 9%;
|
|
39
|
+
|
|
40
|
+
/* Highlight ramp. --highlight-300 is the marker fill. */
|
|
41
|
+
--highlight-50: 60 100% 96%;
|
|
42
|
+
--highlight-100: 58 97% 88%;
|
|
43
|
+
--highlight-200: 56 95% 78%;
|
|
44
|
+
--highlight-300: 54 92% 66%;
|
|
45
|
+
--highlight-400: 51 90% 55%;
|
|
46
|
+
--highlight-500: 48 88% 47%;
|
|
47
|
+
--highlight-600: 44 85% 39%;
|
|
48
|
+
--highlight-700: 40 80% 32%;
|
|
49
|
+
--highlight-800: 36 70% 26%;
|
|
50
|
+
--highlight-900: 32 64% 21%;
|
|
51
|
+
--highlight-950: 30 70% 11%;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.dark {
|
|
55
|
+
--tint-hue: 195;
|
|
56
|
+
--ink-hue: 190;
|
|
57
|
+
|
|
58
|
+
/* Optional: the base uses brand-300 and highlight-300 here */
|
|
59
|
+
/* --primary: 188 50% 70%; */
|
|
60
|
+
/* --ring: 188 50% 64%; */
|
|
61
|
+
}
|
package/tokens.css
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* eloovor-design base tokens: every color role, light and dark.
|
|
3
|
+
*
|
|
4
|
+
* Values are bare HSL channels so Tailwind opacity modifiers keep working
|
|
5
|
+
* (bg-success/10, text-brand/80). Tailwind names for them live in
|
|
6
|
+
* tailwind.preset.js.
|
|
7
|
+
*
|
|
8
|
+
* This file holds what every app shares: the neutral surfaces, feedback
|
|
9
|
+
* colors, lines, radius and the paper reset. The brand comes from a theme
|
|
10
|
+
* (themes/*.css), imported after this file. A theme supplies:
|
|
11
|
+
*
|
|
12
|
+
* --brand-50 … --brand-950 the primary color ramp
|
|
13
|
+
* --highlight-50 … --highlight-950 the highlighter ramp
|
|
14
|
+
* --tint-hue the hue neutrals lean toward
|
|
15
|
+
* --ink-hue the hue of text and light-mode shadows
|
|
16
|
+
* --font-sans, --font-display optional, system fonts otherwise
|
|
17
|
+
*
|
|
18
|
+
* and may override any role below, usually primary, brand, highlight and
|
|
19
|
+
* ring in dark mode.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/*
|
|
23
|
+
* Light values. `.dark .force-light-mode` is listed here so printed pages
|
|
24
|
+
* stay light inside dark mode; its specificity beats `.dark`.
|
|
25
|
+
*/
|
|
26
|
+
:root,
|
|
27
|
+
.force-light-mode,
|
|
28
|
+
.dark .force-light-mode {
|
|
29
|
+
color-scheme: light;
|
|
30
|
+
|
|
31
|
+
--font-sans: ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;
|
|
32
|
+
--font-display: var(--font-sans);
|
|
33
|
+
|
|
34
|
+
/* Surfaces: a tinted canvas, white cards that sit on it */
|
|
35
|
+
--background: var(--tint-hue) 33% 99%;
|
|
36
|
+
--foreground: var(--ink-hue) 30% 13%; /* ink */
|
|
37
|
+
--surface: var(--tint-hue) 26% 96.5%; /* soft section cards */
|
|
38
|
+
--card: 0 0% 100%; /* outline cards */
|
|
39
|
+
--card-foreground: var(--ink-hue) 30% 13%;
|
|
40
|
+
--popover: 0 0% 100%; /* menus, popovers, dialogs */
|
|
41
|
+
--popover-foreground: var(--ink-hue) 30% 13%;
|
|
42
|
+
--muted: var(--tint-hue) 20% 93.5%;
|
|
43
|
+
--muted-foreground: var(--tint-hue) 10% 42%; /* secondary text, 5.6:1 on the canvas */
|
|
44
|
+
|
|
45
|
+
/* Actions and brand */
|
|
46
|
+
--primary: var(--brand-600); /* main buttons, selection, child card tints */
|
|
47
|
+
--primary-foreground: 0 0% 100%;
|
|
48
|
+
--brand: var(--brand-600);
|
|
49
|
+
--brand-foreground: 0 0% 100%;
|
|
50
|
+
--highlight: var(--highlight-300); /* highlighter fill */
|
|
51
|
+
--highlight-foreground: var(--highlight-950);
|
|
52
|
+
--destructive: 2 58% 47%; /* brick red, 5.6:1 on white */
|
|
53
|
+
--destructive-foreground: 0 0% 100%;
|
|
54
|
+
|
|
55
|
+
/* Feedback */
|
|
56
|
+
--success: 152 62% 27%; /* leaf green */
|
|
57
|
+
--success-foreground: 0 0% 100%;
|
|
58
|
+
--warning: 26 90% 36%; /* burnt orange, kept apart from a yellow highlight */
|
|
59
|
+
--warning-foreground: 0 0% 100%;
|
|
60
|
+
--info: 214 72% 44%; /* ink blue */
|
|
61
|
+
--info-foreground: 0 0% 100%;
|
|
62
|
+
|
|
63
|
+
/* Lines */
|
|
64
|
+
--border: var(--tint-hue) 20% 90%;
|
|
65
|
+
--input: var(--tint-hue) 16% 84%; /* a step darker than border, so fields read as fields */
|
|
66
|
+
--ring: var(--brand-500);
|
|
67
|
+
|
|
68
|
+
/* Shadows are tinted with ink, never pure black */
|
|
69
|
+
--shadow-color: var(--ink-hue) 30% 20%;
|
|
70
|
+
|
|
71
|
+
--radius: 0.625rem;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.dark {
|
|
75
|
+
color-scheme: dark;
|
|
76
|
+
|
|
77
|
+
/* Surfaces: deep ink, not charcoal */
|
|
78
|
+
--background: var(--tint-hue) 20% 8%;
|
|
79
|
+
--foreground: var(--ink-hue) 22% 92%;
|
|
80
|
+
--surface: var(--tint-hue) 17% 11%;
|
|
81
|
+
--card: var(--tint-hue) 17% 11%;
|
|
82
|
+
--card-foreground: var(--ink-hue) 22% 92%;
|
|
83
|
+
--popover: var(--tint-hue) 17% 12.5%;
|
|
84
|
+
--popover-foreground: var(--ink-hue) 22% 92%;
|
|
85
|
+
--muted: var(--tint-hue) 14% 16%;
|
|
86
|
+
--muted-foreground: var(--ink-hue) 10% 66%;
|
|
87
|
+
|
|
88
|
+
/* Light brand steps with dark text on them; themes usually tune these */
|
|
89
|
+
--primary: var(--brand-300);
|
|
90
|
+
--primary-foreground: var(--brand-950);
|
|
91
|
+
--brand: var(--brand-300);
|
|
92
|
+
--brand-foreground: var(--brand-950);
|
|
93
|
+
--highlight: var(--highlight-300);
|
|
94
|
+
--highlight-foreground: var(--highlight-950);
|
|
95
|
+
--destructive: 2 62% 67%;
|
|
96
|
+
--destructive-foreground: 2 70% 14%;
|
|
97
|
+
|
|
98
|
+
--success: 150 46% 58%;
|
|
99
|
+
--success-foreground: 152 60% 10%;
|
|
100
|
+
--warning: 30 88% 62%;
|
|
101
|
+
--warning-foreground: 24 80% 12%;
|
|
102
|
+
--info: 214 85% 70%;
|
|
103
|
+
--info-foreground: 220 60% 14%;
|
|
104
|
+
|
|
105
|
+
--border: var(--tint-hue) 14% 18%;
|
|
106
|
+
--input: var(--tint-hue) 13% 25%;
|
|
107
|
+
--ring: var(--brand-400);
|
|
108
|
+
|
|
109
|
+
--shadow-color: var(--tint-hue) 40% 2%;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/*
|
|
113
|
+
* Printed pages (resumes, documents) are paper, not app: plain neutral
|
|
114
|
+
* greys and a print font, so the preview matches the download.
|
|
115
|
+
*/
|
|
116
|
+
.force-light-mode,
|
|
117
|
+
.dark .force-light-mode {
|
|
118
|
+
--background: 0 0% 100%;
|
|
119
|
+
--foreground: 0 0% 3.9%;
|
|
120
|
+
--surface: 0 0% 98%;
|
|
121
|
+
--card-foreground: 0 0% 3.9%;
|
|
122
|
+
--popover-foreground: 0 0% 3.9%;
|
|
123
|
+
--muted: 0 0% 96.1%;
|
|
124
|
+
--muted-foreground: 0 0% 45.1%;
|
|
125
|
+
--border: 0 0% 89.8%;
|
|
126
|
+
--input: 0 0% 89.8%;
|
|
127
|
+
|
|
128
|
+
font-family: Helvetica, Arial, sans-serif;
|
|
129
|
+
}
|