fokus-styles 2.3.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 (101) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/css/components.css +583 -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 +583 -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-core.css +22 -0
  11. package/dist/css/fokus-core.css.map +1 -1
  12. package/dist/css/fokus-core.min.css +1 -1
  13. package/dist/css/fokus-core.min.css.map +1 -1
  14. package/dist/css/fokus-dark.css +10 -0
  15. package/dist/css/fokus-dark.css.map +1 -1
  16. package/dist/css/fokus-dark.min.css +1 -1
  17. package/dist/css/fokus-dark.min.css.map +1 -1
  18. package/dist/css/fokus-rtl.css +9166 -0
  19. package/dist/css/fokus-rtl.css.map +1 -0
  20. package/dist/css/fokus-rtl.min.css +2 -0
  21. package/dist/css/fokus-rtl.min.css.map +1 -0
  22. package/dist/css/fokus-utilities.css +158 -0
  23. package/dist/css/fokus-utilities.css.map +1 -1
  24. package/dist/css/fokus-utilities.min.css +1 -1
  25. package/dist/css/fokus-utilities.min.css.map +1 -1
  26. package/dist/css/fokus.css +1018 -258
  27. package/dist/css/fokus.css.map +1 -1
  28. package/dist/css/fokus.min.css +1 -1
  29. package/dist/css/fokus.min.css.map +1 -1
  30. package/dist/css/forms.css +322 -176
  31. package/dist/css/forms.css.map +1 -1
  32. package/dist/css/forms.min.css +1 -1
  33. package/dist/css/forms.min.css.map +1 -1
  34. package/dist/css/helpers.css +158 -0
  35. package/dist/css/helpers.css.map +1 -1
  36. package/dist/css/helpers.min.css +1 -1
  37. package/dist/css/helpers.min.css.map +1 -1
  38. package/dist/css/layout.css +22 -0
  39. package/dist/css/layout.css.map +1 -1
  40. package/dist/css/layout.min.css +1 -1
  41. package/dist/css/layout.min.css.map +1 -1
  42. package/dist/js/fokus.js +270 -25
  43. package/dist/js/fokus.js.map +2 -2
  44. package/dist/js/fokus.min.js +18 -18
  45. package/dist/js/fokus.min.js.map +3 -3
  46. package/docs/components/alert.md +69 -24
  47. package/docs/components/badge.md +23 -4
  48. package/docs/components/checkbox.md +16 -3
  49. package/docs/components/popover.md +20 -7
  50. package/docs/components/radio.md +11 -1
  51. package/docs/components/responsive.md +19 -0
  52. package/docs/components/switch.md +30 -8
  53. package/docs/components/tag.md +19 -4
  54. package/docs/components/toast.md +72 -59
  55. package/docs/components/tooltip.md +38 -2
  56. package/docs/guides/accessibility.md +7 -0
  57. package/docs/guides/rtl-and-system-preferences.md +28 -0
  58. package/docs/prompts/prompt-plan.md +4 -4
  59. package/docs/reference/accessibility-matrix.md +7 -7
  60. package/docs/reference/contrast-report.md +4 -0
  61. package/docs/reference/definitions.md +5 -1
  62. package/docs/reference/design-tokens.md +14 -0
  63. package/docs/reference/size-baseline.json +13 -13
  64. package/mockup/assets/example-theme.css +11 -0
  65. package/mockup/assets/showcase-contracts.js +6 -6
  66. package/mockup/examples/alerts.html +105 -31
  67. package/mockup/examples/badges-alerts.html +91 -59
  68. package/mockup/examples/check-radio-switch.html +575 -99
  69. package/mockup/examples/popover.html +81 -0
  70. package/mockup/examples/tag.html +97 -87
  71. package/mockup/examples/toast.html +113 -0
  72. package/mockup/examples/tooltip.html +68 -0
  73. package/mockup/forms.html +1 -1
  74. package/mockup/overlays-commands.html +2 -2
  75. package/package.json +2 -1
  76. package/packages/fokus-components/scss/components/_alerts.scss +128 -6
  77. package/packages/fokus-components/scss/components/_badges.scss +26 -10
  78. package/packages/fokus-components/scss/components/_index.scss +1 -0
  79. package/packages/fokus-components/scss/components/_popover.scss +131 -21
  80. package/packages/fokus-components/scss/components/_responsive.scss +23 -0
  81. package/packages/fokus-components/scss/components/_tag.scss +37 -14
  82. package/packages/fokus-components/scss/components/_toasts.scss +156 -11
  83. package/packages/fokus-components/scss/components/_tooltips.scss +70 -18
  84. package/packages/fokus-components/scss/forms/_check-radio-switch.scss +313 -215
  85. package/packages/fokus-components/scss/forms/_forms.scss +16 -0
  86. package/packages/fokus-core/scss/base/_accessibility.scss +14 -0
  87. package/packages/fokus-core/scss/tokens/_root.scss +11 -0
  88. package/packages/fokus-js/js/carousel.d.ts +4 -0
  89. package/packages/fokus-js/js/carousel.js +8 -0
  90. package/packages/fokus-js/js/core/positioning.js +18 -9
  91. package/packages/fokus-js/js/dropdown.d.ts +4 -0
  92. package/packages/fokus-js/js/dropdown.js +7 -0
  93. package/packages/fokus-js/js/popover.js +26 -1
  94. package/packages/fokus-js/js/tabs.d.ts +3 -0
  95. package/packages/fokus-js/js/tabs.js +5 -0
  96. package/packages/fokus-js/js/tag.js +17 -0
  97. package/packages/fokus-js/js/toast.js +77 -3
  98. package/packages/fokus-js/js/tooltip.d.ts +8 -1
  99. package/packages/fokus-js/js/tooltip.js +106 -13
  100. package/packages/fokus-utilities/scss/utilities/_api.scss +48 -0
  101. package/scss/entries/rtl-entry.scss +11 -0
@@ -68,6 +68,8 @@
68
68
  --fs-component-overlay-backdrop: rgb(0 0 0 / 55%);
