fokus-styles 2.4.0 → 2.5.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 (85) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/css/components.css +561 -83
  3. package/dist/css/components.css.map +1 -1
  4. package/dist/css/components.min.css +1 -1
  5. package/dist/css/components.min.css.map +1 -1
  6. package/dist/css/fokus-components.css +561 -83
  7. package/dist/css/fokus-components.css.map +1 -1
  8. package/dist/css/fokus-components.min.css +1 -1
  9. package/dist/css/fokus-components.min.css.map +1 -1
  10. package/dist/css/fokus-rtl.css +697 -83
  11. package/dist/css/fokus-rtl.css.map +1 -1
  12. package/dist/css/fokus-rtl.min.css +1 -1
  13. package/dist/css/fokus-rtl.min.css.map +1 -1
  14. package/dist/css/fokus-utilities.css +136 -0
  15. package/dist/css/fokus-utilities.css.map +1 -1
  16. package/dist/css/fokus-utilities.min.css +1 -1
  17. package/dist/css/fokus-utilities.min.css.map +1 -1
  18. package/dist/css/fokus.css +996 -258
  19. package/dist/css/fokus.css.map +1 -1
  20. package/dist/css/fokus.min.css +1 -1
  21. package/dist/css/fokus.min.css.map +1 -1
  22. package/dist/css/forms.css +300 -176
  23. package/dist/css/forms.css.map +1 -1
  24. package/dist/css/forms.min.css +1 -1
  25. package/dist/css/forms.min.css.map +1 -1
  26. package/dist/css/helpers.css +136 -0
  27. package/dist/css/helpers.css.map +1 -1
  28. package/dist/css/helpers.min.css +1 -1
  29. package/dist/css/helpers.min.css.map +1 -1
  30. package/dist/js/fokus.js +270 -25
  31. package/dist/js/fokus.js.map +2 -2
  32. package/dist/js/fokus.min.js +18 -18
  33. package/dist/js/fokus.min.js.map +3 -3
  34. package/docs/components/alert.md +69 -24
  35. package/docs/components/badge.md +23 -4
  36. package/docs/components/checkbox.md +16 -3
  37. package/docs/components/popover.md +20 -7
  38. package/docs/components/radio.md +11 -1
  39. package/docs/components/responsive.md +19 -0
  40. package/docs/components/switch.md +30 -8
  41. package/docs/components/tag.md +19 -4
  42. package/docs/components/toast.md +72 -59
  43. package/docs/components/tooltip.md +38 -2
  44. package/docs/guides/accessibility.md +7 -0
  45. package/docs/prompts/prompt-plan.md +4 -4
  46. package/docs/reference/accessibility-matrix.md +7 -7
  47. package/docs/reference/contrast-report.md +4 -0
  48. package/docs/reference/definitions.md +5 -1
  49. package/docs/reference/design-tokens.md +14 -0
  50. package/docs/reference/size-baseline.json +11 -11
  51. package/mockup/assets/example-theme.css +11 -0
  52. package/mockup/assets/showcase-contracts.js +6 -6
  53. package/mockup/examples/alerts.html +105 -31
  54. package/mockup/examples/badges-alerts.html +91 -59
  55. package/mockup/examples/check-radio-switch.html +575 -99
  56. package/mockup/examples/popover.html +81 -0
  57. package/mockup/examples/tag.html +97 -87
  58. package/mockup/examples/toast.html +113 -0
  59. package/mockup/examples/tooltip.html +68 -0
  60. package/mockup/forms.html +1 -1
  61. package/mockup/overlays-commands.html +2 -2
  62. package/package.json +1 -1
  63. package/packages/fokus-components/scss/components/_alerts.scss +128 -6
  64. package/packages/fokus-components/scss/components/_badges.scss +26 -10
  65. package/packages/fokus-components/scss/components/_index.scss +1 -0
  66. package/packages/fokus-components/scss/components/_popover.scss +131 -21
  67. package/packages/fokus-components/scss/components/_responsive.scss +23 -0
  68. package/packages/fokus-components/scss/components/_tag.scss +37 -14
  69. package/packages/fokus-components/scss/components/_toasts.scss +156 -11
  70. package/packages/fokus-components/scss/components/_tooltips.scss +70 -18
  71. package/packages/fokus-components/scss/forms/_check-radio-switch.scss +313 -215
  72. package/packages/fokus-components/scss/forms/_forms.scss +16 -0
  73. package/packages/fokus-js/js/carousel.d.ts +4 -0
  74. package/packages/fokus-js/js/carousel.js +8 -0
  75. package/packages/fokus-js/js/core/positioning.js +18 -9
  76. package/packages/fokus-js/js/dropdown.d.ts +4 -0
  77. package/packages/fokus-js/js/dropdown.js +7 -0
  78. package/packages/fokus-js/js/popover.js +26 -1
  79. package/packages/fokus-js/js/tabs.d.ts +3 -0
  80. package/packages/fokus-js/js/tabs.js +5 -0
  81. package/packages/fokus-js/js/tag.js +17 -0
  82. package/packages/fokus-js/js/toast.js +77 -3
  83. package/packages/fokus-js/js/tooltip.d.ts +8 -1
  84. package/packages/fokus-js/js/tooltip.js +106 -13
  85. package/packages/fokus-utilities/scss/utilities/_api.scss +48 -0
