ui-foundations 0.6.0 → 0.7.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 (35) hide show
  1. package/LICENSE +73 -0
  2. package/README.md +43 -8
  3. package/dist/macros/ui.njk +33 -0
  4. package/dist/main.css +230 -84
  5. package/dist/react/form.js +111 -0
  6. package/dist/react/index.js +1 -0
  7. package/dist/react/input.js +7 -0
  8. package/dist/react/textarea.js +7 -0
  9. package/dist/tokens/css/appearance-modes.tokens.mode-dark.css +7 -1
  10. package/dist/tokens/css/appearance-modes.tokens.mode-light.css +7 -1
  11. package/dist/tokens/css/components-ui.tokens.css +55 -33
  12. package/dist/tokens/css/core-primitives.tokens.css +1 -1
  13. package/dist/tokens/css/semantics-roles.tokens.css +1 -1
  14. package/dist/tokens/css/themes-brands.tokens.brand-a.css +1 -1
  15. package/dist/tokens/css/themes-brands.tokens.brand-b.css +1 -1
  16. package/dist/tokens/css/themes-brands.tokens.brand-c.css +1 -1
  17. package/dist/tokens/json/appearance-modes.tokens.mode-dark.json +24 -0
  18. package/dist/tokens/json/appearance-modes.tokens.mode-light.json +24 -0
  19. package/dist/tokens/json/components-ui.tokens.json +161 -25
  20. package/dist/tokens/tokens.yaml +509 -67
  21. package/dist/tokens/ts/appearance-modes.tokens.mode-dark.ts +7 -1
  22. package/dist/tokens/ts/appearance-modes.tokens.mode-light.ts +7 -1
  23. package/dist/tokens/ts/components-ui.tokens.ts +55 -33
  24. package/dist/tokens/ts/core-primitives.tokens.ts +1 -1
  25. package/dist/tokens/ts/semantics-roles.tokens.ts +1 -1
  26. package/dist/tokens/ts/themes-brands.tokens.brand-a.ts +1 -1
  27. package/dist/tokens/ts/themes-brands.tokens.brand-b.ts +1 -1
  28. package/dist/tokens/ts/themes-brands.tokens.brand-c.ts +1 -1
  29. package/dist/ui/index.css +1 -0
  30. package/dist/ui/patterns/button.css +3 -3
  31. package/dist/ui/patterns/checkbox.css +28 -28
  32. package/dist/ui/patterns/form.css +112 -0
  33. package/dist/ui/patterns/input.css +12 -12
  34. package/dist/ui/patterns/label.css +1 -1
  35. package/package.json +14 -3
package/dist/main.css CHANGED
@@ -181,7 +181,7 @@
181
181
  }
182
182
  }
183
183
  /* Auto-generated design tokens from Figma */
184
- /* Generated on 2026-05-22T09:23:10.621Z */
184
+ /* Generated on 2026-06-06T14:29:01.194Z */
185
185
 
186
186
  :root {
187
187
  --color-neutral-100: rgb(230 230 230);
@@ -421,7 +421,7 @@
421
421
  --zindex-hidden: -1;
422
422
  }
423
423
  /* Auto-generated design tokens from Figma */
424
- /* Generated on 2026-05-22T09:23:10.624Z */
424
+ /* Generated on 2026-06-06T14:29:01.200Z */
425
425
 
426
426
  :root {
427
427
  --typography-heading-font-family: var(--brand-font-lead);
@@ -457,7 +457,7 @@
457
457
  --corner-checkbox-radius: var(--brand-corner-input);
458
458
  }
459
459
  /* Auto-generated design tokens from Figma */
460
- /* Generated on 2026-05-22T09:23:10.611Z */
460
+ /* Generated on 2026-06-06T14:29:01.180Z */
461
461
 
