real-world-css-libraries 1.0.3 → 1.0.5

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 (40) hide show
  1. package/README.md +38 -3
  2. package/index.js +36 -6
  3. package/libs/30days30submits-18-v0.0.0.css +213 -0
  4. package/libs/amoled-cord-v5.0.11.css +894 -0
  5. package/libs/animating-hamburger-icons-v0.1.0.css +618 -0
  6. package/libs/bootplus-v1.0.5.css +6876 -0
  7. package/libs/enferno-v13.1.1.css +75 -0
  8. package/libs/facebook-buttons-v1.0.0.css +223 -0
  9. package/libs/fluentbird-v1.1.2.css +1060 -0
  10. package/libs/freebies-v0.0.0.css +1110 -0
  11. package/libs/gitweb-theme-v0.0.0.css +764 -0
  12. package/libs/justified-v0.0.0.css +14 -0
  13. package/libs/kickoff-v8.0.0.css +2267 -0
  14. package/libs/knacss-v8.2.0.css +1141 -0
  15. package/libs/linktree-v0.0.0.css +803 -0
  16. package/libs/littlebox-v0.0.4.css +5833 -0
  17. package/libs/lynx-v1.4.0.css +1587 -0
  18. package/libs/obnoxious-v3.5.2.css +1144 -0
  19. package/libs/obsidian-notebook-themes-v2.2.3.css +272 -0
  20. package/libs/patternbolt-v0.0.0.css +861 -0
  21. package/libs/progress-tracker-v3.0.0.css +352 -0
  22. package/libs/proxmorph-v2.7.3.css +3952 -0
  23. package/libs/sapc-apca-v0.0.0.css +5546 -0
  24. package/libs/shina-fox-v0.1.0.css +1194 -0
  25. package/libs/social-signin-buttons-v0.0.0.css +387 -0
  26. package/libs/tailwind-cards-v0.0.0.css +215592 -0
  27. package/libs/the-50-front-end-project-44-v0.0.0.css +459 -0
  28. package/libs/tocas-v5.7.0.css +19928 -0
  29. package/libs/utility-opentype-v0.1.4.css +515 -0
  30. package/libs/vim-css3-syntax-v2.10.0.css +1642 -0
  31. package/libs/waffle-grid-v1.3.6.css +544 -0
  32. package/libs/wikipedia-dark-v3.7.9.css +9990 -0
  33. package/libs/windows-95-v0.0.0.css +393 -0
  34. package/libs/woah-v1.3.1.css +1025 -0
  35. package/libs/yacy-v4.1.2.css +677 -0
  36. package/libs/yue-v1.1.1.css +180 -0
  37. package/package.json +1 -1
  38. package/test.js +3 -4
  39. /package/libs/{responsive-v4.1.4.css → responsive-4-v4.1.4.css} +0 -0
  40. /package/libs/{responsive-v5.0.0.css → responsive-5-v5.0.0.css} +0 -0
