fokus-styles 2.0.0 → 2.4.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 (137) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +4 -3
  3. package/dist/css/components.css +532 -2
  4. package/dist/css/components.css.map +1 -1
  5. package/dist/css/components.min.css +1 -1
  6. package/dist/css/components.min.css.map +1 -1
  7. package/dist/css/fokus-components.css +4072 -0
  8. package/dist/css/fokus-components.css.map +1 -0
  9. package/dist/css/fokus-components.min.css +2 -0
  10. package/dist/css/fokus-components.min.css.map +1 -0
  11. package/dist/css/fokus-core.css +1585 -0
  12. package/dist/css/fokus-core.css.map +1 -0
  13. package/dist/css/fokus-core.min.css +2 -0
  14. package/dist/css/fokus-core.min.css.map +1 -0
  15. package/dist/css/fokus-dark.css +314 -0
  16. package/dist/css/fokus-dark.css.map +1 -0
  17. package/dist/css/fokus-dark.min.css +2 -0
  18. package/dist/css/fokus-dark.min.css.map +1 -0
  19. package/dist/css/fokus-rtl.css +8552 -0
  20. package/dist/css/fokus-rtl.css.map +1 -0
  21. package/dist/css/fokus-rtl.min.css +2 -0
  22. package/dist/css/fokus-rtl.min.css.map +1 -0
  23. package/dist/css/fokus-utilities.css +4198 -0
  24. package/dist/css/fokus-utilities.css.map +1 -0
  25. package/dist/css/fokus-utilities.min.css +2 -0
  26. package/dist/css/fokus-utilities.min.css.map +1 -0
  27. package/dist/css/fokus.css +1361 -53
  28. package/dist/css/fokus.css.map +1 -1
  29. package/dist/css/fokus.min.css +1 -1
  30. package/dist/css/fokus.min.css.map +1 -1
  31. package/dist/css/forms.css +137 -2
  32. package/dist/css/forms.css.map +1 -1
  33. package/dist/css/forms.min.css +1 -1
  34. package/dist/css/forms.min.css.map +1 -1
  35. package/dist/css/helpers.css +398 -2
  36. package/dist/css/helpers.css.map +1 -1
  37. package/dist/css/helpers.min.css +1 -1
  38. package/dist/css/helpers.min.css.map +1 -1
  39. package/dist/css/layout.css +582 -2
  40. package/dist/css/layout.css.map +1 -1
  41. package/dist/css/layout.min.css +1 -1
  42. package/dist/css/layout.min.css.map +1 -1
  43. package/dist/js/fokus.js +347 -12
  44. package/dist/js/fokus.js.map +4 -4
  45. package/dist/js/fokus.min.js +17 -17
  46. package/dist/js/fokus.min.js.map +4 -4
  47. package/docs/components/accordion.md +3 -0
  48. package/docs/components/avatar.md +13 -0
  49. package/docs/components/button-group.md +13 -0
  50. package/docs/components/close-button.md +13 -0
  51. package/docs/components/code.md +13 -0
  52. package/docs/components/icon-link.md +13 -0
  53. package/docs/components/list-group.md +13 -0
  54. package/docs/components/modal.md +3 -0
  55. package/docs/components/navbar.md +3 -0
  56. package/docs/components/pagination.md +3 -0
  57. package/docs/components/placeholder.md +13 -0
  58. package/docs/components/ratio.md +13 -0
  59. package/docs/components/scrollspy.md +13 -0
  60. package/docs/components/skeleton.md +3 -0
  61. package/docs/components/table.md +3 -0
  62. package/docs/guides/javascript-api.md +9 -0
  63. package/docs/guides/rtl-and-system-preferences.md +28 -0
  64. package/docs/guides/utility-api.md +9 -0
  65. package/docs/reference/size-baseline.json +13 -13
  66. package/mockup/assets/example-theme.css +3 -1
  67. package/mockup/assets/example-theme.js +2 -0
  68. package/mockup/assets/showcase-contracts.js +2 -2
  69. package/mockup/assets/showcase.css +4 -2
  70. package/mockup/assets/showcase.js +2 -0
  71. package/mockup/examples/js-foundation.html +25 -0
  72. package/mockup/examples/tables-navbar.html +12 -8
  73. package/mockup/examples/theming.html +2 -1
  74. package/mockup/foundations.html +2 -2
  75. package/package.json +15 -1
  76. package/packages/fokus-cli/bin/fokus.mjs +18 -1
  77. package/packages/fokus-cli/lib/build.mjs +12 -2
  78. package/packages/fokus-components/scss/components/_accordion.scss +19 -0
  79. package/packages/fokus-components/scss/components/_avatar.scss +22 -0
  80. package/packages/fokus-components/scss/components/_button-group.scss +14 -0
  81. package/packages/fokus-components/scss/components/_close-button.scss +22 -0
  82. package/packages/fokus-components/scss/components/_code.scss +19 -0
  83. package/packages/fokus-components/scss/components/_icon-link.scss +8 -0
  84. package/packages/fokus-components/scss/components/_index.scss +10 -0
  85. package/packages/fokus-components/scss/components/_list-group.scss +26 -0
  86. package/packages/fokus-components/scss/components/_modal.scss +36 -0
  87. package/packages/fokus-components/scss/components/_navbar.scss +48 -0
  88. package/packages/fokus-components/scss/components/_offcanvas.scss +19 -0
  89. package/packages/fokus-components/scss/components/_pagination.scss +10 -0
  90. package/packages/fokus-components/scss/components/_placeholder.scss +13 -0
  91. package/packages/fokus-components/scss/components/_progress.scss +8 -0
  92. package/packages/fokus-components/scss/components/_ratio.scss +10 -0
  93. package/packages/fokus-components/scss/components/_scrollspy.scss +5 -0
  94. package/packages/fokus-components/scss/components/_skeleton.scss +19 -0
  95. package/packages/fokus-components/scss/components/_spinner.scss +9 -53
  96. package/packages/fokus-components/scss/components/_tables.scss +20 -0
  97. package/packages/fokus-components/scss/forms/_forms.scss +29 -0
  98. package/packages/fokus-core/scss/base/_accessibility.scss +59 -0
  99. package/packages/fokus-core/scss/base/_index.scss +1 -0
  100. package/packages/fokus-core/scss/layout/_grid.scss +18 -0
  101. package/packages/fokus-core/scss/settings/_config.scss +43 -0
  102. package/packages/fokus-core/scss/settings/_index.scss +1 -0
  103. package/packages/fokus-core/scss/themes/_dark.scss +38 -2
  104. package/packages/fokus-core/scss/tokens/_root.scss +25 -0
  105. package/packages/fokus-core/scss/tools/_mixins.scss +8 -0
  106. package/packages/fokus-js/js/accordion.js +7 -1
  107. package/packages/fokus-js/js/core/focus.js +20 -0
  108. package/packages/fokus-js/js/core/overlay.d.ts +2 -0
  109. package/packages/fokus-js/js/core/overlay.js +10 -0
  110. package/packages/fokus-js/js/core/register.js +4 -2
  111. package/packages/fokus-js/js/focus-trap.d.ts +3 -0
  112. package/packages/fokus-js/js/focus-trap.js +1 -0
  113. package/packages/fokus-js/js/fokus.d.ts +7 -0
  114. package/packages/fokus-js/js/fokus.js +7 -0
  115. package/packages/fokus-js/js/form-validation.d.ts +7 -0
  116. package/packages/fokus-js/js/form-validation.js +20 -0
  117. package/packages/fokus-js/js/modal.js +16 -2
  118. package/packages/fokus-js/js/navbar.d.ts +10 -0
  119. package/packages/fokus-js/js/navbar.js +27 -0
  120. package/packages/fokus-js/js/offcanvas.d.ts +4 -0
  121. package/packages/fokus-js/js/offcanvas.js +16 -2
  122. package/packages/fokus-js/js/pagination.d.ts +7 -0
  123. package/packages/fokus-js/js/pagination.js +38 -0
  124. package/packages/fokus-js/js/scrollspy.d.ts +7 -0
  125. package/packages/fokus-js/js/scrollspy.js +26 -0
  126. package/packages/fokus-js/js/spinner.d.ts +9 -0
  127. package/packages/fokus-js/js/spinner.js +18 -0
  128. package/packages/fokus-js/js/theme.d.ts +9 -0
  129. package/packages/fokus-js/js/theme.js +19 -0
  130. package/packages/fokus-js/js/toast.js +4 -0
  131. package/packages/fokus-utilities/scss/utilities/_api.scss +48 -0
  132. package/packages/fokus-utilities/scss/utilities/_index.scss +2 -0
  133. package/packages/fokus-utilities/scss/utilities/_states.scss +19 -0
  134. package/packages/fokus-utilities/scss/utilities/_visibility.scss +24 -0
  135. package/scss/entries/core-entry.scss +5 -0
  136. package/scss/entries/dark-entry.scss +3 -0
  137. package/scss/entries/rtl-entry.scss +11 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.4.0] - 2026-09-07