462
462
  :root {
463
463
  --button-border-size-hover: var(--size-border-100);
@@ -465,13 +465,13 @@
465
465
  --button-solid-border-color-hover: var(--color-border-brand);
466
466
  --button-solid-border-color-active: var(--color-border-brand);
467
467
  --button-solid-border-color-focus: var(--color-border-brand);
468
- --button-solid-text-color-default: var(--color-text-inverse);
468
+ --button-solid-text-color-default: var(--color-text-on-brand);
469
469
  --button-solid-container-background-default: var(--color-fill-brand);
470
470
  --button-solid-container-background-hover: var(--color-fill-brand);
471
471
  --button-solid-container-background-active: var(--color-fill-brand);
472
472
  --button-solid-container-background-focus: var(--color-fill-brand);
473
- --button-solid-text-color-hover: var(--color-text-inverse);
474
- --button-solid-text-color-active: var(--color-text-inverse);
473
+ --button-solid-text-color-hover: var(--color-text-on-brand);
474
+ --button-solid-text-color-active: var(--color-text-on-brand);
475
475
  --button-outline-border-color-default: var(--color-border-brand);
476
476
  --button-outline-border-color-hover: var(--color-border-brand);
477
477
  --button-outline-border-color-active: var(--color-border-brand);
@@ -516,22 +516,22 @@
516
516
  --modal-backdrop-color: var(--color-overlay-backdrop);
517
517
  --modal-surface-color: var(--color-fill-surface);
518
518
  --modal-surface-border-radius: var(--brand-corner-modal);
519
- --input-text-text-color-default: var(--color-text-default);
520
- --input-text-text-color-hover: var(--color-text-default);
521
- --input-text-text-color-active: var(--color-text-default);
522
- --input-text-text-color-disabled: var(--color-text-disabled);
523
- --input-text-text-color-placeholder: var(--color-text-subtle);
524
- --input-border-border-color-default: var(--color-border-default);
525
- --input-border-border-color-hover: var(--color-border-brand);
526
- --input-border-border-color-active: var(--color-border-brand);
527
- --input-border-border-color-focus: var(--color-border-brand);
528
- --input-border-border-size-default: var(--size-border-100);
529
- --input-border-border-size-hover: var(--size-border-100);
530
- --input-border-border-size-active: var(--size-border-200);
531
- --input-border-border-radius: var(--brand-corner-input);
532
- --input-border-border-color-disabled: var(--color-border-disabled);
533
- --input-border-border-color-invalid: var(--color-border-danger);
534
- --input-border-border-color-valid: var(--color-border-strong);
519
+ --input-text-color-default: var(--color-text-default);
520
+ --input-text-color-hover: var(--color-text-brand);
521
+ --input-text-color-active: var(--color-text-default);
522
+ --input-text-color-disabled: var(--color-text-disabled);
523
+ --input-text-color-placeholder: var(--color-text-subtle);
524
+ --input-border-color-default: var(--color-border-default);
525
+ --input-border-color-hover: var(--color-border-brand);
526
+ --input-border-color-active: var(--color-border-brand);
527
+ --input-border-color-focus: var(--color-border-brand);
528
+ --input-border-size-default: var(--size-border-100);
529
+ --input-border-size-hover: var(--size-border-100);
530
+ --input-border-size-active: var(--size-border-200);
531
+ --input-border-radius: var(--brand-corner-input);
532
+ --input-border-color-disabled: var(--color-border-disabled);
533
+ --input-border-color-invalid: var(--color-border-danger);
534
+ --input-border-color-valid: var(--color-border-strong);
535
535
  --input-font-family: var(--brand-font-base);
536
536
  --input-font-weight: var(--typography-body-font-weight);
537
537
  --input-font-size: var(--typography-label-font-size);
@@ -549,6 +549,10 @@
549
549
  --input-overlay-active: var(--color-transparent);
550
550
  --input-height: 2.5rem;
551
551
  --input-height-min: 2.5rem;
552
+ --input-radio-text-color-active: var(--color-text-default);
553
+ --input-radio-text-color-hover: var(--color-text-strong);
554
+ --input-radio-container-background-hover: var(--color-fill-surface);
555
+ --input-radio-border-color-focus: var(--color-border-brand);
552
556
  --form-group-gap: var(--size-spacing-400);
553
557
  --form-group-title-color: var(--color-text-default);
554
558
  --form-padding-inline: var(--size-spacing-400);
@@ -562,10 +566,10 @@
562
566
  --form-container-border-color: var(--color-border-subtle);
563
567
  --form-border-size: var(--size-border-100);
564
568
  --checkbox-text-color-default: var(--color-text-default);
565
- --checkbox-text-color-hover: var(--color-text-strong);
566
- --checkbox-text-color-active: var(--color-text-inverse);
569
+ --checkbox-text-color-hover: var(--color-text-brand);
570
+ --checkbox-text-color-active: var(--color-text-on-brand);
567
571
  --checkbox-border-color-default: var(--color-border-subtle);
568
- --checkbox-border-color-hover: var(--color-border-strong);
572
+ --checkbox-border-color-hover: var(--color-border-brand);
569
573
  --checkbox-border-color-active: var(--color-border-brand);
570
574
  --checkbox-border-color-focus: var(--color-border-brand);
571
575
  --checkbox-border-color-invalid: var(--color-border-danger);
@@ -583,7 +587,7 @@
583
587
  --input-radio-text-color-default: var(--color-text-default);
584
588
  --input-radio-text-color-disabled: var(--color-text-disabled);
585
589
  --input-radio-border-color-default: var(--color-border-subtle);
586
- --input-radio-border-color-hover: var(--color-border-strong);
590
+ --input-radio-border-color-hover: var(--color-border-brand);
587
591
  --input-radio-border-color-active: var(--color-border-brand);
588
592
  --input-radio-border-color-disabled: var(--color-border-disabled);
589
593
  --input-radio-container-background-default: var(--color-fill-surface);
@@ -594,30 +598,48 @@
594
598
  --badge-default-text-color: var(--color-text-default);
595
599
  --badge-default-border-color: var(--color-transparent);
596
600
  --badge-default-container-background: var(--color-fill-subtle);
597
- --badge-brand-text-color: var(--color-text-inverse);
601
+ --badge-brand-text-color: var(--color-text-on-brand);
598
602
  --badge-brand-border-color: var(--color-transparent);
599
603
  --badge-brand-container-background: var(--color-fill-brand);
600
- --badge-success-text-color: var(--color-text-inverse);
604
+ --badge-success-text-color: var(--color-text-on-success);
601
605
  --badge-success-border-color: var(--color-transparent);
602
606
  --badge-success-container-background: var(--color-fill-success);
603
607
  --badge-font-family: var(--brand-font-lead);
604
608
  --badge-font-weight: var(--typography-label-font-weight);
605
- --badge-font-size: var(--typography-label-font-size);
606
- --badge-line-height: var(--typography-label-line-height);
607
609
  --badge-border-size-default: var(--size-border-100);
608
- --badge-border-radius: var(--brand-corner-input);
609
- --badge-padding-inline: var(--size-spacing-400);
610
+ --badge-border-radius: var(--size-radius-full);
611
+ --badge-padding-inline-md: var(--size-spacing-300);
610
612
  --badge-padding-inline-icon-only: var(--size-spacing-200);
611
- --badge-padding-block: var(--size-spacing-200);
612
- --badge-gap: var(--size-spacing-200);
613
+ --badge-padding-block-md: var(--size-spacing-100);
614
+ --badge-gap: var(--size-spacing-100);
613
615
  --badge-height-min: 2.5rem;
614
616
  --badge-width-min: 2.5rem;
615
617
  --badge-danger-container-background: var(--color-fill-danger);
616
618
  --badge-danger-border-color: var(--color-transparent);
617
- --badge-danger-text-color: var(--color-text-inverse);
619
+ --badge-danger-text-color: var(--color-text-on-danger);
620
+ --badge-font-size-sm: .75rem;
621
+ --badge-font-size-md: .875rem;
622
+ --badge-line-height-sm: 1rem;
623
+ --badge-line-height-md: 1.25rem;
624
+ --badge-padding-inline-sm: .5rem;
625
+ --badge-padding-block-sm: .125rem;
626
+ --switch-track-background-default: var(--color-fill-surface);
627
+ --switch-track-background-hover: var(--color-fill-surface);
628
+ --switch-track-background-active: var(--color-fill-brand);
629
+ --switch-track-background-disabled: var(--color-fill-disabled);
630
+ --switch-track-border-color-default: var(--color-border-default);
631
+ --switch-track-border-color-hover: var(--color-border-brand);
632
+ --switch-track-border-color-active: var(--color-border-brand);
633
+ --switch-track-border-color-disabled: var(--color-border-disabled);
634
+ --switch-thumb-background-default: var(--color-border-default);
635
+ --switch-thumb-background-hover: var(--color-border-brand);
636
+ --switch-thumb-background-active: var(--color-fill-surface);
637
+ --switch-thumb-background-disabled: var(--color-fill-surface);
638
+ --switch-text-color-default: var(--color-text-default);
639
+ --switch-text-color-disabled: var(--color-text-disabled);
618
640
  }
