@zevra/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/DECISIONS.md +150 -0
  2. package/README.md +177 -0
  3. package/logos/index.json +599 -0
  4. package/logos/png/campus-glyph-ink.png +0 -0
  5. package/logos/png/campus-glyph-orig.png +0 -0
  6. package/logos/png/campus-glyph-white.png +0 -0
  7. package/logos/png/campus-lockup.png +0 -0
  8. package/logos/png/lexform-glyph-ink.png +0 -0
  9. package/logos/png/lexform-glyph-orig.png +0 -0
  10. package/logos/png/lexform-glyph-white.png +0 -0
  11. package/logos/png/lexform-lockup.png +0 -0
  12. package/logos/png/mcp-glyph-ink.png +0 -0
  13. package/logos/png/mcp-glyph-orig.png +0 -0
  14. package/logos/png/mcp-glyph-white.png +0 -0
  15. package/logos/png/mcp-lockup.png +0 -0
  16. package/logos/png/memoire-dark.png +0 -0
  17. package/logos/png/memoire-glyph-ink.png +0 -0
  18. package/logos/png/memoire-glyph-orig.png +0 -0
  19. package/logos/png/memoire-glyph-white.png +0 -0
  20. package/logos/png/memoire-lockup.png +0 -0
  21. package/logos/png/zevra-lockup-ink.png +0 -0
  22. package/logos/png/zevra-lockup-white.png +0 -0
  23. package/logos/png/zevra-lockup.png +0 -0
  24. package/logos/png/zevra-mark-ink.png +0 -0
  25. package/logos/png/zevra-mark-orig.png +0 -0
  26. package/logos/png/zevra-mark-white.png +0 -0
  27. package/logos/png/zevra-mark.png +0 -0
  28. package/logos/svg/campus-glyph-ink.svg +1 -0
  29. package/logos/svg/campus-glyph-navy.svg +1 -0
  30. package/logos/svg/campus-glyph-orig.svg +1 -0
  31. package/logos/svg/campus-glyph-white.svg +1 -0
  32. package/logos/svg/campus-lockup-ink.svg +1 -0
  33. package/logos/svg/campus-lockup-navy.svg +1 -0
  34. package/logos/svg/campus-lockup-orig.svg +1 -0
  35. package/logos/svg/campus-lockup-white.svg +1 -0
  36. package/logos/svg/lexform-glyph-ink.svg +1 -0
  37. package/logos/svg/lexform-glyph-navy.svg +1 -0
  38. package/logos/svg/lexform-glyph-orig.svg +1 -0
  39. package/logos/svg/lexform-glyph-white.svg +1 -0
  40. package/logos/svg/lexform-lockup-ink.svg +1 -0
  41. package/logos/svg/lexform-lockup-navy.svg +1 -0
  42. package/logos/svg/lexform-lockup-orig.svg +1 -0
  43. package/logos/svg/lexform-lockup-white.svg +1 -0
  44. package/logos/svg/mcp-glyph-ink.svg +1 -0
  45. package/logos/svg/mcp-glyph-navy.svg +1 -0
  46. package/logos/svg/mcp-glyph-orig.svg +1 -0
  47. package/logos/svg/mcp-glyph-white.svg +1 -0
  48. package/logos/svg/mcp-lockup-ink.svg +1 -0
  49. package/logos/svg/mcp-lockup-navy.svg +1 -0
  50. package/logos/svg/mcp-lockup-orig.svg +1 -0
  51. package/logos/svg/mcp-lockup-white.svg +1 -0
  52. package/logos/svg/memoire-glyph-ink.svg +1 -0
  53. package/logos/svg/memoire-glyph-navy.svg +1 -0
  54. package/logos/svg/memoire-glyph-orig.svg +1 -0
  55. package/logos/svg/memoire-glyph-white.svg +1 -0
  56. package/logos/svg/memoire-lockup-ink.svg +1 -0
  57. package/logos/svg/memoire-lockup-navy.svg +1 -0
  58. package/logos/svg/memoire-lockup-orig.svg +1 -0
  59. package/logos/svg/memoire-lockup-white.svg +1 -0
  60. package/logos/svg/zevra-lockup-ink.svg +1 -0
  61. package/logos/svg/zevra-lockup-navy.svg +1 -0
  62. package/logos/svg/zevra-lockup-orig.svg +1 -0
  63. package/logos/svg/zevra-lockup-white.svg +1 -0
  64. package/logos/svg/zevra-mark-ink.svg +1 -0
  65. package/logos/svg/zevra-mark-navy.svg +1 -0
  66. package/logos/svg/zevra-mark-orig.svg +1 -0
  67. package/logos/svg/zevra-mark-white.svg +1 -0
  68. package/package.json +52 -0
  69. package/src/base.css +367 -0
  70. package/src/components.css +553 -0
  71. package/src/fonts.css +16 -0
  72. package/src/index.css +11 -0
  73. package/src/layout.css +542 -0
  74. package/src/motion.css +248 -0
  75. package/src/surfaces.css +235 -0
  76. package/src/tokens.css +76 -0
  77. package/tokens/index.js +91 -0
