@paraxe/design 1.0.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/src/tokens.css ADDED
@@ -0,0 +1,635 @@
1
+ /* ==========================================================================
2
+ @loba/design — tokens.css
3
+ LAYER 1 — STRUCTURAL DESIGN TOKENS
4
+
5
+ Loba Design v1.1
6
+ Theme-independent, non-color values.
7
+
8
+ Single source of truth for the structural design language of the
9
+ entire Loba ecosystem.
10
+
11
+ Consumed directly by:
12
+ - @loba/ui
13
+ - @loba/design/components.css
14
+ - project-owned HTML/CSS
15
+ - generated Loba CLI projects
16
+
17
+ v1.1 additions:
18
+ - expanded semantic typography vocabulary
19
+ - display typography roles
20
+ - eyebrow / label / section typography roles
21
+ - section composition anchors
22
+ - layout composition anchors
23
+ - media / aspect-ratio anchors
24
+ - button size structure
25
+ - form structure
26
+ - badge structure
27
+ - navigation structure
28
+ - accessibility geometry
29
+ - responsive breakpoints
30
+
31
+ ❌ colors → themes/*.css
32
+ ❌ font @imports → presets/*.css
33
+ ❌ component implementations → components.css / @loba/ui
34
+ ========================================================================== */
35
+
36
+ :root {
37
+
38
+ /* =====================================================
39
+ SPACING SCALE
40
+ 4px base
41
+ ===================================================== */
42
+
43
+ --space-0: 0px;
44
+ --space-px: 1px;
45
+
46
+ --space-1: 0.25rem;
47
+ --space-2: 0.5rem;
48
+ --space-3: 0.75rem;
49
+ --space-4: 1rem;
50
+ --space-5: 1.25rem;
51
+ --space-6: 1.5rem;
52
+ --space-7: 1.75rem;
53
+ --space-8: 2rem;
54
+ --space-9: 2.25rem;
55
+ --space-10: 2.5rem;
56
+ --space-11: 2.75rem;
57
+ --space-12: 3rem;
58
+ --space-14: 3.5rem;
59
+ --space-16: 4rem;
60
+ --space-20: 5rem;
61
+ --space-24: 6rem;
62
+ --space-28: 7rem;
63
+ --space-32: 8rem;
64
+ --space-36: 9rem;
65
+ --space-40: 10rem;
66
+ --space-44: 11rem;
67
+ --space-48: 12rem;
68
+ --space-52: 13rem;
69
+ --space-56: 14rem;
70
+ --space-60: 15rem;
71
+ --space-64: 16rem;
72
+ --space-72: 18rem;
73
+ --space-80: 20rem;
74
+ --space-96: 24rem;
75
+
76
+
77
+ /* =====================================================
78
+ SPACING ROLES
79
+ ===================================================== */
80
+
81
+ --section-spacing: var(--space-24);
82
+ --section-spacing-sm: var(--space-16);
83
+ --section-spacing-lg: var(--space-32);
84
+
85
+ --container-padding: var(--space-6);
86
+ --container-padding-lg: var(--space-8);
87
+
88
+ --card-padding: var(--space-6);
89
+ --card-padding-sm: var(--space-4);
90
+ --card-padding-lg: var(--space-8);
91
+
92
+ --stack-gap: var(--space-4);
93
+ --stack-gap-sm: var(--space-2);
94
+ --stack-gap-lg: var(--space-8);
95
+
96
+ --inline-gap: var(--space-3);
97
+ --inline-gap-sm: var(--space-2);
98
+ --inline-gap-lg: var(--space-6);
99
+
100
+ --grid-gap: var(--space-6);
101
+ --grid-gap-sm: var(--space-4);
102
+ --grid-gap-lg: var(--space-8);
103
+
104
+ --grid-min: 16rem;
105
+
106
+
107
+ /* =====================================================
108
+ LAYOUT
109
+ ===================================================== */
110
+
111
+ --container-max-width: 1280px;
112
+ --container-wide: 1440px;
113
+ --container-narrow: 768px;
114
+
115
+ --container-gutter: 1.5rem;
116
+ --container-gutter-lg: 2rem;
117
+
118
+ --content-width-narrow: 65ch;
119
+ --content-width-readable: 72ch;
120
+ --content-width-wide: 80ch;
121
+
122
+
123
+ /* =====================================================
124
+ SECTION COMPOSITION
125
+ ===================================================== */
126
+
127
+ --section-inner-max-width: var(--container-max-width);
128
+
129
+ --section-header-max-width: 720px;
130
+ --section-header-wide-max-width: 1000px;
131
+
132
+ --section-header-gap: var(--space-4);
133
+ --section-header-title-gap: var(--space-3);
134
+ --section-header-description-gap: var(--space-4);
135
+
136
+ --section-header-margin-bottom: var(--space-16);
137
+ --section-header-margin-bottom-sm: var(--space-12);
138
+ --section-header-margin-bottom-lg: var(--space-20);
139
+
140
+ --section-content-gap: var(--space-12);
141
+
142
+ --section-radius: var(--radius-3xl);
143
+
144
+
145
+ /* =====================================================
146
+ SECTION RHYTHM
147
+ Background roles reference theme tokens.
148
+ Structural only — no colours defined here.
149
+ ===================================================== */
150
+
151
+ --section-bg-inverse: var(--text-primary);
152
+ --section-bg-base: var(--background-secondary);
153
+ --section-bg-raised: var(--surface-raised);
154
+ --section-bg-surface: var(--surface-card);
155
+ --section-bg-subtle: var(--surface-base);
156
+ --section-bg-brand: var(--brand-primary-muted);
157
+
158
+
159
+ /* =====================================================
160
+ Z-INDEX
161
+ ===================================================== */
162
+
163
+ --z-base: 0;
164
+ --z-floor: 10;
165
+ --z-sticky: 30;
166
+ --z-navbar: 50;
167
+ --z-dropdown: 70;
168
+ --z-overlay: 80;
169
+ --z-modal: 90;
170
+ --z-popover: 95;
171
+ --z-tooltip: 100;
172
+
173
+
174
+ /* =====================================================
175
+ TYPOGRAPHY — FAMILIES
176
+ ===================================================== */
177
+
178
+ --font-family-display:
179
+ "Plus Jakarta Sans",
180
+ ui-sans-serif,
181
+ system-ui,
182
+ -apple-system,
183
+ "Segoe UI",
184
+ Roboto,
185
+ "Helvetica Neue",
186
+ Arial,
187
+ "Noto Sans";
188
+
189
+ --font-family-body:
190
+ "Plus Jakarta Sans",
191
+ ui-sans-serif,
192
+ system-ui,
193
+ -apple-system,
194
+ "Segoe UI",
195
+ Roboto,
196
+ "Helvetica Neue",
197
+ Arial,
198
+ "Noto Sans";
199
+
200
+ --font-family-mono:
201
+ "JetBrains Mono",
202
+ "Fira Code",
203
+ monospace;
204
+
205
+
206
+ /* =====================================================
207
+ TYPOGRAPHY — WEIGHTS
208
+ ===================================================== */
209
+
210
+ --font-weight-light: 300;
211
+ --font-weight-regular: 400;
212
+ --font-weight-medium: 500;
213
+ --font-weight-semibold: 600;
214
+ --font-weight-bold: 700;
215
+ --font-weight-extrabold: 800;
216
+
217
+
218
+ /* =====================================================
219
+ TYPOGRAPHY — SIZES
220
+ ===================================================== */
221
+
222
+ --font-size-xs: 0.75rem;
223
+ --font-size-sm: 0.875rem;
224
+ --font-size-base: 1rem;
225
+ --font-size-lg: 1.125rem;
226
+ --font-size-xl: 1.25rem;
227
+ --font-size-2xl: 1.5rem;
228
+ --font-size-3xl: 1.875rem;
229
+ --font-size-4xl: 2.25rem;
230
+ --font-size-5xl: 3rem;
231
+ --font-size-6xl: 3.75rem;
232
+ --font-size-7xl: 4.5rem;
233
+ --font-size-8xl: 6rem;
234
+ --font-size-9xl: 8rem;
235
+
236
+
237
+ /* =====================================================
238
+ TYPOGRAPHY — LINE HEIGHTS
239
+ ===================================================== */
240
+
241
+ --line-height-none: 1;
242
+ --line-height-tight: 1.1;
243
+ --line-height-snug: 1.25;
244
+ --line-height-normal: 1.5;
245
+ --line-height-relaxed: 1.625;
246
+ --line-height-loose: 2;
247
+
248
+
249
+ /* =====================================================
250
+ TYPOGRAPHY — LETTER SPACING
251
+ ===================================================== */
252
+
253
+ --letter-spacing-tighter: -0.04em;
254
+ --letter-spacing-tight: -0.025em;
255
+ --letter-spacing-normal: 0em;
256
+ --letter-spacing-wide: 0.025em;
257
+ --letter-spacing-wider: 0.05em;
258
+ --letter-spacing-widest: 0.1em;
259
+
260
+
261
+ /* =====================================================
262
+ TYPOGRAPHY — SEMANTIC SCALE
263
+ ===================================================== */
264
+
265
+ --typography-display-size: var(--font-size-8xl);
266
+ --typography-display-weight: var(--font-weight-extrabold);
267
+ --typography-display-lineheight: var(--line-height-tight);
268
+ --typography-display-letterspacing: var(--letter-spacing-tighter);
269
+
270
+ --typography-h1-size: var(--font-size-6xl);
271
+ --typography-h2-size: var(--font-size-4xl);
272
+ --typography-h3-size: var(--font-size-3xl);
273
+ --typography-h4-size: var(--font-size-2xl);
274
+
275
+ --typography-heading-weight: var(--font-weight-semibold);
276
+ --typography-heading-lineheight: var(--line-height-tight);
277
+ --typography-heading-letterspacing: var(--letter-spacing-tight);
278
+
279
+ --typography-lead-size: var(--font-size-xl);
280
+ --typography-lead-lineheight: var(--line-height-relaxed);
281
+ --typography-lead-weight: var(--font-weight-regular);
282
+
283
+ --typography-body-size: var(--font-size-base);
284
+ --typography-body-lineheight: var(--line-height-normal);
285
+ --typography-body-weight: var(--font-weight-regular);
286
+
287
+ --typography-body-large-size: var(--font-size-lg);
288
+ --typography-body-large-lineheight: var(--line-height-relaxed);
289
+
290
+ --typography-caption-size: var(--font-size-sm);
291
+ --typography-caption-lineheight: var(--line-height-normal);
292
+
293
+ --typography-overline-size: var(--font-size-xs);
294
+ --typography-overline-lineheight: var(--line-height-snug);
295
+ --typography-overline-weight: var(--font-weight-semibold);
296
+ --typography-overline-letterspacing: var(--letter-spacing-wider);
297
+
298
+ --typography-eyebrow-size: var(--font-size-sm);
299
+ --typography-eyebrow-lineheight: var(--line-height-none);
300
+ --typography-eyebrow-weight: var(--font-weight-bold);
301
+ --typography-eyebrow-letterspacing: var(--letter-spacing-wider);
302
+
303
+ --typography-label-size: var(--font-size-sm);
304
+ --typography-label-lineheight: var(--line-height-snug);
305
+ --typography-label-weight: var(--font-weight-semibold);
306
+ --typography-label-letterspacing: var(--letter-spacing-wide);
307
+
308
+ --typography-section-title-size: var(--font-size-5xl);
309
+ --typography-section-title-lineheight: var(--line-height-tight);
310
+ --typography-section-title-weight: var(--font-weight-bold);
311
+ --typography-section-title-letterspacing: var(--letter-spacing-tight);
312
+
313
+ --typography-section-description-size: var(--font-size-base);
314
+ --typography-section-description-lineheight: var(--line-height-relaxed);
315
+
316
+ --typography-nav-size: var(--font-size-sm);
317
+ --typography-nav-weight: var(--font-weight-medium);
318
+
319
+ --typography-button-size: var(--font-size-sm);
320
+ --typography-button-weight: var(--font-weight-medium);
321
+ --typography-button-lineheight: var(--line-height-none);
322
+
323
+ --typography-code-size: var(--font-size-sm);
324
+
325
+
326
+ /* =====================================================
327
+ RADIUS
328
+ ===================================================== */
329
+
330
+ --radius-none: 0px;
331
+ --radius-sm: 0.125rem;
332
+ --radius-base: 0.25rem;
333
+ --radius-md: 0.375rem;
334
+ --radius-lg: 0.5rem;
335
+ --radius-xl: 0.75rem;
336
+ --radius-2xl: 1rem;
337
+ --radius-3xl: 1.5rem;
338
+ --radius-full: 9999px;
339
+
340
+
341
+ /* =====================================================
342
+ SHADOWS
343
+ Structural values only.
344
+ Brand tint is applied in theme tokens.
345
+ ===================================================== */
346
+
347
+ --shadow-sm:
348
+ 0 1px 2px 0 rgb(0 0 0 / 0.05);
349
+
350
+ --shadow-base:
351
+ 0 1px 3px 0 rgb(0 0 0 / 0.1),
352
+ 0 1px 2px -1px rgb(0 0 0 / 0.1);
353
+
354
+ --shadow-md:
355
+ 0 4px 6px -1px rgb(0 0 0 / 0.1),
356
+ 0 2px 4px -2px rgb(0 0 0 / 0.1);
357
+
358
+ --shadow-lg:
359
+ 0 10px 15px -3px rgb(0 0 0 / 0.1),
360
+ 0 4px 6px -4px rgb(0 0 0 / 0.1);
361
+
362
+ --shadow-xl:
363
+ 0 20px 25px -5px rgb(0 0 0 / 0.1),
364
+ 0 8px 10px -6px rgb(0 0 0 / 0.1);
365
+
366
+ --shadow-2xl:
367
+ 0 25px 50px -12px rgb(0 0 0 / 0.25);
368
+
369
+ --shadow-inner:
370
+ inset 0 2px 4px 0 rgb(0 0 0 / 0.05);
371
+
372
+
373
+ /* =====================================================
374
+ MOTION — DURATIONS
375
+ ===================================================== */
376
+
377
+ --motion-duration-fast: 150ms;
378
+ --motion-duration-normal: 300ms;
379
+ --motion-duration-slow: 500ms;
380
+ --motion-duration-slower: 700ms;
381
+ --motion-duration-slowest: 1000ms;
382
+
383
+
384
+ /* =====================================================
385
+ MOTION — EASINGS
386
+ ===================================================== */
387
+
388
+ --motion-ease-in:
389
+ cubic-bezier(0.4, 0, 1, 1);
390
+
391
+ --motion-ease-out:
392
+ cubic-bezier(0, 0, 0.2, 1);
393
+
394
+ --motion-ease-in-out:
395
+ cubic-bezier(0.4, 0, 0.2, 1);
396
+
397
+ --motion-ease-spring:
398
+ cubic-bezier(0.175, 0.885, 0.32, 1.275);
399
+
400
+ --motion-ease-smooth:
401
+ cubic-bezier(0.22, 1, 0.36, 1);
402
+
403
+
404
+ /* =====================================================
405
+ MOTION — COMBINATORS
406
+ ===================================================== */
407
+
408
+ --motion-fast:
409
+ var(--motion-duration-fast)
410
+ var(--motion-ease-out);
411
+
412
+ --motion-normal:
413
+ var(--motion-duration-normal)
414
+ var(--motion-ease-smooth);
415
+
416
+ --motion-slow:
417
+ var(--motion-duration-slow)
418
+ var(--motion-ease-smooth);
419
+
420
+ --motion-slower:
421
+ var(--motion-duration-slower)
422
+ var(--motion-ease-smooth);
423
+
424
+ --ease-standard: var(--motion-ease-out);
425
+ --ease-smooth: var(--motion-ease-smooth);
426
+ --ease-spring: var(--motion-ease-spring);
427
+
428
+ --transition-fast:
429
+ all var(--motion-duration-fast) var(--motion-ease-out);
430
+
431
+ --transition-normal:
432
+ all var(--motion-duration-normal) var(--motion-ease-smooth);
433
+
434
+ --transition-slow:
435
+ all var(--motion-duration-slow) var(--motion-ease-smooth);
436
+
437
+
438
+ /* =====================================================
439
+ COMPONENT STRUCTURE — BUTTONS
440
+ ===================================================== */
441
+
442
+ --button-radius: var(--radius-full);
443
+
444
+ --button-padding-x: 1.5rem;
445
+ --button-padding-y: 0.75rem;
446
+
447
+ --button-padding-x-sm: 1rem;
448
+ --button-padding-y-sm: 0.5rem;
449
+
450
+ --button-padding-x-lg: 2rem;
451
+ --button-padding-y-lg: 1rem;
452
+
453
+ --button-gap: 0.5rem;
454
+
455
+ --button-min-height: 44px;
456
+ --button-min-height-sm: 36px;
457
+ --button-min-height-lg: 52px;
458
+
459
+ --button-icon-size: 1rem;
460
+ --button-icon-size-sm: 0.875rem;
461
+ --button-icon-size-lg: 1.125rem;
462
+
463
+
464
+ /* =====================================================
465
+ COMPONENT STRUCTURE — CARDS
466
+ ===================================================== */
467
+
468
+ --card-radius: var(--radius-lg);
469
+
470
+ --card-padding: var(--space-6);
471
+ --card-padding-sm: var(--space-4);
472
+ --card-padding-lg: var(--space-8);
473
+
474
+ --card-content-gap: var(--space-4);
475
+
476
+
477
+ /* =====================================================
478
+ COMPONENT STRUCTURE — BADGES
479
+ ===================================================== */
480
+
481
+ --badge-radius: var(--radius-full);
482
+
483
+ --badge-padding-x: var(--space-3);
484
+ --badge-padding-y: var(--space-1);
485
+
486
+ --badge-gap: var(--space-1);
487
+
488
+ --badge-min-height: 24px;
489
+
490
+ /* =====================================================
491
+ COMPONENT STRUCTURE — TAGS
492
+ ===================================================== */
493
+
494
+ --tag-radius: var(--radius-md);
495
+
496
+ --tag-padding-x: var(--space-2);
497
+ --tag-padding-y: var(--space-1);
498
+
499
+ --tag-gap: var(--space-1);
500
+
501
+ --tag-min-height: 24px;
502
+
503
+ /* =====================================================
504
+ COMPONENT STRUCTURE — NAVIGATION
505
+ ===================================================== */
506
+
507
+ --nav-height: 4.5rem;
508
+ --nav-height-sm: 4rem;
509
+
510
+ --nav-padding-x: var(--container-padding);
511
+ --nav-padding-x-lg: var(--container-padding-lg);
512
+
513
+ --nav-blur: 12px;
514
+
515
+ --nav-link-padding-x: 0.75rem;
516
+ --nav-link-padding-y: 0.5rem;
517
+
518
+ --nav-link-radius: var(--radius-md);
519
+
520
+ --nav-gap: var(--space-2);
521
+ --nav-content-gap: var(--space-8);
522
+
523
+
524
+ /* =====================================================
525
+ COMPONENT STRUCTURE — FORMS
526
+ ===================================================== */
527
+
528
+ --form-height: 44px;
529
+ --form-height-sm: 36px;
530
+ --form-height-lg: 52px;
531
+
532
+ --form-padding-x: 1rem;
533
+ --form-padding-y: 0.75rem;
534
+
535
+ --form-radius: var(--radius-md);
536
+
537
+ --form-gap: var(--space-2);
538
+
539
+ --form-label-gap: var(--space-2);
540
+ --form-field-gap: var(--space-4);
541
+
542
+ --form-textarea-min-height: 120px;
543
+
544
+
545
+ /* =====================================================
546
+ COMPONENT STRUCTURE — MEDIA
547
+ ===================================================== */
548
+
549
+ --media-radius: var(--radius-lg);
550
+ --media-radius-sm: var(--radius-md);
551
+ --media-radius-lg: var(--radius-2xl);
552
+
553
+ --media-aspect-square: 1 / 1;
554
+ --media-aspect-video: 16 / 9;
555
+ --media-aspect-wide: 21 / 9;
556
+ --media-aspect-portrait: 4 / 5;
557
+ --media-aspect-tall: 3 / 4;
558
+
559
+
560
+ /* =====================================================
561
+ COMPONENT STRUCTURE — ICONS
562
+ ===================================================== */
563
+
564
+ --icon-size-xs: 0.75rem;
565
+ --icon-size-sm: 1rem;
566
+ --icon-size-md: 1.25rem;
567
+ --icon-size-lg: 1.5rem;
568
+ --icon-size-xl: 2rem;
569
+
570
+ --icon-button-size-sm: 36px;
571
+ --icon-button-size: 44px;
572
+ --icon-button-size-lg: 52px;
573
+
574
+
575
+ /* =====================================================
576
+ COMPONENT STRUCTURE — FOCUS
577
+ ===================================================== */
578
+
579
+ --focus-ring-width: 2px;
580
+ --focus-ring-offset: 2px;
581
+ --focus-ring-offset-lg: 4px;
582
+
583
+
584
+ /* =====================================================
585
+ RESPONSIVE BREAKPOINTS
586
+ Structural reference values.
587
+
588
+ These are primarily consumed by build tooling / documentation.
589
+ CSS media queries may use the values directly where supported
590
+ through project-owned breakpoint definitions.
591
+ ===================================================== */
592
+
593
+ --breakpoint-sm: 640px;
594
+ --breakpoint-md: 768px;
595
+ --breakpoint-lg: 1024px;
596
+ --breakpoint-xl: 1280px;
597
+ --breakpoint-2xl: 1536px;
598
+
599
+
600
+ /* =====================================================
601
+ CONTENT / COMPOSITION LIMITS
602
+ ===================================================== */
603
+
604
+ --prose-measure: 65ch;
605
+ --prose-measure-wide: 75ch;
606
+
607
+ --text-max-width-sm: 36rem;
608
+ --text-max-width-md: 48rem;
609
+ --text-max-width-lg: 64rem;
610
+
611
+
612
+ /* =====================================================
613
+ ASPECT / GRID COMPOSITION
614
+ ===================================================== */
615
+
616
+
617
+ --grid-min-width-sm: 12rem;
618
+ --grid-min-width: 16rem;
619
+ --grid-min-width-lg: 20rem;
620
+
621
+
622
+ /* =====================================================
623
+ MOTION / INTERACTION ANCHORS
624
+ ===================================================== */
625
+
626
+ --interaction-lift-sm: -1px;
627
+ --interaction-lift: -2px;
628
+ --interaction-lift-lg: -4px;
629
+
630
+ --interaction-scale-sm: 0.98;
631
+ --interaction-scale: 0.97;
632
+
633
+ --interaction-opacity-disabled: 0.5;
634
+
635
+ }