619
641
  /* Auto-generated design tokens from Figma */
620
- /* Generated on 2026-05-22T09:23:10.603Z */
642
+ /* Generated on 2026-06-06T14:29:01.170Z */
621
643
 
622
644
  :root[data-mode="dark"] {
623
645
  --color-text-default: var(--color-neutral-800);
@@ -628,6 +650,12 @@
628
650
  --color-text-strong: var(--color-neutral-1000);
629
651
  --color-text-danger: var(--brand-color-functional-danger);
630
652
  --color-text-success: var(--brand-color-functional-success);
653
+ --color-text-on-brand: var(--color-neutral-000);
654
+ --color-text-on-danger: var(--color-neutral-000);
655
+ --color-text-on-success: var(--color-neutral-000);
656
+ --color-text-on-subtle: var(--brand-color-primary-dark);
657
+ --color-text-on-active: var(--color-neutral-000);
658
+ --color-text-on-disabled: var(--color-neutral-800);
631
659
  --color-fill-surface: var(--color-neutral-1000);
632
660
  --color-fill-disabled: var(--color-neutral-300);
633
661
  --color-fill-hover: var(--color-neutral-alpha-inverse-100);
@@ -649,7 +677,7 @@
649
677
  --color-focus: var(--brand-color-primary-dark);
650
678
  }