@@ -320,6 +320,20 @@
320
320
  }
321
321
  }
322
322
  @layer components {
323
+ .fs-form-fieldset {
324
+ min-inline-size: 0;
325
+ margin: 0;
326
+ padding: var(--fs-space-3);
327
+ border: var(--fs-border-width) solid var(--fs-color-border);
328
+ border-radius: var(--fs-radius-md);
329
+ }
330
+ .fs-form-fieldset > legend {
331
+ max-inline-size: 100%;
332
+ padding-inline: var(--fs-space-1);
333
+ color: var(--fs-color-text);
334
+ font-size: 0.75rem;
335
+ font-weight: 600;
336
+ }
323
337
  .fs-form-row {
324
338
  display: flex;
325
339
  flex-direction: row;
@@ -663,9 +677,53 @@
663
677
  .fs-switch {
664
678
  display: inline-flex;
665
679
  align-items: center;
680
+ min-inline-size: 0;
666
681
  }
667
682
  .fs-check {
668
- --fs-check-mark: var(--fs-color-on-primary);
683
+ --fs-check-size: 18px;
684
+ --fs-check-border-width: 2px;
685
+ --fs-check-radius: var(--fs-radius-sm);
686
+ --fs-check-gap: var(--fs-space-2);
687
+ --fs-check-mark-color: var(--fs-color-on-primary);
688
+ --fs-control-hover-bg: var(--fs-color-subtle);
689
+ --fs-control-active-bg: var(--fs-alert-primary-bg);
690
+ --fs-control-error-color: var(--fs-color-danger);
691
+ --fs-control-success-color: var(--fs-color-success);
692
+ }
693
+ .fs-radio {
694
+ --fs-radio-size: 18px;
695
+ --fs-radio-dot-size: 8px;
696
+ --fs-radio-radius: 50%;
697
+ --fs-radio-gap: var(--fs-space-2);
698
+ --fs-control-hover-bg: var(--fs-color-subtle);
699
+ --fs-control-active-bg: var(--fs-alert-primary-bg);
700
+ --fs-control-error-color: var(--fs-color-danger);
701
+ --fs-control-success-color: var(--fs-color-success);
702
+ }
703
+ .fs-switch {
704
+ --fs-switch-track-width: 40px;
705
+ --fs-switch-track-height: 24px;
706
+ --fs-switch-thumb-width: 18px;
707
+ --fs-switch-thumb-height: 18px;
708
+ --fs-switch-thumb-offset: 3px;
709
+ --fs-switch-on-offset: 19px;
710
+ --fs-switch-radius: var(--fs-radius-md);
711
+ --fs-switch-thumb-radius: var(--fs-radius-sm);
712
+ --fs-switch-gap: var(--fs-space-2);
713
+ --fs-switch-track-bg: var(--fs-color-subtle);
714
+ --fs-switch-track-border: var(--fs-color-border-default);
715
+ --fs-switch-track-checked-bg: var(--fs-color-primary);
716
+ --fs-switch-thumb-bg: var(--fs-color-surface);
717
+ --fs-switch-thumb-border: var(--fs-color-border-default);
718
+ --fs-switch-thumb-shadow: var(--fs-shadow-sm);
719
+ --fs-switch-track-shadow: inset 0 1px 1px rgb(15 23 42 / 12%);
720
+ --fs-switch-hover-ring: color-mix(in srgb, var(--fs-color-primary) 18%, transparent);
721
+ --fs-switch-hover-shadow: 0 0 0 4px var(--fs-switch-hover-ring);
722
+ --fs-switch-active-scale: 0.92;
723
+ --fs-control-hover-bg: var(--fs-color-subtle);
724
+ --fs-control-active-bg: var(--fs-alert-primary-bg);
725
+ --fs-control-error-color: var(--fs-color-danger);
726
+ --fs-control-success-color: var(--fs-color-success);
669
727
  }
670
728
  .fs-check-input,
671
729
  .fs-radio-input,
@@ -686,105 +744,140 @@
686
744
  position: relative;
687
745
  display: inline-flex;
688
746
  align-items: center;
689
- min-height: 20px;
690
- padding-left: 28px;
747
+ min-block-size: 24px;
748
+ min-inline-size: 24px;
691
749
  color: var(--fs-color-text);
692
750
  font-size: 0.8125rem;
751
+ line-height: 1.35;
693
752
  cursor: pointer;
694
753
  -webkit-user-select: none;
695
754
  user-select: none;
696
755
  }
756
+ .fs-check-label {
757
+ padding-inline-start: calc(var(--fs-check-size) + var(--fs-check-gap));
758
+ }
759
+ .fs-radio-label {
760
+ padding-inline-start: calc(var(--fs-radio-size) + var(--fs-radio-gap));
761
+ }
762
+ .fs-switch-label {
763
+ padding-inline-start: calc(var(--fs-switch-track-width) + var(--fs-switch-gap));
764
+ }
697
765
  .fs-check-label::before,
698
766
  .fs-radio-label::before,
699
767
  .fs-switch-label::before {
700
768
  position: absolute;
701
- left: 0;
769
+ inset-block-start: 50%;
702
770
  box-sizing: border-box;
703
- border: 1px solid var(--fs-color-border);
771
+ border: var(--fs-border-width) solid var(--fs-color-border);
704
772
  background-color: var(--fs-color-surface);
705
773
  content: "";
706
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;
707
- }
708
- .fs-check-label::before,
709
- .fs-radio-label::before {
710
- width: 18px;
711
- height: 18px;
774
+ transform: translateY(-50%);
775
+ transition: background-color var(--fs-transition-fast) var(--fs-ease-standard), border-color var(--fs-transition-fast) var(--fs-ease-standard), box-shadow var(--fs-transition-fast) var(--fs-ease-standard);
712
776
  }
713
777
  .fs-check-label::before {
714
- border: 2px solid var(--fs-color-primary);
715
- border-radius: 0;
778
+ inset-inline-start: 0;
779
+ width: var(--fs-check-size);
780
+ height: var(--fs-check-size);
781
+ border-width: var(--fs-check-border-width);
782
+ border-radius: var(--fs-check-radius);
716
783
  }
717
784
  .fs-radio-label::before {
718
- border-radius: 50%;
785
+ inset-inline-start: 0;
786
+ width: var(--fs-radio-size);
787
+ height: var(--fs-radio-size);
788
+ border-radius: var(--fs-radio-radius);
719
789
  }
720
- .fs-check-label::after {
790
+ .fs-check-label::after,
791
+ .fs-radio-label::after,
792
+ .fs-switch-label::after {
721
793
  position: absolute;
722
- left: 4px;
723
- width: 9px;
724
- height: 5px;
725
794
  content: "";
726
795
  opacity: 0;
727
- border-bottom: 2px solid var(--fs-check-mark);
728
- border-left: 2px solid var(--fs-check-mark);
729
- transform: translateY(-1px) rotate(-45deg);
730
- transition: opacity 0.1s ease-in-out;
796
+ transition: opacity var(--fs-transition-fast) var(--fs-ease-standard), background-color var(--fs-transition-fast) var(--fs-ease-standard), inset-inline-start var(--fs-transition-fast) var(--fs-ease-standard), transform var(--fs-transition-fast) var(--fs-ease-standard);
797
+ }
798
+ .fs-check-label::after {
799
+ inset-inline-start: calc((var(--fs-check-size) - 9px) / 2);
800
+ inset-block-start: 50%;
801
+ width: 9px;
802
+ height: 5px;
803
+ border-block-end: 2px solid var(--fs-check-mark-color);
804
+ border-inline-start: 2px solid var(--fs-check-mark-color);
805
+ transform: translateY(-65%) rotate(-45deg);
731
806
  }
732
807
  .fs-radio-label::after {
733
- position: absolute;
734
- left: 5px;
735
- width: 8px;
736
- height: 8px;
808
+ inset-inline-start: calc((var(--fs-radio-size) - var(--fs-radio-dot-size)) / 2);
809
+ inset-block-start: 50%;
810
+ width: var(--fs-radio-dot-size);
811
+ height: var(--fs-radio-dot-size);
737
812
  border-radius: 50%;
738
- content: "";
739
- opacity: 0;
740
813
  background-color: var(--fs-color-on-primary);
741
- transition: opacity 0.1s ease-in-out;
814
+ transform: translateY(-50%);
742
815
  }
743
816
  .fs-check-input:checked + .fs-check-label::before,
744
817
  .fs-radio-input:checked + .fs-radio-label::before {
745
- background-color: var(--fs-color-primary);
746
818
  border-color: var(--fs-color-primary);
819
+ background-color: var(--fs-color-primary);
747
820
  }
748
821
  .fs-check-input:checked + .fs-check-label::after,
749
822
  .fs-radio-input:checked + .fs-radio-label::after {
750
823
  opacity: 1;
751
824
  }
752
- .fs-check-input:not(:checked, :indeterminate, :disabled, .is-invalid) + .fs-check-label:hover::before {
753
- background-color: color-mix(in srgb, var(--fs-color-primary) 10%, transparent);
754
- }
755
- .fs-check-input:not(:disabled, :indeterminate, .is-invalid) + .fs-check-label:active::before {
756
- background-color: color-mix(in srgb, var(--fs-color-primary) 86%, var(--fs-color-black));
757
- border-color: var(--fs-color-primary);
825
+ .fs-check-input:not(:disabled, :indeterminate, .is-invalid) + .fs-check-label:hover::before,
826
+ .fs-radio-input:not(:disabled, .is-invalid) + .fs-radio-label:hover::before,
827
+ .fs-switch-input:not(:disabled, .is-invalid) + .fs-switch-label:hover::before {
828
+ background-color: var(--fs-control-hover-bg);
758
829
  }
759
- .fs-check-input:checked:not(:disabled, .is-invalid) + .fs-check-label:active::after {
760
- transform: translateY(-1px) rotate(-45deg) scale(0.9);
830
+ .fs-check-input:checked:not(:disabled, .is-invalid) + .fs-check-label:hover::before,
831
+ .fs-radio-input:checked:not(:disabled, .is-invalid) + .fs-radio-label:hover::before,
832
+ .fs-switch-input:checked:not(:disabled, .is-invalid) + .fs-switch-label:hover::before {
833
+ background-color: color-mix(in srgb, var(--fs-color-primary) 88%, var(--fs-color-black));
761
834
  }
762
- .fs-switch-label {
763
- padding-left: 44px;
835
+ .fs-check-input:not(:disabled, .is-invalid) + .fs-check-label:active::before,
836
+ .fs-radio-input:not(:disabled, .is-invalid) + .fs-radio-label:active::before,
837
+ .fs-switch-input:not(:disabled, .is-invalid) + .fs-switch-label:active::before {
838
+ background-color: var(--fs-control-active-bg);
839
+ border-color: var(--fs-color-primary);
764
840
  }
765
841
  .fs-switch-label::before {
766
- width: 36px;
767
- height: 20px;
768
- border-radius: var(--fs-radius-md);
842
+ inset-inline-start: 0;
843
+ width: var(--fs-switch-track-width);
844
+ height: var(--fs-switch-track-height);
845
+ border-color: var(--fs-switch-track-border);
846
+ border-radius: var(--fs-switch-radius);
847
+ background-color: var(--fs-switch-track-bg);
848
+ box-shadow: var(--fs-switch-track-shadow);
769
849
  }
770
850
  .fs-switch-label::after {
771
- position: absolute;
772
- left: 2px;
773
- width: 16px;
774
- height: 14px;
775
- border-radius: var(--fs-radius-sm);
776
- content: "";
777
- background-color: var(--fs-color-border);
778
- transition: left 0.15s ease-in-out, background-color 0.15s ease-in-out;
851
+ inset-inline-start: var(--fs-switch-thumb-offset);
852
+ inset-block-start: 50%;
853
+ width: var(--fs-switch-thumb-width);
854
+ height: var(--fs-switch-thumb-height);
855
+ border-radius: var(--fs-switch-thumb-radius);
856
+ border: var(--fs-border-width) solid var(--fs-switch-thumb-border);
857
+ background-color: var(--fs-switch-thumb-bg);
858
+ opacity: 1;
859
+ transform: translateY(-50%);
860
+ box-shadow: var(--fs-switch-thumb-shadow);
779
861
  }
780
862
  .fs-switch-input:checked + .fs-switch-label::before {
781
- background-color: var(--fs-color-primary);
782
- border-color: var(--fs-color-primary);
863
+ border-color: var(--fs-switch-track-checked-bg);
864
+ background-color: var(--fs-switch-track-checked-bg);
865
+ box-shadow: none;
783
866
  }
784
867
  .fs-switch-input:checked + .fs-switch-label::after {
785
- left: 18px;
868
+ inset-inline-start: var(--fs-switch-on-offset);
869
+ border-color: var(--fs-color-on-primary);
786
870
  background-color: var(--fs-color-on-primary);
787
871
  }
872
+ .fs-switch-input:not(:disabled, .is-invalid) + .fs-switch-label:hover::before {
873
+ box-shadow: var(--fs-switch-hover-shadow), var(--fs-switch-track-shadow);
874
+ }
875
+ .fs-switch-input:checked:not(:disabled, .is-invalid) + .fs-switch-label:hover::before {
876
+ box-shadow: var(--fs-switch-hover-shadow);
877
+ }
878
+ .fs-switch-input:not(:disabled) + .fs-switch-label:active::after {
879
+ transform: translateY(-50%) scale(var(--fs-switch-active-scale));
880
+ }
788
881
  .fs-check-input:focus-visible + .fs-check-label::before,
789
882
  .fs-radio-input:focus-visible + .fs-radio-label::before,
790
883
  .fs-switch-input:focus-visible + .fs-switch-label::before {
@@ -793,153 +886,184 @@
793
886
  border-color: var(--fs-color-primary);
794
887
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--fs-color-primary) 22%, transparent);
795
888
  }
889
+ .fs-check-input:disabled + .fs-check-label,
796
890
  .fs-radio-input:disabled + .fs-radio-label,
797
891
  .fs-switch-input:disabled + .fs-switch-label {
798
- opacity: 0.5;
799
- pointer-events: none;
800
- }
801
- .fs-check-input:disabled + .fs-check-label {
802
892
  color: var(--fs-color-muted);
803
- opacity: 1;
893
+ cursor: default;
894
+ opacity: var(--fs-disabled-opacity);
804
895
  pointer-events: none;
805
896
  }
806
- .fs-check-input:disabled:not(:checked, :indeterminate) + .fs-check-label::before {
807
- border-color: var(--fs-color-border);
897
+ .fs-check-input:disabled + .fs-check-label::before,
898
+ .fs-radio-input:disabled + .fs-radio-label::before,
899
+ .fs-switch-input:disabled + .fs-switch-label::before {
900
+ border-color: var(--fs-switch-track-border);
901
+ background-color: var(--fs-switch-track-bg);
902
+ box-shadow: none;
903
+ }
904
+ .fs-switch-input:disabled + .fs-switch-label::after {
808
905
  background-color: var(--fs-color-subtle);
906
+ box-shadow: none;
809
907
  }
810
- .fs-check-input:disabled:checked + .fs-check-label::before {
811
- border-color: color-mix(in srgb, var(--fs-color-primary) 55%, var(--fs-color-border));
812
- background-color: color-mix(in srgb, var(--fs-color-primary) 45%, var(--fs-color-subtle));
908
+ .fs-check-input:disabled:checked + .fs-check-label::before,
909
+ .fs-radio-input:disabled:checked + .fs-radio-label::before,
910
+ .fs-switch-input:disabled:checked + .fs-switch-label::before {
911
+ border-color: color-mix(in srgb, var(--fs-switch-track-checked-bg) 55%, var(--fs-color-border));
912
+ background-color: color-mix(in srgb, var(--fs-switch-track-checked-bg) 45%, var(--fs-switch-track-bg));
813
913
  }
814
- .fs-check-input:disabled:checked + .fs-check-label::after {
815
- opacity: 0.72;
914
+ .fs-switch-input:disabled:checked + .fs-switch-label::after {
915
+ background-color: var(--fs-color-on-primary);
816
916
  }
817
- .fs-radio-input.is-valid + .fs-radio-label::before {
818
- border-color: var(--fs-color-success);
917
+ .fs-check-input.is-valid + .fs-check-label::before,
918
+ .fs-radio-input.is-valid + .fs-radio-label::before,
919
+ .fs-switch-input.is-valid + .fs-switch-label::before,
920
+ .fs-check-input[aria-invalid=false] + .fs-check-label::before,
921
+ .fs-radio-input[aria-invalid=false] + .fs-radio-label::before,
922
+ .fs-switch-input[aria-invalid=false] + .fs-switch-label::before {
923
+ border-color: var(--fs-control-success-color);
819
924
  }
820
925
  .fs-check-input.is-invalid + .fs-check-label::before,
821
- .fs-radio-input.is-invalid + .fs-radio-label::before {
822
- border-color: var(--fs-color-danger);
926
+ .fs-radio-input.is-invalid + .fs-radio-label::before,
927
+ .fs-switch-input.is-invalid + .fs-switch-label::before,
928
+ .fs-check-input[aria-invalid=true] + .fs-check-label::before,
929
+ .fs-radio-input[aria-invalid=true] + .fs-radio-label::before,
930
+ .fs-switch-input[aria-invalid=true] + .fs-switch-label::before {
931
+ border-color: var(--fs-control-error-color);
932
+ }
933
+ .fs-switch-input.is-invalid:checked + .fs-switch-label::before,
934
+ .fs-switch-input[aria-invalid=true]:checked + .fs-switch-label::before {
935
+ background-color: var(--fs-control-error-color);
936
+ box-shadow: none;
937
+ }
938
+ .fs-switch-input.is-valid:checked + .fs-switch-label::before,
939
+ .fs-switch-input[aria-invalid=false]:checked + .fs-switch-label::before {
940
+ background-color: var(--fs-control-success-color);
941
+ border-color: var(--fs-control-success-color);
942
+ box-shadow: none;
823
943
  }
824
- .fs-check-sm .fs-check-label,
825
- .fs-radio-sm .fs-radio-label {
826
- min-height: 16px;
827
- padding-left: 24px;
828
- font-size: 0.75rem;
829
- }
830
- .fs-check-sm .fs-check-label::before,
831
- .fs-radio-sm .fs-radio-label::before {
832
- width: 15px;
833
- height: 15px;
834
- }
835
- .fs-check-sm .fs-check-label::after {
836
- left: 3px;
837
- width: 8px;
838
- height: 4px;
839
- }
840
- .fs-radio-sm .fs-radio-label::after {
841
- left: 4px;
842
- width: 7px;
843
- height: 7px;
844
- }
845
- .fs-check-lg .fs-check-label,
846
- .fs-radio-lg .fs-radio-label {
847
- min-height: 24px;
848
- padding-left: 34px;
849
- font-size: 1rem;
944
+ .fs-check-input.is-invalid + .fs-check-label::before,
945
+ .fs-check-input[aria-invalid=true] + .fs-check-label::before {
946
+ background-color: var(--fs-control-error-color);
850
947
  }
851
- .fs-check-lg .fs-check-label::before,
852
- .fs-radio-lg .fs-radio-label::before {
853
- width: 22px;
854
- height: 22px;
948
+ .fs-check-input.is-invalid + .fs-check-label::after,
949
+ .fs-check-input[aria-invalid=true] + .fs-check-label::after {
950
+ inset-inline-start: 50%;
951
+ inset-block-start: 50%;
952
+ width: 9px;
953
+ height: 9px;
954
+ border: 0;
955
+ background-image: linear-gradient(45deg, transparent 42%, var(--fs-color-on-danger, var(--fs-color-white)) 42% 58%, transparent 58%), linear-gradient(-45deg, transparent 42%, var(--fs-color-on-danger, var(--fs-color-white)) 42% 58%, transparent 58%);
956
+ opacity: 1;
957
+ transform: translate(-50%, -50%);
855
958
  }
856
- .fs-check-lg .fs-check-label::after {
857
- left: 5px;
858
- width: 11px;
859
- height: 6px;
959
+ .fs-check-input:indeterminate + .fs-check-label::before {
960
+ border-color: var(--fs-color-primary);
961
+ background-color: var(--fs-color-surface);
860
962
  }
861
- .fs-radio-lg .fs-radio-label::after {
862
- left: 6px;
963
+ .fs-check-input:indeterminate + .fs-check-label::after {
964
+ inset-inline-start: calc((var(--fs-check-size) - 10px) / 2);
965
+ inset-block-start: 50%;
863
966
  width: 10px;
864
- height: 10px;
967
+ height: 2px;
968
+ border: 0;
969
+ border-radius: 1px;
970
+ background-color: var(--fs-color-primary);
971
+ opacity: 1;
972
+ transform: translateY(-50%);
865
973
  }
866
- .fs-switch-sm .fs-switch-label {
867
- min-height: 16px;
868
- padding-left: 38px;
974
+ .fs-check-sm,
975
+ .fs-radio-sm,
976
+ .fs-switch-sm {
869
977
  font-size: 0.75rem;
870
978
  }
871
- .fs-switch-sm .fs-switch-label::before {
872
- width: 30px;
873
- height: 16px;
874
- }
875
- .fs-switch-sm .fs-switch-label::after {
876
- width: 12px;
877
- height: 10px;
878
- }
879
- .fs-switch-sm .fs-switch-input:checked + .fs-switch-label::after {
880
- left: 16px;
881
- }
882
- .fs-switch-lg .fs-switch-label {
883
- min-height: 26px;
884
- padding-left: 52px;
979
+ .fs-check-sm {
980
+ --fs-check-size: 15px;
981
+ --fs-check-gap: 9px;
982
+ }
983
+ .fs-radio-sm {
984
+ --fs-radio-size: 15px;
985
+ --fs-radio-dot-size: 7px;
986
+ --fs-radio-gap: 9px;
987
+ }
988
+ .fs-switch-sm {
989
+ --fs-switch-track-width: 32px;
990
+ --fs-switch-track-height: 18px;
991
+ --fs-switch-thumb-width: 14px;
992
+ --fs-switch-thumb-height: 14px;
993
+ --fs-switch-thumb-offset: 2px;
994
+ --fs-switch-on-offset: 16px;
995
+ --fs-switch-hover-shadow: 0 0 0 3px var(--fs-switch-hover-ring);
996
+ }
997
+ .fs-check-lg,
998
+ .fs-radio-lg,
999
+ .fs-switch-lg {
885
1000
  font-size: 1rem;
886
1001
  }
887
- .fs-switch-lg .fs-switch-label::before {
888
- width: 44px;
889
- height: 24px;
1002
+ .fs-check-lg {
1003
+ --fs-check-size: 22px;
1004
+ --fs-check-gap: 12px;
890
1005
  }
891
- .fs-switch-lg .fs-switch-label::after {
892
- width: 20px;
893
- height: 18px;
1006
+ .fs-radio-lg {
1007
+ --fs-radio-size: 22px;
1008
+ --fs-radio-dot-size: 10px;
1009
+ --fs-radio-gap: 12px;
894
1010
  }
895
- .fs-switch-lg .fs-switch-input:checked + .fs-switch-label::after {
896
- left: 22px;
1011
+ .fs-switch-lg {
1012
+ --fs-switch-track-width: 48px;
1013
+ --fs-switch-track-height: 28px;
1014
+ --fs-switch-thumb-width: 22px;
1015
+ --fs-switch-thumb-height: 22px;
1016
+ --fs-switch-thumb-offset: 3px;
1017
+ --fs-switch-on-offset: 23px;
1018
+ --fs-switch-hover-shadow: 0 0 0 5px var(--fs-switch-hover-ring);
897
1019
  }
898
- .fs-check-input:indeterminate + .fs-check-label::before {
899
- border: 2px dashed var(--fs-color-primary);
900
- background-color: var(--fs-color-surface);
1020
+ @media (prefers-reduced-motion: reduce) {
1021
+ .fs-check-label::before,
1022
+ .fs-check-label::after,
1023
+ .fs-radio-label::before,
1024
+ .fs-radio-label::after,
1025
+ .fs-switch-label::before,
1026
+ .fs-switch-label::after {
1027
+ transition-duration: 0ms;
1028
+ }
901
1029
  }
902
- .fs-check-input:indeterminate + .fs-check-label::after {
903
- left: 4px;
904
- width: 10px;
905
- height: 0;
906
- opacity: 1;
907
- border-bottom: 2px solid var(--fs-color-primary);
908
- border-left: 0;
909
- transform: translateY(3px) rotate(0deg);
910
- }
911
- .fs-check-sm .fs-check-input:indeterminate + .fs-check-label::after {
912
- left: 3px;
913
- width: 8px;
914
- }
915
- .fs-check-lg .fs-check-input:indeterminate + .fs-check-label::after {
916
- left: 5px;
917
- width: 12px;
918
- }
919
- .fs-check-input.is-invalid + .fs-check-label::before {
920
- background-color: var(--fs-color-danger);
921
- }
922
- .fs-check-input.is-invalid + .fs-check-label::after {
923
- top: 6px;
924
- left: 5px;
925
- width: 8px;
926
- height: 8px;
927
- opacity: 1;
928
- border: 0;
929
- background-image: linear-gradient(45deg, transparent 42%, #ffffff 42% 58%, transparent 58%), linear-gradient(-45deg, transparent 42%, #ffffff 42% 58%, transparent 58%);
930
- transform: none;
931
- }
932
- .fs-check-sm .fs-check-input.is-invalid + .fs-check-label::after {
933
- top: 5px;
934
- left: 4px;
935
- width: 7px;
936
- height: 7px;
937
- }
938
- .fs-check-lg .fs-check-input.is-invalid + .fs-check-label::after {
939
- top: 6px;
940
- left: 6px;
941
- width: 10px;
942
- height: 10px;
1030
+ @media (prefers-contrast: more) {
1031
+ .fs-check,
1032
+ .fs-radio,
1033
+ .fs-switch {
1034
+ --fs-border-width: 2px;
1035
+ --fs-focus-width: 3px;
1036
+ }
1037
+ }
1038
+ @media (forced-colors: active) {
1039
+ .fs-check-label::before,
1040
+ .fs-radio-label::before,
1041
+ .fs-switch-label::before,
1042
+ .fs-switch-label::after {
1043
+ border-color: ButtonText;
1044
+ forced-color-adjust: auto;
1045
+ }
1046
+ .fs-check-input:checked + .fs-check-label::before,
1047
+ .fs-radio-input:checked + .fs-radio-label::before,
1048
+ .fs-switch-input:checked + .fs-switch-label::before {
1049
+ background-color: Highlight;
1050
+ border-color: Highlight;
1051
+ }
1052
+ .fs-switch-label::after {
1053
+ background-color: ButtonFace;
1054
+ border-color: ButtonText;
1055
+ box-shadow: none;
1056
+ }
1057
+ .fs-switch-input:checked + .fs-switch-label::after {
1058
+ background-color: HighlightText;
1059
+ border-color: HighlightText;
1060
+ }
1061
+ .fs-check-input:focus-visible + .fs-check-label::before,
1062
+ .fs-radio-input:focus-visible + .fs-radio-label::before,
1063
+ .fs-switch-input:focus-visible + .fs-switch-label::before {
1064
+ outline: 3px solid Highlight;
1065
+ outline-offset: 2px;
1066
+ }
943
1067
  }
944
1068
  }
945
1069
  @layer components {