4
+
5
+ - adiciona preset `fokus-rtl.css` e export `fokus-styles/rtl.css`;
6
+ - amplia tokens para `prefers-contrast: more` e regras de `forced-colors: active`;
7
+ - documenta RTL, alto contraste, foco e preferências de movimento/cor do sistema.
8
+
9
+ ## [2.3.0] - 2026-09-07
10
+
11
+ - adiciona registro compartilhado de overlays, evitando múltiplos Modal/Offcanvas concorrentes;
12
+ - amplia o contrato TypeScript do núcleo de overlay;
13
+ - mantém o gerenciamento de foco, `inert`, scroll lock e eventos `fs:*` coordenados entre componentes.
14
+
15
+ ## [2.2.0] - 2026-09-07
16
+
17
+ - adiciona Utility API Sass configurável para cores, espaçamento, sizing e variantes responsivas;
18
+ - adiciona tokens de configuração para presets e inclusão seletiva de famílias de utilitários;
19
+ - adiciona `Spinner`, `Pagination` dinâmica e fallback de Scrollspy sem `IntersectionObserver`;
20
+ - adiciona suporte a `inert`/`aria-hidden` no focus trap e estilos do spinner com redução de movimento.
21
+
3
22
  ## Unreleased
4
23
 
5
24
  - refina o Carousel com tokens locais, controles compactos, indicadores em