651
679
  /* Auto-generated design tokens from Figma */
652
- /* Generated on 2026-05-22T09:23:10.601Z */
680
+ /* Generated on 2026-06-06T14:29:01.166Z */
653
681
 
654
682
  :root {
655
683
  --color-text-default: var(--color-neutral-800);
@@ -660,6 +688,12 @@
660
688
  --color-text-strong: var(--color-neutral-1000);
661
689
  --color-text-danger: var(--brand-color-functional-danger);
662
690
  --color-text-success: var(--brand-color-functional-success);
691
+ --color-text-on-brand: var(--color-neutral-000);
692
+ --color-text-on-danger: var(--color-neutral-000);
693
+ --color-text-on-success: var(--color-neutral-000);
694
+ --color-text-on-subtle: var(--brand-color-primary);
695
+ --color-text-on-active: var(--color-neutral-000);
696
+ --color-text-on-disabled: var(--color-neutral-800);
663
697
  --color-fill-surface: var(--color-neutral-000);
664
698
  --color-fill-disabled: var(--color-neutral-300);
665
699
  --color-fill-hover: var(--color-neutral-alpha-500);
@@ -681,7 +715,7 @@
681
715
  --color-focus: var(--brand-color-primary);
682
716
  }
683
717
  /* Auto-generated design tokens from Figma */
684
- /* Generated on 2026-05-22T09:23:10.626Z */
718
+ /* Generated on 2026-06-06T14:29:01.202Z */
685
719
 
686
720
  :root[data-brand="a"] {
687
721
  --brand-color-functional-success: var(--color-brand-c-green-30);
@@ -703,7 +737,7 @@
703
737
  --brand-corner-input: var(--size-radius-200);
704
738
  }
705
739
  /* Auto-generated design tokens from Figma */
706
- /* Generated on 2026-05-22T09:23:10.628Z */
740
+ /* Generated on 2026-06-06T14:29:01.203Z */
707
741
 
708
742
  :root[data-brand="b"] {
709
743
  --brand-color-functional-success: var(--color-brand-b-green-600);
@@ -725,7 +759,7 @@
725
759
  --brand-corner-input: var(--size-radius-000);
726
760
  }