69
69
  --fs-component-panel-radius: var(--fs-radius-md);
70
70
  --fs-component-panel-shadow: var(--fs-shadow-lg);
71
+ --fs-contrast-border-width: var(--fs-border-width);
72
+ --fs-contrast-focus-width: var(--fs-focus-width);
71
73
  --fs-cq-sm: 320px;
72
74
  --fs-cq-md: 480px;
73
75
  --fs-cq-lg: 640px;
@@ -146,6 +148,14 @@
146
148
  --fs-feedback-info-bg: oklch(96.4918490239% 0.0173174767 286.0707018324deg);
147
149
  }
148
150
  }
151
+ @media (prefers-contrast: more) {
152
+ :root {
153
+ --fs-contrast-border-width: 2px;
154
+ --fs-contrast-focus-width: 3px;
155
+ --fs-focus-width: var(--fs-contrast-focus-width);
156
+ --fs-border-width: var(--fs-contrast-border-width);
157
+ }
158
+ }
149
159
  }
150
160
  @layer tokens {
151
161
  :root {
@@ -268,6 +278,18 @@
268
278
  outline: 2px solid CanvasText;
269
279
  outline-offset: 2px;
270
280
  }
281
+ button,
282
+ [role=button],
283
+ input,
284
+ select,
285
+ textarea,
286
+ .fs-btn {
287
+ border-color: ButtonText;
288
+ forced-color-adjust: auto;
289
+ }
290
+ .fs-u-focus-ring:focus-visible {
291
+ outline: 3px solid Highlight;
292
+ }
271
293
  }
272
294
  }
273
295
  @layer utilities {
@@ -585,46 +607,155 @@
585
607
  }
586
608
  @layer components {
587
609
  .fs-alert {
610
+ --fs-alert-padding-block: 12px;
611
+ --fs-alert-padding-inline: 16px;
612
+ --fs-alert-gap: 12px;
613
+ --fs-alert-radius: var(--fs-radius-md, 6px);
614
+ --fs-alert-border-width: 1px;
615
+ --fs-alert-accent-width: 4px;
616
+ --fs-alert-icon-size: 20px;
617
+ --fs-alert-heading-gap: 4px;
618
+ --fs-alert-actions-gap: 8px;
588
619
  display: flex;
589
620
  align-items: flex-start;
590
- gap: 8px;
591
- padding: 12px 16px;
592
- border: 1px solid var(--fs-color-border);
593
- border-left: 5px solid var(--fs-color-border);
594
- border-radius: 0;
621
+ gap: var(--fs-alert-gap);
622
+ min-inline-size: 0;
623
+ padding-block: var(--fs-alert-padding-block);
624
+ padding-inline: var(--fs-alert-padding-inline);
625
+ border: var(--fs-alert-border-width) solid var(--fs-color-border);
626
+ border-inline-start: var(--fs-alert-accent-width) solid var(--fs-color-border);
627
+ border-radius: var(--fs-alert-radius);
595
628
  color: var(--fs-color-text);
596
629
  background-color: var(--fs-color-surface-raised);
597
630
  font-size: 0.75rem;
598
631
  }
632
+ .fs-alert-inline {
633
+ --fs-alert-padding-block: 8px;
634
+ --fs-alert-padding-inline: 12px;
635
+ --fs-alert-gap: 8px;
636
+ --fs-alert-accent-width: 3px;
637
+ --fs-alert-icon-size: 16px;
638
+ }
639
+ .fs-alert-group {
640
+ display: grid;
641
+ gap: 12px;
642
+ min-inline-size: 0;
643
+ }
644
+ .fs-alert[aria-busy=true],
645
+ .fs-alert.is-loading {
646
+ cursor: progress;
647
+ }
648
+ .fs-alert[aria-busy=true] .fs-alert-actions,
649
+ .fs-alert.is-loading .fs-alert-actions {
650
+ opacity: 0.75;
651
+ }
652
+ .fs-alert .fs-spinner {
653
+ flex: 0 0 auto;
654
+ align-self: flex-start;
655
+ margin-block: 2px;
656
+ }
657
+ .fs-alert-icon {
658
+ display: inline-flex;
659
+ flex: 0 0 var(--fs-alert-icon-size);
660
+ align-items: center;
661
+ justify-content: center;
662
+ inline-size: var(--fs-alert-icon-size);
663
+ block-size: var(--fs-alert-icon-size);
664
+ color: currentcolor;
665
+ }
666
+ .fs-alert-icon .fs-icon,
667
+ .fs-alert-icon > svg {
668
+ inline-size: 100%;
669
+ block-size: 100%;
670
+ }
671
+ .fs-alert-content {
672
+ flex: 1 1 auto;
673
+ min-inline-size: 0;
674
+ }
675
+ .fs-alert-heading {
676
+ margin: 0 0 var(--fs-alert-heading-gap);
677
+ color: inherit;
678
+ font-size: inherit;
679
+ font-weight: 600;
680
+ line-height: 1.35;
681
+ }
682
+ .fs-alert-text {
683
+ margin: 0;
684
+ line-height: 1.5;
685
+ }
686
+ .fs-alert-actions {
687
+ display: flex;
688
+ flex-wrap: wrap;
689
+ gap: var(--fs-alert-actions-gap);
690
+ align-items: center;
691
+ margin-block-start: var(--fs-alert-actions-gap);
692
+ }
693
+ .fs-alert-link {
694
+ color: inherit;
695
+ font-weight: 500;
696
+ text-decoration: underline;
697
+ text-underline-offset: 2px;
698
+ }
699
+ .fs-alert-close {
700
+ flex: 0 0 auto;
701
+ margin-inline-start: auto;
702
+ color: inherit;
703
+ }
599
704
  .fs-alert-primary {
600
705
  color: var(--fs-alert-primary-text);
601
706
  background-color: var(--fs-alert-primary-bg);
602
- border-color: var(--fs-color-primary);
707
+ border-color: var(--fs-color-border);
708
+ border-inline-start-color: var(--fs-color-primary);
603
709
  }
604
710
  .fs-alert-secondary {
605
711
  color: var(--fs-alert-secondary-text);
606
712
  background-color: var(--fs-alert-secondary-bg);
607
- border-color: var(--fs-color-secondary);
713
+ border-color: var(--fs-color-border);
714
+ border-inline-start-color: var(--fs-color-secondary);
608
715
  }
609
716
  .fs-alert-success {
610
717
  color: var(--fs-alert-success-text);
611
718
  background-color: var(--fs-alert-success-bg);
612
- border-color: var(--fs-color-success);
719
+ border-color: var(--fs-color-border);
720
+ border-inline-start-color: var(--fs-color-success);
613
721
  }
614
722
  .fs-alert-warning {
615
723
  color: var(--fs-alert-warning-text);
616
724
  background-color: var(--fs-alert-warning-bg);
617
- border-color: var(--fs-color-warning);
725
+ border-color: var(--fs-color-border);
726
+ border-inline-start-color: var(--fs-color-warning);
618
727
  }
619
728
  .fs-alert-danger {
620
729
  color: var(--fs-alert-danger-text);
621
730
  background-color: var(--fs-alert-danger-bg);
622
- border-color: var(--fs-color-danger);
731
+ border-color: var(--fs-color-border);
732
+ border-inline-start-color: var(--fs-color-danger);
623
733
  }
624
734
  .fs-alert-info {
625
735
  color: var(--fs-alert-info-text);
626
736
  background-color: var(--fs-alert-info-bg);
627
- border-color: var(--fs-color-info);
737
+ border-color: var(--fs-color-border);
738
+ border-inline-start-color: var(--fs-color-info);
739
+ }
740
+ @media (width <= 480px) {
741
+ .fs-alert {
742
+ --fs-alert-padding-inline: 12px;
743
+ }
744
+ .fs-alert-actions {
745
+ align-items: flex-start;
746
+ }
747
+ }
748
+ @media (forced-colors: active) {
749
+ .fs-alert {
750
+ border-color: CanvasText;
751
+ border-inline-start-color: Highlight;
752
+ color: CanvasText;
753
+ background-color: Canvas;
754
+ }
755
+ .fs-alert-link,
756
+ .fs-alert .fs-btn {
757
+ forced-color-adjust: none;
758
+ }
628
759
  }
629
760
  }