package/README.md CHANGED
@@ -24,7 +24,7 @@ profissionais, e é distribuído publicamente como produto para qualquer
24
24
  desenvolvedor que precise construir interfaces consistentes sem carregar
25
25
  React, Vue, Angular, jQuery ou qualquer outra dependência de runtime.
26
26
 
27
- > **Status:** `2.0.0`. O Fokus Styles consolida CSS, JavaScript, ícones, React
27
+ > **Status:** `2.1.0`. O Fokus Styles consolida CSS, JavaScript, ícones, React
28
28
  > e CLI em um único pacote npm. O foco atual é consolidar o núcleo CSS e os componentes
29
29
  > essenciais antes de ampliar o catálogo. O framework já possui componentes
30
30
  > avançados, mas eles são tratados como extensões e não definem o caminho
@@ -67,8 +67,9 @@ Ou direto via CDN (jsDelivr/unpkg), sem instalar nada:
67
67
  <script src="https://cdn.jsdelivr.net/npm/fokus-styles/dist/js/fokus.js"></script>
68
68
  ```
69
69
 
70
- O CSS também é distribuído em arquivos separados (`layout.css`, `forms.css`,
71
- `components.css`, `helpers.css`), e o ponto de entrada Sass está disponível para
70
+ O CSS também é distribuído em arquivos separados (`fokus-core.css`,
71
+ `fokus-components.css`, `fokus-utilities.css`, `fokus-dark.css`, além de
72
+ `layout.css`, `forms.css`, `components.css`, `helpers.css`), e o ponto de entrada Sass está disponível para
72
73
  compilar com suas próprias variáveis. Detalhes em
73
74
  [Instalação](docs/getting-started/installation.md) e
74
75
  [Formas de uso](docs/getting-started/usage.md).
@@ -48,12 +48,28 @@
48
48
  --fs-control-padding-x-lg: 16px;
49
49
  --fs-focus-width: 2px;
50
50
  --fs-focus-offset: 2px;
51
+ --fs-focus-color: var(--fs-color-primary);
52
+ --fs-focus-ring-size: 3px;
53
+ --fs-focus-ring-color: color-mix(in srgb, var(--fs-focus-color) 22%, transparent);
51
54
  --fs-focus-ring-alpha: 22%;
52
55
  --fs-transition-fast: 150ms;
53
56
  --fs-transition-normal: 220ms;
57
+ --fs-motion-duration-fast: var(--fs-transition-fast);
58
+ --fs-motion-duration-normal: var(--fs-transition-normal);
59
+ --fs-motion-ease-standard: var(--fs-ease-standard);
54
60
  --fs-ease-standard: cubic-bezier(0.2, 0, 0, 1);
55
61
  --fs-border-width: 1px;
56
62
  --fs-disabled-opacity: 0.5;
63
+ --fs-safe-area-top: env(safe-area-inset-top, 0px);
64
+ --fs-safe-area-right: env(safe-area-inset-right, 0px);
65
+ --fs-safe-area-bottom: env(safe-area-inset-bottom, 0px);
66
+ --fs-safe-area-left: env(safe-area-inset-left, 0px);
67
+ --fs-component-control-height: var(--fs-control-height);
68
+ --fs-component-overlay-backdrop: rgb(0 0 0 / 55%);
69
+ --fs-component-panel-radius: var(--fs-radius-md);
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);
57
73
  --fs-cq-sm: 320px;
58
74
  --fs-cq-md: 480px;
59
75
  --fs-cq-lg: 640px;
@@ -132,6 +148,14 @@
132
148
  --fs-feedback-info-bg: oklch(96.4918490239% 0.0173174767 286.0707018324deg);
133
149
  }
134
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
+ }
135
159
  }
136
160
  @layer tokens {
137
161
  :root {
@@ -243,6 +267,59 @@
243
267
  }
244
268
  }
245
269
  }
270
+ /* stylelint-disable property-no-deprecated, selector-not-notation */
271
+ @layer reset {
272
+ :focus-visible {
273
+ outline: var(--fs-focus-width) solid var(--fs-focus-color);
274
+ outline-offset: var(--fs-focus-offset);
275
+ }
276
+ @media (forced-colors: active) {
277
+ :focus-visible {
278
+ outline: 2px solid CanvasText;
279
+ outline-offset: 2px;
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
+ }
293
+ }
294
+ }
295
+ @layer utilities {
296
+ .fs-u-visually-hidden:not(:focus):not(:focus-within),
297
+ .fs-u-visually-hidden-focusable:not(:focus):not(:focus-within) {
298
+ position: absolute !important;
299
+ width: 1px !important;
300
+ height: 1px !important;
301
+ padding: 0 !important;
302
+ margin: -1px !important;
303
+ overflow: hidden !important;
304
+ clip-path: inset(50%) !important;
305
+ white-space: nowrap !important;
306
+ border: 0 !important;
307
+ }
308
+ .fs-skip-link {
309
+ position: fixed;
310
+ z-index: 1000;
311
+ inset-block-start: var(--fs-space-2);
312
+ inset-inline-start: var(--fs-space-2);
313
+ transform: translateY(-200%);
314
+ padding: var(--fs-space-2) var(--fs-space-3);
315
+ color: var(--fs-color-on-primary);
316
+ background: var(--fs-color-primary);
317
+ border-radius: var(--fs-radius-sm);
318
+ }
319
+ .fs-skip-link:focus {
320
+ transform: translateY(0);
321
+ }
322
+ }
246
323
  @layer components {
247
324
  .fs-btn {
248
325
  --fs-btn-color: var(--fs-color-text-primary);
@@ -847,6 +924,23 @@
847
924
  .fs-table-responsive {
848
925
  overflow-x: auto;
849
926
  }
927
+ .fs-table-caption {
928
+ caption-side: top;
929
+ padding: var(--fs-space-2) 0;
930
+ color: var(--fs-color-muted);
931
+ text-align: start;
932
+ }
933
+ .fs-table-empty {
934
+ padding: var(--fs-space-5);
935
+ color: var(--fs-color-muted);
936
+ text-align: center;
937
+ }
938
+ @media (width < 640px) {
939
+ .fs-table-priority th:nth-child(n+4),
940
+ .fs-table-priority td:nth-child(n+4) {
941
+ display: none;
942
+ }
943
+ }
850
944
  }
851
945
  @layer components {
852
946
  .fs-navbar {
@@ -873,6 +967,47 @@
873
967
  padding: 0;
874
968
  list-style: none;
875
969
  }
970
+ .fs-navbar-toggler {
971
+ display: inline-flex;
972
+ align-items: center;
973
+ justify-content: center;
974
+ min-width: 44px;
975
+ min-height: 44px;
976
+ padding: 8px;
977
+ color: var(--fs-color-text);
978
+ background: transparent;
979
+ border: 1px solid var(--fs-color-border);
980
+ border-radius: var(--fs-radius-sm);
981
+ cursor: pointer;
982
+ }
983
+ .fs-navbar-collapse {
984
+ flex-basis: 100%;
985
+ width: 100%;
986
+ }
987
+ .fs-navbar-collapse:not(.is-open) {
988
+ display: none;
989
+ }
990
+ .fs-navbar-collapse.is-open .fs-navbar-nav {
991
+ flex-direction: column;
992
+ align-items: stretch;
993
+ }
994
+ @media (width >= 768px) {
995
+ .fs-navbar-toggler {
996
+ display: none;
997
+ }
998
+ .fs-navbar-collapse,
999
+ .fs-navbar-collapse:not(.is-open),
1000
+ .fs-navbar-collapse[hidden] {
1001
+ display: flex;
1002
+ flex: 1 1 auto;
1003
+ align-items: center;
1004
+ justify-content: flex-end;
1005
+ width: auto;
1006
+ }
1007
+ .fs-navbar-collapse .fs-navbar-nav {
1008
+ flex-direction: row;
1009
+ }
1010
+ }
876
1011
  .fs-nav-link {
877
1012
  display: inline-flex;
878
1013
  align-items: center;
@@ -1286,6 +1421,13 @@
1286
1421
  .fs-modal-dialog.fs-modal-lg {
1287
1422
  max-width: 720px;
1288
1423
  }
1424
+ .fs-modal-dialog.fs-modal-xl {
1425
+ max-width: 1140px;
1426
+ }
1427
+ .fs-modal-dialog.fs-modal-fullscreen {
1428
+ max-width: none;
1429
+ height: 100%;
1430
+ }
1289
1431
  .fs-modal-content {
1290
1432
  display: flex;
1291
1433
  flex-direction: column;
@@ -1312,6 +1454,28 @@
1312
1454
  padding: 20px;
1313
1455
  overflow-y: auto;
1314
1456
  }
1457
+ .fs-modal-scrollable .fs-modal-content {
1458
+ overflow: hidden;
1459
+ }
1460
+ .fs-modal-scrollable .fs-modal-body {
1461
+ overflow-y: auto;
1462
+ }
1463
+ @media (width < 640px) {
1464
+ .fs-modal {
1465
+ align-items: flex-end;
1466
+ padding: 0;
1467
+ }
1468
+ .fs-modal-dialog,
1469
+ .fs-modal-dialog.fs-modal-sm,
1470
+ .fs-modal-dialog.fs-modal-lg,
1471
+ .fs-modal-dialog.fs-modal-xl {
1472
+ max-width: none;
1473
+ }
1474
+ .fs-modal-content {
1475
+ max-height: calc(100dvh - var(--fs-safe-area-top));
1476
+ border-radius: var(--fs-radius-md) var(--fs-radius-md) 0 0;
1477
+ }
1478
+ }
1315
1479
  .fs-modal-footer {
1316
1480
  display: flex;
1317
1481
  align-items: center;
@@ -1675,6 +1839,22 @@
1675
1839
  padding: 16px 20px;
1676
1840
  border-top: 1px solid var(--fs-color-border);
1677
1841
  }
1842
+ .fs-offcanvas-responsive {
1843
+ width: min(100%, 420px);
1844
+ }
1845
+ @media (width >= 1024px) {
1846
+ .fs-offcanvas-lg {
1847
+ position: static;
1848
+ width: auto;
1849
+ height: auto;
1850
+ visibility: visible;
1851
+ transform: none;
1852
+ box-shadow: none;
1853
+ }
1854
+ .fs-offcanvas-lg + .fs-offcanvas-backdrop {
1855
+ display: none;
1856
+ }
1857
+ }
1678
1858
  @media (prefers-reduced-motion: reduce) {
1679
1859
  .fs-offcanvas,
1680
1860
  .fs-offcanvas-backdrop {
@@ -1703,6 +1883,16 @@
1703
1883
  border-bottom-right-radius: var(--fs-radius-md);
1704
1884
  border-bottom-left-radius: var(--fs-radius-md);
1705
1885
  }
1886
+ .fs-accordion-flush .fs-accordion-item {
1887
+ border-inline: 0;
1888
+ border-radius: 0;
1889
+ }
1890
+ .fs-accordion-flush .fs-accordion-item:first-child {
1891
+ border-block-start: 0;
1892
+ }
1893
+ .fs-accordion-always-open .fs-accordion-button[aria-expanded=true]::after {
1894
+ transform: rotate(-135deg);
1895
+ }
1706
1896
  .fs-accordion-header {
1707
1897
  margin: 0;
1708
1898
  }
@@ -1751,6 +1941,11 @@
1751
1941
  border-top: 1px solid var(--fs-color-border);
1752
1942
  background-color: var(--fs-color-surface-raised);
1753
1943
  }
1944
+ @media (prefers-reduced-motion: reduce) {
1945
+ .fs-accordion-button::after {
1946
+ transition: none;
1947
+ }
1948
+ }
1754
1949
  }
1755
1950
  @layer components {
1756
1951
  .fs-tabs {
@@ -2012,6 +2207,14 @@
2012
2207
  padding: 0;
2013
2208
  list-style: none;
2014
2209
  }
2210
+ .fs-pagination-scroll {
2211
+ max-width: 100%;
2212
+ overflow-x: auto;
2213
+ padding-block: 2px;
2214
+ }
2215
+ .fs-pagination-scroll .fs-pagination {
2216
+ width: max-content;
2217
+ }
2015
2218
  .fs-page-link {
2016
2219
  display: inline-flex;
2017
2220
  align-items: center;
@@ -2240,6 +2443,9 @@
2240
2443
  --fs-progress-bar-bg: var(--fs-color-info);
2241
2444
  --fs-progress-color: #ffffff;
2242
2445
  }
2446
+ .fs-spinner[data-fs-loading=false] {
2447
+ display: none;
2448
+ }
2243
2449
  .fs-progress-sm {
2244
2450
  --fs-progress-height: 4px;
2245
2451
  }
@@ -2965,6 +3171,22 @@
2965
3171
  .fs-skeleton-rect {
2966
3172
  border-radius: var(--fs-radius-md);
2967
3173
  }
3174
+ .fs-skeleton-card {
3175
+ display: grid;
3176
+ gap: var(--fs-space-3);
3177
+ min-height: 10rem;
3178
+ padding: var(--fs-space-4);
3179
+ border-radius: var(--fs-radius-md);
3180
+ }
3181
+ .fs-skeleton-table {
3182
+ height: 1.25rem;
3183
+ margin-block-end: var(--fs-space-2);
3184
+ }
3185
+ .fs-skeleton-avatar {
3186
+ width: 2.5rem;
3187
+ height: 2.5rem;
3188
+ border-radius: 50%;
3189
+ }
2968
3190
  @keyframes fokus-skeleton-pulse {
2969
3191
  0%, 100% {
2970
3192
  opacity: 1;
@@ -3352,6 +3574,280 @@
3352
3574
  font-size: 1rem;
3353
3575
  }
3354
3576
  }
3577
+ /* stylelint-disable declaration-block-single-line-max-declarations */
3578
+ @layer components {
3579
+ .fs-avatar {
3580
+ display: inline-flex;
3581
+ flex: 0 0 auto;
3582
+ align-items: center;
3583
+ justify-content: center;
3584
+ width: 2.5rem;
3585
+ height: 2.5rem;
3586
+ overflow: hidden;
3587
+ color: var(--fs-color-on-primary);
3588
+ font-weight: 600;
3589
+ background: var(--fs-color-primary);
3590
+ border-radius: 50%;
3591
+ object-fit: cover;
3592
+ }
3593
+ .fs-avatar-sm {
3594
+ width: 2rem;
3595
+ height: 2rem;
3596
+ font-size: 0.8125rem;
3597
+ }
3598
+ .fs-avatar-lg {
3599
+ width: 3.5rem;
3600
+ height: 3.5rem;
3601
+ font-size: 1.25rem;
3602
+ }
3603
+ .fs-avatar-square {
3604
+ border-radius: var(--fs-radius-md);
3605
+ }
3606
+ .fs-avatar img {
3607
+ width: 100%;
3608
+ height: 100%;
3609
+ object-fit: cover;
3610
+ }
3611
+ }
3612
+ /* stylelint-disable declaration-block-single-line-max-declarations */
3613
+ @layer components {
3614
+ .fs-button-group {
3615
+ display: inline-flex;
3616
+ vertical-align: middle;
3617
+ }
3618
+ .fs-button-group > .fs-btn {
3619
+ border-radius: 0;
3620
+ }
3621
+ .fs-button-group > .fs-btn:first-child {
3622
+ border-start-start-radius: var(--fs-radius-sm);
3623
+ border-end-start-radius: var(--fs-radius-sm);
3624
+ }
3625
+ .fs-button-group > .fs-btn:last-child {
3626
+ border-start-end-radius: var(--fs-radius-sm);
3627
+ border-end-end-radius: var(--fs-radius-sm);
3628
+ }
3629
+ .fs-button-group > .fs-btn + .fs-btn {
3630
+ margin-inline-start: -1px;
3631
+ }
3632
+ .fs-button-group-vertical {
3633
+ flex-direction: column;
3634
+ align-items: flex-start;
3635
+ }
3636
+ .fs-button-group-vertical > .fs-btn {
3637
+ width: 100%;
3638
+ }
3639
+ }
3640
+ /* stylelint-disable declaration-block-single-line-max-declarations */
3641
+ @layer components {
3642
+ .fs-close {
3643
+ display: inline-grid;
3644
+ width: 2rem;
3645
+ height: 2rem;
3646
+ place-items: center;
3647
+ padding: 0;
3648
+ color: currentcolor;
3649
+ font-size: 1.5rem;
3650
+ line-height: 1;
3651
+ background: transparent;
3652
+ border: 0;
3653
+ border-radius: 50%;
3654
+ cursor: pointer;
3655
+ opacity: 0.72;
3656
+ }
3657
+ .fs-close::before {
3658
+ content: "×";
3659
+ }
3660
+ .fs-close:hover {
3661
+ opacity: 1;
3662
+ background: var(--fs-color-subtle);
3663
+ }
3664
+ .fs-close:focus-visible {
3665
+ outline: var(--fs-focus-width) solid var(--fs-focus-color);
3666
+ outline-offset: var(--fs-focus-offset);
3667
+ }
3668
+ }
3669
+ /* stylelint-disable declaration-block-single-line-max-declarations */
3670
+ @layer components {
3671
+ .fs-list-group {
3672
+ display: flex;
3673
+ flex-direction: column;
3674
+ padding: 0;
3675
+ margin: 0;
3676
+ list-style: none;
3677
+ border: 1px solid var(--fs-color-border);
3678
+ border-radius: var(--fs-radius-md);
3679
+ }
3680
+ .fs-list-group-item {
3681
+ position: relative;
3682
+ display: block;
3683
+ padding: var(--fs-space-3) var(--fs-space-4);
3684
+ color: var(--fs-color-text);
3685
+ background: var(--fs-color-surface);
3686
+ border-block-end: 1px solid var(--fs-color-border);
3687
+ }
3688
+ .fs-list-group-item:last-child {
3689
+ border-block-end: 0;
3690
+ }
3691
+ button.fs-list-group-item, a.fs-list-group-item {
3692
+ width: 100%;
3693
+ text-align: start;
3694
+ cursor: pointer;
3695
+ }
3696
+ .fs-list-group-item:hover {
3697
+ background: var(--fs-color-subtle);
3698
+ }
3699
+ .fs-list-group-item.is-active {
3700
+ color: var(--fs-color-on-primary);
3701
+ background: var(--fs-color-primary);
3702
+ }
3703
+ }
3704
+ @layer components {
3705
+ .fs-code {
3706
+ padding: 0.125em 0.35em;
3707
+ color: var(--fs-color-danger);
3708
+ background: var(--fs-color-subtle);
3709
+ border-radius: var(--fs-radius-sm);
3710
+ }
3711
+ .fs-pre {
3712
+ display: block;
3713
+ max-width: 100%;
3714
+ padding: var(--fs-space-4);
3715
+ overflow: auto;
3716
+ color: var(--fs-color-text);
3717
+ background: var(--fs-color-subtle);
3718
+ border: 1px solid var(--fs-color-border);
3719
+ border-radius: var(--fs-radius-md);
3720
+ }
3721
+ }
3722
+ /* stylelint-disable declaration-block-single-line-max-declarations */
3723
+ @layer components {
3724
+ .fs-ratio {
3725
+ position: relative;
3726
+ width: 100%;
3727
+ }
3728
+ .fs-ratio::before {
3729
+ display: block;
3730
+ padding-top: var(--fs-ratio, 56.25%);
3731
+ content: "";
3732
+ }
3733
+ .fs-ratio > * {
3734
+ position: absolute;
3735
+ inset: 0;
3736
+ width: 100%;
3737
+ height: 100%;
3738
+ object-fit: cover;
3739
+ }
3740
+ .fs-ratio-1x1 {
3741
+ --fs-ratio: 100%;
3742
+ }
3743
+ .fs-ratio-4x3 {
3744
+ --fs-ratio: 75%;
3745
+ }
3746
+ .fs-ratio-16x9 {
3747
+ --fs-ratio: 56.25%;
3748
+ }
3749
+ .fs-ratio-21x9 {
3750
+ --fs-ratio: 42.857%;
3751
+ }
3752
+ }
3753
+ /* stylelint-disable declaration-block-single-line-max-declarations */
3754
+ @layer components {
3755
+ .fs-icon-link {
3756
+ display: inline-flex;
3757
+ gap: 0.5em;
3758
+ align-items: center;
3759
+ }
3760
+ .fs-icon-link svg {
3761
+ width: 1em;
3762
+ height: 1em;
3763
+ flex: 0 0 auto;
3764
+ }
3765
+ .fs-icon-link:hover svg {
3766
+ transform: translateX(0.15em);
3767
+ }
3768
+ @media (prefers-reduced-motion: reduce) {
3769
+ .fs-icon-link svg {
3770
+ transition: none;
3771
+ }
3772
+ }
3773
+ }
3774
+ /* stylelint-disable declaration-block-single-line-max-declarations */
3775
+ @layer components {
3776
+ .fs-placeholder {
3777
+ display: inline-block;
3778
+ min-height: 1em;
3779
+ vertical-align: middle;
3780
+ cursor: wait;
3781
+ background: currentcolor;
3782
+ opacity: 0.18;
3783
+ }
3784
+ .fs-placeholder-glow {
3785
+ animation: fs-placeholder-glow 1.5s ease-in-out infinite;
3786
+ }
3787
+ .fs-placeholder-wave {
3788
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.35), transparent), currentcolor;
3789
+ background-size: 200% 100%;
3790
+ animation: fs-placeholder-wave 1.5s linear infinite;
3791
+ }
3792
+ .fs-placeholder-btn {
3793
+ width: 6rem;
3794
+ height: 2.5rem;
3795
+ border-radius: var(--fs-radius-sm);
3796
+ }
3797
+ @keyframes fs-placeholder-glow {
3798
+ 50% {
3799
+ opacity: 0.08;
3800
+ }
3801
+ }
3802
+ @keyframes fs-placeholder-wave {
3803
+ to {
3804
+ background-position: -200% 0;
3805
+ }
3806
+ }
3807
+ @media (prefers-reduced-motion: reduce) {
3808
+ .fs-placeholder-glow, .fs-placeholder-wave {
3809
+ animation: none;
3810
+ }
3811
+ }
3812
+ }
3813
+ /* stylelint-disable declaration-block-single-line-max-declarations */
3814
+ @layer components {
3815
+ .fs-progress {
3816
+ display: flex;
3817
+ height: 0.75rem;
3818
+ overflow: hidden;
3819
+ background: var(--fs-color-subtle);
3820
+ border-radius: 999px;
3821
+ }
3822
+ .fs-progress-bar {
3823
+ display: flex;
3824
+ align-items: center;
3825
+ justify-content: center;
3826
+ color: var(--fs-color-on-primary);
3827
+ background: var(--fs-color-primary);
3828
+ transition: width var(--fs-motion-duration-normal) var(--fs-motion-ease-standard);
3829
+ }
3830
+ .fs-progress-bar-striped {
3831
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%);
3832
+ background-size: 1rem 1rem;
3833
+ }
3834
+ @media (prefers-reduced-motion: reduce) {
3835
+ .fs-progress-bar {
3836
+ transition: none;
3837
+ }
3838
+ }
3839
+ }
3840
+ /* stylelint-disable declaration-block-single-line-max-declarations */
3841
+ @layer components {
3842
+ [data-fs-scrollspy] .is-active {
3843
+ color: var(--fs-color-primary);
3844
+ font-weight: 600;
3845
+ }
3846
+ .fs-scrollspy-nav {
3847
+ position: sticky;
3848
+ inset-block-start: var(--fs-space-4);
3849
+ }
3850
+ }
3355
3851
  @layer tokens {
3356
3852
  [data-fs-brand=violet] {
3357
3853
  --fs-color-primary: #6d28d9;
@@ -3447,7 +3943,8 @@
3447
3943
  }
3448
3944
  }
3449
3945
  @layer tokens {
3450
- [data-theme=dark] {
3946
+ [data-theme=dark],
3947
+ [data-fs-theme=dark] {
3451
3948
  --fs-color-text: #f1f3f4;
3452
3949
  --fs-color-muted: #bdc1c6;
3453
3950
  --fs-color-border: #3c4043;
@@ -3494,7 +3991,8 @@
3494
3991
  --fs-feedback-info-bg: rgb(35.0058091619, 49.6887857769, 78.5757788254);
3495
3992
  }
3496
3993
  @supports (color: oklch(0% 0 0deg)) {
3497
- [data-theme=dark] {
3994
+ [data-theme=dark],
3995
+ [data-fs-theme=dark] {
3498
3996
  --fs-color-text: oklch(96.2913383165% 0.002529697 228.7848682695deg);
3499
3997
  --fs-color-muted: oklch(80.9268110646% 0.0083071608 253.8653061211deg);
3500
3998
  --fs-color-border: oklch(36.8827622528% 0.0074489239 240.018838067deg);
@@ -3538,5 +4036,37 @@
3538
4036
  --fs-feedback-info-bg: oklch(31.7574919059% 0.0556228738 263.0598185246deg);
3539
4037
  }
3540
4038
  }
4039
+ @media (prefers-color-scheme: dark) {
4040
+ [data-fs-theme=auto] {
4041
+ --fs-color-text: #f1f3f4;
4042
+ --fs-color-muted: #bdc1c6;
4043
+ --fs-color-border: #3c4043;
4044
+ --fs-color-surface: #202124;
4045
+ --fs-color-subtle: #2b2c2f;
4046
+ --fs-color-bg-surface: var(--fs-color-surface);
4047
+ --fs-color-bg-subtle: var(--fs-color-subtle);
4048
+ --fs-color-surface-raised: var(--fs-color-surface);
4049
+ --fs-color-surface-interactive: var(--fs-color-subtle);
4050
+ --fs-color-text-primary: var(--fs-color-text);
4051
+ --fs-color-text-muted: var(--fs-color-muted);
4052
+ --fs-color-border-default: var(--fs-color-border);
4053
+ --fs-color-focus: var(--fs-color-primary);
4054
+ --fs-tooltip-bg: #f8fafc;
4055
+ --fs-tooltip-text: #1e293b;
4056
+ }
4057
+ }
4058
+ @media (forced-colors: active) {
4059
+ :root,
4060
+ [data-theme=dark],
4061
+ [data-fs-theme=light],
4062
+ [data-fs-theme=dark],
4063
+ [data-fs-theme=auto] {
4064
+ --fs-color-border: CanvasText;
4065
+ --fs-color-text: CanvasText;
4066
+ --fs-color-surface: Canvas;
4067
+ --fs-color-subtle: Canvas;
4068
+ --fs-focus-color: Highlight;
4069
+ }
4070
+ }
3541
4071
  }
3542
4072
  /*# sourceMappingURL=components.css.map */