727
761
  /* Auto-generated design tokens from Figma */
728
- /* Generated on 2026-05-22T09:23:10.629Z */
762
+ /* Generated on 2026-06-06T14:29:01.205Z */
729
763
 
730
764
  :root[data-brand="c"] {
731
765
  --brand-color-functional-success: var(--color-brand-a-green-600);
@@ -756,7 +790,7 @@
756
790
  .label-content {
757
791
  display: inline-flex;
758
792
  align-items: center;
759
- gap: var(--label-gap, 0.5em);
793
+ gap: var(--typography-label-gap, 0.5em);
760
794
  line-height: inherit;
761
795
  }
762
796
 
@@ -812,7 +846,7 @@
812
846
  min-height: var(--button-height-min);
813
847
  background: var(--button-solid-container-background-default);
814
848
  border-color: var(--button-solid-border-color-default);
815
- border-width: var(--button-solid-border-size);
849
+ border-width: var(--button-border-size-default);
816
850
  border-style: solid;
817
851
  color: var(--button-solid-text-color-default);
818
852
  border-radius: var(--button-border-radius);
@@ -872,7 +906,7 @@
872
906
  .button.outline {
873
907
  background: var(--button-outline-container-background-default);
874
908
  border-color: var(--button-outline-border-color-default);
875
- border-width: var(--button-outline-border-size);
909
+ border-width: var(--button-border-size-default);
876
910
  border-style: solid;
877
911
  color: var(--button-outline-text-color-default);
878
912
  }
@@ -911,7 +945,7 @@
911
945
  .button.ghost {
912
946
  background: var(--button-ghost-container-background-default);
913
947
  border-color: var(--button-ghost-border-color-default);
914
- border-width: var(--button-ghost-border-size);
948
+ border-width: var(--button-border-size-default);
915
949
  border-style: solid;
916
950
  color: var(--button-ghost-text-color-default);
917
951
  }
@@ -1052,25 +1086,25 @@
1052
1086
  font-weight: var(--input-font-weight);
1053
1087
  font-size: var(--input-font-size);
1054
1088
  line-height: var(--input-line-height, var(--button-line-height, 1.5));
1055
- color: var(--input-text-text-color-default);
1056
- background: var(--input-text-container-background-default);
1089
+ color: var(--input-text-color-default);
1090
+ background: var(--input-container-background-default);
1057
1091
  border-style: solid;
1058
1092
  border-width: var(--input-border-size-default);
1059
- border-color: var(--input-text-border-color-default);
1093
+ border-color: var(--input-border-color-default);
1060
1094
  border-radius: var(--input-border-radius);
1061
1095
  padding-inline: var(--input-padding-inline);
1062
1096
  padding-block: var(--input-padding-block);
1063
1097
  }
1064
1098
 
1065
1099
  .input::placeholder {
1066
- color: var(--input-text-text-color-placeholder);
1100
+ color: var(--input-text-color-placeholder);
1067
1101
  }
1068
1102
 
1069
1103
  .input:hover,
1070
1104
  .input.is-hover {
1071
1105
  background:
1072
1106
  linear-gradient(0deg, var(--input-overlay-hover), var(--input-overlay-hover)),
1073
- var(--input-text-container-background-default);
1107
+ var(--input-container-background-default);
1074
1108
  border-width: var(--input-border-size-hover);
1075
1109
  padding-inline: calc(
1076
1110
  var(--input-padding-inline) + var(--input-border-size-default) -
@@ -1080,15 +1114,15 @@
1080
1114
  var(--input-padding-block) + var(--input-border-size-default) -
1081
1115
  var(--input-border-size-hover)
1082
1116
  );
1083
- border-color: var(--input-text-border-color-hover);
1084
- color: var(--input-text-text-color-hover);
1117
+ border-color: var(--input-border-color-hover);
1118
+ color: var(--input-text-color-hover);
1085
1119
  }
1086
1120
 
1087
1121
  .input:active,