630
761
  @layer components {
@@ -633,13 +764,16 @@
633
764
  --fs-badge-bg: var(--fs-color-subtle);
634
765
  --fs-badge-border: transparent;
635
766
  --fs-badge-height: 22px;
636
- --fs-badge-radius: 0;
767
+ --fs-badge-radius: var(--fs-radius-sm);
768
+ --fs-badge-padding-inline: 8px;
769
+ --fs-badge-padding-block-start: 2px;
770
+ --fs-badge-padding-block-end: 2px;
637
771
  display: inline-flex;
638
772
  align-items: center;
639
773
  gap: 6px;
640
774
  justify-content: center;
641
775
  min-height: var(--fs-badge-height);
642
- padding: 1px 8px 3px;
776
+ padding: var(--fs-badge-padding-block-start) var(--fs-badge-padding-inline) var(--fs-badge-padding-block-end);
643
777
  border: 1px solid var(--fs-badge-border);
644
778
  border-radius: var(--fs-badge-radius);
645
779
  color: var(--fs-badge-color);
@@ -736,12 +870,16 @@
736
870
  }
737
871
  .fs-badge-sm {
738
872
  --fs-badge-height: 18px;
739
- padding: 0 6px 2px;
873
+ --fs-badge-padding-inline: 6px;
874
+ --fs-badge-padding-block-start: 1px;
875
+ --fs-badge-padding-block-end: 1px;
740
876
  font-size: 0.6875rem;
741
877
  }
742
878
  .fs-badge-lg {
743
879
  --fs-badge-height: 26px;
744
- padding: 2px 10px 4px;
880
+ --fs-badge-padding-inline: 10px;
881
+ --fs-badge-padding-block-start: 3px;
882
+ --fs-badge-padding-block-end: 3px;
745
883
  font-size: 0.8125rem;
746
884
  }
747
885
  .fs-badge-dot::before {
@@ -758,13 +896,19 @@
758
896
  padding-inline: 6px;
759
897
  font-variant-numeric: tabular-nums;
760
898
  }
899
+ .fs-badge-count-circle {
900
+ aspect-ratio: 1;
901
+ min-width: var(--fs-badge-height);
902
+ padding-inline: 0;
903
+ border-radius: 50%;
904
+ }
761
905
  .fs-badge-split {
762
906
  --fs-badge-split-label-bg: var(--fs-color-black);
763
907
  --fs-badge-split-label-color: var(--fs-color-white);
764
908
  --fs-badge-split-value-bg: var(--fs-color-primary);
765
909
  --fs-badge-split-value-color: #ffffff;
766
910
  --fs-badge-split-height: 22px;
767
- --fs-badge-split-radius: 0;
911
+ --fs-badge-split-radius: var(--fs-radius-sm);
768
912
  display: inline-flex;
769
913
  min-height: var(--fs-badge-split-height);
770
914
  overflow: hidden;
@@ -780,7 +924,8 @@
780
924
  display: inline-flex;
781
925
  align-items: center;
782
926
  min-height: var(--fs-badge-split-height);
783
- padding: 1px 8px 3px;
927
+ padding-block: 2px;
928
+ padding-inline: 8px;
784
929
  }
785
930
  .fs-badge-split-label {
786
931
  color: var(--fs-badge-split-label-color);
@@ -828,11 +973,13 @@
828
973
  }
829
974
  .fs-badge-split.fs-badge-sm .fs-badge-split-label,
830
975
  .fs-badge-split.fs-badge-sm .fs-badge-split-value {
831
- padding: 0 6px 2px;
976
+ padding-block: 1px;
977
+ padding-inline: 6px;
832
978
  }
833
979
  .fs-badge-split.fs-badge-lg .fs-badge-split-label,
