@bubble-design-system/ui 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.
@@ -0,0 +1,2122 @@
1
+ /* === tokens.css === */
2
+ /* ─────────────────────────────────────────────────────────
3
+ bubble · design tokens
4
+ Layer 1: primitives (raw values)
5
+ Layer 2: semantics (purpose-bound)
6
+ Layer 3: component (only when semantics don't fit)
7
+
8
+ Tone axis (`[data-tone]`, default `soft`):
9
+ · soft — signature look: gray page, white floating pills,
10
+ layered shadows w/ inset highlight, pill controls
11
+ · vivid — flat shadcn-like: white surfaces, single-layer shadows
12
+ · pastel — warm desaturated, off-white surfaces
13
+ ───────────────────────────────────────────────────────── */
14
+
15
+ :root {
16
+ /* ── neutrals: cool slate (default) ─────────────────── */
17
+ --slate-50: #F8FAFC;
18
+ --slate-100: #F1F5F9;
19
+ --slate-200: #E2E8F0;
20
+ --slate-300: #CBD5E1;
21
+ --slate-400: #94A3B8;
22
+ --slate-500: #64748B;
23
+ --slate-600: #475569;
24
+ --slate-700: #334155;
25
+ --slate-800: #1E293B;
26
+ --slate-900: #0F172A;
27
+ --slate-950: #020617;
28
+
29
+ /* ── neutrals: true neutral ─────────────────────────── */
30
+ --neutral-50: #FAFAFA;
31
+ --neutral-100: #F5F5F5;
32
+ --neutral-200: #E5E5E5;
33
+ --neutral-300: #D4D4D4;
34
+ --neutral-400: #A3A3A3;
35
+ --neutral-500: #737373;
36
+ --neutral-600: #525252;
37
+ --neutral-700: #404040;
38
+ --neutral-800: #262626;
39
+ --neutral-900: #171717;
40
+ --neutral-950: #0A0A0A;
41
+
42
+ /* ── neutrals: warm stone ───────────────────────────── */
43
+ --stone-50: #FAFAF9;
44
+ --stone-100: #F5F5F4;
45
+ --stone-200: #E7E5E4;
46
+ --stone-300: #D6D3D1;
47
+ --stone-400: #A8A29E;
48
+ --stone-500: #78716C;
49
+ --stone-600: #57534E;
50
+ --stone-700: #44403C;
51
+ --stone-800: #292524;
52
+ --stone-900: #1C1917;
53
+ --stone-950: #0C0A09;
54
+
55
+ /* ── brand: blue (default, anchored on #1D4ED8) ─────── */
56
+ --blue-50: #EFF6FF;
57
+ --blue-100: #DBEAFE;
58
+ --blue-200: #BFDBFE;
59
+ --blue-300: #93C5FD;
60
+ --blue-400: #60A5FA;
61
+ --blue-500: #3B82F6;
62
+ --blue-600: #1D4ED8;
63
+ --blue-700: #1E40AF;
64
+ --blue-800: #1E3A8A;
65
+ --blue-900: #172554;
66
+ --blue-950: #0B1336;
67
+
68
+ /* ── brand: violet ──────────────────────────────────── */
69
+ --violet-50: #F5F3FF;
70
+ --violet-100: #EDE9FE;
71
+ --violet-200: #DDD6FE;
72
+ --violet-300: #C4B5FD;
73
+ --violet-400: #A78BFA;
74
+ --violet-500: #8B5CF6;
75
+ --violet-600: #6D28D9;
76
+ --violet-700: #5B21B6;
77
+ --violet-800: #4C1D95;
78
+ --violet-900: #3B0764;
79
+ --violet-950: #2A0556;
80
+
81
+ /* ── brand: emerald ─────────────────────────────────── */
82
+ --emerald-50: #ECFDF5;
83
+ --emerald-100: #D1FAE5;
84
+ --emerald-200: #A7F3D0;
85
+ --emerald-300: #6EE7B7;
86
+ --emerald-400: #34D399;
87
+ --emerald-500: #10B981;
88
+ --emerald-600: #047857;
89
+ --emerald-700: #065F46;
90
+ --emerald-800: #064E3B;
91
+ --emerald-900: #022C22;
92
+ --emerald-950: #011D18;
93
+
94
+ /* ── brand: orange ──────────────────────────────────── */
95
+ --orange-50: #FFF7ED;
96
+ --orange-100: #FFEDD5;
97
+ --orange-200: #FED7AA;
98
+ --orange-300: #FDBA74;
99
+ --orange-400: #FB923C;
100
+ --orange-500: #F97316;
101
+ --orange-600: #C2410C;
102
+ --orange-700: #9A3412;
103
+ --orange-800: #7C2D12;
104
+ --orange-900: #431407;
105
+ --orange-950: #2A0D04;
106
+
107
+ /* ── brand: mono (uses neutrals) ────────────────────── */
108
+ /* mono-* are aliased per gray family below */
109
+
110
+ /* ── semantic palette: green ────────────────────────── */
111
+ --green-50: #F0FDF4;
112
+ --green-100: #DCFCE7;
113
+ --green-200: #BBF7D0;
114
+ --green-300: #86EFAC;
115
+ --green-400: #4ADE80;
116
+ --green-500: #22C55E;
117
+ --green-600: #16A34A;
118
+ --green-700: #15803D;
119
+ --green-800: #166534;
120
+ --green-900: #14532D;
121
+ --green-950: #052E16;
122
+
123
+ /* ── semantic palette: amber ────────────────────────── */
124
+ --amber-50: #FFFBEB;
125
+ --amber-100: #FEF3C7;
126
+ --amber-200: #FDE68A;
127
+ --amber-300: #FCD34D;
128
+ --amber-400: #FBBF24;
129
+ --amber-500: #F59E0B;
130
+ --amber-600: #D97706;
131
+ --amber-700: #B45309;
132
+ --amber-800: #92400E;
133
+ --amber-900: #78350F;
134
+ --amber-950: #451A03;
135
+
136
+ /* ── semantic palette: red ──────────────────────────── */
137
+ --red-50: #FEF2F2;
138
+ --red-100: #FEE2E2;
139
+ --red-200: #FECACA;
140
+ --red-300: #FCA5A5;
141
+ --red-400: #F87171;
142
+ --red-500: #EF4444;
143
+ --red-600: #DC2626;
144
+ --red-700: #B91C1C;
145
+ --red-800: #991B1B;
146
+ --red-900: #7F1D1D;
147
+ --red-950: #450A0A;
148
+
149
+ /* ── pure ───────────────────────────────────────────── */
150
+ --white: #FFFFFF;
151
+ --black: #000000;
152
+ }
153
+
154
+ /* ─────────────────────────────────────────────────────────
155
+ gray-family aliases — selected via [data-gray]
156
+ ───────────────────────────────────────────────────────── */
157
+ :root,
158
+ [data-gray="slate"] {
159
+ --gray-50: var(--slate-50);
160
+ --gray-100: var(--slate-100);
161
+ --gray-200: var(--slate-200);
162
+ --gray-300: var(--slate-300);
163
+ --gray-400: var(--slate-400);
164
+ --gray-500: var(--slate-500);
165
+ --gray-600: var(--slate-600);
166
+ --gray-700: var(--slate-700);
167
+ --gray-800: var(--slate-800);
168
+ --gray-900: var(--slate-900);
169
+ --gray-950: var(--slate-950);
170
+ }
171
+ [data-gray="neutral"] {
172
+ --gray-50: var(--neutral-50);
173
+ --gray-100: var(--neutral-100);
174
+ --gray-200: var(--neutral-200);
175
+ --gray-300: var(--neutral-300);
176
+ --gray-400: var(--neutral-400);
177
+ --gray-500: var(--neutral-500);
178
+ --gray-600: var(--neutral-600);
179
+ --gray-700: var(--neutral-700);
180
+ --gray-800: var(--neutral-800);
181
+ --gray-900: var(--neutral-900);
182
+ --gray-950: var(--neutral-950);
183
+ }
184
+ [data-gray="stone"] {
185
+ --gray-50: var(--stone-50);
186
+ --gray-100: var(--stone-100);
187
+ --gray-200: var(--stone-200);
188
+ --gray-300: var(--stone-300);
189
+ --gray-400: var(--stone-400);
190
+ --gray-500: var(--stone-500);
191
+ --gray-600: var(--stone-600);
192
+ --gray-700: var(--stone-700);
193
+ --gray-800: var(--stone-800);
194
+ --gray-900: var(--stone-900);
195
+ --gray-950: var(--stone-950);
196
+ }
197
+
198
+ /* ─────────────────────────────────────────────────────────
199
+ brand aliases — selected via [data-brand]
200
+ ───────────────────────────────────────────────────────── */
201
+ :root,
202
+ [data-brand="blue"] {
203
+ --brand-50: var(--blue-50);
204
+ --brand-100: var(--blue-100);
205
+ --brand-200: var(--blue-200);
206
+ --brand-300: var(--blue-300);
207
+ --brand-400: var(--blue-400);
208
+ --brand-500: var(--blue-500);
209
+ --brand-600: var(--blue-600);
210
+ --brand-700: var(--blue-700);
211
+ --brand-800: var(--blue-800);
212
+ --brand-900: var(--blue-900);
213
+ --brand-950: var(--blue-950);
214
+ }
215
+ [data-brand="violet"] {
216
+ --brand-50: var(--violet-50);
217
+ --brand-100: var(--violet-100);
218
+ --brand-200: var(--violet-200);
219
+ --brand-300: var(--violet-300);
220
+ --brand-400: var(--violet-400);
221
+ --brand-500: var(--violet-500);
222
+ --brand-600: var(--violet-600);
223
+ --brand-700: var(--violet-700);
224
+ --brand-800: var(--violet-800);
225
+ --brand-900: var(--violet-900);
226
+ --brand-950: var(--violet-950);
227
+ }
228
+ [data-brand="emerald"] {
229
+ --brand-50: var(--emerald-50);
230
+ --brand-100: var(--emerald-100);
231
+ --brand-200: var(--emerald-200);
232
+ --brand-300: var(--emerald-300);
233
+ --brand-400: var(--emerald-400);
234
+ --brand-500: var(--emerald-500);
235
+ --brand-600: var(--emerald-600);
236
+ --brand-700: var(--emerald-700);
237
+ --brand-800: var(--emerald-800);
238
+ --brand-900: var(--emerald-900);
239
+ --brand-950: var(--emerald-950);
240
+ }
241
+ [data-brand="orange"] {
242
+ --brand-50: var(--orange-50);
243
+ --brand-100: var(--orange-100);
244
+ --brand-200: var(--orange-200);
245
+ --brand-300: var(--orange-300);
246
+ --brand-400: var(--orange-400);
247
+ --brand-500: var(--orange-500);
248
+ --brand-600: var(--orange-600);
249
+ --brand-700: var(--orange-700);
250
+ --brand-800: var(--orange-800);
251
+ --brand-900: var(--orange-900);
252
+ --brand-950: var(--orange-950);
253
+ }
254
+ [data-brand="mono"] {
255
+ --brand-50: var(--gray-50);
256
+ --brand-100: var(--gray-100);
257
+ --brand-200: var(--gray-200);
258
+ --brand-300: var(--gray-300);
259
+ --brand-400: var(--gray-400);
260
+ --brand-500: var(--gray-500);
261
+ --brand-600: var(--gray-900);
262
+ --brand-700: var(--gray-950);
263
+ --brand-800: var(--black);
264
+ --brand-900: var(--black);
265
+ --brand-950: var(--black);
266
+ }
267
+ [data-brand="teal"] {
268
+ --brand-50: #E2FBFA;
269
+ --brand-100: #B8F4F1;
270
+ --brand-200: #8AECE7;
271
+ --brand-300: #4DDFD9;
272
+ --brand-400: #14D2CB;
273
+ --brand-500: #00CEC8;
274
+ --brand-600: #00CEC8;
275
+ --brand-700: #009E99;
276
+ --brand-800: #007570;
277
+ --brand-900: #004B48;
278
+ --brand-950: #002523;
279
+ }
280
+
281
+ /* ─────────────────────────────────────────────────────────
282
+ Semantic tokens — LIGHT (default)
283
+ ───────────────────────────────────────────────────────── */
284
+ :root {
285
+ /* background */
286
+ --color-bg-page: var(--color-bg-primary);
287
+ --color-bg-primary: var(--white);
288
+ --color-bg-secondary: var(--gray-50);
289
+ --color-bg-tertiary: var(--gray-100);
290
+ --color-bg-inverse: var(--gray-900);
291
+
292
+ --color-bg-brand: var(--brand-600);
293
+ --color-bg-brand-hover: var(--brand-700);
294
+ --color-bg-brand-active: var(--brand-800);
295
+ --color-bg-brand-subtle: var(--brand-50);
296
+
297
+ --color-bg-success: var(--green-50);
298
+ --color-bg-success-strong: var(--green-600);
299
+ --color-bg-warning: var(--amber-50);
300
+ --color-bg-warning-strong: var(--amber-500);
301
+ --color-bg-danger: var(--red-50);
302
+ --color-bg-danger-strong: var(--red-600);
303
+ --color-bg-danger-hover: var(--red-700);
304
+ --color-bg-info: var(--brand-50);
305
+
306
+ --color-bg-hover: var(--gray-100);
307
+ --color-bg-pressed: var(--gray-200);
308
+ --color-bg-disabled: var(--gray-100);
309
+
310
+ /* text */
311
+ --color-text-primary: var(--gray-900);
312
+ --color-text-secondary: var(--gray-600);
313
+ --color-text-tertiary: var(--gray-400);
314
+ --color-text-disabled: var(--gray-300);
315
+ --color-text-inverse: var(--white);
316
+
317
+ --color-text-brand: var(--brand-700);
318
+ --color-text-success: var(--green-700);
319
+ --color-text-warning: var(--amber-700);
320
+ --color-text-danger: var(--red-700);
321
+
322
+ --color-text-on-brand: var(--white);
323
+ --color-text-on-danger: var(--white);
324
+ --color-text-on-success: var(--white);
325
+
326
+ /* border */
327
+ --color-border-primary: var(--gray-300);
328
+ --color-border-secondary: var(--gray-200);
329
+ --color-border-tertiary: var(--gray-100);
330
+ --color-border-brand: var(--brand-600);
331
+ --color-border-success: var(--green-200);
332
+ --color-border-warning: var(--amber-200);
333
+ --color-border-danger: var(--red-200);
334
+ --color-border-focus: var(--brand-600);
335
+
336
+ /* shadow */
337
+ --shadow-xs: 0 1px 2px 0 rgba(15, 23, 42, 0.04);
338
+ --shadow-sm: 0 1px 2px 0 rgba(15, 23, 42, 0.05), 0 1px 1px -1px rgba(15, 23, 42, 0.04);
339
+ --shadow-md: 0 4px 6px -1px rgba(15, 23, 42, 0.06), 0 2px 4px -2px rgba(15, 23, 42, 0.04);
340
+ --shadow-lg: 0 10px 15px -3px rgba(15, 23, 42, 0.08), 0 4px 6px -4px rgba(15, 23, 42, 0.04);
341
+ --shadow-xl: 0 20px 25px -5px rgba(15, 23, 42, 0.10), 0 8px 10px -6px rgba(15, 23, 42, 0.04);
342
+ --shadow-focus: 0 0 0 3px var(--brand-100);
343
+
344
+ /* code surface */
345
+ --color-code-bg: var(--gray-50);
346
+ --color-code-border: var(--gray-200);
347
+ --color-code-text: var(--gray-800);
348
+
349
+ /* signature gradient — used for the brand blob + AI/featured accents.
350
+ Always present regardless of tone; soft tone leans on it most. */
351
+ --gradient-accent: linear-gradient(135deg,
352
+ #FF8A9E 0%,
353
+ #FF6BA5 25%,
354
+ #C760D9 55%,
355
+ #8B6BE8 100%);
356
+ --gradient-accent-soft: linear-gradient(135deg,
357
+ rgba(255, 138, 158, 0.18) 0%,
358
+ rgba(199, 96, 217, 0.16) 50%,
359
+ rgba(139, 107, 232, 0.18) 100%);
360
+
361
+ /* control radius — pill-first in soft, default otherwise */
362
+ --ctrl-radius: var(--radius-md);
363
+ }
364
+
365
+ /* ─────────────────────────────────────────────────────────
366
+ Semantic tokens — DARK
367
+ ───────────────────────────────────────────────────────── */
368
+ [data-theme="dark"] {
369
+ --color-bg-primary: var(--gray-950);
370
+ --color-bg-secondary: var(--gray-900);
371
+ --color-bg-tertiary: var(--gray-800);
372
+ --color-bg-inverse: var(--gray-50);
373
+
374
+ --color-bg-brand: var(--brand-500);
375
+ --color-bg-brand-hover: var(--brand-400);
376
+ --color-bg-brand-active: var(--brand-300);
377
+ --color-bg-brand-subtle: color-mix(in srgb, var(--brand-500) 14%, transparent);
378
+
379
+ --color-bg-success: color-mix(in srgb, var(--green-500) 14%, transparent);
380
+ --color-bg-success-strong: var(--green-500);
381
+ --color-bg-warning: color-mix(in srgb, var(--amber-500) 14%, transparent);
382
+ --color-bg-warning-strong: var(--amber-400);
383
+ --color-bg-danger: color-mix(in srgb, var(--red-500) 14%, transparent);
384
+ --color-bg-danger-strong: var(--red-500);
385
+ --color-bg-danger-hover: var(--red-400);
386
+ --color-bg-info: color-mix(in srgb, var(--brand-500) 14%, transparent);
387
+
388
+ --color-bg-hover: var(--gray-800);
389
+ --color-bg-pressed: var(--gray-700);
390
+ --color-bg-disabled: var(--gray-800);
391
+
392
+ --color-text-primary: var(--gray-50);
393
+ --color-text-secondary: var(--gray-400);
394
+ --color-text-tertiary: var(--gray-500);
395
+ --color-text-disabled: var(--gray-700);
396
+ --color-text-inverse: var(--gray-950);
397
+
398
+ --color-text-brand: var(--brand-400);
399
+ --color-text-success: var(--green-400);
400
+ --color-text-warning: var(--amber-400);
401
+ --color-text-danger: var(--red-400);
402
+
403
+ --color-text-on-brand: var(--gray-950);
404
+ --color-text-on-danger: var(--white);
405
+ --color-text-on-success: var(--gray-950);
406
+
407
+ --color-border-primary: var(--gray-700);
408
+ --color-border-secondary: var(--gray-800);
409
+ --color-border-tertiary: var(--gray-800);
410
+ --color-border-brand: var(--brand-400);
411
+ --color-border-success: color-mix(in srgb, var(--green-500) 30%, transparent);
412
+ --color-border-warning: color-mix(in srgb, var(--amber-500) 30%, transparent);
413
+ --color-border-danger: color-mix(in srgb, var(--red-500) 30%, transparent);
414
+ --color-border-focus: var(--brand-400);
415
+
416
+ --shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.5);
417
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.6), 0 1px 1px -1px rgba(0, 0, 0, 0.5);
418
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.5), 0 2px 4px -2px rgba(0, 0, 0, 0.4);
419
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.6), 0 4px 6px -4px rgba(0, 0, 0, 0.4);
420
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.7), 0 8px 10px -6px rgba(0, 0, 0, 0.4);
421
+ --shadow-focus: 0 0 0 3px color-mix(in srgb, var(--brand-400) 35%, transparent);
422
+
423
+ --color-code-bg: var(--gray-900);
424
+ --color-code-border: var(--gray-800);
425
+ --color-code-text: var(--gray-200);
426
+ }
427
+
428
+ /* "mono" brand needs special treatment in dark so it stays visible */
429
+ [data-theme="dark"][data-brand="mono"] {
430
+ --color-bg-brand: var(--gray-50);
431
+ --color-bg-brand-hover: var(--gray-100);
432
+ --color-bg-brand-active: var(--gray-200);
433
+ --color-text-on-brand: var(--gray-950);
434
+ --color-text-brand: var(--gray-50);
435
+ --color-border-brand: var(--gray-50);
436
+ }
437
+
438
+ /* "teal" anchor (#00CEC8) is too light for white text — force dark text on brand */
439
+ :root[data-brand="teal"] {
440
+ --color-text-on-brand: var(--gray-950);
441
+ }
442
+ [data-theme="dark"][data-brand="teal"] {
443
+ --color-bg-brand: var(--brand-500);
444
+ --color-bg-brand-hover: var(--brand-400);
445
+ --color-bg-brand-active: var(--brand-300);
446
+ --color-text-on-brand: var(--gray-950);
447
+ --color-text-brand: var(--brand-400);
448
+ --color-border-brand: var(--brand-500);
449
+ }
450
+
451
+ /* ═════════════════════════════════════════════════════════
452
+ Tone axis — vivid (flat) · pastel (dusty) · soft (signature)
453
+ `vivid` is the implicit default produced by the primitives
454
+ above. `pastel` and `soft` retune the slate/neutral/stone +
455
+ semantic palettes; `soft` additionally swaps surface model
456
+ (gray page, white floating pills) and shadow stack (layered
457
+ with inset white highlight).
458
+ ═════════════════════════════════════════════════════════ */
459
+
460
+ /* ─── pastel ─────────────────────────────────────────────── */
461
+ [data-tone="pastel"] {
462
+ --slate-50: #F6F7F9; --slate-100: #EBEEF3; --slate-200: #DDE1E9;
463
+ --slate-300: #C1C7D3; --slate-400: #8E96A7; --slate-500: #686F82;
464
+ --slate-600: #4E5667; --slate-700: #3C4250; --slate-800: #272C38;
465
+ --slate-900: #161A24; --slate-950: #0A0D14;
466
+
467
+ --neutral-50: #F8F7F5; --neutral-100: #EFEDEA; --neutral-200: #E0DDD9;
468
+ --neutral-300: #C8C5BF; --neutral-400: #9D9A93; --neutral-500: #757269;
469
+ --neutral-600: #56544D; --neutral-700: #41403A; --neutral-800: #2A2926;
470
+ --neutral-900: #1A1A18; --neutral-950: #0D0D0B;
471
+
472
+ --stone-50: #F8F6F2; --stone-100: #EFECE5; --stone-200: #E1DBD0;
473
+ --stone-300: #CAC2B3; --stone-400: #A19888; --stone-500: #7A7263;
474
+ --stone-600: #5A5447; --stone-700: #443F35; --stone-800: #2B2822;
475
+ --stone-900: #1A1814; --stone-950: #0D0B09;
476
+
477
+ --green-50: #EEF6EF; --green-500: #66A26F; --green-600: #568D5E; --green-700: #45724B;
478
+ --amber-50: #FBF4E1; --amber-400: #D5A741; --amber-500: #C19234; --amber-700: #855F23;
479
+ --red-50: #FAEBEA; --red-500: #BE584F; --red-600: #A8463F; --red-700: #883831;
480
+ }
481
+
482
+ /* pastel · light — warm off-white surfaces, softer shadows */
483
+ [data-tone="pastel"]:not([data-theme="dark"]) {
484
+ --color-bg-primary: #FBFAF7;
485
+ --color-bg-secondary: #F4F2EC;
486
+ --color-bg-tertiary: #EBE8DF;
487
+ --color-bg-page: var(--color-bg-primary);
488
+
489
+ --shadow-xs: 0 1px 2px 0 rgba(50, 47, 38, 0.04);
490
+ --shadow-sm: 0 1px 2px 0 rgba(50, 47, 38, 0.05), 0 1px 1px -1px rgba(50, 47, 38, 0.04);
491
+ --shadow-md: 0 4px 8px -2px rgba(50, 47, 38, 0.06), 0 2px 4px -2px rgba(50, 47, 38, 0.04);
492
+ --shadow-lg: 0 10px 18px -4px rgba(50, 47, 38, 0.08), 0 4px 6px -4px rgba(50, 47, 38, 0.04);
493
+ --shadow-xl: 0 20px 28px -6px rgba(50, 47, 38, 0.10), 0 8px 10px -6px rgba(50, 47, 38, 0.04);
494
+ }
495
+ [data-tone="pastel"][data-gray="stone"]:not([data-theme="dark"]) {
496
+ --color-bg-primary: #FBF9F4;
497
+ --color-bg-secondary: #F3EFE5;
498
+ --color-bg-tertiary: #E9E3D4;
499
+ }
500
+
501
+ /* ─── soft (signature look) ──────────────────────────────── */
502
+ [data-tone="soft"] {
503
+ --slate-50: #F6F7F8; --slate-100: #ECEDF0; --slate-200: #DCDEE3;
504
+ --slate-300: #BCC0C9; --slate-400: #8C92A0; --slate-500: #666C7B;
505
+ --slate-600: #4C5263; --slate-700: #3A3F4D; --slate-800: #262A35;
506
+ --slate-900: #181B23; --slate-950: #0C0E13;
507
+
508
+ --neutral-50: #F7F7F6; --neutral-100: #EDEDEB; --neutral-200: #DEDDDA;
509
+ --neutral-300: #C5C4BF; --neutral-400: #99988F; --neutral-500: #71706A;
510
+ --neutral-600: #555450; --neutral-700: #41403D; --neutral-800: #2A2A28;
511
+ --neutral-900: #1A1A18; --neutral-950: #0D0D0C;
512
+
513
+ --stone-50: #F8F6F2; --stone-100: #F0EDE6; --stone-200: #E2DDD2;
514
+ --stone-300: #CDC5B4; --stone-400: #A09683; --stone-500: #777060;
515
+ --stone-600: #595348; --stone-700: #443F37; --stone-800: #2B2823;
516
+ --stone-900: #1A1815; --stone-950: #0E0C0A;
517
+
518
+ /* soft status ramps — vivid but warm */
519
+ --green-50: #E8F8EF; --green-500: #46B47C; --green-600: #38A06A; --green-700: #2A8054;
520
+ --amber-50: #FFF8E0; --amber-400: #F5BC2E; --amber-500: #E8A716; --amber-700: #9C6E0E;
521
+ --red-50: #FFEDEC; --red-500: #ED5E5B; --red-600: #D6443F; --red-700: #AB3531;
522
+
523
+ /* pill controls */
524
+ --ctrl-radius: 9999px;
525
+ }
526
+
527
+ /* soft · light — gray page, white floating pills, layered shadow w/ inset highlight */
528
+ [data-tone="soft"]:not([data-theme="dark"]) {
529
+ --color-bg-primary: #FFFFFF;
530
+ --color-bg-secondary: #ECEDEF;
531
+ --color-bg-tertiary: #E1E2E6;
532
+ --color-bg-page: #ECEDEF;
533
+
534
+ --color-bg-brand-subtle: color-mix(in srgb, var(--brand-500) 14%, white);
535
+ --color-bg-success: #E8F6EE;
536
+ --color-bg-warning: #FFF6DC;
537
+ --color-bg-danger: #FFE8E6;
538
+ --color-bg-info: #ECF1FF;
539
+
540
+ --color-border-primary: #DCDEE3;
541
+ --color-border-secondary: #E6E8EB;
542
+ --color-border-tertiary: #EFF0F2;
543
+
544
+ /* the signature layered shadows — md/lg/xl carry an inset white top-highlight */
545
+ --shadow-xs: 0 1px 2px 0 rgba(20, 24, 34, 0.04);
546
+ --shadow-sm: 0 1px 2px 0 rgba(20, 24, 34, 0.05),
547
+ 0 1px 3px 0 rgba(20, 24, 34, 0.04);
548
+ --shadow-md: 0 2px 4px -1px rgba(20, 24, 34, 0.05),
549
+ 0 6px 16px -4px rgba(20, 24, 34, 0.08),
550
+ 0 1px 1px 0 rgba(255, 255, 255, 0.65) inset;
551
+ --shadow-lg: 0 4px 6px -2px rgba(20, 24, 34, 0.06),
552
+ 0 12px 24px -8px rgba(20, 24, 34, 0.10),
553
+ 0 1px 1px 0 rgba(255, 255, 255, 0.70) inset;
554
+ --shadow-xl: 0 6px 10px -2px rgba(20, 24, 34, 0.07),
555
+ 0 20px 40px -12px rgba(20, 24, 34, 0.14),
556
+ 0 1px 1px 0 rgba(255, 255, 255, 0.70) inset;
557
+ --shadow-focus: 0 0 0 4px color-mix(in srgb, var(--brand-500) 18%, transparent);
558
+ }
559
+
560
+ [data-tone="soft"][data-theme="dark"] {
561
+ --color-bg-primary: var(--gray-900);
562
+ --color-bg-secondary: var(--gray-950);
563
+ --color-bg-tertiary: var(--gray-800);
564
+ --color-bg-page: var(--gray-950);
565
+
566
+ --shadow-md: 0 2px 4px -1px rgba(0, 0, 0, 0.40),
567
+ 0 6px 16px -4px rgba(0, 0, 0, 0.50),
568
+ 0 1px 0 0 rgba(255, 255, 255, 0.04) inset;
569
+ --shadow-lg: 0 4px 6px -2px rgba(0, 0, 0, 0.45),
570
+ 0 12px 24px -8px rgba(0, 0, 0, 0.60),
571
+ 0 1px 0 0 rgba(255, 255, 255, 0.05) inset;
572
+ }
573
+
574
+ /* ─────────────────────────────────────────────────────────
575
+ Typography scale (rem-based, root = 16px)
576
+ ───────────────────────────────────────────────────────── */
577
+ :root {
578
+ --font-size-xs: 0.75rem; /* 12 */
579
+ --font-size-sm: 0.875rem; /* 14 */
580
+ --font-size-md: 1rem; /* 16 */
581
+ --font-size-lg: 1.125rem; /* 18 */
582
+ --font-size-xl: 1.25rem; /* 20 */
583
+ --font-size-2xl: 1.5rem; /* 24 */
584
+ --font-size-3xl: 1.875rem; /* 30 */
585
+ --font-size-4xl: 2.25rem; /* 36 */
586
+ --font-size-5xl: 3rem; /* 48 */
587
+ --font-size-6xl: 3.75rem; /* 60 */
588
+
589
+ --line-height-tight: 1.15;
590
+ --line-height-snug: 1.3;
591
+ --line-height-normal: 1.5;
592
+ --line-height-relaxed: 1.65;
593
+
594
+ --font-weight-regular: 400;
595
+ --font-weight-medium: 500;
596
+ --font-weight-semibold: 600;
597
+ --font-weight-bold: 700;
598
+
599
+ --letter-tight: -0.022em;
600
+ --letter-snug: -0.012em;
601
+ --letter-normal: 0;
602
+ --letter-wide: 0.04em;
603
+ }
604
+
605
+ /* font pairs — selected via [data-font] */
606
+ :root,
607
+ [data-font="geist"] {
608
+ --font-sans: 'Geist', 'Anuphan', ui-sans-serif, system-ui, -apple-system, sans-serif;
609
+ --font-mono: 'Geist Mono', ui-monospace, 'SF Mono', Menlo, monospace;
610
+ }
611
+ [data-font="plex"] {
612
+ --font-sans: 'IBM Plex Sans', 'IBM Plex Sans Thai Looped', ui-sans-serif, system-ui, sans-serif;
613
+ --font-mono: 'IBM Plex Mono', ui-monospace, 'SF Mono', Menlo, monospace;
614
+ }
615
+ [data-font="system"] {
616
+ --font-sans: ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
617
+ --font-mono: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
618
+ }
619
+
620
+ /* ─────────────────────────────────────────────────────────
621
+ Spacing scale — base 4px (8px after 4)
622
+ ───────────────────────────────────────────────────────── */
623
+ :root {
624
+ --space-0: 0;
625
+ --space-1: 0.25rem; /* 4 */
626
+ --space-2: 0.5rem; /* 8 */
627
+ --space-3: 0.75rem; /* 12 */
628
+ --space-4: 1rem; /* 16 */
629
+ --space-5: 1.25rem; /* 20 */
630
+ --space-6: 1.5rem; /* 24 */
631
+ --space-8: 2rem; /* 32 */
632
+ --space-10: 2.5rem; /* 40 */
633
+ --space-12: 3rem; /* 48 */
634
+ --space-16: 4rem; /* 64 */
635
+ --space-20: 5rem; /* 80 */
636
+ --space-24: 6rem; /* 96 */
637
+ }
638
+
639
+ /* ─────────────────────────────────────────────────────────
640
+ Radius scale — selected via [data-radius]
641
+ ───────────────────────────────────────────────────────── */
642
+ :root,
643
+ [data-radius="default"] {
644
+ --radius-xs: 2px;
645
+ --radius-sm: 4px;
646
+ --radius-md: 6px;
647
+ --radius-lg: 8px;
648
+ --radius-xl: 12px;
649
+ --radius-2xl: 16px;
650
+ --radius-full: 9999px;
651
+ }
652
+ [data-radius="sharp"] {
653
+ --radius-xs: 0px;
654
+ --radius-sm: 1px;
655
+ --radius-md: 2px;
656
+ --radius-lg: 3px;
657
+ --radius-xl: 4px;
658
+ --radius-2xl: 6px;
659
+ --radius-full: 9999px;
660
+ }
661
+ [data-radius="soft"] {
662
+ --radius-xs: 4px;
663
+ --radius-sm: 8px;
664
+ --radius-md: 12px;
665
+ --radius-lg: 14px;
666
+ --radius-xl: 18px;
667
+ --radius-2xl: 24px;
668
+ --radius-full: 9999px;
669
+ }
670
+ [data-radius="pill"] {
671
+ --radius-xs: 4px;
672
+ --radius-sm: 9999px;
673
+ --radius-md: 9999px;
674
+ --radius-lg: 9999px;
675
+ --radius-xl: 18px;
676
+ --radius-2xl: 22px;
677
+ --radius-full: 9999px;
678
+ }
679
+
680
+ /* ─────────────────────────────────────────────────────────
681
+ Density — affects control sizes, not the spacing scale
682
+ ───────────────────────────────────────────────────────── */
683
+ :root,
684
+ [data-density="default"] {
685
+ --control-h-sm: 28px;
686
+ --control-h-md: 36px;
687
+ --control-h-lg: 44px;
688
+ --control-px-sm: 10px;
689
+ --control-px-md: 14px;
690
+ --control-px-lg: 18px;
691
+ --card-p: 24px;
692
+ --row-gap: 16px;
693
+ }
694
+ [data-density="compact"] {
695
+ --control-h-sm: 24px;
696
+ --control-h-md: 30px;
697
+ --control-h-lg: 38px;
698
+ --control-px-sm: 8px;
699
+ --control-px-md: 12px;
700
+ --control-px-lg: 16px;
701
+ --card-p: 16px;
702
+ --row-gap: 12px;
703
+ }
704
+ [data-density="comfortable"] {
705
+ --control-h-sm: 32px;
706
+ --control-h-md: 42px;
707
+ --control-h-lg: 52px;
708
+ --control-px-sm: 12px;
709
+ --control-px-md: 18px;
710
+ --control-px-lg: 22px;
711
+ --card-p: 32px;
712
+ --row-gap: 20px;
713
+ }
714
+
715
+ /* ─────────────────────────────────────────────────────────
716
+ Layout — 12-column grid, breakpoints, container widths
717
+ ───────────────────────────────────────────────────────── */
718
+ :root {
719
+ --grid-columns: 12;
720
+ --grid-gutter: var(--space-6); /* 24 */
721
+ --grid-gutter-tight: var(--space-4); /* 16 — used below sm */
722
+ --grid-margin: var(--space-6); /* 24 */
723
+ --grid-margin-lg: var(--space-10); /* 40 */
724
+
725
+ --breakpoint-sm: 640px;
726
+ --breakpoint-md: 768px;
727
+ --breakpoint-lg: 1024px;
728
+ --breakpoint-xl: 1280px;
729
+
730
+ --container-sm: 640px;
731
+ --container-md: 768px;
732
+ --container-lg: 1024px;
733
+ --container-xl: 1140px;
734
+ --container-prose: 1080px;
735
+ }
736
+
737
+ /* ─────────────────────────────────────────────────────────
738
+ Motion
739
+ ───────────────────────────────────────────────────────── */
740
+ :root {
741
+ --duration-instant: 50ms;
742
+ --duration-fast: 120ms;
743
+ --duration-normal: 200ms;
744
+ --duration-slow: 320ms;
745
+ --duration-slower: 500ms;
746
+
747
+ --ease-linear: linear;
748
+ --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
749
+ --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
750
+ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
751
+ }
752
+
753
+
754
+ /* === base.css === */
755
+ /* ─────────────────────────────────────────────────────────
756
+ Base reset — minimal, scoped to what the components need.
757
+ Consumers can override anything here from their own CSS.
758
+ ───────────────────────────────────────────────────────── */
759
+
760
+ *,
761
+ *::before,
762
+ *::after {
763
+ box-sizing: border-box;
764
+ }
765
+
766
+ html {
767
+ font-family: var(--font-sans);
768
+ color: var(--color-text-primary);
769
+ background-color: var(--color-bg-page);
770
+ -webkit-font-smoothing: antialiased;
771
+ -moz-osx-font-smoothing: grayscale;
772
+ }
773
+
774
+ button {
775
+ font-family: inherit;
776
+ }
777
+
778
+
779
+ /* === components/Alert.css === */
780
+ /* Alert */
781
+ .pds-alert {
782
+ position: relative;
783
+ display: flex;
784
+ align-items: flex-start;
785
+ gap: 0.75rem;
786
+ border-radius: var(--radius-md);
787
+ border: 1px solid;
788
+ padding: 0.75rem 1rem;
789
+ font-size: var(--font-size-sm);
790
+ color: var(--color-text-primary);
791
+ }
792
+
793
+ .pds-alert--info {
794
+ background-color: var(--color-bg-info);
795
+ border-color: var(--color-border-secondary);
796
+ }
797
+ .pds-alert--info .pds-alert__icon { color: var(--color-text-brand); }
798
+
799
+ .pds-alert--success {
800
+ background-color: var(--color-bg-success);
801
+ border-color: var(--color-border-success);
802
+ }
803
+ .pds-alert--success .pds-alert__icon { color: var(--color-text-success); }
804
+
805
+ .pds-alert--warning {
806
+ background-color: var(--color-bg-warning);
807
+ border-color: var(--color-border-warning);
808
+ }
809
+ .pds-alert--warning .pds-alert__icon { color: var(--color-text-warning); }
810
+
811
+ .pds-alert--danger {
812
+ background-color: var(--color-bg-danger);
813
+ border-color: var(--color-border-danger);
814
+ }
815
+ .pds-alert--danger .pds-alert__icon { color: var(--color-text-danger); }
816
+
817
+ .pds-alert__icon {
818
+ display: inline-flex;
819
+ width: 1.25rem;
820
+ height: 1.25rem;
821
+ flex-shrink: 0;
822
+ align-items: center;
823
+ justify-content: center;
824
+ }
825
+ .pds-alert__icon svg { width: 1.25rem; height: 1.25rem; }
826
+
827
+ .pds-alert__body {
828
+ flex: 1;
829
+ display: flex;
830
+ flex-direction: column;
831
+ gap: 0.125rem;
832
+ }
833
+
834
+ .pds-alert__title {
835
+ font-weight: var(--font-weight-semibold);
836
+ line-height: var(--line-height-snug);
837
+ }
838
+
839
+ .pds-alert__description {
840
+ color: var(--color-text-secondary);
841
+ line-height: var(--line-height-snug);
842
+ }
843
+
844
+
845
+ /* === components/Avatar.css === */
846
+ /* Avatar */
847
+ .pds-avatar {
848
+ display: inline-flex;
849
+ align-items: center;
850
+ justify-content: center;
851
+ overflow: hidden;
852
+ border-radius: var(--radius-full);
853
+ background-color: var(--color-bg-tertiary);
854
+ color: var(--color-text-secondary);
855
+ font-weight: var(--font-weight-medium);
856
+ user-select: none;
857
+ vertical-align: middle;
858
+ }
859
+
860
+ .pds-avatar--sm { width: 1.5rem; height: 1.5rem; font-size: var(--font-size-xs); }
861
+ .pds-avatar--md { width: 2rem; height: 2rem; font-size: var(--font-size-sm); }
862
+ .pds-avatar--lg { width: 2.5rem; height: 2.5rem; font-size: var(--font-size-md); }
863
+ .pds-avatar--xl { width: 3rem; height: 3rem; font-size: var(--font-size-lg); }
864
+
865
+ .pds-avatar__image {
866
+ width: 100%;
867
+ height: 100%;
868
+ object-fit: cover;
869
+ }
870
+
871
+ .pds-avatar__fallback {
872
+ display: inline-flex;
873
+ width: 100%;
874
+ height: 100%;
875
+ align-items: center;
876
+ justify-content: center;
877
+ }
878
+
879
+
880
+ /* === components/Badge.css === */
881
+ /* Badge */
882
+ .pds-badge {
883
+ display: inline-flex;
884
+ align-items: center;
885
+ gap: 0.25rem;
886
+ font-weight: var(--font-weight-medium);
887
+ border-radius: var(--radius-full);
888
+ white-space: nowrap;
889
+ user-select: none;
890
+ }
891
+
892
+ /* variants */
893
+ .pds-badge--neutral {
894
+ background-color: var(--color-bg-tertiary);
895
+ color: var(--color-text-secondary);
896
+ }
897
+ .pds-badge--brand {
898
+ background-color: var(--color-bg-brand-subtle);
899
+ color: var(--color-text-brand);
900
+ }
901
+ .pds-badge--success {
902
+ background-color: var(--color-bg-success);
903
+ color: var(--color-text-success);
904
+ }
905
+ .pds-badge--warning {
906
+ background-color: var(--color-bg-warning);
907
+ color: var(--color-text-warning);
908
+ }
909
+ .pds-badge--danger {
910
+ background-color: var(--color-bg-danger);
911
+ color: var(--color-text-danger);
912
+ }
913
+
914
+ /* sizes */
915
+ .pds-badge--sm {
916
+ height: 1.25rem;
917
+ padding-inline: 0.375rem;
918
+ font-size: var(--font-size-xs);
919
+ }
920
+ .pds-badge--md {
921
+ height: 1.5rem;
922
+ padding-inline: 0.5rem;
923
+ font-size: var(--font-size-xs);
924
+ }
925
+ .pds-badge--lg {
926
+ height: 1.75rem;
927
+ padding-inline: 0.625rem;
928
+ font-size: var(--font-size-sm);
929
+ }
930
+
931
+
932
+ /* === components/Button.css === */
933
+ /* Button */
934
+ .pds-btn {
935
+ display: inline-flex;
936
+ align-items: center;
937
+ justify-content: center;
938
+ gap: 0.5rem;
939
+ border: 0;
940
+ border-radius: var(--ctrl-radius);
941
+ font-family: inherit;
942
+ font-weight: var(--font-weight-medium);
943
+ white-space: nowrap;
944
+ user-select: none;
945
+ cursor: pointer;
946
+ transition-property: background-color, color, box-shadow, transform;
947
+ transition-duration: var(--duration-fast);
948
+ transition-timing-function: var(--ease-out);
949
+ }
950
+
951
+ .pds-btn:focus-visible {
952
+ outline: none;
953
+ box-shadow: var(--shadow-focus);
954
+ }
955
+
956
+ .pds-btn:disabled,
957
+ .pds-btn[data-disabled] {
958
+ opacity: 0.55;
959
+ pointer-events: none;
960
+ cursor: not-allowed;
961
+ }
962
+
963
+ /* variants */
964
+ .pds-btn--primary {
965
+ background-color: var(--color-bg-brand);
966
+ color: var(--color-text-on-brand);
967
+ box-shadow: var(--shadow-sm);
968
+ }
969
+ .pds-btn--primary:hover {
970
+ background-color: var(--color-bg-brand-hover);
971
+ box-shadow: var(--shadow-md);
972
+ transform: translateY(-1px);
973
+ }
974
+ .pds-btn--primary:active {
975
+ background-color: var(--color-bg-brand-active);
976
+ transform: translateY(0);
977
+ box-shadow: var(--shadow-xs);
978
+ }
979
+
980
+ .pds-btn--secondary {
981
+ background-color: var(--color-bg-primary);
982
+ color: var(--color-text-primary);
983
+ box-shadow: var(--shadow-md);
984
+ }
985
+ .pds-btn--secondary:hover {
986
+ box-shadow: var(--shadow-lg);
987
+ transform: translateY(-1px);
988
+ }
989
+ .pds-btn--secondary:active {
990
+ box-shadow: var(--shadow-sm);
991
+ transform: translateY(0);
992
+ }
993
+
994
+ .pds-btn--destructive {
995
+ background-color: var(--color-bg-danger-strong);
996
+ color: var(--color-text-on-danger);
997
+ box-shadow: var(--shadow-sm);
998
+ }
999
+ .pds-btn--destructive:hover {
1000
+ background-color: var(--color-bg-danger-hover);
1001
+ box-shadow: var(--shadow-md);
1002
+ transform: translateY(-1px);
1003
+ }
1004
+ .pds-btn--destructive:active {
1005
+ transform: translateY(0);
1006
+ box-shadow: var(--shadow-xs);
1007
+ }
1008
+
1009
+ .pds-btn--ghost {
1010
+ background-color: transparent;
1011
+ color: var(--color-text-primary);
1012
+ }
1013
+ .pds-btn--ghost:hover {
1014
+ background-color: var(--color-bg-hover);
1015
+ }
1016
+ .pds-btn--ghost:active {
1017
+ background-color: var(--color-bg-pressed);
1018
+ }
1019
+
1020
+ /* sizes */
1021
+ .pds-btn--sm {
1022
+ height: var(--control-h-sm);
1023
+ padding-inline: var(--control-px-sm);
1024
+ font-size: var(--font-size-xs);
1025
+ }
1026
+ .pds-btn--md {
1027
+ height: var(--control-h-md);
1028
+ padding-inline: var(--control-px-md);
1029
+ font-size: var(--font-size-sm);
1030
+ }
1031
+ .pds-btn--lg {
1032
+ height: var(--control-h-lg);
1033
+ padding-inline: var(--control-px-lg);
1034
+ font-size: var(--font-size-md);
1035
+ }
1036
+
1037
+
1038
+ /* === components/Card.css === */
1039
+ /* Card */
1040
+ .pds-card {
1041
+ display: flex;
1042
+ flex-direction: column;
1043
+ border-radius: var(--radius-2xl);
1044
+ padding: var(--card-p);
1045
+ gap: var(--row-gap);
1046
+ transition: box-shadow var(--duration-fast) var(--ease-out);
1047
+ }
1048
+
1049
+ .pds-card--elevated {
1050
+ background-color: var(--color-bg-primary);
1051
+ box-shadow: var(--shadow-md);
1052
+ }
1053
+
1054
+ .pds-card--muted {
1055
+ background-color: var(--color-bg-secondary);
1056
+ }
1057
+
1058
+ .pds-card__header {
1059
+ display: flex;
1060
+ align-items: flex-start;
1061
+ justify-content: space-between;
1062
+ gap: 0.75rem;
1063
+ }
1064
+
1065
+ .pds-card__title {
1066
+ font-size: var(--font-size-lg);
1067
+ font-weight: var(--font-weight-semibold);
1068
+ color: var(--color-text-primary);
1069
+ letter-spacing: var(--letter-snug);
1070
+ line-height: var(--line-height-snug);
1071
+ margin: 0;
1072
+ }
1073
+
1074
+ .pds-card__description {
1075
+ font-size: var(--font-size-sm);
1076
+ color: var(--color-text-secondary);
1077
+ line-height: var(--line-height-normal);
1078
+ margin: 0;
1079
+ }
1080
+
1081
+ .pds-card__action {
1082
+ flex-shrink: 0;
1083
+ display: flex;
1084
+ align-items: center;
1085
+ gap: 0.5rem;
1086
+ }
1087
+
1088
+ .pds-card__body {
1089
+ flex: 1;
1090
+ font-size: var(--font-size-sm);
1091
+ color: var(--color-text-primary);
1092
+ }
1093
+
1094
+ .pds-card__footer {
1095
+ display: flex;
1096
+ align-items: center;
1097
+ justify-content: flex-end;
1098
+ gap: 0.5rem;
1099
+ padding-top: var(--row-gap);
1100
+ border-top: 1px solid var(--color-border-tertiary);
1101
+ }
1102
+
1103
+
1104
+ /* === components/Checkbox.css === */
1105
+ /* Checkbox */
1106
+ .pds-checkbox {
1107
+ display: inline-flex;
1108
+ align-items: center;
1109
+ justify-content: center;
1110
+ flex-shrink: 0;
1111
+ background-color: var(--color-bg-primary);
1112
+ border: 1px solid var(--color-border-primary);
1113
+ color: var(--color-text-on-brand);
1114
+ transition-property: background-color, color, border-color, box-shadow;
1115
+ transition-duration: var(--duration-fast);
1116
+ transition-timing-function: var(--ease-out);
1117
+ cursor: pointer;
1118
+ }
1119
+
1120
+ .pds-checkbox:hover {
1121
+ border-color: var(--color-border-brand);
1122
+ }
1123
+
1124
+ .pds-checkbox:focus-visible {
1125
+ outline: none;
1126
+ box-shadow: var(--shadow-focus);
1127
+ }
1128
+
1129
+ .pds-checkbox[data-checked],
1130
+ .pds-checkbox[data-indeterminate] {
1131
+ background-color: var(--color-bg-brand);
1132
+ border-color: var(--color-border-brand);
1133
+ }
1134
+
1135
+ .pds-checkbox[data-disabled] {
1136
+ background-color: var(--color-bg-disabled);
1137
+ border-color: var(--color-border-secondary);
1138
+ cursor: not-allowed;
1139
+ }
1140
+ .pds-checkbox[data-disabled]:hover {
1141
+ border-color: var(--color-border-secondary);
1142
+ }
1143
+
1144
+ /* sizes */
1145
+ .pds-checkbox--sm { width: 1rem; height: 1rem; border-radius: var(--radius-xs); }
1146
+ .pds-checkbox--md { width: 1.125rem; height: 1.125rem; border-radius: var(--radius-sm); }
1147
+ .pds-checkbox--lg { width: 1.25rem; height: 1.25rem; border-radius: var(--radius-sm); }
1148
+
1149
+ /* indicator wrapper */
1150
+ .pds-checkbox__indicator {
1151
+ display: flex;
1152
+ align-items: center;
1153
+ justify-content: center;
1154
+ }
1155
+
1156
+ /* indicator icons — sized by parent .pds-checkbox--{size} */
1157
+ .pds-checkbox--sm .pds-checkbox__icon { width: 0.75rem; height: 0.75rem; }
1158
+ .pds-checkbox--md .pds-checkbox__icon { width: 0.875rem; height: 0.875rem; }
1159
+ .pds-checkbox--lg .pds-checkbox__icon { width: 1rem; height: 1rem; }
1160
+
1161
+ /* show the right icon based on state — checked or indeterminate */
1162
+ .pds-checkbox__icon--check { display: block; }
1163
+ .pds-checkbox__icon--indeterminate { display: none; }
1164
+ .pds-checkbox[data-indeterminate] .pds-checkbox__icon--check { display: none; }
1165
+ .pds-checkbox[data-indeterminate] .pds-checkbox__icon--indeterminate { display: block; }
1166
+
1167
+
1168
+ /* === components/Divider.css === */
1169
+ /* Divider */
1170
+ .pds-divider {
1171
+ background-color: var(--color-border-secondary);
1172
+ flex-shrink: 0;
1173
+ }
1174
+
1175
+ .pds-divider--horizontal {
1176
+ height: 1px;
1177
+ width: 100%;
1178
+ }
1179
+
1180
+ .pds-divider--vertical {
1181
+ width: 1px;
1182
+ align-self: stretch;
1183
+ }
1184
+
1185
+
1186
+ /* === components/DropdownMenu.css === */
1187
+ /* DropdownMenu */
1188
+ .pds-menu-positioner {
1189
+ outline: none;
1190
+ z-index: 50;
1191
+ }
1192
+
1193
+ .pds-menu-popup {
1194
+ z-index: 50;
1195
+ min-width: 11rem;
1196
+ max-height: var(--available-height);
1197
+ overflow-y: auto;
1198
+ background-color: var(--color-bg-primary);
1199
+ border: 1px solid var(--color-border-primary);
1200
+ border-radius: var(--radius-md);
1201
+ box-shadow: var(--shadow-lg);
1202
+ padding: 0.25rem;
1203
+ outline: none;
1204
+ transform-origin: var(--transform-origin);
1205
+ transition-property: opacity, transform, scale;
1206
+ transition-duration: var(--duration-fast);
1207
+ transition-timing-function: var(--ease-out);
1208
+ }
1209
+
1210
+ .pds-menu-popup[data-starting-style],
1211
+ .pds-menu-popup[data-ending-style] {
1212
+ opacity: 0;
1213
+ transform: scale(0.95);
1214
+ }
1215
+
1216
+ .pds-menu-item {
1217
+ position: relative;
1218
+ display: flex;
1219
+ align-items: center;
1220
+ gap: 0.5rem;
1221
+ border-radius: var(--radius-sm);
1222
+ padding: 0.375rem 0.5rem;
1223
+ font-size: var(--font-size-sm);
1224
+ cursor: pointer;
1225
+ user-select: none;
1226
+ outline: none;
1227
+ color: var(--color-text-primary);
1228
+ }
1229
+
1230
+ .pds-menu-item[data-highlighted] {
1231
+ background-color: var(--color-bg-hover);
1232
+ }
1233
+
1234
+ .pds-menu-item[data-disabled] {
1235
+ color: var(--color-text-disabled);
1236
+ cursor: not-allowed;
1237
+ background-color: transparent;
1238
+ }
1239
+
1240
+ .pds-menu-item--indented {
1241
+ padding-left: 1.75rem;
1242
+ }
1243
+
1244
+ .pds-menu-item__indicator {
1245
+ position: absolute;
1246
+ left: 0.5rem;
1247
+ display: inline-flex;
1248
+ align-items: center;
1249
+ color: var(--color-text-brand);
1250
+ }
1251
+ .pds-menu-item__indicator svg { width: 0.875rem; height: 0.875rem; }
1252
+ .pds-menu-item__indicator--radio svg { width: 0.5rem; height: 0.5rem; }
1253
+
1254
+ .pds-menu-label {
1255
+ padding: 0.375rem 0.5rem;
1256
+ font-size: var(--font-size-xs);
1257
+ font-weight: var(--font-weight-semibold);
1258
+ color: var(--color-text-tertiary);
1259
+ text-transform: uppercase;
1260
+ letter-spacing: var(--letter-wide);
1261
+ }
1262
+
1263
+ .pds-menu-separator {
1264
+ margin-block: 0.25rem;
1265
+ height: 1px;
1266
+ background-color: var(--color-border-tertiary);
1267
+ }
1268
+
1269
+
1270
+ /* === components/Grid.css === */
1271
+ /* Container */
1272
+ .pds-container {
1273
+ margin-inline: auto;
1274
+ width: 100%;
1275
+ padding-inline: var(--grid-margin);
1276
+ }
1277
+
1278
+ @media (min-width: 1024px) {
1279
+ .pds-container { padding-inline: var(--grid-margin-lg); }
1280
+ }
1281
+
1282
+ .pds-container--sm { max-width: var(--container-sm); }
1283
+ .pds-container--md { max-width: var(--container-md); }
1284
+ .pds-container--lg { max-width: var(--container-lg); }
1285
+ .pds-container--xl { max-width: var(--container-xl); }
1286
+ .pds-container--prose { max-width: var(--container-prose); }
1287
+ .pds-container--fluid { max-width: none; }
1288
+
1289
+ /* Grid root */
1290
+ .pds-grid {
1291
+ display: grid;
1292
+ grid-template-columns: repeat(12, minmax(0, 1fr));
1293
+ gap: var(--grid-gutter-tight);
1294
+ }
1295
+
1296
+ @media (min-width: 640px) {
1297
+ .pds-grid--default { gap: var(--grid-gutter); }
1298
+ }
1299
+
1300
+ .pds-grid--tight { gap: var(--grid-gutter-tight); }
1301
+ .pds-grid--flush { gap: 0; }
1302
+
1303
+ /* Grid columns */
1304
+ .pds-grid__col--span-1 { grid-column: span 1 / span 1; }
1305
+ .pds-grid__col--span-2 { grid-column: span 2 / span 2; }
1306
+ .pds-grid__col--span-3 { grid-column: span 3 / span 3; }
1307
+ .pds-grid__col--span-4 { grid-column: span 4 / span 4; }
1308
+ .pds-grid__col--span-5 { grid-column: span 5 / span 5; }
1309
+ .pds-grid__col--span-6 { grid-column: span 6 / span 6; }
1310
+ .pds-grid__col--span-7 { grid-column: span 7 / span 7; }
1311
+ .pds-grid__col--span-8 { grid-column: span 8 / span 8; }
1312
+ .pds-grid__col--span-9 { grid-column: span 9 / span 9; }
1313
+ .pds-grid__col--span-10 { grid-column: span 10 / span 10; }
1314
+ .pds-grid__col--span-11 { grid-column: span 11 / span 11; }
1315
+ .pds-grid__col--span-12 { grid-column: span 12 / span 12; }
1316
+ .pds-grid__col--span-full { grid-column: 1 / -1; }
1317
+
1318
+ @media (min-width: 640px) {
1319
+ .pds-grid__col--sm-span-1 { grid-column: span 1 / span 1; }
1320
+ .pds-grid__col--sm-span-2 { grid-column: span 2 / span 2; }
1321
+ .pds-grid__col--sm-span-3 { grid-column: span 3 / span 3; }
1322
+ .pds-grid__col--sm-span-4 { grid-column: span 4 / span 4; }
1323
+ .pds-grid__col--sm-span-5 { grid-column: span 5 / span 5; }
1324
+ .pds-grid__col--sm-span-6 { grid-column: span 6 / span 6; }
1325
+ .pds-grid__col--sm-span-7 { grid-column: span 7 / span 7; }
1326
+ .pds-grid__col--sm-span-8 { grid-column: span 8 / span 8; }
1327
+ .pds-grid__col--sm-span-9 { grid-column: span 9 / span 9; }
1328
+ .pds-grid__col--sm-span-10 { grid-column: span 10 / span 10; }
1329
+ .pds-grid__col--sm-span-11 { grid-column: span 11 / span 11; }
1330
+ .pds-grid__col--sm-span-12 { grid-column: span 12 / span 12; }
1331
+ .pds-grid__col--sm-span-full { grid-column: 1 / -1; }
1332
+ }
1333
+
1334
+ @media (min-width: 768px) {
1335
+ .pds-grid__col--md-span-1 { grid-column: span 1 / span 1; }
1336
+ .pds-grid__col--md-span-2 { grid-column: span 2 / span 2; }
1337
+ .pds-grid__col--md-span-3 { grid-column: span 3 / span 3; }
1338
+ .pds-grid__col--md-span-4 { grid-column: span 4 / span 4; }
1339
+ .pds-grid__col--md-span-5 { grid-column: span 5 / span 5; }
1340
+ .pds-grid__col--md-span-6 { grid-column: span 6 / span 6; }
1341
+ .pds-grid__col--md-span-7 { grid-column: span 7 / span 7; }
1342
+ .pds-grid__col--md-span-8 { grid-column: span 8 / span 8; }
1343
+ .pds-grid__col--md-span-9 { grid-column: span 9 / span 9; }
1344
+ .pds-grid__col--md-span-10 { grid-column: span 10 / span 10; }
1345
+ .pds-grid__col--md-span-11 { grid-column: span 11 / span 11; }
1346
+ .pds-grid__col--md-span-12 { grid-column: span 12 / span 12; }
1347
+ .pds-grid__col--md-span-full { grid-column: 1 / -1; }
1348
+ }
1349
+
1350
+ @media (min-width: 1024px) {
1351
+ .pds-grid__col--lg-span-1 { grid-column: span 1 / span 1; }
1352
+ .pds-grid__col--lg-span-2 { grid-column: span 2 / span 2; }
1353
+ .pds-grid__col--lg-span-3 { grid-column: span 3 / span 3; }
1354
+ .pds-grid__col--lg-span-4 { grid-column: span 4 / span 4; }
1355
+ .pds-grid__col--lg-span-5 { grid-column: span 5 / span 5; }
1356
+ .pds-grid__col--lg-span-6 { grid-column: span 6 / span 6; }
1357
+ .pds-grid__col--lg-span-7 { grid-column: span 7 / span 7; }
1358
+ .pds-grid__col--lg-span-8 { grid-column: span 8 / span 8; }
1359
+ .pds-grid__col--lg-span-9 { grid-column: span 9 / span 9; }
1360
+ .pds-grid__col--lg-span-10 { grid-column: span 10 / span 10; }
1361
+ .pds-grid__col--lg-span-11 { grid-column: span 11 / span 11; }
1362
+ .pds-grid__col--lg-span-12 { grid-column: span 12 / span 12; }
1363
+ .pds-grid__col--lg-span-full { grid-column: 1 / -1; }
1364
+ }
1365
+
1366
+
1367
+ /* === components/Input.css === */
1368
+ /* Input */
1369
+ .pds-input {
1370
+ width: 100%;
1371
+ font-family: inherit;
1372
+ background-color: var(--color-bg-primary);
1373
+ color: var(--color-text-primary);
1374
+ border: 1px solid var(--color-border-primary);
1375
+ border-radius: var(--ctrl-radius);
1376
+ transition-property: color, background-color, border-color, box-shadow;
1377
+ transition-duration: var(--duration-fast);
1378
+ transition-timing-function: var(--ease-out);
1379
+ }
1380
+
1381
+ .pds-input::placeholder {
1382
+ color: var(--color-text-tertiary);
1383
+ }
1384
+
1385
+ .pds-input:focus-visible {
1386
+ outline: none;
1387
+ border-color: var(--color-border-focus);
1388
+ box-shadow: var(--shadow-focus);
1389
+ }
1390
+
1391
+ .pds-input:disabled,
1392
+ .pds-input[data-disabled] {
1393
+ background-color: var(--color-bg-disabled);
1394
+ color: var(--color-text-disabled);
1395
+ cursor: not-allowed;
1396
+ }
1397
+
1398
+ .pds-input[aria-invalid] {
1399
+ border-color: var(--color-border-danger);
1400
+ }
1401
+ .pds-input[aria-invalid]:focus-visible {
1402
+ border-color: var(--color-border-danger);
1403
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-bg-danger-strong) 25%, transparent);
1404
+ }
1405
+
1406
+ /* sizes */
1407
+ .pds-input--sm {
1408
+ height: var(--control-h-sm);
1409
+ padding-inline: var(--control-px-sm);
1410
+ font-size: var(--font-size-xs);
1411
+ }
1412
+ .pds-input--md {
1413
+ height: var(--control-h-md);
1414
+ padding-inline: var(--control-px-md);
1415
+ font-size: var(--font-size-sm);
1416
+ }
1417
+ .pds-input--lg {
1418
+ height: var(--control-h-lg);
1419
+ padding-inline: var(--control-px-lg);
1420
+ font-size: var(--font-size-md);
1421
+ }
1422
+
1423
+
1424
+ /* === components/Modal.css === */
1425
+ /* Modal — backdrop */
1426
+ .pds-modal-backdrop {
1427
+ position: fixed;
1428
+ inset: 0;
1429
+ z-index: 50;
1430
+ background-color: color-mix(in srgb, var(--color-bg-inverse) 50%, transparent);
1431
+ backdrop-filter: blur(4px);
1432
+ transition: opacity var(--duration-normal) var(--ease-out);
1433
+ }
1434
+ .pds-modal-backdrop[data-starting-style],
1435
+ .pds-modal-backdrop[data-ending-style] {
1436
+ opacity: 0;
1437
+ }
1438
+
1439
+ /* popup */
1440
+ .pds-modal-popup {
1441
+ position: fixed;
1442
+ left: 50%;
1443
+ top: 50%;
1444
+ z-index: 50;
1445
+ width: calc(100% - 2rem);
1446
+ max-width: 28rem;
1447
+ transform: translate(-50%, -50%);
1448
+ background-color: var(--color-bg-primary);
1449
+ color: var(--color-text-primary);
1450
+ border: 1px solid var(--color-border-secondary);
1451
+ border-radius: var(--radius-lg);
1452
+ box-shadow: var(--shadow-xl);
1453
+ padding: 1.5rem;
1454
+ outline: none;
1455
+ transition-property: opacity, transform, scale;
1456
+ transition-duration: var(--duration-normal);
1457
+ transition-timing-function: var(--ease-out);
1458
+ }
1459
+ .pds-modal-popup[data-starting-style],
1460
+ .pds-modal-popup[data-ending-style] {
1461
+ opacity: 0;
1462
+ transform: translate(-50%, -50%) scale(0.95);
1463
+ }
1464
+
1465
+ .pds-modal-title {
1466
+ font-size: var(--font-size-lg);
1467
+ font-weight: var(--font-weight-semibold);
1468
+ letter-spacing: var(--letter-snug);
1469
+ }
1470
+
1471
+ .pds-modal-description {
1472
+ margin-top: 0.25rem;
1473
+ font-size: var(--font-size-sm);
1474
+ color: var(--color-text-secondary);
1475
+ }
1476
+
1477
+
1478
+ /* === components/Radio.css === */
1479
+ /* Radio */
1480
+ .pds-radio {
1481
+ display: inline-flex;
1482
+ align-items: center;
1483
+ justify-content: center;
1484
+ flex-shrink: 0;
1485
+ border-radius: var(--radius-full);
1486
+ background-color: var(--color-bg-primary);
1487
+ border: 1px solid var(--color-border-primary);
1488
+ transition-property: background-color, border-color, box-shadow;
1489
+ transition-duration: var(--duration-fast);
1490
+ transition-timing-function: var(--ease-out);
1491
+ cursor: pointer;
1492
+ }
1493
+
1494
+ .pds-radio:hover {
1495
+ border-color: var(--color-border-brand);
1496
+ }
1497
+
1498
+ .pds-radio:focus-visible {
1499
+ outline: none;
1500
+ box-shadow: var(--shadow-focus);
1501
+ }
1502
+
1503
+ .pds-radio[data-checked] {
1504
+ border-color: var(--color-border-brand);
1505
+ }
1506
+
1507
+ .pds-radio[data-disabled] {
1508
+ background-color: var(--color-bg-disabled);
1509
+ border-color: var(--color-border-secondary);
1510
+ cursor: not-allowed;
1511
+ }
1512
+ .pds-radio[data-disabled]:hover {
1513
+ border-color: var(--color-border-secondary);
1514
+ }
1515
+
1516
+ /* sizes */
1517
+ .pds-radio--sm { width: 1rem; height: 1rem; }
1518
+ .pds-radio--md { width: 1.125rem; height: 1.125rem; }
1519
+ .pds-radio--lg { width: 1.25rem; height: 1.25rem; }
1520
+
1521
+ /* indicator */
1522
+ .pds-radio__indicator {
1523
+ border-radius: var(--radius-full);
1524
+ background-color: var(--color-bg-brand);
1525
+ transition: transform var(--duration-fast) var(--ease-out);
1526
+ }
1527
+ .pds-radio__indicator[data-unchecked] {
1528
+ transform: scale(0);
1529
+ }
1530
+
1531
+ .pds-radio--sm .pds-radio__indicator { width: 0.375rem; height: 0.375rem; }
1532
+ .pds-radio--md .pds-radio__indicator { width: 0.5rem; height: 0.5rem; }
1533
+ .pds-radio--lg .pds-radio__indicator { width: 0.625rem; height: 0.625rem; }
1534
+
1535
+ /* RadioGroup */
1536
+ .pds-radio-group {
1537
+ display: flex;
1538
+ flex-direction: column;
1539
+ gap: 0.5rem;
1540
+ }
1541
+
1542
+
1543
+ /* === components/Segmented.css === */
1544
+ /* Segmented — root */
1545
+ .pds-segmented {
1546
+ display: inline-flex;
1547
+ align-items: center;
1548
+ background-color: var(--color-bg-secondary);
1549
+ border-radius: var(--radius-full);
1550
+ }
1551
+
1552
+ .pds-segmented--sm { padding: 0.125rem; gap: 0.125rem; }
1553
+ .pds-segmented--md { padding: 0.25rem; gap: 0.125rem; }
1554
+ .pds-segmented--lg { padding: 0.25rem; gap: 0.25rem; }
1555
+
1556
+ /* item */
1557
+ .pds-segmented__item {
1558
+ display: inline-flex;
1559
+ align-items: center;
1560
+ justify-content: center;
1561
+ gap: 0.375rem;
1562
+ border: 0;
1563
+ background: transparent;
1564
+ border-radius: var(--radius-full);
1565
+ font-family: inherit;
1566
+ font-weight: var(--font-weight-medium);
1567
+ color: var(--color-text-secondary);
1568
+ cursor: pointer;
1569
+ user-select: none;
1570
+ transition-property: background-color, color, box-shadow;
1571
+ transition-duration: var(--duration-fast);
1572
+ transition-timing-function: var(--ease-out);
1573
+ }
1574
+
1575
+ .pds-segmented__item:hover {
1576
+ color: var(--color-text-primary);
1577
+ }
1578
+
1579
+ .pds-segmented__item:focus-visible {
1580
+ outline: none;
1581
+ box-shadow: var(--shadow-focus);
1582
+ }
1583
+
1584
+ .pds-segmented__item[data-pressed] {
1585
+ background-color: var(--color-bg-primary);
1586
+ color: var(--color-text-primary);
1587
+ box-shadow: var(--shadow-sm);
1588
+ font-weight: var(--font-weight-semibold);
1589
+ }
1590
+
1591
+ .pds-segmented__item:disabled,
1592
+ .pds-segmented__item[data-disabled] {
1593
+ opacity: 0.55;
1594
+ pointer-events: none;
1595
+ cursor: not-allowed;
1596
+ }
1597
+
1598
+ .pds-segmented__item--sm { height: 1.5rem; padding-inline: 0.625rem; font-size: var(--font-size-xs); }
1599
+ .pds-segmented__item--md { height: 1.75rem; padding-inline: 0.75rem; font-size: var(--font-size-xs); }
1600
+ .pds-segmented__item--lg { height: 2rem; padding-inline: 0.875rem; font-size: var(--font-size-sm); }
1601
+
1602
+
1603
+ /* === components/Select.css === */
1604
+ /* Select — trigger */
1605
+ .pds-select-trigger {
1606
+ display: inline-flex;
1607
+ width: 100%;
1608
+ align-items: center;
1609
+ justify-content: space-between;
1610
+ gap: 0.5rem;
1611
+ background-color: var(--color-bg-primary);
1612
+ color: var(--color-text-primary);
1613
+ border: 1px solid var(--color-border-primary);
1614
+ border-radius: var(--radius-md);
1615
+ font-family: inherit;
1616
+ transition-property: background-color, color, border-color, box-shadow;
1617
+ transition-duration: var(--duration-fast);
1618
+ transition-timing-function: var(--ease-out);
1619
+ cursor: pointer;
1620
+ }
1621
+
1622
+ .pds-select-trigger:hover {
1623
+ background-color: var(--color-bg-hover);
1624
+ }
1625
+
1626
+ .pds-select-trigger:focus-visible,
1627
+ .pds-select-trigger[data-popup-open] {
1628
+ outline: none;
1629
+ border-color: var(--color-border-focus);
1630
+ box-shadow: var(--shadow-focus);
1631
+ }
1632
+
1633
+ .pds-select-trigger[data-disabled] {
1634
+ background-color: var(--color-bg-disabled);
1635
+ color: var(--color-text-disabled);
1636
+ cursor: not-allowed;
1637
+ }
1638
+ .pds-select-trigger[data-disabled]:hover {
1639
+ background-color: var(--color-bg-disabled);
1640
+ }
1641
+
1642
+ /* trigger sizes */
1643
+ .pds-select-trigger--sm {
1644
+ height: var(--control-h-sm);
1645
+ padding-inline: var(--control-px-sm);
1646
+ font-size: var(--font-size-xs);
1647
+ }
1648
+ .pds-select-trigger--md {
1649
+ height: var(--control-h-md);
1650
+ padding-inline: var(--control-px-md);
1651
+ font-size: var(--font-size-sm);
1652
+ }
1653
+ .pds-select-trigger--lg {
1654
+ height: var(--control-h-lg);
1655
+ padding-inline: var(--control-px-lg);
1656
+ font-size: var(--font-size-md);
1657
+ }
1658
+
1659
+ /* trigger icon */
1660
+ .pds-select-icon {
1661
+ color: var(--color-text-tertiary);
1662
+ flex-shrink: 0;
1663
+ display: inline-flex;
1664
+ }
1665
+ .pds-select-icon svg { width: 1rem; height: 1rem; }
1666
+
1667
+ /* value */
1668
+ .pds-select-value {
1669
+ overflow: hidden;
1670
+ text-overflow: ellipsis;
1671
+ white-space: nowrap;
1672
+ }
1673
+ .pds-select-value-placeholder {
1674
+ color: var(--color-text-tertiary);
1675
+ }
1676
+
1677
+ /* positioner — keeps z-index above page chrome */
1678
+ .pds-select-positioner {
1679
+ outline: none;
1680
+ z-index: 50;
1681
+ }
1682
+
1683
+ /* popup */
1684
+ .pds-select-popup {
1685
+ min-width: var(--anchor-width);
1686
+ max-height: var(--available-height);
1687
+ overflow-y: auto;
1688
+ background-color: var(--color-bg-primary);
1689
+ border: 1px solid var(--color-border-primary);
1690
+ border-radius: var(--radius-md);
1691
+ box-shadow: var(--shadow-lg);
1692
+ padding: 0.25rem;
1693
+ outline: none;
1694
+ transform-origin: var(--transform-origin);
1695
+ transition-property: transform, opacity;
1696
+ transition-duration: var(--duration-fast);
1697
+ transition-timing-function: var(--ease-out);
1698
+ }
1699
+ .pds-select-popup[data-starting-style],
1700
+ .pds-select-popup[data-ending-style] {
1701
+ opacity: 0;
1702
+ transform: scale(0.95);
1703
+ }
1704
+
1705
+ /* item */
1706
+ .pds-select-item {
1707
+ position: relative;
1708
+ display: flex;
1709
+ align-items: center;
1710
+ gap: 0.5rem;
1711
+ border-radius: var(--radius-sm);
1712
+ padding: 0.375rem 0.5rem 0.375rem 1.75rem;
1713
+ font-size: var(--font-size-sm);
1714
+ cursor: pointer;
1715
+ user-select: none;
1716
+ outline: none;
1717
+ color: var(--color-text-primary);
1718
+ }
1719
+
1720
+ .pds-select-item[data-highlighted] {
1721
+ background-color: var(--color-bg-hover);
1722
+ }
1723
+
1724
+ .pds-select-item[data-disabled] {
1725
+ color: var(--color-text-disabled);
1726
+ cursor: not-allowed;
1727
+ background-color: transparent;
1728
+ }
1729
+
1730
+ .pds-select-item__indicator {
1731
+ position: absolute;
1732
+ left: 0.5rem;
1733
+ display: inline-flex;
1734
+ align-items: center;
1735
+ color: var(--color-text-brand);
1736
+ }
1737
+ .pds-select-item__indicator svg { width: 0.875rem; height: 0.875rem; }
1738
+
1739
+
1740
+ /* === components/Skeleton.css === */
1741
+ /* Skeleton */
1742
+ .pds-skeleton {
1743
+ background-color: var(--color-bg-tertiary);
1744
+ animation: pds-skeleton-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
1745
+ }
1746
+
1747
+ .pds-skeleton--line {
1748
+ height: 1rem;
1749
+ width: 100%;
1750
+ border-radius: var(--radius-sm);
1751
+ }
1752
+
1753
+ .pds-skeleton--circle {
1754
+ border-radius: var(--radius-full);
1755
+ }
1756
+
1757
+ .pds-skeleton--block {
1758
+ border-radius: var(--radius-md);
1759
+ }
1760
+
1761
+ @keyframes pds-skeleton-pulse {
1762
+ 50% { opacity: 0.5; }
1763
+ }
1764
+
1765
+
1766
+ /* === components/StatusPill.css === */
1767
+ /* StatusPill */
1768
+ .pds-status-pill {
1769
+ display: inline-flex;
1770
+ align-items: center;
1771
+ gap: 0.5rem;
1772
+ height: 2rem;
1773
+ padding-inline-start: 0.375rem;
1774
+ padding-inline-end: 0.875rem;
1775
+ border-radius: var(--radius-full);
1776
+ background-color: var(--color-bg-primary);
1777
+ color: var(--color-text-primary);
1778
+ box-shadow: var(--shadow-md);
1779
+ font-size: var(--font-size-sm);
1780
+ font-weight: var(--font-weight-semibold);
1781
+ white-space: nowrap;
1782
+ }
1783
+
1784
+ .pds-status-pill__indicator {
1785
+ display: inline-flex;
1786
+ align-items: center;
1787
+ justify-content: center;
1788
+ width: 1.25rem;
1789
+ height: 1.25rem;
1790
+ border-radius: var(--radius-full);
1791
+ color: #fff;
1792
+ flex-shrink: 0;
1793
+ background: var(--pill-chip);
1794
+ }
1795
+ .pds-status-pill__indicator svg { width: 0.75rem; height: 0.75rem; }
1796
+
1797
+ .pds-status-pill__label {
1798
+ line-height: 1;
1799
+ color: var(--pill-text);
1800
+ }
1801
+
1802
+
1803
+ /* === components/Switch.css === */
1804
+ /* Switch */
1805
+ .pds-switch {
1806
+ position: relative;
1807
+ display: inline-flex;
1808
+ align-items: center;
1809
+ flex-shrink: 0;
1810
+ border-radius: var(--radius-full);
1811
+ background-color: var(--color-bg-tertiary);
1812
+ border: 1px solid transparent;
1813
+ transition-property: background-color, border-color;
1814
+ transition-duration: var(--duration-fast);
1815
+ transition-timing-function: var(--ease-out);
1816
+ cursor: pointer;
1817
+ padding: 0.125rem;
1818
+ }
1819
+
1820
+ .pds-switch:focus-visible {
1821
+ outline: none;
1822
+ box-shadow: var(--shadow-focus);
1823
+ }
1824
+
1825
+ .pds-switch[data-checked] {
1826
+ background-color: var(--color-bg-brand);
1827
+ }
1828
+
1829
+ .pds-switch[data-disabled] {
1830
+ background-color: var(--color-bg-disabled);
1831
+ cursor: not-allowed;
1832
+ opacity: 0.55;
1833
+ }
1834
+
1835
+ /* sizes — root */
1836
+ .pds-switch--sm { height: 1rem; width: 1.75rem; }
1837
+ .pds-switch--md { height: 1.25rem; width: 2.25rem; }
1838
+ .pds-switch--lg { height: 1.5rem; width: 2.75rem; }
1839
+
1840
+ /* thumb */
1841
+ .pds-switch__thumb {
1842
+ display: block;
1843
+ border-radius: var(--radius-full);
1844
+ background-color: var(--color-bg-primary);
1845
+ box-shadow: var(--shadow-sm);
1846
+ transition: transform var(--duration-normal) var(--ease-out);
1847
+ }
1848
+
1849
+ .pds-switch--sm .pds-switch__thumb { width: 0.75rem; height: 0.75rem; }
1850
+ .pds-switch--md .pds-switch__thumb { width: 1rem; height: 1rem; }
1851
+ .pds-switch--lg .pds-switch__thumb { width: 1.25rem; height: 1.25rem; }
1852
+
1853
+ .pds-switch--sm[data-checked] .pds-switch__thumb { transform: translateX(0.75rem); }
1854
+ .pds-switch--md[data-checked] .pds-switch__thumb { transform: translateX(1rem); }
1855
+ .pds-switch--lg[data-checked] .pds-switch__thumb { transform: translateX(1.25rem); }
1856
+
1857
+
1858
+ /* === components/Tabs.css === */
1859
+ /* Tabs */
1860
+ .pds-tabs {
1861
+ width: 100%;
1862
+ }
1863
+
1864
+ .pds-tabs__list {
1865
+ position: relative;
1866
+ display: inline-flex;
1867
+ align-items: center;
1868
+ gap: 0.25rem;
1869
+ border-bottom: 1px solid var(--color-border-secondary);
1870
+ }
1871
+
1872
+ .pds-tabs__tab {
1873
+ position: relative;
1874
+ display: inline-flex;
1875
+ align-items: center;
1876
+ justify-content: center;
1877
+ height: 2.25rem;
1878
+ padding-inline: 0.75rem;
1879
+ border: 0;
1880
+ background: transparent;
1881
+ font-family: inherit;
1882
+ font-size: var(--font-size-sm);
1883
+ font-weight: var(--font-weight-medium);
1884
+ color: var(--color-text-secondary);
1885
+ cursor: pointer;
1886
+ user-select: none;
1887
+ border-radius: var(--radius-sm);
1888
+ transition: color var(--duration-fast) var(--ease-out);
1889
+ }
1890
+
1891
+ .pds-tabs__tab:hover {
1892
+ color: var(--color-text-primary);
1893
+ }
1894
+
1895
+ .pds-tabs__tab:focus-visible {
1896
+ outline: none;
1897
+ box-shadow: var(--shadow-focus);
1898
+ }
1899
+
1900
+ .pds-tabs__tab[data-selected] {
1901
+ color: var(--color-text-primary);
1902
+ }
1903
+
1904
+ .pds-tabs__tab[data-disabled] {
1905
+ color: var(--color-text-disabled);
1906
+ cursor: not-allowed;
1907
+ }
1908
+ .pds-tabs__tab[data-disabled]:hover {
1909
+ color: var(--color-text-disabled);
1910
+ }
1911
+
1912
+ .pds-tabs__indicator {
1913
+ position: absolute;
1914
+ left: 0;
1915
+ bottom: -1px;
1916
+ height: 2px;
1917
+ width: var(--active-tab-width);
1918
+ transform: translateX(var(--active-tab-left));
1919
+ background-color: var(--color-bg-brand);
1920
+ transition: transform var(--duration-normal) var(--ease-out), width var(--duration-normal) var(--ease-out);
1921
+ }
1922
+
1923
+ .pds-tabs__panel {
1924
+ padding-block: 1rem;
1925
+ outline: none;
1926
+ border-radius: var(--radius-sm);
1927
+ }
1928
+
1929
+ .pds-tabs__panel:focus-visible {
1930
+ box-shadow: var(--shadow-focus);
1931
+ }
1932
+
1933
+
1934
+ /* === components/Textarea.css === */
1935
+ /* Textarea */
1936
+ .pds-textarea {
1937
+ width: 100%;
1938
+ font-family: inherit;
1939
+ background-color: var(--color-bg-primary);
1940
+ color: var(--color-text-primary);
1941
+ border: 1px solid var(--color-border-primary);
1942
+ border-radius: var(--radius-lg);
1943
+ padding-block: 0.5rem;
1944
+ transition-property: color, background-color, border-color, box-shadow;
1945
+ transition-duration: var(--duration-fast);
1946
+ transition-timing-function: var(--ease-out);
1947
+ }
1948
+
1949
+ .pds-textarea::placeholder {
1950
+ color: var(--color-text-tertiary);
1951
+ }
1952
+
1953
+ .pds-textarea:focus-visible {
1954
+ outline: none;
1955
+ border-color: var(--color-border-focus);
1956
+ box-shadow: var(--shadow-focus);
1957
+ }
1958
+
1959
+ .pds-textarea:disabled {
1960
+ background-color: var(--color-bg-disabled);
1961
+ color: var(--color-text-disabled);
1962
+ cursor: not-allowed;
1963
+ }
1964
+
1965
+ .pds-textarea[aria-invalid] {
1966
+ border-color: var(--color-border-danger);
1967
+ }
1968
+ .pds-textarea[aria-invalid]:focus-visible {
1969
+ border-color: var(--color-border-danger);
1970
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-bg-danger-strong) 25%, transparent);
1971
+ }
1972
+
1973
+ /* sizes */
1974
+ .pds-textarea--sm {
1975
+ min-height: 4rem;
1976
+ padding-inline: var(--control-px-sm);
1977
+ font-size: var(--font-size-xs);
1978
+ }
1979
+ .pds-textarea--md {
1980
+ min-height: 5rem;
1981
+ padding-inline: var(--control-px-md);
1982
+ font-size: var(--font-size-sm);
1983
+ }
1984
+ .pds-textarea--lg {
1985
+ min-height: 6rem;
1986
+ padding-inline: var(--control-px-lg);
1987
+ font-size: var(--font-size-md);
1988
+ }
1989
+
1990
+
1991
+ /* === components/Toast.css === */
1992
+ /* Toast — viewport */
1993
+ .pds-toast-viewport {
1994
+ position: fixed;
1995
+ bottom: 1rem;
1996
+ right: 1rem;
1997
+ z-index: 50;
1998
+ margin-inline: auto;
1999
+ display: flex;
2000
+ flex-direction: column-reverse;
2001
+ width: min(420px, calc(100vw - 2rem));
2002
+ outline: none;
2003
+ }
2004
+
2005
+ /* item (root + content combined for a single Base UI Root) */
2006
+ .pds-toast-item {
2007
+ position: absolute;
2008
+ right: 0;
2009
+ bottom: 0;
2010
+ left: auto;
2011
+ width: 100%;
2012
+ border: 1px solid var(--color-border-secondary);
2013
+ background-color: var(--color-bg-primary);
2014
+ color: var(--color-text-primary);
2015
+ border-radius: var(--radius-md);
2016
+ box-shadow: var(--shadow-lg);
2017
+ padding: 1rem 2.5rem 1rem 1rem;
2018
+ display: flex;
2019
+ flex-direction: column;
2020
+ gap: 0.25rem;
2021
+
2022
+ transform:
2023
+ translateX(var(--toast-swipe-movement-x))
2024
+ translateY(calc(var(--toast-index) * -20% + var(--toast-swipe-movement-y)));
2025
+ transition:
2026
+ transform 350ms var(--ease-out),
2027
+ opacity 350ms var(--ease-out),
2028
+ background-color 200ms var(--ease-out),
2029
+ color 200ms var(--ease-out);
2030
+ }
2031
+
2032
+ .pds-toast-item[data-expanded] {
2033
+ transform: translateY(calc(var(--toast-offset-y) * -1px - var(--toast-index) * var(--gap)));
2034
+ }
2035
+
2036
+ .pds-toast-item[data-limited] {
2037
+ opacity: 0;
2038
+ }
2039
+
2040
+ .pds-toast-item::after {
2041
+ content: "";
2042
+ position: absolute;
2043
+ left: 0;
2044
+ right: 0;
2045
+ bottom: 100%;
2046
+ height: calc(var(--gap) + 1px);
2047
+ }
2048
+
2049
+ .pds-toast-title {
2050
+ font-size: var(--font-size-sm);
2051
+ font-weight: var(--font-weight-semibold);
2052
+ line-height: var(--line-height-snug);
2053
+ }
2054
+
2055
+ .pds-toast-description {
2056
+ font-size: var(--font-size-sm);
2057
+ color: var(--color-text-secondary);
2058
+ line-height: var(--line-height-snug);
2059
+ }
2060
+
2061
+ .pds-toast-close {
2062
+ position: absolute;
2063
+ top: 0.5rem;
2064
+ right: 0.5rem;
2065
+ display: inline-flex;
2066
+ width: 1.75rem;
2067
+ height: 1.75rem;
2068
+ align-items: center;
2069
+ justify-content: center;
2070
+ border: 0;
2071
+ background: transparent;
2072
+ border-radius: var(--radius-md);
2073
+ color: var(--color-text-tertiary);
2074
+ cursor: pointer;
2075
+ transition: background-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out);
2076
+ }
2077
+
2078
+ .pds-toast-close:hover {
2079
+ background-color: var(--color-bg-hover);
2080
+ color: var(--color-text-primary);
2081
+ }
2082
+
2083
+ .pds-toast-close:focus-visible {
2084
+ outline: none;
2085
+ box-shadow: var(--shadow-focus);
2086
+ }
2087
+
2088
+ .pds-toast-close svg { width: 1rem; height: 1rem; }
2089
+
2090
+
2091
+ /* === components/Tooltip.css === */
2092
+ /* Tooltip */
2093
+ .pds-tooltip-positioner {
2094
+ outline: none;
2095
+ z-index: 50;
2096
+ }
2097
+
2098
+ .pds-tooltip-popup {
2099
+ z-index: 50;
2100
+ max-width: 20rem;
2101
+ border-radius: var(--radius-sm);
2102
+ padding: 0.25rem 0.5rem;
2103
+ font-size: var(--font-size-xs);
2104
+ background-color: var(--color-bg-inverse);
2105
+ color: var(--color-text-inverse);
2106
+ box-shadow: var(--shadow-md);
2107
+ transform-origin: var(--transform-origin);
2108
+ transition-property: opacity, transform, scale;
2109
+ transition-duration: var(--duration-fast);
2110
+ transition-timing-function: var(--ease-out);
2111
+ }
2112
+
2113
+ .pds-tooltip-popup[data-starting-style],
2114
+ .pds-tooltip-popup[data-ending-style] {
2115
+ opacity: 0;
2116
+ transform: scale(0.95);
2117
+ }
2118
+
2119
+ .pds-tooltip-popup[data-instant] {
2120
+ transition-duration: 0s;
2121
+ }
2122
+