1088
1122
  .input.is-active {
1089
1123
  background:
1090
1124
  linear-gradient(0deg, var(--input-overlay-active), var(--input-overlay-active)),
1091
- var(--input-text-container-background-default);
1125
+ var(--input-container-background-default);
1092
1126
  border-width: var(--input-border-size-active);
1093
1127
  padding-inline: calc(
1094
1128
  var(--input-padding-inline) + var(--input-border-size-default) -
@@ -1098,14 +1132,14 @@
1098
1132
  var(--input-padding-block) + var(--input-border-size-default) -
1099
1133
  var(--input-border-size-active)
1100
1134
  );
1101
- border-color: var(--input-text-border-color-active);
1102
- color: var(--input-text-text-color-active);
1135
+ border-color: var(--input-border-color-active);
1136
+ color: var(--input-text-color-active);
1103
1137
  }
1104
1138
 
1105
1139
  .input:focus-visible,
1106
1140
  .input.is-focus-visible {
1107
- background: var(--input-text-container-background-focus);
1108
- border-color: var(--input-text-border-color-focus);
1141
+ background: var(--input-container-background-focus);
1142
+ border-color: var(--input-border-color-focus);
1109
1143
  outline: none;
1110
1144
  box-shadow: 0 0 0 var(--shadow-focus, 0) var(--color-focus, transparent);
1111
1145
  }
@@ -1148,12 +1182,12 @@
1148
1182
  font-weight: var(--typography-label-font-weight);
1149
1183
  font-size: var(--typography-label-font-size);
1150
1184
  line-height: var(--typography-label-line-height);
1151
- color: var(--input-checkbox-text-color-default);
1185
+ color: var(--checkbox-text-color-default);
1152
1186
  cursor: pointer;
1153
1187
  }
1154
1188
 
1155
1189
  .checkbox-field.is-disabled {
1156
- color: var(--input-checkbox-text-color-disabled);
1190
+ color: var(--checkbox-text-color-disabled);
1157
1191
  cursor: not-allowed;
1158
1192
  }
1159
1193
 
@@ -1166,10 +1200,10 @@
1166
1200
  place-content: center;
1167
1201
  border-style: solid;
1168
1202
  border-width: var(--checkbox-border-size-default);
1169
- border-color: var(--input-checkbox-border-color-default);
1203
+ border-color: var(--checkbox-border-color-default);
1170
1204
  border-radius: var(--corner-checkbox-radius);
1171
- background: var(--input-checkbox-container-background-default);
1172
- color: var(--input-checkbox-text-color-active);
1205
+ background: var(--checkbox-container-background-default);
1206
+ color: var(--checkbox-text-color-active);
1173
1207
  cursor: pointer;
1174
1208
  }
1175
1209
 
@@ -1180,8 +1214,8 @@
1180
1214
 
1181
1215
  .checkbox:checked,
1182
1216
  .checkbox.is-checked {
1183
- border-color: var(--input-checkbox-border-color-active);
1184
- background: var(--input-checkbox-container-background-active);
1217
+ border-color: var(--checkbox-border-color-active);
1218
+ background: var(--checkbox-container-background-active);
1185
1219
  }
1186
1220
 
1187
1221
  .checkbox:checked::after,
@@ -1202,8 +1236,8 @@
1202
1236
 
1203
1237
  .checkbox:indeterminate,
1204
1238
  .checkbox.is-indeterminate {
1205
- border-color: var(--input-checkbox-border-color-active);
1206
- background: var(--input-checkbox-container-background-active);
1239
+ border-color: var(--checkbox-border-color-active);
1240
+ background: var(--checkbox-container-background-active);
1207
1241
  }
1208
1242
 
1209
1243
  .checkbox:indeterminate::after,
@@ -1218,9 +1252,9 @@
1218
1252
  .checkbox.is-hover {
1219
1253
  background:
1220
1254
  linear-gradient(0deg, var(--color-overlay-hover), var(--color-overlay-hover)),
1221
- var(--input-checkbox-container-background-hover);
1222
- color: var(--input-checkbox-text-color-hover);
1223
- border-color: var(--input-checkbox-border-color-hover);
1255
+ var(--checkbox-container-background-hover);
1256
+ color: var(--checkbox-text-color-hover);
1257
+ border-color: var(--checkbox-border-color-hover);
1224
1258
  border-width: var(--checkbox-border-size-hover);
1225
1259
  }