834
980
  .fs-badge-split.fs-badge-lg .fs-badge-split-value {
835
- padding: 2px 10px 4px;
981
+ padding-block: 3px;
982
+ padding-inline: 10px;
836
983
  }
837
984
  }
838
985
  @layer components {
@@ -1580,8 +1727,17 @@
1580
1727
  }
1581
1728
  @layer components {
1582
1729
  .fs-tag {
1730
+ --fs-tag-icon-size: var(--fs-tag-close-size);
1731
+ --fs-tag-icon-glyph-size: 12px;
1732
+ --fs-tag-icon-gap: 4px;
1733
+ --fs-tag-icon-color: currentcolor;
1734
+ --fs-tag-close-size: calc(var(--fs-badge-height) - 2px);
1735
+ --fs-tag-close-gap: 4px;
1736
+ --fs-tag-padding-inline-start: 8px;
1737
+ --fs-tag-padding-inline-end: 2px;
1583
1738
  gap: 0;
1584
- padding: 0 0 0 8px;
1739
+ padding-inline-start: var(--fs-tag-padding-inline-start);
1740
+ padding-inline-end: var(--fs-tag-padding-inline-end);
1585
1741
  }
1586
1742
  .fs-tag-label {
1587
1743
  min-width: 0;
@@ -1596,23 +1752,29 @@
1596
1752
  }
1597
1753
  .fs-tag-icon {
1598
1754
  display: inline-grid;
1599
- width: 12px;
1600
- height: 12px;
1601
- flex: 0 0 12px;
1602
- margin-right: 4px;
1755
+ width: var(--fs-tag-icon-size);
1756
+ height: var(--fs-tag-icon-size);
1757
+ flex: 0 0 var(--fs-tag-icon-size);
1603
1758
  place-items: center;
1759
+ color: var(--fs-tag-icon-color);
1760
+ margin-inline-end: var(--fs-tag-icon-gap);
1761
+ }
1762
+ .fs-tag-icon-end {
1763
+ margin-inline-start: auto;
1764
+ margin-inline-end: var(--fs-tag-icon-gap);
1604
1765
  }
1605
1766
  .fs-tag-icon .fs-icon {
1606
- width: 12px;
1607
- height: 12px;
1767
+ display: block;
1768
+ width: var(--fs-tag-icon-glyph-size);
1769
+ height: var(--fs-tag-icon-glyph-size);
1608
1770
  stroke: currentcolor;
1609
1771
  }
1610
1772
  .fs-tag .fs-btn-close {
1611
- width: calc(var(--fs-badge-height) - 2px);
1612
- height: calc(var(--fs-badge-height) - 2px);
1613
- flex: 0 0 calc(var(--fs-badge-height) - 2px);
1614
- margin-left: 4px;
1615
- border-radius: 0;
1773
+ width: var(--fs-tag-close-size);
1774
+ height: var(--fs-tag-close-size);
1775
+ flex: 0 0 var(--fs-tag-close-size);
1776
+ margin-inline-start: var(--fs-tag-close-gap);
1777
+ border-radius: var(--fs-badge-radius);
1616
1778
  background-color: transparent;
1617
1779
  color: inherit;
1618
1780
  opacity: 0.7;
@@ -1620,7 +1782,7 @@
1620
1782
  }
1621
1783
  .fs-tag .fs-btn-close::before,
1622
1784
  .fs-tag .fs-btn-close::after {
1623
- top: calc(50% + 1px);
1785
+ top: 50%;
1624
1786
  width: 8px;
1625
1787
  }
1626
1788
  .fs-tag .fs-btn-close:hover {
@@ -1683,6 +1845,9 @@
1683
1845
  .fs-tag-group .fs-tag:focus-within {
1684
1846
  background-color: color-mix(in srgb, currentcolor 18%, transparent);
1685
1847
  }
1848
+ .fs-tag:has(> .fs-tag-icon:not(.fs-tag-icon-end)) {
1849
+ --fs-tag-padding-inline-start: 2px;
1850
+ }
1686
1851
  .fs-tag-overflow {
1687
1852
  --fs-badge-bg: transparent;
1688
1853
  --fs-badge-color: var(--fs-alert-primary-text);
@@ -1733,7 +1898,7 @@
1733
1898
  display: inline-grid;
1734
1899
  width: calc(var(--fs-badge-height) - 2px);
1735
1900
  height: calc(var(--fs-badge-height) - 2px);
1736
- margin-left: 4px;
1901
+ margin-inline-start: var(--fs-tag-close-gap);
1737
1902
  place-items: center;
1738
1903
  }
1739
1904
  .fs-tag-lock svg {
@@ -1994,118 +2159,229 @@
1994
2159
  }
1995
2160
  @layer components {
1996
2161
  .fs-tooltip {
2162
+ --fs-tooltip-max-width: 240px;
2163
+ --fs-tooltip-padding-block: 6px;
2164
+ --fs-tooltip-padding-inline: 10px;
2165
+ --fs-tooltip-radius: var(--fs-radius-sm);
2166
+ --fs-tooltip-offset: 8px;
2167
+ --fs-tooltip-shadow: var(--fs-shadow-sm, 0 2px 8px rgb(0 0 0 / 18%));
2168
+ --fs-tooltip-arrow-size: 8px;
2169
+ --fs-tooltip-transition-duration: 120ms;
1997
2170
  position: absolute;
1998
2171
  z-index: var(--fs-z-tooltip);
1999
2172
  display: none;
2000
- max-width: 220px;
2173
+ max-inline-size: min(var(--fs-tooltip-max-width), 100vw - 16px);
2174
+ min-inline-size: 0;
2175
+ overflow-wrap: anywhere;
2001
2176
  }
2002
2177
  .fs-tooltip.is-open {
2003
2178
  display: block;
2179
+ pointer-events: none;
2180
+ animation: fs-tooltip-in var(--fs-tooltip-transition-duration) ease-out;
2004
2181
  }
2005
2182
  .fs-tooltip-inner {
2006
- padding: 6px 10px;
2007
- border-radius: var(--fs-radius-sm);
2183
+ padding-block: var(--fs-tooltip-padding-block);
2184
+ padding-inline: var(--fs-tooltip-padding-inline);
2185
+ border: 1px solid transparent;
2186
+ border-radius: var(--fs-tooltip-radius);
2008
2187
  color: var(--fs-tooltip-text);
2009
2188
  background-color: var(--fs-tooltip-bg);
2189
+ box-shadow: var(--fs-tooltip-shadow);
2010
2190
  font-size: 0.6875rem;
2011
- text-align: center;
2191
+ line-height: 1.4;
2192
+ text-align: start;
2012
2193
  }
2013
2194
  .fs-tooltip-arrow {
2014
2195
  position: absolute;
2015
- width: 8px;
2016
- height: 8px;
2196
+ inline-size: var(--fs-tooltip-arrow-size);
2197
+ block-size: var(--fs-tooltip-arrow-size);
2017
2198
  background-color: var(--fs-tooltip-bg);
2018
2199
  transform: rotate(45deg);
2019
2200
  }
2020
2201
  .fs-tooltip[data-placement=top] .fs-tooltip-arrow {
2021
- bottom: -4px;
2022
- left: 50%;
2023
- margin-left: -4px;
2202
+ inset-block-end: -4px;
2203
+ inset-inline-start: var(--fs-tooltip-arrow-offset, 50%);
2204
+ margin-inline-start: -4px;
2024
2205
  }
2025
2206
  .fs-tooltip[data-placement=bottom] .fs-tooltip-arrow {
2026
- top: -4px;
2027
- left: 50%;
2028
- margin-left: -4px;
2207
+ inset-block-start: -4px;
2208
+ inset-inline-start: var(--fs-tooltip-arrow-offset, 50%);
2209
+ margin-inline-start: -4px;
2029
2210
  }
2030
2211
  .fs-tooltip[data-placement=left] .fs-tooltip-arrow {
2031
- top: 50%;
2032
- right: -4px;
2033
- margin-top: -4px;
2212
+ inset-block-start: var(--fs-tooltip-arrow-offset, 50%);
2213
+ inset-inline-end: -4px;
2214
+ margin-block-start: -4px;
2034
2215
  }
2035
2216
  .fs-tooltip[data-placement=right] .fs-tooltip-arrow {
2036
- top: 50%;
2037
- left: -4px;
2038
- margin-top: -4px;
2217
+ inset-block-start: var(--fs-tooltip-arrow-offset, 50%);
2218
+ inset-inline-start: -4px;
2219
+ margin-block-start: -4px;
2220
+ }
2221
+ @media (prefers-reduced-motion: reduce) {
2222
+ .fs-tooltip {
2223
+ animation: none;
2224
+ }
2225
+ }
2226
+ @media (forced-colors: active) {
2227
+ .fs-tooltip-inner,
2228
+ .fs-tooltip-arrow {
2229
+ color: CanvasText;
2230
+ background-color: Canvas;
2231
+ border-color: CanvasText;
2232
+ box-shadow: none;
2233
+ }
2234
+ }
2235
+ @media (prefers-contrast: more) {
2236
+ .fs-tooltip-inner {
2237
+ border-color: currentcolor;
2238
+ box-shadow: none;
2239
+ }
2240
+ }
2241
+ @keyframes fs-tooltip-in {
2242
+ from {
2243
+ opacity: 0;
2244
+ transform: translateY(2px);
2245
+ }
2246
+ to {
2247
+ opacity: 1;
2248
+ transform: translateY(0);
2249
+ }
2039
2250
  }
2040
2251
  }
2041
2252
  @layer components {
2042
2253
  .fs-popover {
2254
+ --fs-popover-width: 320px;
2255
+ --fs-popover-max-width: min(var(--fs-popover-width), calc(100vw - 32px));
2256
+ --fs-popover-padding-block: 12px;
2257
+ --fs-popover-padding-inline: 14px;
2258
+ --fs-popover-gap: 10px;
2259
+ --fs-popover-radius: var(--fs-radius-md, 6px);
2260
+ --fs-popover-shadow: var(--fs-shadow-md);
2261
+ --fs-popover-icon-size: 20px;
2262
+ --fs-popover-heading-gap: 4px;
2263
+ --fs-popover-footer-gap: 8px;
2264
+ --fs-popover-arrow-size: 8px;
2265
+ --fs-popover-border-width: 1px;
2043
2266
  position: absolute;
2044
2267
  z-index: var(--fs-z-offcanvas);
2045
2268
  display: none;
2046
- max-width: 280px;
2269
+ inline-size: var(--fs-popover-width);
2270
+ max-inline-size: var(--fs-popover-max-width);
2271
+ min-inline-size: 0;
2047
2272
  color: var(--fs-color-text);
2048
2273
  background-color: var(--fs-color-surface);
2049
- border: 1px solid var(--fs-color-border);
2050
- border-radius: var(--fs-radius-md);
2051
- box-shadow: var(--fs-shadow-md);
2274
+ border: var(--fs-popover-border-width) solid var(--fs-color-border);
2275
+ border-radius: var(--fs-popover-radius);
2276
+ box-shadow: var(--fs-popover-shadow);
2277
+ overflow-wrap: anywhere;
2052
2278
  }
2053
2279
  .fs-popover.is-open {
2054
2280
  display: block;
2055
2281
  }
2056
2282
  .fs-popover-header {
2057
- padding: 10px 14px;
2283
+ display: flex;
2284
+ align-items: center;
2285
+ gap: var(--fs-popover-gap);
2286
+ min-inline-size: 0;
2287
+ padding-block: var(--fs-popover-padding-block);
2288
+ padding-inline: var(--fs-popover-padding-inline);
2058
2289
  background-color: var(--fs-color-subtle);
2059
2290
  border-bottom: 1px solid var(--fs-color-border);
2060
- border-radius: var(--fs-radius-md) var(--fs-radius-md) 0 0;
2291
+ border-radius: var(--fs-popover-radius) var(--fs-popover-radius) 0 0;
2061
2292
  font-size: 0.75rem;
2062
2293
  font-weight: 500;
2063
2294
  }
2064
2295
  .fs-popover-body {
2065
- padding: 14px;
2296
+ min-inline-size: 0;
2297
+ padding-block: var(--fs-popover-padding-block);
2298
+ padding-inline: var(--fs-popover-padding-inline);
2066
2299
  font-size: 0.75rem;
2300
+ line-height: 1.5;
2301
+ }
2302
+ .fs-popover-icon {
2303
+ display: inline-flex;
2304
+ flex: 0 0 var(--fs-popover-icon-size);
2305
+ align-items: center;
2306
+ justify-content: center;
2307
+ inline-size: var(--fs-popover-icon-size);
2308
+ block-size: var(--fs-popover-icon-size);
2309
+ color: currentcolor;
2310
+ }
2311
+ .fs-popover-icon .fs-icon,
2312
+ .fs-popover-icon > svg {
2313
+ inline-size: 100%;
2314
+ block-size: 100%;
2315
+ }
2316
+ .fs-popover-heading {
2317
+ display: flex;
2318
+ flex: 1 1 auto;
2319
+ flex-wrap: wrap;
2320
+ align-items: baseline;
2321
+ gap: var(--fs-popover-heading-gap);
2322
+ min-inline-size: 0;
2323
+ }
2324
+ .fs-popover-title,
2325
+ .fs-popover-meta,
2326
+ .fs-popover-text {
2327
+ min-inline-size: 0;
2328
+ }
2329
+ .fs-popover-meta {
2330
+ color: var(--fs-color-muted);
2331
+ font-size: 0.6875rem;
2332
+ font-weight: 400;
2333
+ }
2334
+ .fs-popover-text {
2335
+ margin: 0;
2336
+ }
2337
+ .fs-popover-close {
2338
+ flex: 0 0 auto;
2339
+ margin-inline-start: auto;
2340
+ color: inherit;
2067
2341
  }
2068
2342
  .fs-popover-footer {
2069
2343
  display: flex;
2070
2344
  align-items: center;
2071
2345
  justify-content: flex-end;
2072
- gap: 8px;
2073
- padding: 10px 14px;
2346
+ flex-wrap: wrap;
2347
+ gap: var(--fs-popover-footer-gap);
2348
+ padding-block: var(--fs-popover-padding-block);
2349
+ padding-inline: var(--fs-popover-padding-inline);
2074
2350
  border-top: 1px solid var(--fs-color-border);
2075
2351
  }
2076
2352
  .fs-popover-arrow {
2077
2353
  position: absolute;
2078
- width: 8px;
2079
- height: 8px;
2354
+ inline-size: var(--fs-popover-arrow-size);
2355
+ block-size: var(--fs-popover-arrow-size);
2080
2356
  background-color: var(--fs-color-surface);
2081
2357
  border: 1px solid var(--fs-color-border);
2082
2358
  transform: rotate(45deg);
2083
2359
  }
2084
2360
  .fs-popover[data-placement=top] .fs-popover-arrow {
2085
2361
  bottom: -5px;
2086
- left: 50%;
2087
- margin-left: -4px;
2362
+ inset-inline-start: var(--fs-popover-arrow-offset, 50%);
2363
+ margin-inline-start: calc(var(--fs-popover-arrow-size) / -2);
2088
2364
  border-top: 0;
2089
2365
  border-left: 0;
2090
2366
  }
2091
2367
  .fs-popover[data-placement=bottom] .fs-popover-arrow {
2092
2368
  top: -5px;
2093
- left: 50%;
2094
- margin-left: -4px;
2369
+ inset-inline-start: var(--fs-popover-arrow-offset, 50%);
2370
+ margin-inline-start: calc(var(--fs-popover-arrow-size) / -2);
2095
2371
  border-right: 0;
2096
2372
  border-bottom: 0;
2097
2373
  }
2098
2374
  .fs-popover[data-placement=left] .fs-popover-arrow {
2099
- top: 50%;
2100
- right: -5px;
2101
- margin-top: -4px;
2375
+ inset-block-start: var(--fs-popover-arrow-offset, 50%);
2376
+ inset-inline-end: calc(var(--fs-popover-arrow-size) / -2 - 1px);
2377
+ margin-block-start: calc(var(--fs-popover-arrow-size) / -2);
2102
2378
  border-bottom: 0;
2103
2379
  border-left: 0;
2104
2380
  }
2105
2381
  .fs-popover[data-placement=right] .fs-popover-arrow {
2106
- top: 50%;
2107
- left: -5px;
2108
- margin-top: -4px;
2382
+ inset-block-start: var(--fs-popover-arrow-offset, 50%);
2383
+ inset-inline-start: calc(var(--fs-popover-arrow-size) / -2 - 1px);
2384
+ margin-block-start: calc(var(--fs-popover-arrow-size) / -2);
2109
2385
  border-top: 0;
2110
2386
  border-right: 0;
2111
2387
  }
@@ -2116,66 +2392,237 @@
2116
2392
  display: flex;
2117
2393
  gap: 12px;
2118
2394
  }
2395
+ .fs-popover[aria-busy=true] {
2396
+ cursor: progress;
2397
+ }
2398
+ @media (width <= 480px) {
2399
+ .fs-popover {
2400
+ --fs-popover-padding-inline: 12px;
2401
+ --fs-popover-max-width: calc(100vw - 24px);
2402
+ }
2403
+ .fs-popover-footer {
2404
+ align-items: flex-start;
2405
+ }
2406
+ }
2407
+ @media (prefers-reduced-motion: reduce) {
2408
+ .fs-popover {
2409
+ transition: none;
2410
+ }
2411
+ }
2412
+ @media (forced-colors: active) {
2413
+ .fs-popover,
2414
+ .fs-popover-arrow {
2415
+ border-color: CanvasText;
2416
+ color: CanvasText;
2417
+ background-color: Canvas;
2418
+ box-shadow: none;
2419
+ }
2420
+ .fs-popover-header,
2421
+ .fs-popover-footer {
2422
+ border-color: CanvasText;
2423
+ background-color: Canvas;
2424
+ }
2425
+ }
2119
2426
  }
2120
2427
  @layer components {
2121
2428
  .fs-toast-container {
2429
+ --fs-toast-offset: 16px;
2430
+ --fs-toast-gap: 8px;
2431
+ --fs-toast-width: 360px;
2432
+ --fs-toast-max-width: calc(100vw - 32px);
2122
2433
  position: fixed;
2123
- right: 16px;
2124
- bottom: 16px;
2434
+ inset-inline-end: calc(var(--fs-toast-offset) + env(safe-area-inset-inline-end, 0px));
2435
+ inset-block-end: calc(var(--fs-toast-offset) + env(safe-area-inset-bottom, 0px));
2125
2436
  z-index: var(--fs-z-toast);
2126
2437
  display: flex;
2127
2438
  flex-direction: column;
2128
- gap: 8px;
2129
- width: min(360px, 100%);
2130
- max-width: calc(100vw - 2 * var(--fs-space-3));
2439
+ gap: var(--fs-toast-gap);
2440
+ inline-size: min(var(--fs-toast-width), 100%);
2441
+ max-inline-size: var(--fs-toast-max-width);
2131
2442
  }
2132
2443
  .fs-toast {
2444
+ --fs-toast-padding-block: 12px;
2445
+ --fs-toast-padding-inline: 14px;
2446
+ --fs-toast-gap: 10px;
2447
+ --fs-toast-radius: var(--fs-radius-md, 6px);
2448
+ --fs-toast-shadow: var(--fs-shadow-md);
2449
+ --fs-toast-icon-size: 20px;
2450
+ --fs-toast-title-gap: 4px;
2451
+ --fs-toast-actions-gap: 8px;
2452
+ --fs-toast-border-width: 1px;
2453
+ --fs-toast-progress-height: 3px;
2133
2454
  display: flex;
2134
2455
  overflow: hidden;
2135
2456
  flex-direction: column;
2136
- border: 1px solid var(--fs-color-border);
2137
- border-radius: var(--fs-radius-md);
2457
+ min-inline-size: 0;
2458
+ border: var(--fs-toast-border-width) solid var(--fs-color-border);
2459
+ border-inline-start: 4px solid var(--fs-color-border);
2460
+ border-radius: var(--fs-toast-radius);
2138
2461
  color: var(--fs-color-text);
2139
2462
  background-color: var(--fs-color-surface);
2140
- box-shadow: var(--fs-shadow-md);
2463
+ box-shadow: var(--fs-toast-shadow);
2464
+ overflow-wrap: anywhere;
2141
2465
  }
2142
2466
  .fs-toast-header {
2143
2467
  display: flex;
2144
2468
  align-items: center;
2145
- justify-content: space-between;
2146
- padding: 10px 12px;
2469
+ gap: var(--fs-toast-gap);
2470
+ min-inline-size: 0;
2471
+ padding-block: var(--fs-toast-padding-block);
2472
+ padding-inline: var(--fs-toast-padding-inline);
2147
2473
  border-bottom: 1px solid var(--fs-color-border);
2148
2474
  font-size: 0.75rem;
2149
2475
  font-weight: 500;
2150
2476
  }
2477
+ .fs-toast-icon {
2478
+ display: inline-flex;
2479
+ flex: 0 0 var(--fs-toast-icon-size);
2480
+ align-items: center;
2481
+ justify-content: center;
2482
+ inline-size: var(--fs-toast-icon-size);
2483
+ block-size: var(--fs-toast-icon-size);
2484
+ color: currentcolor;
2485
+ }
2486
+ .fs-toast-icon .fs-icon,
2487
+ .fs-toast-icon > svg {
2488
+ inline-size: 100%;
2489
+ block-size: 100%;
2490
+ }
2491
+ .fs-toast-heading {
2492
+ display: flex;
2493
+ flex: 1 1 auto;
2494
+ flex-wrap: wrap;
2495
+ align-items: baseline;
2496
+ gap: var(--fs-toast-title-gap);
2497
+ min-inline-size: 0;
2498
+ }
2499
+ .fs-toast-title,
2500
+ .fs-toast-meta {
2501
+ min-inline-size: 0;
2502
+ }
2503
+ .fs-toast-meta {
2504
+ color: var(--fs-color-muted);
2505
+ font-size: 0.6875rem;
2506
+ font-weight: 400;
2507
+ }
2508
+ .fs-toast-close {
2509
+ flex: 0 0 auto;
2510
+ margin-inline-start: auto;
2511
+ color: inherit;
2512
+ }
2151
2513
  .fs-toast-body {
2152
- padding: 12px;
2514
+ min-inline-size: 0;
2515
+ padding-block: var(--fs-toast-padding-block);
2516
+ padding-inline: var(--fs-toast-padding-inline);
2153
2517
  font-size: 0.75rem;
2518
+ line-height: 1.5;
2519
+ }
2520
+ .fs-toast-actions {
2521
+ display: flex;
2522
+ flex-wrap: wrap;
2523
+ gap: var(--fs-toast-actions-gap);
2524
+ align-items: center;
2525
+ padding-block: 0 var(--fs-toast-padding-block);
2526
+ padding-inline: var(--fs-toast-padding-inline);
2527
+ }
2528
+ .fs-toast-link {
2529
+ color: inherit;
2530
+ font-weight: 500;
2531
+ text-decoration: underline;
2532
+ text-underline-offset: 2px;
2533
+ }
2534
+ .fs-toast-progress {
2535
+ display: none;
2536
+ align-self: stretch;
2537
+ margin-inline-start: auto;
2538
+ inline-size: 100%;
2539
+ block-size: var(--fs-toast-progress-height);
2540
+ background-color: currentcolor;
2541
+ opacity: 0.5;
2542
+ }
2543
+ .fs-toast.is-progressing[data-toast-progress=true]:not([data-autohide=false]) .fs-toast-progress {
2544
+ display: block;
2545
+ inline-size: 100%;
2546
+ transition: inline-size 50ms linear;
2547
+ }
2548
+ .fs-toast.is-paused .fs-toast-progress,
2549
+ .fs-toast.is-progressing[data-toast-progress=true]:not([data-autohide=false]):hover .fs-toast-progress {
2550
+ animation-play-state: paused;
2154
2551
  }
2155
2552
  .fs-toast-primary .fs-toast-header {
2156
2553
  color: var(--fs-alert-primary-text);
2157
2554
  background-color: var(--fs-alert-primary-bg);
2158
2555
  }
2556
+ .fs-toast-primary {
2557
+ border-inline-start-color: var(--fs-color-primary);
2558
+ }
2159
2559
  .fs-toast-secondary .fs-toast-header {
2160
2560
  color: var(--fs-alert-secondary-text);
2161
2561
  background-color: var(--fs-alert-secondary-bg);
2162
2562
  }
2563
+ .fs-toast-secondary {
2564
+ border-inline-start-color: var(--fs-color-secondary);
2565
+ }
2163
2566
  .fs-toast-success .fs-toast-header {
2164
2567
  color: var(--fs-alert-success-text);
2165
2568
  background-color: var(--fs-alert-success-bg);
2166
2569
  }
2570
+ .fs-toast-success {
2571
+ border-inline-start-color: var(--fs-color-success);
2572
+ }
2167
2573
  .fs-toast-warning .fs-toast-header {
2168
2574
  color: var(--fs-alert-warning-text);
2169
2575
  background-color: var(--fs-alert-warning-bg);
2170
2576
  }
2577
+ .fs-toast-warning {
2578
+ border-inline-start-color: var(--fs-color-warning);
2579
+ }
2171
2580
  .fs-toast-danger .fs-toast-header {
2172
2581
  color: var(--fs-alert-danger-text);
2173
2582
  background-color: var(--fs-alert-danger-bg);
2174
2583
  }
2584
+ .fs-toast-danger {
2585
+ border-inline-start-color: var(--fs-color-danger);
2586
+ }
2175
2587
  .fs-toast-info .fs-toast-header {
2176
2588
  color: var(--fs-alert-info-text);
2177
2589
  background-color: var(--fs-alert-info-bg);
2178
2590
  }
2591
+ .fs-toast-info {
2592
+ border-inline-start-color: var(--fs-color-info);
2593
+ }
2594
+ @media (width <= 480px) {
2595
+ .fs-toast-container {
2596
+ --fs-toast-offset: 12px;
2597
+ --fs-toast-max-width: calc(100vw - 24px);
2598
+ }
2599
+ .fs-toast-actions {
2600
+ align-items: flex-start;
2601
+ }
2602
+ }
2603
+ @media (prefers-reduced-motion: reduce) {
2604
+ .fs-toast.is-progressing[data-toast-progress=true]:not([data-autohide=false]) .fs-toast-progress {
2605
+ animation: none;
2606
+ inline-size: 100%;
2607
+ transition: none;
2608
+ }
2609
+ }
2610
+ @media (forced-colors: active) {
2611
+ .fs-toast {
2612
+ border-color: CanvasText;
2613
+ border-inline-start-color: Highlight;
2614
+ color: CanvasText;
2615
+ background-color: Canvas;
2616
+ box-shadow: none;
2617
+ }
2618
+ .fs-toast-header {
2619
+ border-color: CanvasText;
2620
+ background-color: Canvas;
2621
+ }
2622
+ .fs-toast-progress {
2623
+ background-color: Highlight;
2624
+ }
2625
+ }
2179
2626
  }
2180
2627
  @layer components {
2181
2628
  .fs-pagination {
@@ -3826,6 +4273,59 @@
3826
4273
  inset-block-start: var(--fs-space-4);
3827
4274
  }
3828
4275
  }
4276
+ /* stylelint-disable declaration-block-single-line-max-declarations */
4277
+ @layer components {
4278
+ .fs-stack {
4279
+ display: flex;
4280
+ flex-direction: column;
4281
+ gap: var(--fs-stack-gap, var(--fs-space-3));
4282
+ }
4283
+ .fs-cluster {
4284
+ display: flex;
4285
+ flex-wrap: wrap;
4286
+ align-items: center;
4287
+ gap: var(--fs-cluster-gap, var(--fs-space-2));
4288
+ }
4289
+ .fs-responsive-media {
4290
+ width: 100%;
4291
+ height: auto;
4292
+ object-fit: cover;
4293
+ }
4294
+ @media (width <= 639.98px) {
4295
+ .fs-modal-dialog, .fs-offcanvas {
4296
+ max-width: 100%;
4297
+ margin-inline: 0;
4298
+ border-radius: 0;
4299
+ }
4300
+ .fs-table-responsive {
4301
+ overflow-x: auto;
4302
+ -webkit-overflow-scrolling: touch;
4303
+ }
4304
+ .fs-btn-group-responsive, .fs-btn-group-responsive > .fs-btn {
4305
+ width: 100%;
4306
+ }
4307
+ .fs-btn-group-responsive {
4308
+ flex-direction: column;
4309
+ }
4310
+ }
4311
+ @media (width >= 640px) {
4312
+ .fs-stack-md-row {
4313
+ flex-direction: row;
4314
+ align-items: center;
4315
+ }
4316
+ }
4317
+ @media (prefers-reduced-motion: reduce) {
4318
+ .fs-stack, .fs-cluster {
4319
+ scroll-behavior: auto;
4320
+ }
4321
+ }
4322
+ @media (forced-colors: active) {
4323
+ .fs-card, .fs-dropdown-menu, .fs-modal-content, .fs-offcanvas, .fs-toast {
4324
+ border: 1px solid CanvasText;
4325
+ box-shadow: none;
4326
+ }
4327
+ }
4328
+ }
3829
4329
  @layer tokens {
3830
4330
  [data-fs-brand=violet] {
3831
4331
  --fs-color-primary: #6d28d9;