@clinia/tailwindcss 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/fonts.css ADDED
@@ -0,0 +1,99 @@
1
+ /* ============================================================================
2
+ * Clinia – Font loading
3
+ *
4
+ * Drop this file into your app's global CSS *once* and place the licensed
5
+ * woff2 files at the paths declared below. The package itself does not ship
6
+ * the font binaries — Lineto (CircularXX) and Sharp Type (Gothia Serif)
7
+ * licenses are non-redistributable.
8
+ *
9
+ * Usage in a Next.js or Vite app:
10
+ * 1. Drop the woff2 files in `public/fonts/` (paths must match the URLs below).
11
+ * 2. Import this file from your app's globals.css *before* @clinia/ui's theme:
12
+ * @import "@clinia/ui/fonts";
13
+ * @import "@clinia/ui/styles";
14
+ * 3. Preload the two faces above the fold in your HTML <head>:
15
+ * <link rel="preload" href="/fonts/CircularXX-Book.woff2"
16
+ * as="font" type="font/woff2" crossorigin />
17
+ * <link rel="preload" href="/fonts/CircularXX-Medium.woff2"
18
+ * as="font" type="font/woff2" crossorigin />
19
+ *
20
+ * Why these specific weights:
21
+ * - Pulled directly from the Clinia – Brand Guidelines Figma text styles.
22
+ * - CircularXX: Book (most body), Regular (titles), Medium (labels, eyebrows).
23
+ * - Gothia Serif: Book (Display XL/L), Regular (Huge, Display M/S).
24
+ * - CircularXX Mono: Regular (Eyebrow L/S, Dev Body).
25
+ *
26
+ * Performance:
27
+ * - `font-display: swap` paints fallback first, swaps when the file lands.
28
+ * Avoids invisible text (FOIT). Pairs with the fallback stack tuned in
29
+ * tokens.css.
30
+ * - `unicode-range: U+0000-00FF, U+0131, ...` requests the latin subset only.
31
+ * Cuts ~40% off file size. Drop or extend if you serve other scripts.
32
+ * - Subset your woff2 with `pyftsubset` or `glyphhanger` before deploying.
33
+ * ========================================================================== */
34
+
35
+ /* ---------- CircularXX (UI Sans) ---------------------------------------- */
36
+ @font-face {
37
+ font-family: "CircularXX";
38
+ src: url("/fonts/CircularXXWeb-Book.woff2") format("woff2");
39
+ font-weight: 400;
40
+ font-style: normal;
41
+ font-display: swap;
42
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
43
+ U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC,
44
+ U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
45
+ }
46
+
47
+ @font-face {
48
+ font-family: "CircularXX";
49
+ src: url("/fonts/CircularXXWeb-Regular.woff2") format("woff2");
50
+ font-weight: 450; /* Regular falls between 400/500 in the Lineto cut. */
51
+ font-style: normal;
52
+ font-display: swap;
53
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
54
+ U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC,
55
+ U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
56
+ }
57
+
58
+ @font-face {
59
+ font-family: "CircularXX";
60
+ src: url("/fonts/CircularXXWeb-Medium.woff2") format("woff2");
61
+ font-weight: 500;
62
+ font-style: normal;
63
+ font-display: swap;
64
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
65
+ U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC,
66
+ U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
67
+ }
68
+
69
+ /* ---------- CircularXX Mono --------------------------------------------- */
70
+ @font-face {
71
+ font-family: "CircularXX Mono";
72
+ src: url("/fonts/CircularXXMonoWeb-Regular.woff2") format("woff2");
73
+ font-weight: 400;
74
+ font-style: normal;
75
+ font-display: swap;
76
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+2000-206F, U+2074,
77
+ U+20AC, U+2122, U+FEFF, U+FFFD;
78
+ }
79
+
80
+ /* ---------- Gothia Serif (Display) -------------------------------------- */
81
+ @font-face {
82
+ font-family: "Gothia Serif";
83
+ src: url("/fonts/GothiaSerif-Book.woff2") format("woff2");
84
+ font-weight: 400;
85
+ font-style: normal;
86
+ font-display: swap;
87
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
88
+ U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122, U+FEFF, U+FFFD;
89
+ }
90
+
91
+ @font-face {
92
+ font-family: "Gothia Serif";
93
+ src: url("/fonts/GothiaSerif-Regular.woff2") format("woff2");
94
+ font-weight: 500;
95
+ font-style: normal;
96
+ font-display: swap;
97
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
98
+ U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122, U+FEFF, U+FFFD;
99
+ }
package/package.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@clinia/tailwindcss",
3
+ "version": "0.2.0",
4
+ "description": "Clinia design-system: Tailwind v4 tokens, theme, and style layers.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": [
8
+ "**/*.css"
9
+ ],
10
+ "exports": {
11
+ ".": "./theme.css",
12
+ "./tokens": "./tokens.css",
13
+ "./theme": "./theme.css",
14
+ "./fonts": "./fonts.css",
15
+ "./style-sera": "./style-sera.css",
16
+ "./style-luma": "./style-luma.css"
17
+ },
18
+ "files": [
19
+ "*.css"
20
+ ],
21
+ "peerDependencies": {
22
+ "tailwindcss": ">=4.0.0"
23
+ }
24
+ }
package/style-luma.css ADDED
@@ -0,0 +1,80 @@
1
+ /* ============================================================================
2
+ * Luma — shape layer
3
+ *
4
+ * Rounded geometry. Soft elevation. Breathable layouts. The shape system for
5
+ * Clinia's product surfaces — clinical workflows, search consoles, login,
6
+ * settings. Calmer than Sera, with enough lift to guide the eye through
7
+ * dense interfaces without shouting.
8
+ *
9
+ * Activate by adding `data-style="luma"` to <html> (or any ancestor).
10
+ *
11
+ * Design notes:
12
+ * - radius bumps to 0.875rem — soft but not pill-y.
13
+ * - shadows are subtle but real. Cards earn the lift; popovers earn more.
14
+ * - typography stays sans (no uppercase tracking on buttons). The voice
15
+ * here is calm-and-competent, not editorial.
16
+ * - transitions soften slightly (180ms ease-out) so hover states feel
17
+ * considered, not snappy.
18
+ * ========================================================================== */
19
+
20
+ [data-style="luma"] {
21
+ --radius: 0.875rem;
22
+
23
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.04),
24
+ 0 1px 1px 0 rgb(0 0 0 / 0.03);
25
+ --shadow-md: 0 2px 4px -1px rgb(0 0 0 / 0.06),
26
+ 0 4px 12px -4px rgb(0 0 0 / 0.08);
27
+ --shadow-lg: 0 8px 24px -8px rgb(0 0 0 / 0.12),
28
+ 0 16px 48px -16px rgb(0 0 0 / 0.10);
29
+
30
+ --tracking-display: -0.015em;
31
+ --tracking-eyebrow: 0.08em;
32
+
33
+ --button-text-transform: none;
34
+ --button-letter-spacing: -0.005em;
35
+ }
36
+
37
+ /* Dark mode shadow tuning — increase opacity slightly so elevation reads. */
38
+ .dark[data-style="luma"],
39
+ [data-style="luma"] .dark,
40
+ .dark [data-style="luma"] {
41
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.30),
42
+ 0 1px 1px 0 rgb(0 0 0 / 0.20);
43
+ --shadow-md: 0 2px 4px -1px rgb(0 0 0 / 0.35),
44
+ 0 4px 12px -4px rgb(0 0 0 / 0.25);
45
+ --shadow-lg: 0 8px 24px -8px rgb(0 0 0 / 0.40),
46
+ 0 16px 48px -16px rgb(0 0 0 / 0.30);
47
+ }
48
+
49
+ /* ---------- Component-level expression ---------------------------------- */
50
+ @layer components {
51
+ /* Buttons: subtle hover lift. Pairs with the soft shadow on press. */
52
+ [data-style="luma"] :where(button, [role="button"], a[role="button"]) {
53
+ transition-duration: 180ms;
54
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
55
+ }
56
+
57
+ /* Cards: visible elevation, generous radius. */
58
+ [data-style="luma"] :where(.shadow-sm) {
59
+ box-shadow: var(--shadow-sm);
60
+ }
61
+ [data-style="luma"] :where(.shadow, .shadow-md) {
62
+ box-shadow: var(--shadow-md);
63
+ }
64
+ [data-style="luma"] :where(.shadow-lg) {
65
+ box-shadow: var(--shadow-lg);
66
+ }
67
+
68
+ /* Inputs: softer borders, slight inner shadow for depth. */
69
+ [data-style="luma"] :where(input, textarea, select) {
70
+ transition: border-color 160ms ease, box-shadow 160ms ease;
71
+ }
72
+ [data-style="luma"] :where(input, textarea, select):not(:focus) {
73
+ box-shadow: inset 0 1px 0 0 rgb(0 0 0 / 0.02);
74
+ }
75
+
76
+ /* Headings: confident negative tracking for tighter rhythm. */
77
+ [data-style="luma"] :where(h1, h2, h3) {
78
+ letter-spacing: var(--tracking-display);
79
+ }
80
+ }
package/style-sera.css ADDED
@@ -0,0 +1,75 @@
1
+ /* ============================================================================
2
+ * Sera — shape layer
3
+ *
4
+ * Typography-first, print-inspired. Square corners, uppercase tracking,
5
+ * underlined controls. Built for Clinia's brand surfaces (marketing site,
6
+ * editorial content) where the Gothia Serif + CircularXX + CircularXX Mono
7
+ * pairing carries the visual weight.
8
+ *
9
+ * Activate by adding `data-style="sera"` to <html> (or any ancestor).
10
+ *
11
+ * Design notes:
12
+ * - radius collapses to 0 — every edge is a hairline.
13
+ * - shadows go away. Cards/popovers separate via 1px borders only.
14
+ * - body text inherits sans (CircularXX); headings should set
15
+ * `font-display` (Gothia Serif) at the consumer level.
16
+ * - buttons get tracked, slightly uppercase typography to match the
17
+ * editorial register without committing to ALL CAPS everywhere.
18
+ * - links and ghost buttons receive an offset underline for
19
+ * "underlined controls".
20
+ * ========================================================================== */
21
+
22
+ [data-style="sera"] {
23
+ --radius: 0;
24
+
25
+ --shadow-sm: 0 0 0 1px var(--border);
26
+ --shadow-md: 0 0 0 1px var(--border);
27
+ --shadow-lg: 0 0 0 1px var(--border);
28
+
29
+ --tracking-display: 0;
30
+ --tracking-eyebrow: 0.18em;
31
+
32
+ --button-text-transform: uppercase;
33
+ --button-letter-spacing: 0.08em;
34
+ }
35
+
36
+ /* ---------- Component-level expression ---------------------------------- */
37
+ @layer components {
38
+ /* Buttons: editorial chrome. Default fill keeps the Confident voice;
39
+ uppercase + tracking adds the print-inspired register. */
40
+ [data-style="sera"] :where(button, [role="button"], a[role="button"]) {
41
+ text-transform: var(--button-text-transform);
42
+ letter-spacing: var(--button-letter-spacing);
43
+ font-weight: 500;
44
+ }
45
+
46
+ /* Link variant gets the explicit underline. */
47
+ [data-style="sera"] :where(a:not([role="button"])) {
48
+ text-underline-offset: 4px;
49
+ text-decoration-thickness: 1px;
50
+ }
51
+
52
+ /* Cards: hairline only, no shadow lift. The border and the negative
53
+ space carry the structure. */
54
+ [data-style="sera"] :where(.shadow-sm, .shadow, .shadow-md, .shadow-lg) {
55
+ box-shadow: 0 0 0 1px var(--border);
56
+ }
57
+
58
+ /* Headings: editorial spacing. Tighter line-height, slight tracking. */
59
+ [data-style="sera"] :where(h1, h2, h3) {
60
+ letter-spacing: var(--tracking-display);
61
+ line-height: 1.05;
62
+ }
63
+
64
+ /* Eyebrows already exist as a brand pattern. Sera amps the tracking. */
65
+ [data-style="sera"] :where(.eyebrow, [data-eyebrow]) {
66
+ text-transform: uppercase;
67
+ letter-spacing: var(--tracking-eyebrow);
68
+ font-family: var(--clinia-font-mono);
69
+ }
70
+
71
+ /* Inputs: square, hairline border, no inner shadow. */
72
+ [data-style="sera"] :where(input, textarea, select) {
73
+ box-shadow: none;
74
+ }
75
+ }
package/theme.css ADDED
@@ -0,0 +1,255 @@
1
+ /* ============================================================================
2
+ * Clinia Theme — Tailwind v4
3
+ *
4
+ * Architecture (modern shadcn + Tailwind v4 pattern, with style layering):
5
+ * 1. Raw brand palette + fonts live in `tokens.css` (the brand truth).
6
+ * 2. Semantic *color* tokens (background, foreground, primary, …) are declared
7
+ * here on `:root` (light) and `.dark` (dark) — one shared color truth
8
+ * across every Clinia surface.
9
+ * 3. *Shape* tokens (radii, shadows, spacing density, control treatment) are
10
+ * declared in style layers — `style-sera.css` and `style-luma.css` —
11
+ * and gated by `[data-style="sera"|"luma"]` on the root. Apps pick one;
12
+ * brand sites typically pick Sera, product surfaces pick Luma.
13
+ * 4. `@theme inline` re-exposes the semantic variables to Tailwind so
14
+ * utilities like `bg-primary`, `rounded-md`, etc. resolve correctly and
15
+ * switch with both theme (light/dark) and style (sera/luma).
16
+ *
17
+ * Accessibility:
18
+ * - All text-on-surface pairs target WCAG AA at minimum.
19
+ * - Brand orange (Vital) is paired with deep Infinite text — never white —
20
+ * because white-on-Vital fails AA for normal text (≈3.1:1).
21
+ * - Focus ring uses Vital at 2px to remain visible on any surface.
22
+ *
23
+ * Dark mode: add `class="dark"` to <html> (or any ancestor).
24
+ * Style choice: add `data-style="sera"` or `data-style="luma"` to <html>.
25
+ * No attribute = the neutral default (radius 0.5rem, light shadow).
26
+ * ========================================================================== */
27
+
28
+ @import "tailwindcss";
29
+ @import "./tokens.css";
30
+
31
+ @custom-variant dark (&:is(.dark *));
32
+
33
+ /* ---------- Light theme (default) ---------------------------------------- */
34
+ :root {
35
+ /* Shape defaults — overridden by style layers when [data-style] is set. */
36
+ --radius: 0.5rem;
37
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.04);
38
+ --shadow-md: 0 1px 3px 0 rgb(0 0 0 / 0.06), 0 1px 2px -1px rgb(0 0 0 / 0.04);
39
+ --shadow-lg: 0 8px 24px -8px rgb(0 0 0 / 0.10);
40
+ --tracking-display: -0.01em;
41
+ --tracking-eyebrow: 0.1em;
42
+ --button-text-transform: none;
43
+ --button-letter-spacing: normal;
44
+
45
+ --background: var(--clinia-serene);
46
+ --foreground: var(--clinia-infinite);
47
+
48
+ --card: #ffffff;
49
+ --card-foreground: var(--clinia-infinite);
50
+
51
+ --popover: #ffffff;
52
+ --popover-foreground: var(--clinia-infinite);
53
+
54
+ /* Primary = Infinite (deep brand black) — high-contrast default action. */
55
+ --primary: var(--clinia-infinite);
56
+ --primary-foreground: var(--clinia-serene);
57
+
58
+ /* Secondary = Remedy (warm cream) — low-emphasis surfaces. */
59
+ --secondary: var(--clinia-remedy);
60
+ --secondary-foreground: var(--clinia-infinite);
61
+
62
+ --muted: var(--clinia-remedy);
63
+ --muted-foreground: var(--clinia-infinite-4);
64
+
65
+ /* Accent = Vital orange — brand emphasis, always paired with dark text. */
66
+ --accent: var(--clinia-vital);
67
+ --accent-foreground: var(--clinia-infinite);
68
+
69
+ --destructive: #b91c1c;
70
+ --destructive-foreground: var(--clinia-serene);
71
+
72
+ --success: #2d7d5e;
73
+ --success-foreground: var(--clinia-serene);
74
+
75
+ --warning: var(--clinia-noble);
76
+ --warning-foreground: var(--clinia-infinite);
77
+
78
+ --border: var(--clinia-infinite-1);
79
+ --input: var(--clinia-infinite-1);
80
+ --ring: var(--clinia-vital);
81
+
82
+ /* Chart palette drawn from across the brand families. */
83
+ --chart-1: var(--clinia-vital);
84
+ --chart-2: var(--clinia-thistle);
85
+ --chart-3: var(--clinia-noble);
86
+ --chart-4: var(--clinia-trust);
87
+ --chart-5: var(--clinia-purple-5);
88
+ }
89
+
90
+ /* ---------- Dark theme ---------------------------------------------------- */
91
+ .dark {
92
+ --background: var(--clinia-infinite);
93
+ --foreground: var(--clinia-serene);
94
+
95
+ --card: #232327; /* one stop above --background for surface lift */
96
+ --card-foreground: var(--clinia-serene);
97
+
98
+ --popover: #232327;
99
+ --popover-foreground: var(--clinia-serene);
100
+
101
+ /* On dark, primary inverts: Serene fill + Infinite text. */
102
+ --primary: var(--clinia-serene);
103
+ --primary-foreground: var(--clinia-infinite);
104
+
105
+ --secondary: var(--clinia-infinite-5);
106
+ --secondary-foreground: var(--clinia-serene);
107
+
108
+ --muted: var(--clinia-infinite-5);
109
+ --muted-foreground: var(--clinia-infinite-2);
110
+
111
+ --accent: var(--clinia-vital);
112
+ --accent-foreground: var(--clinia-infinite);
113
+
114
+ --destructive: #ef6b5c;
115
+ --destructive-foreground: var(--clinia-infinite);
116
+
117
+ --success: #4ea985;
118
+ --success-foreground: var(--clinia-infinite);
119
+
120
+ --warning: var(--clinia-beige-5);
121
+ --warning-foreground: var(--clinia-infinite);
122
+
123
+ --border: var(--clinia-infinite-5);
124
+ --input: var(--clinia-infinite-5);
125
+ --ring: var(--clinia-vital);
126
+
127
+ --chart-1: var(--clinia-peach-2);
128
+ --chart-2: var(--clinia-purple-5);
129
+ --chart-3: var(--clinia-beige-5);
130
+ --chart-4: var(--clinia-purple-3);
131
+ --chart-5: var(--clinia-mend);
132
+ }
133
+
134
+ /* ---------- Tailwind theme bridge ---------------------------------------- */
135
+ @theme inline {
136
+ /* Surface + intent colors */
137
+ --color-background: var(--background);
138
+ --color-foreground: var(--foreground);
139
+
140
+ --color-card: var(--card);
141
+ --color-card-foreground: var(--card-foreground);
142
+
143
+ --color-popover: var(--popover);
144
+ --color-popover-foreground: var(--popover-foreground);
145
+
146
+ --color-primary: var(--primary);
147
+ --color-primary-foreground: var(--primary-foreground);
148
+
149
+ --color-secondary: var(--secondary);
150
+ --color-secondary-foreground: var(--secondary-foreground);
151
+
152
+ --color-muted: var(--muted);
153
+ --color-muted-foreground: var(--muted-foreground);
154
+
155
+ --color-accent: var(--accent);
156
+ --color-accent-foreground: var(--accent-foreground);
157
+
158
+ --color-destructive: var(--destructive);
159
+ --color-destructive-foreground: var(--destructive-foreground);
160
+
161
+ --color-success: var(--success);
162
+ --color-success-foreground: var(--success-foreground);
163
+
164
+ --color-warning: var(--warning);
165
+ --color-warning-foreground: var(--warning-foreground);
166
+
167
+ --color-border: var(--border);
168
+ --color-input: var(--input);
169
+ --color-ring: var(--ring);
170
+
171
+ --color-chart-1: var(--chart-1);
172
+ --color-chart-2: var(--chart-2);
173
+ --color-chart-3: var(--chart-3);
174
+ --color-chart-4: var(--chart-4);
175
+ --color-chart-5: var(--chart-5);
176
+
177
+ /* Direct access to raw brand swatches when explicitly needed. */
178
+ --color-brand-vital: var(--clinia-vital);
179
+ --color-brand-infinite: var(--clinia-infinite);
180
+ --color-brand-serene: var(--clinia-serene);
181
+ --color-brand-noble: var(--clinia-noble);
182
+ --color-brand-thistle: var(--clinia-thistle);
183
+ --color-brand-mend: var(--clinia-mend);
184
+ --color-brand-trust: var(--clinia-trust);
185
+
186
+ /* Radius scale derived from a single base. */
187
+ --radius-sm: calc(var(--radius) - 4px);
188
+ --radius-md: calc(var(--radius) - 2px);
189
+ --radius-lg: var(--radius);
190
+ --radius-xl: calc(var(--radius) + 4px);
191
+
192
+ /* Type scale — names mirror the Figma styles for traceability. */
193
+ --font-display: var(--clinia-font-display);
194
+ --font-sans: var(--clinia-font-sans);
195
+ --font-mono: var(--clinia-font-mono);
196
+
197
+ --text-display-xl: 6rem; /* 96 / Display XL */
198
+ --text-display-l: 5.5rem; /* 88 / Display L */
199
+ --text-display-m: 4.5rem; /* 72 / Display M */
200
+ --text-display-s: 3.5rem; /* 56 / Display S */
201
+ --text-title-xl: 5rem; /* 80 / Title XL */
202
+ --text-title-l: 4rem; /* 64 / Title L */
203
+ --text-title-m: 2.5rem; /* 40 / Title M */
204
+ --text-title-s: 2rem; /* 32 / Title S */
205
+ --text-title-xs: 1.5rem; /* 24 / Title XS */
206
+ --text-body-xl: 2rem; /* 32 / Body XL */
207
+ --text-body-l: 1.5rem; /* 24 / Body L */
208
+ --text-body-m: 1rem; /* 16 / Body M */
209
+ --text-body-s: 0.875rem; /* 14 / Body S */
210
+ --text-body-xs: 0.75rem; /* 12 / Body XS */
211
+ --text-eyebrow-l: 1rem; /* 16 / Eyebrow L */
212
+ --text-eyebrow-s: 0.625rem; /* 10 / Eyebrow S */
213
+ }
214
+
215
+ /* ---------- Base reset --------------------------------------------------- */
216
+ @layer base {
217
+ * {
218
+ border-color: var(--border);
219
+ }
220
+
221
+ html {
222
+ color-scheme: light;
223
+ font-family: var(--clinia-font-sans);
224
+ }
225
+
226
+ html.dark {
227
+ color-scheme: dark;
228
+ }
229
+
230
+ body {
231
+ background-color: var(--background);
232
+ color: var(--foreground);
233
+ -webkit-font-smoothing: antialiased;
234
+ -moz-osx-font-smoothing: grayscale;
235
+ text-rendering: optimizeLegibility;
236
+ }
237
+
238
+ :focus-visible {
239
+ outline: 2px solid var(--ring);
240
+ outline-offset: 2px;
241
+ border-radius: 2px;
242
+ }
243
+
244
+ /* Honor reduced-motion preference everywhere by default. */
245
+ @media (prefers-reduced-motion: reduce) {
246
+ *,
247
+ *::before,
248
+ *::after {
249
+ animation-duration: 0.01ms !important;
250
+ animation-iteration-count: 1 !important;
251
+ transition-duration: 0.01ms !important;
252
+ scroll-behavior: auto !important;
253
+ }
254
+ }
255
+ }
package/tokens.css ADDED
@@ -0,0 +1,58 @@
1
+ /* ============================================================================
2
+ * Clinia Brand Tokens
3
+ * Source: Clinia – Brand Guidelines (Figma)
4
+ * https://www.figma.com/design/aF7fTYG31l7DcKdySyk6yH
5
+ *
6
+ * These are the raw brand values pulled from the Figma paint + text styles.
7
+ * Do NOT use these directly in components — consume the semantic tokens in
8
+ * `theme.css` (e.g., `--color-primary`, `--color-accent`) so light/dark
9
+ * theming and accessibility guarantees remain intact.
10
+ * ========================================================================== */
11
+
12
+ @layer base {
13
+ :root {
14
+ /* --- Foundation ------------------------------------------------------ */
15
+ --clinia-infinite: #1a1a1e; /* Brand black — anchors the system */
16
+ --clinia-infinite-5: #333333;
17
+ --clinia-infinite-4: #666666;
18
+ --clinia-infinite-3: #999999;
19
+ --clinia-infinite-2: #cdcdcd;
20
+ --clinia-infinite-1: #e2e2e2;
21
+
22
+ /* --- Beige / Tan (warm neutrals) ------------------------------------ */
23
+ --clinia-serene: #fffdf9; /* Brand cream — page background */
24
+ --clinia-remedy: #fcf8ef;
25
+ --clinia-beige-3: #f1e3cb;
26
+ --clinia-remedy-dark: #ecd9b9;
27
+ --clinia-beige-5: #dbbe87;
28
+ --clinia-noble: #cca44f;
29
+
30
+ /* --- Purple (cool accent family) ------------------------------------ */
31
+ --clinia-purple-1: #faf7ff;
32
+ --clinia-aura: #f8f1ff;
33
+ --clinia-purple-3: #ede5f6;
34
+ --clinia-thistle: #e3daed;
35
+ --clinia-purple-5: #cabbdb;
36
+ --clinia-purple-6: #b3a0ae;
37
+
38
+ /* --- Peach / Orange (warm accent family) ---------------------------- */
39
+ --clinia-mend: #ffccaf;
40
+ --clinia-peach-2: #fd945f;
41
+ --clinia-vital: #ff5c00; /* Brand orange — flagship accent */
42
+ --clinia-peach-4: #cb6a3d;
43
+ --clinia-peach-5: #b3724c;
44
+ --clinia-trust: #95795c;
45
+
46
+ /* --- Typography ------------------------------------------------------
47
+ * Gothia Serif and CircularXX are licensed fonts. Self-host the .woff2
48
+ * files via @font-face in your app's CSS or use a hosting provider.
49
+ * Fallbacks are tuned to keep editorial vs. UI character distinct.
50
+ * ----------------------------------------------------------------- */
51
+ --clinia-font-display: "Gothia Serif", "GT Sectra", "Tiempos Headline",
52
+ Georgia, "Times New Roman", serif;
53
+ --clinia-font-sans: "CircularXX", "Inter", -apple-system, BlinkMacSystemFont,
54
+ "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
55
+ --clinia-font-mono: "CircularXX Mono", "JetBrains Mono", ui-monospace,
56
+ SFMono-Regular, Menlo, Consolas, monospace;
57
+ }
58
+ }