1226
1260
 
@@ -1228,9 +1262,9 @@
1228
1262
  .checkbox.is-checked.is-hover {
1229
1263
  background:
1230
1264
  linear-gradient(0deg, var(--color-overlay-hover), var(--color-overlay-hover)),
1231
- var(--input-checkbox-container-background-active);
1232
- color: var(--input-checkbox-text-color-hover);
1233
- border-color: var(--input-checkbox-border-color-hover);
1265
+ var(--checkbox-container-background-active);
1266
+ color: var(--checkbox-text-color-hover);
1267
+ border-color: var(--checkbox-border-color-hover);
1234
1268
  border-width: var(--checkbox-border-size-hover);
1235
1269
  }
1236
1270
 
@@ -1238,9 +1272,9 @@
1238
1272
  .checkbox.is-indeterminate.is-hover {
1239
1273
  background:
1240
1274
  linear-gradient(0deg, var(--color-overlay-hover), var(--color-overlay-hover)),
1241
- var(--input-checkbox-container-background-active);
1242
- color: var(--input-checkbox-text-color-hover);
1243
- border-color: var(--input-checkbox-border-color-hover);
1275
+ var(--checkbox-container-background-active);
1276
+ color: var(--checkbox-text-color-hover);
1277
+ border-color: var(--checkbox-border-color-hover);
1244
1278
  border-width: var(--checkbox-border-size-hover);
1245
1279
  }
1246
1280
 
@@ -1248,8 +1282,8 @@
1248
1282
  .checkbox.is-active {
1249
1283
  background:
1250
1284
  linear-gradient(0deg, var(--color-overlay-active), var(--color-overlay-active)),
1251
- var(--input-checkbox-container-background-default);
1252
- border-color: var(--input-checkbox-border-color-active);
1285
+ var(--checkbox-container-background-default);
1286
+ border-color: var(--checkbox-border-color-active);
1253
1287
  border-width: var(--size-border-200);
1254
1288
  }
1255
1289
 
@@ -1257,21 +1291,21 @@
1257
1291
  .checkbox.is-checked.is-active {
1258
1292
  background:
1259
1293
  linear-gradient(0deg, var(--color-overlay-active), var(--color-overlay-active)),
1260
- var(--input-checkbox-container-background-active);
1261
- border-color: var(--input-checkbox-border-color-active);
1294
+ var(--checkbox-container-background-active);
1295
+ border-color: var(--checkbox-border-color-active);
1262
1296
  }
1263
1297
 
1264
1298
  .checkbox:indeterminate:active,
1265
1299
  .checkbox.is-indeterminate.is-active {
1266
1300
  background:
1267
1301
  linear-gradient(0deg, var(--color-overlay-active), var(--color-overlay-active)),
1268
- var(--input-checkbox-container-background-active);
1269
- border-color: var(--input-checkbox-border-color-active);
1302
+ var(--checkbox-container-background-active);
1303
+ border-color: var(--checkbox-border-color-active);
1270
1304
  }
1271
1305
 
1272
1306
  .checkbox:focus-visible,
1273
1307
  .checkbox.is-focus-visible {
1274
- border-color: var(--input-checkbox-border-color-focus);
1308
+ border-color: var(--checkbox-border-color-focus);
1275
1309
  outline: none;
1276
1310
  box-shadow: 0 0 0 var(--shadow-focus, 0) var(--color-focus, transparent);
1277
1311
  }
@@ -1279,9 +1313,9 @@
1279
1313
  .checkbox:disabled,
1280
1314
  .checkbox.is-disabled {
1281
1315
  border-width: var(--checkbox-border-size-disabled);
1282
- border-color: var(--input-checkbox-border-color-disabled);
1283
- background: var(--input-checkbox-container-background-disabled);
1284
- color: var(--input-checkbox-text-color-disabled);
1316
+ border-color: var(--checkbox-border-color-disabled);
1317
+ background: var(--checkbox-container-background-disabled);
1318
+ color: var(--checkbox-text-color-disabled);
1285
1319
  cursor: not-allowed;
1286
1320
  }
1287
1321
  }