@@ -0,0 +1,553 @@
1
+ /* Zevra UI — composants : boutons, badges, cartes, encarts
2
+ * Dépend de tokens.css et base.css.
3
+ *
4
+ * Les cinq maquettes ne divergent jamais sur l'intention, souvent sur le
5
+ * chiffre. La règle appliquée ici : Main.html fait foi (c'est la page de
6
+ * référence, la plus complète), les écarts des autres planches sont notés
7
+ * en commentaire et détaillés dans DECISIONS.md.
8
+ */
9
+
10
+ /* ─── Boutons ───────────────────────────────────────────────────────────
11
+ * UN SEUL bouton plein par écran : l'indigo porte l'action, il perd tout
12
+ * s'il est répété. Les actions secondaires prennent la variante fantôme.
13
+ *
14
+ * Hauteur 48px : Main.html, Mobile.html et le prototype s'accordent.
15
+ * DesignSystem.html pose 46px — planche isolée, écartée. */
16
+
17
+ .zv-btn,
18
+ .zv-btn--ghost,
19
+ .zv-btn--ink {
20
+ display: inline-flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ gap: 10px;
24
+ height: 48px;
25
+ padding: 0 24px;
26
+ border-radius: var(--r-btn);
27
+ font-family: var(--font-text);
28
+ font-weight: 600;
29
+ font-size: 14px;
30
+ text-decoration: none;
31
+ border: 0;
32
+ cursor: pointer;
33
+ }
34
+
35
+ .zv-btn {
36
+ background: linear-gradient(180deg, #2b2bb4 0%, var(--accent-deep) 100%);
37
+ color: var(--white);
38
+ /* Le liseré interne fait tout le galbe du bouton : il est dans Main.html
39
+ * mais absent de --shadow-btn, d'où la composition ici. */
40
+ box-shadow:
41
+ 0 1px 0 rgba(255, 255, 255, 0.18) inset,
42
+ var(--shadow-btn);
43
+ }
44
+
45
+ .zv-btn--ghost {
46
+ background: var(--white);
47
+ color: var(--ink);
48
+ border: 1px solid var(--accent-line);
49
+ }
50
+
51
+ .zv-btn--ink {
52
+ background: var(--ink);
53
+ color: var(--white);
54
+ }
55
+
56
+ /* Variante compacte : barres de navigation. L'ombre tombe — un bouton de
57
+ * chrome ne décolle pas de la page. */
58
+ .zv-btn--sm {
59
+ height: 40px;
60
+ padding: 0 18px;
61
+ box-shadow: none;
62
+ }
63
+
64
+ /* CTA mobile : le bouton prend toute la largeur. */
65
+ .zv-btn--block {
66
+ width: 100%;
67
+ }
68
+
69
+ .zv-btn[disabled],
70
+ .zv-btn--ghost[disabled],
71
+ .zv-btn--ink[disabled] {
72
+ /* HORS RELEVÉ — aucune maquette ne montre de bouton désactivé. Traitement
73
+ * minimal et neutre plutôt qu'une couleur inventée. */
74
+ opacity: 0.5;
75
+ cursor: not-allowed;
76
+ box-shadow: none;
77
+ }
78
+
79
+ .zv-btn-row {
80
+ display: flex;
81
+ align-items: center;
82
+ gap: 12px;
83
+ flex-wrap: wrap;
84
+ }
85
+
86
+ .zv-btn-row--stack {
87
+ flex-direction: column;
88
+ gap: 10px;
89
+ width: 100%;
90
+ }
91
+
92
+ /* ─── Lien fléché ───────────────────────────────────────────────────────
93
+ * Le SVG fait 15×15 : quatre occurrences dans Main.html contre une seule
94
+ * à 16px dans DesignSystem.html. Tracés : M5 12h14 et M13 6l6 6-6 6, sur
95
+ * un viewBox 0 0 24 24, stroke currentColor, épaisseur 2, bouts arrondis. */
96
+
97
+ .zv-link-arrow {
98
+ display: inline-flex;
99
+ align-items: center;
100
+ gap: 8px;
101
+ font-size: 14px;
102
+ font-weight: 600;
103
+ color: var(--accent);
104
+ text-decoration: none;
105
+ }
106
+
107
+ .zv-link-arrow:hover {
108
+ color: var(--accent-deep);
109
+ }
110
+
111
+ .zv-link-arrow svg {
112
+ width: 15px;
113
+ height: 15px;
114
+ flex: none;
115
+ }
116
+
117
+ .zv-link-arrow--on-dark {
118
+ color: var(--white);
119
+ }
120
+
121
+ /* ─── Badges et puces ───────────────────────────────────────────────────*/
122
+
123
+ /* Pastille pleine : numéro de pièce, catégorie de section. */
124
+ .zv-pill {
125
+ display: inline-flex;
126
+ align-items: center;
127
+ align-self: flex-start;
128
+ height: 28px;
129
+ padding: 0 13px;
130
+ background: var(--accent-deep);
131
+ color: var(--white);
132
+ font-family: var(--font-mono);
133
+ text-transform: uppercase;
134
+ letter-spacing: 0.18em;
135
+ font-size: 10px;
136
+ font-weight: 700;
137
+ border-radius: var(--r-pill);
138
+ }
139
+
140
+ /* Puce de source (BOSS, Judilibre, KALI…). Le rayon 4px n'a pas de token :
141
+ * il est entre --r-pill (3) et --r-panel (10), sans équivalent. */
142
+ .zv-src {
143
+ display: inline-block;
144
+ font-family: var(--font-mono);
145
+ font-size: 10px;
146
+ letter-spacing: 0.14em;
147
+ text-transform: uppercase;
148
+ color: var(--accent-deep);
149
+ background: var(--white);
150
+ border: 1px solid var(--accent-line);
151
+ border-radius: 4px;
152
+ padding: 6px 10px;
153
+ }
154
+
155
+ /* Variante atténuée : le « + 11 » qui clôt une liste de sources. */
156
+ .zv-src--quiet {
157
+ color: var(--label);
158
+ border-color: var(--line);
159
+ }
160
+
161
+ .zv-src-row {
162
+ display: flex;
163
+ gap: 8px;
164
+ flex-wrap: wrap;
165
+ }
166
+
167
+ /* Entité pseudonymisée Lexform, posée dans le fil du texte. */
168
+ .zv-ent {
169
+ display: inline-block;
170
+ background: linear-gradient(135deg, var(--accent-deep), #3d36d6);
171
+ color: var(--white);
172
+ font-family: var(--font-mono);
173
+ font-size: 10px;
174
+ padding: 1px 6px;
175
+ border-radius: var(--r-pill);
176
+ vertical-align: middle;
177
+ }
178
+
179
+ /* Le paragraphe qui accueille des entités respire davantage : sans cette
180
+ * interligne, les tags se télescopent d'une ligne à l'autre. */
181
+ .zv-ent-text {
182
+ font-size: 14px;
183
+ line-height: 1.9;
184
+ color: var(--ink);
185
+ }
186
+
187
+ /* Micro-label de statut. */
188
+ .zv-tag {
189
+ font-family: var(--font-mono);
190
+ font-size: 9px;
191
+ letter-spacing: 0.14em;
192
+ text-transform: uppercase;
193
+ color: var(--label);
194
+ white-space: nowrap;
195
+ }
196
+
197
+ .zv-tag--ok {
198
+ color: var(--ok);
199
+ }
200
+
201
+ .zv-tag--err {
202
+ color: var(--err);
203
+ }
204
+
205
+ /* Sur fond sombre les états s'éclaircissent, sinon ils virent au noir. */
206
+ .zv-tag--ok-on-dark {
207
+ color: #8fd3a8;
208
+ }
209
+
210
+ .zv-tag--err-on-dark {
211
+ color: #f0a5ad;
212
+ }
213
+
214
+ /* ─── Cartes ────────────────────────────────────────────────────────────
215
+ * ⚠️ ARBITRAGE : le rayon vient de --r-card (16px), comme dans Main.html et
216
+ * Mobile.html. DesignSystem.html et Logos.html codent 14px en dur, le
217
+ * prototype 12px. Voir DECISIONS.md. */
218
+
219
+ .zv-card {
220
+ background: var(--white);
221
+ border: 1px solid var(--line);
222
+ border-radius: var(--r-card);
223
+ box-shadow: var(--shadow-card);
224
+ }
225
+
226
+ /* Paddings relevés : 22 / 24 / 28 / 32px selon la densité. */
227
+ .zv-card--pad {
228
+ padding: 24px;
229
+ }
230
+
231
+ .zv-card--pad-lg {
232
+ padding: 32px;
233
+ }
234
+
235
+ /* Carte de statut. L'état « refusé » n'a pas de token de filet — il n'existe
236
+ * pas de --err-line, là où --ok-line existe. Asymétrie du jeu de tokens. */
237
+ .zv-card--ok {
238
+ border-color: var(--ok-line);
239
+ }
240
+
241
+ .zv-card--err {
242
+ border-color: #efc9cd;
243
+ }
244
+
245
+ /* Carte flottante : celle qui se détache au-dessus d'une scène. */
246
+ .zv-card--float {
247
+ box-shadow: var(--shadow-panel);
248
+ }
249
+
250
+ /* ─── Carte verre ───────────────────────────────────────────────────────
251
+ * Surface semi-opaque posée sur un halo ou une scène. Ne fonctionne QUE
252
+ * devant quelque chose : sur du papier nu, elle disparaît. */
253
+
254
+ .zv-glass {
255
+ background: rgba(255, 255, 255, 0.86);
256
+ border: 1px solid rgba(255, 255, 255, 1);
257
+ border-radius: var(--r-card);
258
+ box-shadow:
259
+ 0 30px 70px rgba(30, 27, 140, 0.18),
260
+ 0 2px 8px rgba(11, 16, 32, 0.05);
261
+ }
262
+
263
+ /* ─── Encarts ───────────────────────────────────────────────────────────
264
+ * Deux encarts distincts au relevé, longtemps confondus. Ils ne se
265
+ * substituent pas : le premier est une citation d'interface (fond blanc,
266
+ * texte gris), le second un extrait de document (fond panel, texte encre,
267
+ * très aéré). */
268
+
269
+ .zv-inset {
270
+ background: var(--white);
271
+ border: 1px solid var(--line);
272
+ border-radius: var(--r-panel);
273
+ padding: 14px 16px;
274
+ font-size: 13px;
275
+ line-height: 1.6;
276
+ color: var(--muted);
277
+ max-width: 380px;
278
+ }
279
+
280
+ .zv-inset__key,
281
+ .zv-inset em {
282
+ font-style: normal;
283
+ color: var(--accent);
284
+ font-weight: 600;
285
+ }
286
+
287
+ .zv-inset--quiet {
288
+ background: var(--panel);
289
+ border-color: var(--hairline);
290
+ font-size: 12px;
291
+ line-height: 1.9;
292
+ color: var(--ink);
293
+ }
294
+
295
+ /* Poussé en bas de la carte qui l'accueille. */
296
+ .zv-inset--bottom {
297
+ margin-top: auto;
298
+ }
299
+
300
+ /* ─── Statistiques ──────────────────────────────────────────────────────*/
301
+
302
+ /* Paire de mini-statistiques au pied d'une carte produit. */
303
+ .zv-ministat {
304
+ display: flex;
305
+ gap: 10px;
306
+ }
307
+
308
+ .zv-ministat__item {
309
+ flex: 1;
310
+ background: var(--panel);
311
+ border: 1px solid var(--hairline);
312
+ border-radius: var(--r-panel);
313
+ padding: 12px 14px;
314
+ display: flex;
315
+ flex-direction: column;
316
+ gap: 2px;
317
+ }
318
+
319
+ .zv-ministat__value {
320
+ font-family: var(--font-display);
321
+ letter-spacing: -0.02em;
322
+ font-size: 18px;
323
+ font-weight: 500;
324
+ }
325
+
326
+ /* Carte statistique autonome (prototype). */
327
+ .zv-stat-card {
328
+ flex: 1;
329
+ background: var(--white);
330
+ border: 1px solid var(--line);
331
+ border-radius: var(--r-panel);
332
+ padding: 16px;
333
+ display: flex;
334
+ flex-direction: column;
335
+ gap: 4px;
336
+ box-shadow: 0 12px 32px rgba(30, 27, 140, 0.08);
337
+ }
338
+
339
+ .zv-stat-card__value {
340
+ font-family: var(--font-display);
341
+ letter-spacing: -0.02em;
342
+ font-size: 22px;
343
+ font-weight: 500;
344
+ }
345
+
346
+ /* ─── Citation ──────────────────────────────────────────────────────────
347
+ * Fond navy, filet clair, citation en Outfit 300.
348
+ * ⚠️ Règle de la passation : jamais de fausse citation. Tant qu'un verbatim
349
+ * n'a pas été recueilli, le bloc reste en réserve, pas en placeholder crédible. */
350
+
351
+ .zv-quote {
352
+ background: linear-gradient(135deg, #06063a, var(--accent-deep));
353
+ color: var(--white);
354
+ border-radius: var(--r-card);
355
+ padding: 28px 32px;
356
+ display: flex;
357
+ flex-direction: column;
358
+ gap: 10px;
359
+ }
360
+
361
+ .zv-quote__text {
362
+ font-family: var(--font-display);
363
+ letter-spacing: -0.02em;
364
+ font-size: 17px;
365
+ font-weight: 300;
366
+ }
367
+
368
+ /* ─── Carte de tarif ────────────────────────────────────────────────────
369
+ * Trois par page au maximum. La formule recommandée se signale par le
370
+ * bandeau indigo et sa pastille — pas par une couleur de fond. */
371
+
372
+ .zv-price {
373
+ background: var(--white);
374
+ border: 1px solid var(--line);
375
+ border-radius: var(--r-card);
376
+ box-shadow: var(--shadow-card);
377
+ padding: 26px;
378
+ display: flex;
379
+ flex-direction: column;
380
+ gap: 10px;
381
+ }
382
+
383
+ .zv-price--featured {
384
+ border-top: 3px solid var(--accent-deep);
385
+ }
386
+
387
+ .zv-price__amount {
388
+ font-family: var(--font-display);
389
+ letter-spacing: -0.02em;
390
+ font-size: 28px;
391
+ font-weight: 300;
392
+ }
393
+
394
+ /* Le « HT · 1re année » accolé au montant, et la mention sous la carte. */
395
+ .zv-price__unit,
396
+ .zv-price__note {
397
+ font-size: 12px;
398
+ color: var(--muted);
399
+ font-weight: 400;
400
+ letter-spacing: normal;
401
+ }
402
+
403
+ /* ─── FAQ ───────────────────────────────────────────────────────────────
404
+ * Cinq questions par page au maximum. */
405
+
406
+ .zv-faq {
407
+ background: var(--white);
408
+ }
409
+
410
+ .zv-faq__q {
411
+ display: flex;
412
+ justify-content: space-between;
413
+ align-items: center;
414
+ gap: 16px;
415
+ padding: 18px 24px;
416
+ border-bottom: 1px solid var(--hairline);
417
+ font-size: 14px;
418
+ font-weight: 600;
419
+ cursor: pointer;
420
+ }
421
+
422
+ .zv-faq__q svg {
423
+ width: 14px;
424
+ height: 14px;
425
+ flex: none;
426
+ color: var(--accent);
427
+ }
428
+
429
+ .zv-faq__a {
430
+ padding: 14px 24px;
431
+ font-size: 13px;
432
+ color: var(--muted);
433
+ }
434
+
435
+ /* ─── Aperçu d'interface ────────────────────────────────────────────────
436
+ * La preuve produit : une question, une réponse, ses sources.
437
+ * ⚠️ Règle de la passation : toujours de vraies données réalistes, jamais
438
+ * de lorem — c'est ce bloc qui porte la crédibilité de la page. */
439
+
440
+ .zv-ui-preview {
441
+ background: var(--white);
442
+ border: 1px solid var(--line);
443
+ border-radius: var(--r-panel);
444
+ padding: 18px 20px;
445
+ display: flex;
446
+ flex-direction: column;
447
+ gap: 10px;
448
+ }
449
+
450
+ .zv-ui-preview__q {
451
+ display: flex;
452
+ align-items: center;
453
+ gap: 10px;
454
+ font-size: 12px;
455
+ color: var(--ink);
456
+ }
457
+
458
+ .zv-ui-preview__q svg {
459
+ width: 12px;
460
+ height: 12px;
461
+ flex: none;
462
+ color: var(--label);
463
+ }
464
+
465
+ .zv-ui-preview__a {
466
+ font-size: 11px;
467
+ color: var(--muted);
468
+ }
469
+
470
+ /* Le compteur de sources, seul élément mis en avant de la réponse. */
471
+ .zv-ui-preview__count {
472
+ color: var(--accent-deep);
473
+ font-weight: 600;
474
+ }
475
+
476
+ /* Les puces de source rétrécissent dans un aperçu. */
477
+ .zv-ui-preview .zv-src {
478
+ font-size: 8px;
479
+ }
480
+
481
+ /* ─── Pastille de validation ────────────────────────────────────────────*/
482
+
483
+ .zv-check {
484
+ width: 18px;
485
+ height: 18px;
486
+ border-radius: 50%;
487
+ background: var(--ok-soft);
488
+ color: var(--ok);
489
+ display: inline-flex;
490
+ align-items: center;
491
+ justify-content: center;
492
+ flex: none;
493
+ }
494
+
495
+ /* ─── Filets ────────────────────────────────────────────────────────────*/
496
+
497
+ .zv-divider {
498
+ height: 1px;
499
+ background: var(--hairline);
500
+ border: 0;
501
+ }
502
+
503
+ .zv-divider--strong {
504
+ background: var(--line);
505
+ }
506
+
507
+ /* Sur fond sombre. La valeur est relevée en border-top de la ligne de
508
+ * statistiques du manifeste ; elle est reprise ici en fond de filet. */
509
+ .zv-divider--on-dark {
510
+ background: rgba(255, 255, 255, 0.18);
511
+ }
512
+
513
+ /* ─── Barre de progression ──────────────────────────────────────────────
514
+ * Deuxième des trois emplois autorisés du spectre. */
515
+
516
+ .zv-progress {
517
+ height: 3px;
518
+ background: var(--hairline);
519
+ border-radius: 2px;
520
+ overflow: hidden;
521
+ }
522
+
523
+ .zv-progress__fill {
524
+ height: 3px;
525
+ background: var(--spectre);
526
+ }
527
+
528
+ /* ─── Mobile ────────────────────────────────────────────────────────────*/
529
+
530
+ @media (max-width: 767px) {
531
+ .zv-btn--sm {
532
+ height: 36px;
533
+ padding: 0 14px;
534
+ font-size: 13px;
535
+ }
536
+
537
+ .zv-pill {
538
+ height: 26px;
539
+ padding: 0 12px;
540
+ letter-spacing: 0.16em;
541
+ }
542
+
543
+ .zv-glass {
544
+ background: rgba(255, 255, 255, 0.88);
545
+ box-shadow:
546
+ 0 20px 48px rgba(30, 27, 140, 0.18),
547
+ 0 2px 8px rgba(11, 16, 32, 0.05);
548
+ }
549
+
550
+ .zv-inset {
551
+ max-width: none;
552
+ }
553
+ }
package/src/fonts.css ADDED
@@ -0,0 +1,16 @@
1
+ /* Zevra — chargement des trois familles de la DA.
2
+ *
3
+ * Import SÉPARÉ du reste : une @import CSS bloque le rendu le temps d'un
4
+ * aller-retour réseau. En production, préférez la balise <link> en tête de
5
+ * document (voir README, section « Polices ») ou l'auto-hébergement ; ce
6
+ * fichier existe pour les prototypes, les maquettes et les canvas de design,
7
+ * où la simplicité prime sur la milliseconde.
8
+ *
9
+ * Graisses volontairement restreintes à ce que la DA utilise réellement —
10
+ * charger la famille entière alourdirait la page sans rien apporter :
11
+ * Outfit 200-600 (titres en 300, wordmarks en 600)
12
+ * Public Sans 400/600 (texte courant)
13
+ * Space Grotesk 500-700 (labels capitales)
14
+ */
15
+
16
+ @import url("https://fonts.googleapis.com/css2?family=Outfit:wght@200;300;400;500;600&family=Public+Sans:wght@400;600&family=Space+Grotesk:wght@500;600;700&display=swap");
package/src/index.css ADDED
@@ -0,0 +1,11 @@
1
+ /* Zevra UI — feuille complète.
2
+ * L'ordre compte : les tokens d'abord, le socle ensuite, puis ce qui
3
+ * s'appuie dessus. Pour n'en charger qu'une partie, importer les modules
4
+ * un à un dans ce même ordre.
5
+ */
6
+ @import "./tokens.css";
7
+ @import "./base.css";
8
+ @import "./components.css";
9
+ @import "./layout.css";
10
+ @import "./surfaces.css";
11
+ @import "./motion.css";