@@ -0,0 +1,1141 @@
1
+ /* https://github.com/alsacreations/KNACSS/blob/master/assets/css/natives.css */
2
+ /* ============================
3
+ * KNACSS Natives
4
+ * Styles natifs pour éléments HTML
5
+ * Consignes : à placer dans un layer au-dessus de `reset`
6
+ * Mise à jour : 2026-06-09
7
+ * ============================ */
8
+
9
+ /* ---------------------
10
+ * Variables globales de formulaires
11
+ * --------------------- */
12
+
13
+ /*
14
+ * Ces variables pilotent l'ensemble des contrôles de formulaire (input, textarea, select, button)
15
+ * Elles peuvent être surchargées individuellement sur chacun des éléments.
16
+ */
17
+ :root {
18
+ /* Couleur de fond des champs */
19
+ --form-background: light-dark(var(--color-gray-50), var(--color-gray-800));
20
+
21
+ /* Couleur du texte des champs */
22
+ --on-form: light-dark(var(--color-gray-900), var(--color-gray-100));
23
+
24
+ /* Couleur d'accent principale des champs */
25
+ --form-accent-color: var(--primary, AccentColor);
26
+
27
+ /* Espacement interne (padding) */
28
+ --form-spacing: var(--spacing-12) var(--spacing-16);
29
+
30
+ /* Épaisseur de bordure (par défaut 1px) */
31
+ --form-border-width: 1px;
32
+
33
+ /* Couleur de bordure */
34
+ --form-border-color: var(--color-gray-400);
35
+
36
+ /* Arrondi des bordures (border-radius) */
37
+ --form-border-radius: var(--radius-4);
38
+
39
+ /* Couleur de bordure spécifique pour radio/checkbox */
40
+ --checkables-border-color: var(--color-gray-400);
41
+
42
+ /* Taille des radio/checkbox */
43
+ --checkable-size: 1.25em;
44
+
45
+ /* Chevron pour fond clair (trait sombre %23222222) (le %23 remplace le #) */
46
+ --chevron-lightmode: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='%23222222' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/></svg>");
47
+
48
+ /* Chevron pour fond sombre (trait clair %23FFFFFF) (le %23 remplace le #) */
49
+ --chevron-darkmode: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='%23FFFFFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/></svg>");
50
+ }
51
+
52
+ /* ---------------------
53
+ * Button et liens-boutons
54
+ * --------------------- */
55
+
56
+ button,
57
+ a:where(.btn),
58
+ input:where([type="button"], [type="reset"], [type="submit"]) {
59
+ --button-background-color: var(--form-background, Field);
60
+ --button-background-color-hover: oklch(
61
+ from var(--button-background-color) calc(l * 0.9) c h
62
+ );
63
+ --button-background-color-active: oklch(
64
+ from var(--button-background-color) calc(l * 0.8) c h
65
+ );
66
+ --button-border-color: var(--form-border-color, ButtonBorder);
67
+ --button-border-color-hover: var(--button-border-color);
68
+ --button-border-color-active: var(--button-border-color);
69
+ --button-border-radius: var(--form-border-radius, 0);
70
+ --button-border-width: var(--form-border-width, 1px);
71
+ --button-text-color: var(--on-form, ButtonText);
72
+ --button-text-color-hover: var(--button-text-color);
73
+ --button-text-color-active: var(--button-text-color);
74
+ --button-font-weight: var(--font-weight-regular, 400);
75
+
76
+ display: inline-flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ width: fit-content;
80
+ padding: var(--form-spacing, 12px 16px);
81
+ transition-property: background, border, box-shadow, color;
82
+ transition-duration: var(--transition-duration, 0.25s);
83
+ border: 0;
84
+ border-radius: var(--button-border-radius);
85
+ background-color: var(--button-background-color);
86
+ box-shadow: inset 0 0 0 var(--button-border-width) var(--button-border-color);
87
+ color: var(--button-text-color);
88
+ font: inherit;
89
+ font-weight: var(--button-font-weight);
90
+ line-height: 1;
91
+ text-decoration: none;
92
+ vertical-align: middle;
93
+ white-space: nowrap;
94
+ cursor: pointer;
95
+ user-select: none;
96
+
97
+ /* Base button */
98
+ &:hover,
99
+ &:focus-visible {
100
+ background-color: var(--button-background-color-hover);
101
+ box-shadow: inset 0 0 0 var(--button-border-width)
102
+ var(--button-border-color-hover);
103
+ color: var(--button-text-color-hover);
104
+ }
105
+
106
+ &:active {
107
+ background-color: var(--button-background-color-active);
108
+ box-shadow: inset 0 0 0 var(--button-border-width)
109
+ var(--button-border-color-active);
110
+ color: var(--button-text-color-active);
111
+ }
112
+
113
+ /* Primary button */
114
+ &.btn-primary {
115
+ --button-background-color: var(--form-accent-color, AccentColor);
116
+ --button-border-color: transparent;
117
+ --button-text-color: var(--on-primary, #ffffff);
118
+ }
119
+
120
+ /* Secondary button */
121
+ &.btn-secondary {
122
+ --button-background-color: var(--color-gray-200, GrayText);
123
+ --button-border-color: transparent;
124
+ --button-text-color: var(--form-accent-color, AccentColor);
125
+ }
126
+
127
+ /* Reset button */
128
+ &.btn-reset {
129
+ --button-background-color: transparent;
130
+ --button-border-color: transparent;
131
+ --button-text-color: currentcolor;
132
+ }
133
+ }
134
+
135
+ /* --------------------
136
+ * Details (disclosure)
137
+ * -------------------- */
138
+
139
+ details {
140
+ --details-padding: var(--form-spacing, 12px 16px);
141
+ --details-border-color: var(--form-border-color, ButtonBorder);
142
+ --details-border-color-hover: var(--details-border-color);
143
+ --details-border-width: var(--form-border-width, 1px);
144
+ --details-border-radius: var(--form-border-radius, 0);
145
+ --details-background-color: var(--layer-1, Canvas);
146
+ --details-content-border-radius: 0;
147
+ --details-title-color: var(--on-form, FieldText);
148
+ --details-title-color-hover: var(--details-title-color);
149
+
150
+ border: var(--details-border-width) solid var(--details-border-color);
151
+ border-radius: var(--details-border-radius);
152
+ background-color: var(--details-background-color);
153
+
154
+ /* État survol */
155
+ &:hover,
156
+ &:focus-visible {
157
+ border-color: var(--details-border-color-hover);
158
+
159
+ & summary {
160
+ color: var(--details-title-color-hover);
161
+ }
162
+ }
163
+
164
+ /* Summary (titre cliquable) */
165
+ & summary {
166
+ display: flex;
167
+ align-items: center;
168
+ justify-content: space-between;
169
+ padding: var(--details-padding);
170
+ transition: background-color;
171
+ transition-duration: var(--transition-duration, 0.25s);
172
+ border-radius: var(--details-border-radius);
173
+ color: var(--details-title-color, currentcolor);
174
+ font-weight: var(--font-weight-semibold, 600);
175
+ list-style: none;
176
+ cursor: pointer;
177
+ user-select: none;
178
+
179
+ /* Suppression du triangle par défaut */
180
+ &::-webkit-details-marker {
181
+ display: none;
182
+ }
183
+
184
+ /* Icône personnalisée */
185
+ &::after {
186
+ content: "";
187
+ width: 1rem;
188
+ height: 1rem;
189
+ transition: rotate var(--transition-duration, 0.25s);
190
+ background-image: var(--chevron-lightmode);
191
+ background-repeat: no-repeat;
192
+ background-position: center;
193
+ background-size: contain;
194
+ rotate: 0deg;
195
+ }
196
+ }
197
+
198
+ /* État ouvert */
199
+ &[open] summary::after {
200
+ rotate: 180deg;
201
+ }
202
+
203
+ /* Support des modes sombres pour l'icône */
204
+ [data-theme="dark"] & {
205
+ & summary::after {
206
+ background-image: var(--chevron-darkmode);
207
+ }
208
+ }
209
+
210
+ /* Contenu du details */
211
+ &::details-content {
212
+ padding: var(--form-spacing, 12px 16px);
213
+ padding-top: 0;
214
+ border-top: none;
215
+
216
+ & > :first-child {
217
+ margin-top: 0;
218
+ }
219
+
220
+ & > :last-child {
221
+ margin-bottom: 0;
222
+ }
223
+ }
224
+ }
225
+
226
+ /* Support moderne pour les transitions fluides */
227
+ @supports (interpolate-size: allow-keywords) {
228
+ details::details-content {
229
+ /* État de fin de transition */
230
+ display: none;
231
+ height: 0;
232
+ transition: var(--transition-duration, 0.25s) allow-discrete;
233
+ transition-property: opacity, height, display;
234
+ interpolate-size: allow-keywords;
235
+ }
236
+
237
+ details[open]::details-content {
238
+ display: grid;
239
+ height: auto;
240
+
241
+ @starting-style {
242
+ height: 0;
243
+ }
244
+ }
245
+ }
246
+
247
+ /* Accessibilité améliorée */
248
+ @media (prefers-reduced-motion: reduce) {
249
+ details {
250
+ & summary::after {
251
+ transition: none;
252
+ }
253
+
254
+ &::details-content {
255
+ transition: none;
256
+ }
257
+ }
258
+ }
259
+
260
+ /* --------------------
261
+ * Dialog (modale)
262
+ * -------------------- */
263
+
264
+ dialog {
265
+ --dialog-background-color: var(--surface, Field);
266
+ --dialog-text-color: var(--on-surface, CanvasText);
267
+ --dialog-border-color: var(--form-border-color, ButtonBorder);
268
+ --dialog-border-radius: var(--form-border-radius, 0);
269
+ --dialog-border-width: var(--form-border-width, 1px);
270
+ --dialog-backdrop-color: oklch(0% 0 0 / 50%);
271
+ --dialog-padding: var(--spacing-24, 1.5rem);
272
+ --dialog-header-padding: var(--spacing-16, 1rem) var(--spacing-24, 1.5rem);
273
+ --dialog-footer-padding: var(--spacing-16, 1rem) var(--spacing-24, 1.5rem);
274
+ --dialog-max-width: 32rem;
275
+ --dialog-max-height: calc(100vh - var(--spacing-32, 2rem));
276
+
277
+ max-width: var(--dialog-max-width);
278
+ padding: 0;
279
+ overflow: visible;
280
+ border: none;
281
+ background-color: transparent;
282
+ color: var(--dialog-text-color);
283
+
284
+ /* État fermé par défaut */
285
+ &:not([open]) {
286
+ display: none;
287
+ }
288
+
289
+ /* Backdrop (arrière-plan) */
290
+ &::backdrop {
291
+ background-color: var(--dialog-backdrop-color);
292
+ backdrop-filter: blur(3px);
293
+ }
294
+
295
+ /* Animation d'ouverture */
296
+ &[open] {
297
+ animation: dialog-show var(--transition-duration, 0.25s) ease-out;
298
+ }
299
+
300
+ /* Variante petite modale */
301
+ &.dialog-sm {
302
+ --dialog-max-width: 24rem;
303
+ }
304
+
305
+ /* Variante grande modale */
306
+ &.dialog-lg {
307
+ --dialog-max-width: 48rem;
308
+ }
309
+
310
+ /* Variante pleine largeur */
311
+ &.dialog-fullwidth {
312
+ --dialog-max-width: calc(100vw - var(--spacing-32, 2rem));
313
+ }
314
+ }
315
+
316
+ /* Contenu principal de la modale */
317
+ .dialog-content {
318
+ display: grid;
319
+ border: var(--dialog-border-width) solid var(--dialog-border-color);
320
+ border-radius: var(--dialog-border-radius);
321
+ background-color: var(--dialog-background-color);
322
+ }
323
+
324
+ /* En-tête de la modale */
325
+ .dialog-header {
326
+ display: flex;
327
+ align-items: center;
328
+ justify-content: space-between;
329
+ padding: var(--dialog-header-padding);
330
+ border-bottom: 1px solid var(--dialog-border-color);
331
+ border-radius: var(--dialog-border-radius) var(--dialog-border-radius) 0 0;
332
+ background-color: var(--layer-1, Canvas);
333
+ gap: var(--spacing-16, 1rem);
334
+ }
335
+
336
+ .dialog-title {
337
+ margin: 0;
338
+ color: var(--dialog-text-color);
339
+ font-size: var(--text-xl, 1.25rem);
340
+ font-weight: var(--font-weight-semibold, 600);
341
+ }
342
+
343
+ /* Bouton de fermeture */
344
+ .dialog-close {
345
+ display: inline-grid;
346
+ box-sizing: content-box;
347
+ flex-shrink: 0;
348
+ width: 2rem;
349
+ height: 2rem;
350
+ padding: 2px;
351
+ transition: background-color var(--transition-duration, 0.25s);
352
+ border-radius: var(--radius-full, 9999px);
353
+ font-size: 2rem;
354
+ place-content: center;
355
+ place-self: center;
356
+ aspect-ratio: 1;
357
+
358
+ /* État survol */
359
+ &:hover,
360
+ &:focus-visible {
361
+ background-color: var(--layer-2, GrayText);
362
+ }
363
+ }
364
+
365
+ /* Corps de la modale */
366
+ .dialog-body {
367
+ padding: var(--dialog-padding);
368
+ overflow-y: auto;
369
+
370
+ & > :first-child {
371
+ margin-top: 0;
372
+ }
373
+
374
+ & > :last-child {
375
+ margin-bottom: 0;
376
+ }
377
+ }
378
+
379
+ /* Pied de la modale */
380
+ .dialog-footer {
381
+ padding: var(--dialog-footer-padding);
382
+ border-top: 1px solid var(--dialog-border-color);
383
+ border-radius: 0 0 var(--dialog-border-radius) var(--dialog-border-radius);
384
+ background-color: var(--layer-1, Canvas);
385
+ }
386
+
387
+ /* Animations */
388
+ @keyframes dialog-show {
389
+ from {
390
+ scale: 0.95;
391
+ opacity: 0%;
392
+ }
393
+
394
+ to {
395
+ scale: 1;
396
+ opacity: 100%;
397
+ }
398
+ }
399
+
400
+ /* Accessibilité */
401
+ @media (prefers-reduced-motion: reduce) {
402
+ dialog {
403
+ animation: none;
404
+
405
+ &::backdrop {
406
+ animation: none;
407
+ }
408
+ }
409
+ }
410
+
411
+ /* Responsive */
412
+ @media (width < 48rem) {
413
+ dialog {
414
+ --dialog-max-width: calc(100vw - var(--spacing-16, 1rem));
415
+ --dialog-max-height: calc(100vh - var(--spacing-16, 1rem));
416
+ }
417
+
418
+ .dialog-header,
419
+ .dialog-footer {
420
+ padding: var(--spacing-16, 1rem);
421
+ }
422
+
423
+ .dialog-body {
424
+ padding: var(--spacing-16, 1rem);
425
+ }
426
+ }
427
+
428
+ /* --------------------
429
+ * Hr (séparateur)
430
+ * -------------------- */
431
+
432
+ hr {
433
+ /* Couleur et épaisseur par défaut alignées sur les contrôles de formulaire */
434
+ --hr-border-color: var(--form-border-color, ButtonBorder);
435
+ --hr-border-width: var(--form-border-width, 1px);
436
+
437
+ margin-block: var(--spacing-16, 1rem);
438
+ border: 0;
439
+ border-top: var(--hr-border-width) solid var(--hr-border-color);
440
+
441
+ /* Variante couleur primaire */
442
+ &.hr-primary {
443
+ --hr-border-color: var(--form-accent-color, AccentColor);
444
+ }
445
+
446
+ /* Variante épaisseur moyenne (x2) */
447
+ &.hr-medium {
448
+ --hr-border-width: calc(var(--form-border-width, 1px) * 2);
449
+ }
450
+
451
+ /* Variante trait en vague */
452
+ &.hr-wavy {
453
+ /* Harmonisation avec les variables ci-dessus */
454
+ --hr-wave-length: 16px; /* longueur d'une vague */
455
+ --hr-wave-height: 8px; /* hauteur totale du motif */
456
+
457
+ height: var(--hr-wave-height);
458
+ margin-block: var(--spacing-16, 1rem);
459
+ border: 0;
460
+
461
+ /* La couleur vient de --hr-border-color, modifiable via .hr-primary */
462
+ background-color: var(--hr-border-color, currentcolor);
463
+
464
+ /* Masque SVG répétable pour obtenir un trait ondulé, coloré via background-color */
465
+ mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='8' viewBox='0 0 16 8'><path d='M0,4 C4,0 12,8 16,4' stroke='white' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round'/></svg>")
466
+ left center / var(--hr-wave-length) 100% repeat-x;
467
+ }
468
+ }
469
+
470
+ /* --------------------
471
+ * Table
472
+ * -------------------- */
473
+
474
+ table {
475
+ --table-border-color: var(--form-border-color, ButtonBorder);
476
+ --table-border-width: var(--form-border-width, 1px);
477
+ --table-layout: fixed;
478
+ --table-border-collapse: collapse;
479
+ --table-border-spacing: 0;
480
+ --table-zebra: 0%;
481
+ --table-caption-color: GrayText;
482
+
483
+ width: 100%;
484
+ table-layout: var(--table-layout, fixed);
485
+ border-spacing: var(--table-border-spacing, 0);
486
+ border-collapse: var(--table-border-collapse, collapse);
487
+ color: var(--on-surface, CanvasText);
488
+
489
+ /* Légende */
490
+ & caption {
491
+ margin-block: var(--spacing-8, 0.5rem);
492
+ color: var(--table-caption-color);
493
+ text-align: left;
494
+ }
495
+
496
+ /* Cellules */
497
+ & th,
498
+ & td {
499
+ padding: var(--spacing-8, 0.5rem) var(--spacing-12, 0.75rem);
500
+ border: var(--table-border-width) solid var(--table-border-color);
501
+ text-align: left;
502
+ vertical-align: top;
503
+ }
504
+
505
+ /* En-têtes */
506
+ & thead th {
507
+ background-color: var(--layer-1, Canvas);
508
+ font-weight: var(--font-weight-semibold, 600);
509
+ }
510
+
511
+ /* Pied de tableau */
512
+ & tfoot th,
513
+ & tfoot td {
514
+ background-color: var(--layer-1, Canvas);
515
+ font-weight: var(--font-weight-medium, 500);
516
+ }
517
+
518
+ /* Zébrage (conditionné par --table-zebra */
519
+ & tbody tr:nth-child(odd) {
520
+ background-color: oklch(
521
+ from var(--color-black, #000000) l c h / var(--table-zebra, 0%)
522
+ );
523
+ }
524
+ }
525
+
526
+ /* Wrapper responsive pour permettre le scroll horizontal sur petits écrans */
527
+ .table-responsive {
528
+ --table-min-width: 30rem; /* largeur minimale par défaut pour un tableau lisible */
529
+
530
+ display: block;
531
+ overflow-x: auto;
532
+ -webkit-overflow-scrolling: touch;
533
+ scrollbar-gutter: stable both-edges;
534
+
535
+ & > table {
536
+ min-width: var(--table-min-width, 30rem);
537
+ }
538
+ }
539
+
540
+ /* Tableau arrondi */
541
+ .table-rounded {
542
+ --table-border-color: var(--form-border-color, ButtonBorder);
543
+ --table-border-width: var(--form-border-width, 1px);
544
+ --table-border-radius: var(--form-border-radius, 0.5rem);
545
+
546
+ padding: var(--spacing-8, 0.5rem);
547
+ border: var(--table-border-width) solid var(--table-border-color);
548
+ border-radius: var(--table-border-radius);
549
+
550
+ & :is(th, td) {
551
+ border: none;
552
+ background-color: transparent;
553
+ }
554
+
555
+ & thead :is(th, td),
556
+ & tr:not(:last-child) :is(th, td) {
557
+ border-bottom: var(--table-border-width) solid var(--table-border-color);
558
+ }
559
+
560
+ & tbody tr:nth-child(odd) {
561
+ background-color: transparent;
562
+ }
563
+ }
564
+
565
+ /* --------------------
566
+ * Formulaires
567
+ * (input, textarea, select, checkbox, radio, switch, range)
568
+ * -------------------- */
569
+
570
+ /* Input
571
+ * -------------------- */
572
+
573
+ input:not(
574
+ [type="button"],
575
+ [type="reset"],
576
+ [type="submit"],
577
+ [type="checkbox"],
578
+ [type="radio"],
579
+ [type="range"]
580
+ ) {
581
+ --input-background-color: var(--form-background, Field);
582
+ --input-border-color: var(--form-border-color, ButtonBorder);
583
+ --input-border-color-hover: var(--form-border-color);
584
+ --input-border-radius: var(--form-border-radius, 0);
585
+ --input-border-width: var(--form-border-width, 1px);
586
+ --input-text-color: var(--on-form, ButtonText);
587
+ --input-placeholder-color: GrayText;
588
+
589
+ display: block;
590
+ width: 100%;
591
+ padding: var(--input-spacing, 12px 16px);
592
+ transition-property: background, border, box-shadow, color;
593
+ transition-duration: var(--transition-duration, 0.25s);
594
+ border: 0;
595
+ border-radius: var(--input-border-radius);
596
+ background-color: var(--input-background-color);
597
+ box-shadow: inset 0 0 0 var(--input-border-width) var(--input-border-color);
598
+ color: var(--input-text-color);
599
+ font: inherit;
600
+ line-height: 1.5;
601
+
602
+ /* État survol */
603
+ &:hover,
604
+ &:focus-visible {
605
+ box-shadow: inset 0 0 0 var(--input-border-width)
606
+ var(--input-border-color-hover);
607
+ }
608
+
609
+ /* État invalide après interaction utilisateur */
610
+ &:user-invalid {
611
+ --input-border-color: var(--error);
612
+ --input-border-width: 2px;
613
+ }
614
+
615
+ /* Placeholder */
616
+ &::placeholder {
617
+ opacity: 100%;
618
+ color: var(--input-placeholder-color);
619
+ }
620
+ }
621
+
622
+ /* Champ de recherche */
623
+ :where(input[type="search"]) {
624
+ appearance: textfield;
625
+
626
+ &::-webkit-search-decoration,
627
+ &::-webkit-search-cancel-button,
628
+ &::-webkit-search-results-button,
629
+ &::-webkit-search-results-decoration {
630
+ appearance: none;
631
+ }
632
+ }
633
+
634
+ /* Champs numériques */
635
+ :where(input[type="number"]) {
636
+ appearance: textfield;
637
+
638
+ &::-webkit-outer-spin-button,
639
+ &::-webkit-inner-spin-button {
640
+ appearance: none;
641
+ margin: 0;
642
+ }
643
+ }
644
+
645
+ /* Champ de date et heure */
646
+ :where(input[type="date"], input[type="time"], input[type="datetime-local"]) {
647
+ cursor: pointer;
648
+
649
+ /* Styles pour WebKit */
650
+ &::-webkit-calendar-picker-indicator {
651
+ transition: opacity var(--transition-duration, 0.25s);
652
+ opacity: 60%;
653
+ cursor: pointer;
654
+
655
+ &:hover,
656
+ &:focus-visible {
657
+ opacity: 100%;
658
+ }
659
+ }
660
+ }
661
+
662
+ /* Champ de fichier */
663
+ :where(input[type="file"]) {
664
+ padding: var(--spacing-8, 0.5rem) var(--spacing-12, 0.75rem);
665
+ cursor: pointer;
666
+
667
+ &::file-selector-button {
668
+ margin-right: var(--spacing-12, 0.75rem);
669
+ padding: var(--spacing-8, 0.5rem) var(--spacing-12, 0.75rem);
670
+ transition: background-color var(--transition-duration, 0.25s);
671
+ border: 0;
672
+ border-radius: var(--input-border-radius);
673
+ background-color: var(--form-accent-color, AccentColor);
674
+ color: var(--on-primary, #ffffff);
675
+ font: inherit;
676
+ cursor: pointer;
677
+
678
+ /* État survol */
679
+ &:hover,
680
+ &:focus-visible {
681
+ background-color: oklch(
682
+ from var(--form-accent-color, AccentColor) calc(l * 0.9) c h
683
+ );
684
+ }
685
+ }
686
+
687
+ /* Support WebKit */
688
+ &::-webkit-file-upload-button {
689
+ margin-right: var(--spacing-12, 0.75rem);
690
+ padding: var(--spacing-8, 0.5rem) var(--spacing-12, 0.75rem);
691
+ transition: background-color var(--transition-duration, 0.25s);
692
+ border: 0;
693
+ border-radius: var(--input-border-radius);
694
+ background-color: var(--form-accent-color, AccentColor);
695
+ color: var(--on-primary, #ffffff);
696
+ font: inherit;
697
+ cursor: pointer;
698
+
699
+ /* État survol */
700
+ &:hover,
701
+ &:focus-visible {
702
+ background-color: oklch(
703
+ from var(--form-accent-color, AccentColor) calc(l * 0.9) c h
704
+ );
705
+ }
706
+ }
707
+ }
708
+
709
+ /* Select
710
+ * -------------------- */
711
+
712
+ select {
713
+ --select-background-color: var(--form-background, Field);
714
+ --select-border-color: var(--form-border-color, ButtonBorder);
715
+ --select-border-color-hover: var(--select-border-color);
716
+ --select-border-radius: var(--form-border-radius, 0);
717
+ --select-border-width: var(--form-border-width, 1px);
718
+ --select-text-color: var(--on-form, FieldText);
719
+ --select-optgroup-color: GrayText;
720
+
721
+ display: block;
722
+ width: 100%;
723
+ padding: var(--form-spacing, 12px 16px);
724
+ padding-right: calc(var(--spacing-32, 2rem) + var(--spacing-12, 0.75rem));
725
+ transition-property: background-color, border, box-shadow, color;
726
+ transition-duration: var(--transition-duration, 0.25s);
727
+ border: 0;
728
+ border-radius: var(--select-border-radius);
729
+ background-color: var(--select-background-color);
730
+ background-image: var(--chevron-lightmode);
731
+ background-repeat: no-repeat;
732
+ background-position: right var(--spacing-16, 1rem) center;
733
+ background-size: 1rem;
734
+ box-shadow: inset 0 0 0 var(--select-border-width) var(--select-border-color);
735
+ color: var(--select-text-color);
736
+ font: inherit;
737
+ line-height: 1.5;
738
+ cursor: pointer;
739
+ appearance: none;
740
+ user-select: none;
741
+
742
+ /* État survol */
743
+ &:hover,
744
+ &:focus-visible {
745
+ box-shadow: inset 0 0 0 var(--select-border-width)
746
+ var(--select-border-color-hover);
747
+ }
748
+
749
+ /* Support des modes sombres pour les flèches */
750
+ [data-theme="dark"] & {
751
+ background-image: var(--chevron-darkmode);
752
+ }
753
+
754
+ /* Sélection multiple */
755
+ &[multiple] {
756
+ padding-right: var(--spacing-16, 1rem);
757
+ background-image: none;
758
+ cursor: default;
759
+ }
760
+ }
761
+
762
+ /* Optgroups */
763
+ :where(optgroup) {
764
+ color: var(--select-optgroup-color);
765
+ font-weight: var(--font-weight-bold, 700);
766
+ }
767
+
768
+ /* Textarea
769
+ * -------------------- */
770
+
771
+ textarea {
772
+ --textarea-background-color: var(--form-background, Field);
773
+ --textarea-border-color: var(--form-border-color, ButtonBorder);
774
+ --textarea-border-color-hover: var(--textarea-border-color);
775
+ --textarea-border-radius: var(--form-border-radius, 0);
776
+ --textarea-border-width: var(--form-border-width, 1px);
777
+ --textarea-text-color: var(--on-form, ButtonText);
778
+ --textarea-counter-color: GrayText;
779
+
780
+ display: block;
781
+ width: 100%;
782
+ min-height: 5lh;
783
+ padding: var(--form-spacing, 12px 16px);
784
+ transition-property: background, border, box-shadow, color;
785
+ transition-duration: var(--transition-duration, 0.25s);
786
+ border: 0;
787
+ border-radius: var(--textarea-border-radius);
788
+ background-color: var(--textarea-background-color);
789
+ box-shadow: inset 0 0 0 var(--textarea-border-width)
790
+ var(--textarea-border-color);
791
+ color: var(--textarea-text-color);
792
+ font: inherit;
793
+ line-height: 1.5;
794
+ resize: vertical;
795
+ field-sizing: content;
796
+
797
+ /* État survol */
798
+ &:hover,
799
+ &:focus-visible {
800
+ box-shadow: inset 0 0 0 var(--textarea-border-width)
801
+ var(--textarea-border-color-hover);
802
+ }
803
+
804
+ /* État invalide après interaction utilisateur */
805
+ &:user-invalid {
806
+ --textarea-border-color: var(--error);
807
+ --textarea-border-width: 2px;
808
+ }
809
+
810
+ /* Placeholder */
811
+ &::placeholder {
812
+ opacity: 100%;
813
+ color: var(--on-surface);
814
+ }
815
+ }
816
+
817
+ /* Compteur de caractères */
818
+ .character-counter {
819
+ min-width: max-content;
820
+ margin-left: auto;
821
+ color: var(--textarea-counter-color);
822
+ font-size: var(--text-14, 0.875rem);
823
+ font-weight: var(--font-weight-medium, 500);
824
+ text-align: right;
825
+
826
+ /* États du compteur selon le pourcentage restant */
827
+ &.warning {
828
+ color: var(--warning, #f97316);
829
+ }
830
+
831
+ &.danger {
832
+ color: var(--error, #ef4444);
833
+ font-weight: var(--font-weight-semibold, 600);
834
+ }
835
+ }
836
+
837
+ /* Adaptations responsive */
838
+ @media (width < 48rem) {
839
+ .form-group-footer {
840
+ flex-direction: column;
841
+ align-items: stretch;
842
+ }
843
+
844
+ .character-counter {
845
+ margin-left: 0;
846
+ text-align: left;
847
+ }
848
+ }
849
+
850
+ /* Checkbox
851
+ * -------------------- */
852
+
853
+ [type="checkbox"]:not([role="switch"]) {
854
+ --checkbox-background-color: var(--form-background, Field);
855
+ --checkbox-checked-color: var(--form-accent-color, AccentColor);
856
+ --checkbox-border-color: var(--checkables-border-color, ButtonBorder);
857
+ --checkbox-border-color-hover: var(--checkbox-border-color);
858
+ --checkbox-border-radius: var(--form-border-radius, 0);
859
+ --checkbox-border-width: var(--form-border-width, 1px);
860
+
861
+ display: inline-grid;
862
+ position: relative;
863
+ flex: 0 0 auto;
864
+ align-items: center;
865
+ justify-content: center;
866
+ width: var(--checkable-size, 1.25rem);
867
+ height: var(--checkable-size, 1.25rem);
868
+ margin: 0;
869
+ transition-property: background, border, box-shadow, color;
870
+ transition-duration: var(--transition-duration, 0.25s);
871
+ border: 0;
872
+ border-radius: var(--checkbox-border-radius);
873
+ background-color: var(--checkbox-background-color);
874
+ box-shadow: inset 0 0 0 var(--checkbox-border-width)
875
+ var(--checkbox-border-color);
876
+ font: inherit;
877
+ line-height: 1;
878
+ cursor: pointer;
879
+ user-select: none;
880
+ appearance: none;
881
+
882
+ /* États */
883
+ &:is(:checked, :indeterminate) {
884
+ background-color: var(--checkbox-checked-color);
885
+ box-shadow: inset 0 0 0 var(--checkbox-border-width) transparent;
886
+ }
887
+
888
+ /* État survol */
889
+ &:hover,
890
+ &:focus-visible {
891
+ box-shadow: inset 0 0 0 var(--checkbox-border-width)
892
+ var(--checkbox-border-color-hover);
893
+ }
894
+
895
+ /* État coché */
896
+ &:checked::after {
897
+ content: "";
898
+ position: absolute;
899
+ width: 100%;
900
+ height: 100%;
901
+ background-color: var(--on-primary, #ffffff);
902
+ mask: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="16" width="14" viewBox="0 0 448 512"><path d="M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"/></svg>')
903
+ center no-repeat;
904
+ }
905
+
906
+ &:indeterminate::after {
907
+ content: "";
908
+ position: absolute;
909
+ width: 100%;
910
+ height: 100%;
911
+ background-color: currentcolor;
912
+ mask: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="16" width="14" viewBox="0 0 448 512"><path d="M431 256c0 17.7-14.3 32-32 32H49c-17.7 0-32-14.3-32-32s14.3-32 32-32h350c17.7 0 32 14.3 32 32z"/></svg>')
913
+ center no-repeat;
914
+ }
915
+ }
916
+
917
+ /* Radio
918
+ * -------------------- */
919
+
920
+ [type="radio"] {
921
+ --radio-background-color: var(--form-background, Field);
922
+ --radio-border-color: var(--checkables-border-color, ButtonBorder);
923
+ --radio-border-color-hover: var(--radio-border-color);
924
+ --radio-border-radius: var(--radius-full, 9999px);
925
+ --radio-border-width: var(--form-border-width, 1px);
926
+ --radio-checked-color: var(--form-accent-color, AccentColor);
927
+ --radio-checked-border-color: var(--color-white, #ffffff);
928
+
929
+ display: inline-grid;
930
+ width: var(--checkable-size, 1.25em);
931
+ height: var(--checkable-size, 1.25em);
932
+ margin: 0;
933
+ padding: 0;
934
+ transition-property: background, border, box-shadow, color;
935
+ transition-duration: var(--transition-duration, 0.25s);
936
+ border: 0;
937
+ border-radius: var(--radio-border-radius);
938
+ background-color: var(--radio-background-color);
939
+ box-shadow: inset 0 0 0 var(--radio-border-width) var(--radio-border-color);
940
+ cursor: pointer;
941
+ appearance: none;
942
+ place-content: center;
943
+
944
+ &::before {
945
+ content: "";
946
+ width: calc(var(--checkable-size, 1.25em) / 1);
947
+ height: calc(var(--checkable-size, 1.25em) / 1);
948
+ transition-property: scale;
949
+ transition-duration: var(--transition-duration, 0.25s);
950
+ border: 2px solid var(--radio-checked-border-color);
951
+ border-radius: var(--radius-full, 9999px);
952
+ background-color: var(--radio-checked-color);
953
+ scale: 0;
954
+ }
955
+
956
+ /* État survol */
957
+ &:hover,
958
+ &:focus-visible {
959
+ box-shadow: inset 0 0 0 var(--radio-border-width)
960
+ var(--radio-border-color-hover);
961
+ }
962
+
963
+ /* État coché */
964
+ &:checked {
965
+ &::before {
966
+ scale: 0.9;
967
+ }
968
+ }
969
+ }
970
+
971
+ /* Switch
972
+ * -------------------- */
973
+
974
+ [role="switch"] {
975
+ --switch-width: 2.5rem;
976
+ --switch-height: 1.5rem;
977
+ --switch-track-color: var(--form-background, ButtonFace);
978
+ --switch-track-color-checked: var(--form-accent-color, AccentColor);
979
+ --switch-thumb-color: ButtonBorder;
980
+ --switch-border-radius: var(--radius-full, 9999px);
981
+ --switch-border-color: var(--checkables-border-color, ButtonBorder);
982
+ --switch-border-width: 1px;
983
+
984
+ display: inline-flex;
985
+ align-items: center;
986
+ justify-content: start;
987
+ width: var(--switch-width);
988
+ height: var(--switch-height);
989
+ margin: 0;
990
+ padding: 0;
991
+ transition-property: background;
992
+ transition-duration: var(--transition-duration, 0.25s);
993
+ border: var(--switch-border-color) solid var(--switch-border-width);
994
+ border-radius: var(--switch-border-radius);
995
+ background-color: var(--switch-track-color);
996
+ cursor: pointer;
997
+ appearance: none;
998
+
999
+ &::before {
1000
+ content: "";
1001
+ transition-property: flex-grow;
1002
+ transition-duration: var(--transition-duration, 0.25s);
1003
+ }
1004
+
1005
+ /* Indicateur du switch */
1006
+ &::after {
1007
+ content: "";
1008
+ flex-shrink: 0;
1009
+ width: var(--switch-height);
1010
+ height: var(--switch-height);
1011
+ transition-property: background, scale;
1012
+ transition-duration: var(--transition-duration, 0.25s);
1013
+ border-radius: var(--switch-border-radius);
1014
+ background-color: ButtonBorder;
1015
+ scale: 0.6;
1016
+ background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="16" width="14" viewBox="0 0 448 512"><path fill="currentcolor" d="M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"/></svg>');
1017
+ background-repeat: no-repeat;
1018
+ background-position: center;
1019
+ background-size: 0%;
1020
+ }
1021
+
1022
+ /* État coché */
1023
+ &:checked::before {
1024
+ flex-grow: 1;
1025
+ }
1026
+
1027
+ /* État coché (variante) */
1028
+ &[data-variant="check"]:checked {
1029
+ border-color: var(--switch-track-color-checked);
1030
+ background-color: var(--switch-track-color-checked);
1031
+
1032
+ &::before {
1033
+ flex-grow: 1;
1034
+ }
1035
+
1036
+ &::after {
1037
+ scale: 0.8;
1038
+ background-color: var(--on-primary, #ffffff);
1039
+ background-size: 70%;
1040
+ }
1041
+ }
1042
+ }
1043
+
1044
+ /* Range
1045
+ * -------------------- */
1046
+
1047
+ .range {
1048
+ position: relative;
1049
+ padding-bottom: 2rem; /* Espace pour la valeur affichée */
1050
+ }
1051
+
1052
+ [type="range"] {
1053
+ --range-thumb-size: 22px;
1054
+ --range-color: var(--form-accent-color, AccentColor);
1055
+ --range-track-color: oklch(
1056
+ from var(--form-border-color, ButtonBorder) calc(l * 1.5) c h
1057
+ );
1058
+ --range-track-height: 6px;
1059
+
1060
+ width: 100%;
1061
+ height: var(--range-thumb-size);
1062
+ margin: 0;
1063
+ padding: 0;
1064
+ border: 0;
1065
+ background: transparent;
1066
+ color: var(--range-color);
1067
+ appearance: none;
1068
+ cursor: pointer;
1069
+ }
1070
+
1071
+ [type="range"]:focus-visible {
1072
+ outline: 2px solid currentcolor;
1073
+ outline-offset: 2px;
1074
+ }
1075
+
1076
+ /* WebKit */
1077
+ [type="range"]::-webkit-slider-runnable-track {
1078
+ height: var(--range-track-height);
1079
+ border-radius: var(--range-track-height);
1080
+ background: var(--range-track-color);
1081
+ }
1082
+
1083
+ [type="range"]::-webkit-slider-thumb {
1084
+ box-sizing: border-box;
1085
+ width: var(--range-thumb-size);
1086
+ height: var(--range-thumb-size);
1087
+ margin-top: calc((var(--range-track-height) - var(--range-thumb-size)) * 0.5);
1088
+ border: 4px solid var(--color-white, #ffffff);
1089
+ border-radius: 50%;
1090
+ background-color: currentcolor;
1091
+ appearance: none;
1092
+ }
1093
+
1094
+ /* Firefox */
1095
+ [type="range"]::-moz-range-track {
1096
+ height: var(--range-track-height);
1097
+ border-radius: var(--range-track-height);
1098
+ background: var(--range-track-color);
1099
+ }
1100
+
1101
+ [type="range"]::-moz-range-thumb {
1102
+ box-sizing: border-box;
1103
+ width: var(--range-thumb-size);
1104
+ height: var(--range-thumb-size);
1105
+ border: 4px solid var(--color-white, #ffffff);
1106
+ border-radius: 50%;
1107
+ background: currentcolor;
1108
+ cursor: pointer;
1109
+ }
1110
+
1111
+ [type="range"]::-moz-range-progress {
1112
+ height: var(--range-track-height);
1113
+ border-radius: var(--range-track-height);
1114
+ background: currentcolor;
1115
+ }
1116
+
1117
+ .range-value {
1118
+ position: absolute;
1119
+ left: 0;
1120
+ padding: 4px 8px;
1121
+ border-radius: var(--form-border-radius, 4px);
1122
+ background-color: var(--form-background, ButtonFace);
1123
+ font-size: var(--text-14, 0.875rem);
1124
+ translate: 0 1.4rem;
1125
+ }
1126
+
1127
+ @supports (position-anchor: --i) {
1128
+ [data-range-output="anchor"] input::-webkit-slider-thumb {
1129
+ anchor-name: --thumb;
1130
+ }
1131
+
1132
+ [data-range-output="anchor"] input::-moz-range-thumb {
1133
+ anchor-name: --thumb;
1134
+ }
1135
+
1136
+ [data-range-output="anchor"] .range-value {
1137
+ position-anchor: --thumb;
1138
+ position-area: bottom span-all;
1139
+ inset: anchor(top);
1140
+ }
1141
+ }