@@ -1946,3 +1980,115 @@
1946
1980
  opacity: 1;
1947
1981
  }
1948
1982
  }
1983
+ @layer components {
1984
+ /* ----------------------------------------------------------------
1985
+ * Form — layout container for form fields
1986
+ * ---------------------------------------------------------------- */
1987
+
1988
+ .form {
1989
+ display: flex;
1990
+ flex-direction: column;
1991
+ gap: var(--form-gap);
1992
+ padding-inline: var(--form-padding-inline);
1993
+ padding-block: var(--form-padding-block);
1994
+ background: var(--form-container-background);
1995
+ border: var(--form-border-size) solid var(--form-container-border-color);
1996
+ border-radius: var(--form-border-radius);
1997
+ }
1998
+
1999
+ .form.borderless {
2000
+ border: none;
2001
+ padding: 0;
2002
+ background: transparent;
2003
+ }
2004
+
2005
+ /* ----------------------------------------------------------------
2006
+ * Form Group — groups related fields with an optional title
2007
+ * ---------------------------------------------------------------- */
2008
+
2009
+ .form-group {
2010
+ display: flex;
2011
+ flex-direction: column;
2012
+ gap: var(--form-group-gap);
2013
+ margin: 0;
2014
+ padding: 0;
2015
+ border: 0;
2016
+ min-inline-size: 0;
2017
+ }
2018
+
2019
+ .form-group__title {
2020
+ font-family: var(--typography-heading-font-family);
2021
+ font-weight: var(--typography-heading-font-weight);
2022
+ font-size: var(--typography-heading-font-size-sm);
2023
+ line-height: var(--typography-heading-line-height-sm);
2024
+ color: var(--form-group-title-color);
2025
+ margin: 0;
2026
+ }
2027
+
2028
+ /* ----------------------------------------------------------------
2029
+ * Form Field — single field with label, input, and helper/error
2030
+ * ---------------------------------------------------------------- */
2031
+
2032
+ .form-field {
2033
+ display: flex;
2034
+ flex-direction: column;
2035
+ gap: var(--form-field-gap);
2036
+ }
2037
+
2038
+ .form-field[data-label-position="side"] {
2039
+ flex-direction: row;
2040
+ align-items: flex-start;
2041
+ }
2042
+
2043
+ .form-field[data-label-position="side"] > .field-label {
2044
+ flex-shrink: 0;
2045
+ inline-size: 8rem;
2046
+ padding-block-start: var(--size-spacing-200);
2047
+ }
2048
+
2049
+ .form-field[data-label-position="side"] > .form-field__body {
2050
+ flex: 1;
2051
+ display: flex;
2052
+ flex-direction: column;
2053
+ gap: var(--form-field-gap);
2054
+ }
2055
+
2056
+ /* ----------------------------------------------------------------
2057
+ * Helper and error text
2058
+ * ---------------------------------------------------------------- */
2059
+
2060
+ .form-field__helper {
2061
+ font-family: var(--typography-body-font-family);
2062
+ font-size: var(--font-size-sm);
2063
+ line-height: var(--line-height-sm);
2064
+ color: var(--form-field-helper-text-color-default);
2065
+ margin: 0;
2066
+ }
2067
+
2068
+ .form-field.is-invalid .form-field__helper {
2069
+ color: var(--form-field-helper-text-color-invalid);
2070
+ }
2071
+
2072
+ /* ----------------------------------------------------------------
2073
+ * Form Actions — button area at the bottom
2074
+ * ---------------------------------------------------------------- */
2075
+
2076
+ .form-actions {
2077
+ display: flex;
2078
+ gap: var(--size-spacing-200);
2079
+ justify-content: flex-end;
2080
+ padding-block-start: var(--size-spacing-200);
2081
+ }
2082
+
2083
+ .form-actions[data-align="start"] {
2084
+ justify-content: flex-start;
2085
+ }
2086
+
2087
+ .form-actions[data-align="stretch"] {
2088
+ flex-direction: column;
2089
+ }
2090
+
2091
+ .form-actions[data-align="stretch"] > * {
2092
+ inline-size: 100%;
2093
+ }
2094
+ }