fokus-styles 2.6.2 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +5 -0
  2. package/dist/css/components.css +534 -27
  3. package/dist/css/components.min.css +1 -1
  4. package/dist/css/fokus-components.css +534 -27
  5. package/dist/css/fokus-components.min.css +1 -1
  6. package/dist/css/fokus-core.css +42 -0
  7. package/dist/css/fokus-core.min.css +1 -1
  8. package/dist/css/fokus-dark.css +42 -0
  9. package/dist/css/fokus-dark.min.css +1 -1
  10. package/dist/css/fokus-helpers.css +646 -0
  11. package/dist/css/fokus-helpers.min.css +2 -0
  12. package/dist/css/fokus-rtl.css +9667 -2716
  13. package/dist/css/fokus-rtl.min.css +1 -1
  14. package/dist/css/fokus-utilities.css +9175 -2682
  15. package/dist/css/fokus-utilities.min.css +1 -1
  16. package/dist/css/fokus.css +9893 -2799
  17. package/dist/css/fokus.min.css +1 -1
  18. package/dist/css/forms.css +206 -28
  19. package/dist/css/forms.min.css +1 -1
  20. package/dist/css/helpers.css +9175 -2682
  21. package/dist/css/helpers.min.css +1 -1
  22. package/dist/css/layout.css +42 -0
  23. package/dist/css/layout.min.css +1 -1
  24. package/dist/js/fokus.js +91 -69
  25. package/dist/js/fokus.min.js +19 -19
  26. package/package.json +2 -1
  27. package/packages/fokus-components/scss/components/_button-group.scss +12 -0
  28. package/packages/fokus-components/scss/components/_buttons.scss +39 -6
  29. package/packages/fokus-components/scss/components/_datepicker.scss +47 -1
  30. package/packages/fokus-components/scss/components/_dropdown.scss +212 -6
  31. package/packages/fokus-components/scss/components/_index.scss +1 -0
  32. package/packages/fokus-components/scss/components/_menu.scss +95 -0
  33. package/packages/fokus-components/scss/components/_pagination.scss +43 -16
  34. package/packages/fokus-components/scss/components/_segmented-control.scss +16 -1
  35. package/packages/fokus-components/scss/components/_tabs.scss +58 -0
  36. package/packages/fokus-components/scss/components/_tag.scss +32 -0
  37. package/packages/fokus-components/scss/forms/_forms.scss +155 -28
  38. package/packages/fokus-components/scss/forms/_range.scss +29 -0
  39. package/packages/fokus-core/scss/base/_motion.scss +3 -1
  40. package/packages/fokus-core/scss/settings/_config.scss +39 -1
  41. package/packages/fokus-core/scss/settings/_index.scss +1 -0
  42. package/packages/fokus-core/scss/settings/_utilities.scss +86 -0
  43. package/packages/fokus-core/scss/themes/_dark.scss +9 -0
  44. package/packages/fokus-core/scss/tokens/_root.scss +23 -0
  45. package/packages/fokus-js/js/combobox.js +2 -6
  46. package/packages/fokus-js/js/command-palette.js +2 -6
  47. package/packages/fokus-js/js/core/positioning.d.ts +2 -0
  48. package/packages/fokus-js/js/core/positioning.js +2 -2
  49. package/packages/fokus-js/js/core/theme.js +8 -0
  50. package/packages/fokus-js/js/datatable.js +6 -2
  51. package/packages/fokus-js/js/datepicker.js +13 -5
  52. package/packages/fokus-js/js/dropdown.js +37 -5
  53. package/packages/fokus-js/js/nested-menu.js +2 -6
  54. package/packages/fokus-js/js/notification-center.js +2 -6
  55. package/packages/fokus-js/js/pagination.js +15 -9
  56. package/packages/fokus-js/js/popover.js +2 -6
  57. package/packages/fokus-js/js/select.js +4 -0
  58. package/packages/fokus-js/js/tabs.js +4 -4
  59. package/packages/fokus-js/js/tooltip.js +2 -6
  60. package/packages/fokus-utilities/scss/utilities/_api.scss +62 -69
  61. package/packages/fokus-utilities/scss/utilities/_borders.scss +39 -0
  62. package/packages/fokus-utilities/scss/utilities/_colors.scss +27 -0
  63. package/packages/fokus-utilities/scss/utilities/_display.scss +20 -16
  64. package/packages/fokus-utilities/scss/utilities/_effects.scss +53 -0
  65. package/packages/fokus-utilities/scss/utilities/_flex.scss +50 -35
  66. package/packages/fokus-utilities/scss/utilities/_generated.scss +21 -0
  67. package/packages/fokus-utilities/scss/utilities/_grid.scss +25 -0
  68. package/packages/fokus-utilities/scss/utilities/_helpers.scss +35 -0
  69. package/packages/fokus-utilities/scss/utilities/_index.scss +11 -0
  70. package/packages/fokus-utilities/scss/utilities/_interactivity.scss +51 -0
  71. package/packages/fokus-utilities/scss/utilities/_layout.scss +61 -0
  72. package/packages/fokus-utilities/scss/utilities/_motion.scss +51 -0
  73. package/packages/fokus-utilities/scss/utilities/_position.scss +6 -6
  74. package/packages/fokus-utilities/scss/utilities/_print.scss +22 -18
  75. package/packages/fokus-utilities/scss/utilities/_shadow.scss +7 -3
  76. package/packages/fokus-utilities/scss/utilities/_sizing.scss +46 -0
  77. package/packages/fokus-utilities/scss/utilities/_spacing.scss +40 -113
  78. package/packages/fokus-utilities/scss/utilities/_states.scss +26 -10
  79. package/packages/fokus-utilities/scss/utilities/_transforms.scss +67 -0
  80. package/packages/fokus-utilities/scss/utilities/_typography.scss +72 -94
  81. package/scss/entries/helpers-entry.scss +5 -0
  82. package/scss/entries/rtl-entry.scss +6 -3
@@ -9,9 +9,47 @@
9
9
  @layer components {
10
10
  .fs-tabs {
11
11
  display: flex;
12
+ max-inline-size: 100%;
13
+ overflow-x: auto;
14
+ scrollbar-width: thin;
12
15
  border-bottom: var(--fs-border-width) solid var(--fs-color-border-default);
13
16
  }
14
17
 
18
+ .fs-tabs .fs-nav-link { flex: 0 0 auto; }
19
+
20
+ .fs-tabs-boxed {
21
+ border: var(--fs-border-width) solid var(--fs-color-border-default);
22
+ border-radius: var(--fs-radius-md);
23
+ padding: 0.25rem;
24
+ }
25
+
26
+ .fs-tabs-boxed .fs-nav-link,
27
+ .fs-tabs-toggle .fs-nav-link {
28
+ margin-block-end: 0;
29
+ border: 0;
30
+ border-radius: var(--fs-radius-sm);
31
+ }
32
+
33
+ .fs-tabs-boxed .fs-nav-link.is-active,
34
+ .fs-tabs-toggle .fs-nav-link.is-active {
35
+ color: var(--fs-color-text);
36
+ background-color: var(--fs-color-surface);
37
+ box-shadow: var(--fs-shadow-sm);
38
+ }
39
+
40
+ .fs-tabs-toggle {
41
+ gap: 0;
42
+ padding: 0.25rem;
43
+ border: 0;
44
+ border-radius: var(--fs-radius-md);
45
+ background-color: var(--fs-color-subtle);
46
+ }
47
+
48
+ .fs-tabs-toggle .fs-nav-link {
49
+ flex: 1 1 0;
50
+ justify-content: center;
51
+ }
52
+
15
53
  .fs-tabs .fs-nav-link {
16
54
  margin-bottom: -1px;
17
55
  border-bottom: 2px solid transparent;
@@ -77,6 +115,26 @@
77
115
  text-align: center;
78
116
  }
79
117
 
118
+ .fs-tabs-vertical {
119
+ flex-direction: column;
120
+ align-items: stretch;
121
+ overflow-x: visible;
122
+ border-inline-start: var(--fs-border-width) solid var(--fs-color-border-default);
123
+ border-block-end: 0;
124
+ }
125
+
126
+ .fs-tabs-vertical .fs-nav-link {
127
+ justify-content: flex-start;
128
+ margin-block-end: 0;
129
+ margin-inline-start: -1px;
130
+ border-block-end: 0;
131
+ border-inline-start: 2px solid transparent;
132
+ }
133
+
134
+ .fs-tabs-vertical .fs-nav-link.is-active {
135
+ border-inline-start-color: var(--fs-color-primary);
136
+ }
137
+
80
138
  // Tamanhos — mesma escala sm/lg dos outros componentes.
81
139
  .fs-tabs-sm .fs-nav-link {
82
140
  padding: 6px 10px;
@@ -22,6 +22,38 @@
22
22
  padding-inline-end: var(--fs-tag-padding-inline-end);
23
23
  }
24
24
 
25
+ .fs-tag-rounded {
26
+ --fs-badge-radius: 999px;
27
+ --fs-tag-padding-inline-start: 8px;
28
+ --fs-tag-padding-inline-end: 8px;
29
+ }
30
+
31
+ .fs-tag-addons {
32
+ --fs-tag-addon-padding-inline: 8px;
33
+
34
+ display: inline-flex;
35
+ align-items: stretch;
36
+ gap: 0;
37
+ }
38
+
39
+ .fs-tag-addons > .fs-tag {
40
+ --fs-tag-padding-inline-start: var(--fs-tag-addon-padding-inline);
41
+ --fs-tag-padding-inline-end: var(--fs-tag-addon-padding-inline);
42
+
43
+ min-inline-size: 0;
44
+ border-radius: 0;
45
+ }
46
+
47
+ .fs-tag-addons > .fs-tag:first-child {
48
+ border-start-start-radius: var(--fs-badge-radius);
49
+ border-end-start-radius: var(--fs-badge-radius);
50
+ }
51
+
52
+ .fs-tag-addons > .fs-tag:last-child {
53
+ border-start-end-radius: var(--fs-badge-radius);
54
+ border-end-end-radius: var(--fs-badge-radius);
55
+ }
56
+
25
57
  // O texto fica em um elemento próprio quando a tag puder ser truncada. A
26
58
  // string integral permanece no DOM, portanto continua disponível para AT.
27
59
  .fs-tag-label {
@@ -90,39 +90,87 @@
90
90
  display: block;
91
91
  }
92
92
 
93
- .fs-form-control {
93
+ .fs-form-control,
94
+ .fs-form-textarea,
95
+ .fs-form-date,
96
+ .fs-form-time {
94
97
  width: 100%;
95
98
  min-width: 0;
96
99
  height: var(--fs-control-height);
97
- padding: 0 7px;
98
- border: var(--fs-border-width) solid var(--fs-color-border-default);
99
- border-radius: var(--fs-radius-sm);
100
+ min-block-size: var(--fs-control-height);
101
+ padding-block: 0;
102
+ padding-inline: var(--fs-control-padding-x);
103
+ border: var(--fs-border-width) solid var(--fs-control-border-color);
104
+ border-radius: var(--fs-control-radius);
100
105
  color: var(--fs-color-text);
101
- background-color: var(--fs-color-surface);
106
+ background-color: var(--fs-control-bg);
102
107
  font-size: $font-size-md;
103
108
  font-weight: $font-weight-medium;
109
+ line-height: 1.35;
110
+ transition: var(--fs-control-transition);
111
+ color-scheme: light;
104
112
  }
105
113
 
106
- .fs-form-control::placeholder {
107
- color: var(--fs-color-muted);
114
+ [data-theme="dark"] .fs-form-control,
115
+ [data-theme="dark"] .fs-form-textarea,
116
+ [data-theme="dark"] .fs-form-date,
117
+ [data-theme="dark"] .fs-form-time,
118
+ [data-fs-theme="dark"] .fs-form-control,
119
+ [data-fs-theme="dark"] .fs-form-textarea,
120
+ [data-fs-theme="dark"] .fs-form-date,
121
+ [data-fs-theme="dark"] .fs-form-time {
122
+ color-scheme: dark;
123
+ }
124
+
125
+ .fs-form-textarea {
126
+ height: auto;
127
+ min-block-size: 96px;
128
+ padding-block: var(--fs-space-2);
129
+ resize: vertical;
130
+ }
131
+
132
+ .fs-form-control::placeholder,
133
+ .fs-form-textarea::placeholder {
134
+ color: var(--fs-control-placeholder-color);
135
+ opacity: 1;
108
136
  }
109
137
 
110
- .fs-form-control:focus-visible {
138
+ .fs-form-control:focus-visible,
139
+ .fs-form-textarea:focus-visible,
140
+ .fs-form-date:focus-visible,
141
+ .fs-form-time:focus-visible {
111
142
  @include focus-ring;
112
143
  }
113
144
 
114
- .fs-form-control:disabled {
145
+ .fs-form-control:disabled,
146
+ .fs-form-textarea:disabled,
147
+ .fs-form-date:disabled,
148
+ .fs-form-time:disabled {
115
149
  color: var(--fs-color-muted);
116
150
  background-color: var(--fs-color-subtle);
117
- opacity: var(--fs-disabled-opacity);
151
+ opacity: var(--fs-control-disabled-opacity);
118
152
  pointer-events: none;
119
153
  }
120
154
 
121
- .fs-form-control:read-only {
155
+ .fs-form-control:read-only,
156
+ .fs-form-textarea:read-only,
157
+ .fs-form-date:read-only,
158
+ .fs-form-time:read-only {
122
159
  background-color: var(--fs-color-subtle);
123
160
  cursor: default;
124
161
  }
125
162
 
163
+ .fs-form-control[type="search"] {
164
+ appearance: auto;
165
+ }
166
+
167
+ .fs-form-control[type="date"],
168
+ .fs-form-control[type="time"],
169
+ .fs-form-date,
170
+ .fs-form-time {
171
+ accent-color: var(--fs-color-primary);
172
+ }
173
+
126
174
  .fs-floating-label {
127
175
  position: relative;
128
176
  }
@@ -143,25 +191,49 @@
143
191
  }
144
192
 
145
193
  .fs-form-control[aria-invalid="true"],
194
+ .fs-form-textarea[aria-invalid="true"],
195
+ .fs-form-date[aria-invalid="true"],
196
+ .fs-form-time[aria-invalid="true"],
146
197
  .fs-was-validated .fs-form-control:invalid {
147
- border-color: var(--fs-color-danger);
198
+ border-color: var(--fs-control-invalid-color);
148
199
  }
149
200
 
150
201
  .fs-form-control[aria-invalid="false"],
202
+ .fs-form-textarea[aria-invalid="false"],
203
+ .fs-form-date[aria-invalid="false"],
204
+ .fs-form-time[aria-invalid="false"],
151
205
  .fs-was-validated .fs-form-control:valid {
152
- border-color: var(--fs-color-success);
206
+ border-color: var(--fs-control-valid-color);
153
207
  }
154
208
 
155
209
  .fs-form-control-sm {
156
210
  height: var(--fs-control-height-sm);
211
+ min-block-size: var(--fs-control-height-sm);
212
+ padding-inline: var(--fs-control-padding-x-sm);
157
213
  font-size: $font-size-xs;
158
214
  }
159
215
 
160
216
  .fs-form-control-lg {
161
217
  height: var(--fs-control-height-lg);
218
+ min-block-size: var(--fs-control-height-lg);
219
+ padding-inline: var(--fs-control-padding-x-lg);
162
220
  font-size: $font-size-md;
163
221
  }
164
222
 
223
+ .fs-form-control-xs {
224
+ height: var(--fs-control-height-xs);
225
+ min-block-size: var(--fs-control-height-xs);
226
+ padding-inline: var(--fs-control-padding-x-xs);
227
+ font-size: $font-size-xs;
228
+ }
229
+
230
+ .fs-form-control-xl {
231
+ height: var(--fs-control-height-xl);
232
+ min-block-size: var(--fs-control-height-xl);
233
+ padding-inline: var(--fs-control-padding-x-xl);
234
+ font-size: $font-size-lg;
235
+ }
236
+
165
237
  .fs-form-size-sm {
166
238
  width: 120px;
167
239
  }
@@ -205,15 +277,24 @@
205
277
  justify-content: space-between;
206
278
  width: 100%;
207
279
  height: var(--fs-control-height);
208
- padding: 0 7px;
209
- border: var(--fs-border-width) solid var(--fs-color-border-default);
210
- border-radius: var(--fs-radius-sm);
280
+ min-block-size: var(--fs-control-height);
281
+ padding-block: 0;
282
+ padding-inline: var(--fs-control-padding-x);
283
+ border: var(--fs-border-width) solid var(--fs-control-border-color);
284
+ border-radius: var(--fs-control-radius);
211
285
  color: var(--fs-color-text);
212
- background-color: var(--fs-color-surface);
286
+ background-color: var(--fs-control-bg);
213
287
  font-size: $font-size-md;
214
288
  font-weight: $font-weight-medium;
215
289
  text-align: left;
216
290
  cursor: pointer;
291
+ transition: var(--fs-control-transition);
292
+ color-scheme: light;
293
+ }
294
+
295
+ [data-theme="dark"] .fs-form-select,
296
+ [data-fs-theme="dark"] .fs-form-select {
297
+ color-scheme: dark;
217
298
  }
218
299
 
219
300
  .fs-form-select::after {
@@ -241,14 +322,32 @@
241
322
 
242
323
  .fs-form-select-sm {
243
324
  height: var(--fs-control-height-sm);
325
+ min-block-size: var(--fs-control-height-sm);
326
+ padding-inline: var(--fs-control-padding-x-sm);
244
327
  font-size: $font-size-xs;
245
328
  }
246
329
 
247
330
  .fs-form-select-lg {
248
331
  height: var(--fs-control-height-lg);
332
+ min-block-size: var(--fs-control-height-lg);
333
+ padding-inline: var(--fs-control-padding-x-lg);
249
334
  font-size: $font-size-md;
250
335
  }
251
336
 
337
+ .fs-form-select-xs {
338
+ height: var(--fs-control-height-xs);
339
+ min-block-size: var(--fs-control-height-xs);
340
+ padding-inline: var(--fs-control-padding-x-xs);
341
+ font-size: $font-size-xs;
342
+ }
343
+
344
+ .fs-form-select-xl {
345
+ height: var(--fs-control-height-xl);
346
+ min-block-size: var(--fs-control-height-xl);
347
+ padding-inline: var(--fs-control-padding-x-xl);
348
+ font-size: $font-size-lg;
349
+ }
350
+
252
351
  .fs-file-upload {
253
352
  position: relative;
254
353
  display: inline-flex;
@@ -356,10 +455,11 @@
356
455
  .fs-input-group-text {
357
456
  display: flex;
358
457
  align-items: center;
359
- padding: 0 12px;
360
- border: 1px solid var(--fs-color-border);
458
+ min-block-size: var(--fs-control-height);
459
+ padding-inline: var(--fs-control-padding-x);
460
+ border: var(--fs-border-width) solid var(--fs-control-border-color);
361
461
  color: var(--fs-color-muted);
362
- background-color: var(--fs-color-subtle);
462
+ background-color: var(--fs-control-addon-bg);
363
463
  font-size: $font-size-md;
364
464
  font-weight: $font-weight-medium;
365
465
  white-space: nowrap;
@@ -383,28 +483,55 @@
383
483
  }
384
484
 
385
485
  .fs-input-group > :first-child {
386
- border-top-left-radius: var(--fs-radius-sm);
387
- border-bottom-left-radius: var(--fs-radius-sm);
486
+ border-start-start-radius: var(--fs-control-radius);
487
+ border-end-start-radius: var(--fs-control-radius);
388
488
  }
389
489
 
390
490
  .fs-input-group > :last-child {
391
- border-top-right-radius: var(--fs-radius-sm);
392
- border-bottom-right-radius: var(--fs-radius-sm);
491
+ border-start-end-radius: var(--fs-control-radius);
492
+ border-end-end-radius: var(--fs-control-radius);
493
+ }
494
+
495
+ .fs-input-group:focus-within {
496
+ --fs-control-border-color: var(--fs-focus-color);
497
+ }
498
+
499
+ .fs-input-group.is-invalid,
500
+ .fs-input-group:has([aria-invalid="true"], .is-invalid) {
501
+ --fs-control-border-color: var(--fs-control-invalid-color);
502
+ }
503
+
504
+ .fs-input-group.is-valid,
505
+ .fs-input-group:has([aria-invalid="false"], .is-valid) {
506
+ --fs-control-border-color: var(--fs-control-valid-color);
507
+ }
508
+
509
+ .fs-input-group-stack-sm {
510
+ flex-wrap: wrap;
511
+ }
512
+
513
+ .fs-input-group-stack-sm > * {
514
+ flex: 1 1 100%;
515
+ width: 100%;
516
+ margin-inline-start: 0;
517
+ border-radius: var(--fs-control-radius);
393
518
  }
394
519
 
395
520
  .fs-input-group-sm > .fs-form-control,
396
521
  .fs-input-group-sm > .fs-form-select,
397
522
  .fs-input-group-sm > .fs-input-group-text {
398
- height: 30px;
399
- padding: 0 8px;
523
+ height: var(--fs-control-height-sm);
524
+ min-block-size: var(--fs-control-height-sm);
525
+ padding-inline: var(--fs-control-padding-x-sm);
400
526
  font-size: $font-size-xs;
401
527
  }
402
528
 
403
529
  .fs-input-group-lg > .fs-form-control,
404
530
  .fs-input-group-lg > .fs-form-select,
405
531
  .fs-input-group-lg > .fs-input-group-text {
406
- height: 46px;
407
- padding: 0 16px;
532
+ height: var(--fs-control-height-lg);
533
+ min-block-size: var(--fs-control-height-lg);
534
+ padding-inline: var(--fs-control-padding-x-lg);
408
535
  font-size: $font-size-lg;
409
536
  }
410
537
  }
@@ -25,6 +25,34 @@
25
25
  background: transparent;
26
26
  appearance: none;
27
27
  cursor: pointer;
28
+ accent-color: var(--fs-range-fill-color);
29
+ }
30
+
31
+ .fs-form-range-xs {
32
+ --fs-range-track-height: 4px;
33
+ --fs-range-thumb-size: 14px;
34
+ }
35
+
36
+ .fs-form-range-sm {
37
+ --fs-range-track-height: 5px;
38
+ --fs-range-thumb-size: 16px;
39
+ }
40
+
41
+ .fs-form-range-lg {
42
+ --fs-range-track-height: 8px;
43
+ --fs-range-thumb-size: 22px;
44
+ }
45
+
46
+ .fs-form-range-xl {
47
+ --fs-range-track-height: 10px;
48
+ --fs-range-thumb-size: 26px;
49
+ }
50
+
51
+ .fs-form-range-vertical {
52
+ width: var(--fs-range-thumb-size);
53
+ height: 160px;
54
+ writing-mode: vertical-lr;
55
+ direction: rtl;
28
56
  }
29
57
 
30
58
  .fs-form-range::-webkit-slider-runnable-track {
@@ -96,4 +124,5 @@
96
124
  font-weight: $font-weight-medium;
97
125
  text-align: center;
98
126
  }
127
+
99
128
  }
@@ -1,7 +1,8 @@
1
1
  // Respeita a preferência do sistema sem remover a funcionalidade dos
2
2
  // componentes: apenas reduz transições e animações ao estado final.
3
3
  @layer base {
4
- @media (prefers-reduced-motion: reduce) {
4
+ @if fs-feature-enabled(reduced-motion, true) {
5
+ @media (prefers-reduced-motion: reduce) {
5
6
  *,
6
7
  *::before,
7
8
  *::after {
@@ -21,4 +22,5 @@
21
22
  animation-iteration-count: infinite !important;
22
23
  }
23
24
  }
25
+ }
24
26
  }
@@ -7,16 +7,40 @@ $fs-config: (
7
7
  preset: full,
8
8
  components: all,
9
9
  utilities: all,
10
+ helpers: all,
10
11
  colors: all,
12
+ layout: all,
13
+ columns: all,
11
14
  spacing: all,
12
15
  sizing: all,
16
+ typography: all,
17
+ borders: all,
18
+ effects: all,
19
+ motion: all,
20
+ interactivity: all,
21
+ display: all,
22
+ flex: all,
23
+ grid: all,
13
24
  responsive: true,
14
25
  states: true,
15
26
  pseudo-variants: (responsive, focus-visible, disabled, checked, hover, print),
16
27
  fluid-type: true,
17
- color-modes: true
28
+ color-modes: true,
29
+ print: true,
30
+ rtl: true,
31
+ dark-mode: true,
32
+ reduced-motion: true,
33
+ important-utilities: true
18
34
  ) !default;
19
35
 
36
+ $fs-enable-dark-mode: true !default;
37
+ $fs-enable-rounded: true !default;
38
+ $fs-enable-shadows: true !default;
39
+ $fs-enable-important-utilities: true !default;
40
+ $fs-enable-helpers: true !default;
41
+ $fs-enable-print-utilities: true !default;
42
+ $fs-enable-rtl: true !default;
43
+
20
44
  @function fs-config-list-enabled($key, $item) {
21
45
 
22
46
  $value: fs-config-get($key, all);
@@ -39,5 +63,19 @@ $fs-config: (
39
63
  @function fs-feature-enabled($feature, $fallback: true) {
40
64
  $value: fs-config-get($feature, $fallback);
41
65
 
66
+ @if $feature == dark-mode and $fs-enable-dark-mode == false { @return false; }
67
+
68
+ @if $feature == helpers and $fs-enable-helpers == false { @return false; }
69
+
70
+ @if $feature == print and $fs-enable-print-utilities == false { @return false; }
71
+
72
+ @if $feature == rtl and $fs-enable-rtl == false { @return false; }
73
+
74
+ @if $feature == important-utilities and $fs-enable-important-utilities == false { @return false; }
75
+
76
+ @if $feature == rounded and $fs-enable-rounded == false { @return false; }
77
+
78
+ @if $feature == shadows and $fs-enable-shadows == false { @return false; }
79
+
42
80
  @return $value != false;
43
81
  }
@@ -4,3 +4,4 @@
4
4
  @forward "container-queries";
5
5
  @forward "spacing";
6
6
  @forward "typography";
7
+ @forward "utilities";
@@ -0,0 +1,86 @@
1
+ // Mapas públicos que alimentam os utilitários atômicos. Todos usam !default
2
+ // para que consumidores possam estender a escala antes do entry-point Sass.
3
+ $fs-utility-sizes: (
4
+ 0: 0,
5
+ 25: 25%,
6
+ 50: 50%,
7
+ 75: 75%,
8
+ 100: 100%,
9
+ auto: auto,
10
+ full: 100%,
11
+ screen: 100vw,
12
+ svh: 100svh,
13
+ dvh: 100dvh,
14
+ lvh: 100lvh
15
+ ) !default;
16
+
17
+ $fs-utility-border-widths: (
18
+ 0: 0,
19
+ 1: 1px,
20
+ 2: 2px,
21
+ 4: 4px,
22
+ 8: 8px
23
+ ) !default;
24
+
25
+ $fs-utility-radii: (
26
+ none: 0,
27
+ sm: var(--fs-radius-sm),
28
+ md: var(--fs-radius-md),
29
+ lg: var(--fs-radius-lg),
30
+ full: 9999px
31
+ ) !default;
32
+
33
+ $fs-utility-transition-durations: (
34
+ none: 0ms,
35
+ fast: var(--fs-transition-fast),
36
+ normal: var(--fs-transition-normal),
37
+ slow: 500ms
38
+ ) !default;
39
+
40
+ $fs-utility-easings: (
41
+ standard: var(--fs-ease-standard),
42
+ entrance: cubic-bezier(0, 0, 0.2, 1),
43
+ exit: cubic-bezier(0.4, 0, 1, 1),
44
+ linear: linear
45
+ ) !default;
46
+
47
+ // Registro declarativo para extensões simples. Os módulos de categoria
48
+ // continuam sendo responsáveis pelas APIs históricas; este mapa é a nova
49
+ // superfície de extensão para consumidores e para utilitários sem aliases.
50
+ $fs-utility-object-values: (
51
+ contain: contain,
52
+ cover: cover,
53
+ fill: fill,
54
+ none: none,
55
+ "scale-down": scale-down
56
+ ) !default;
57
+
58
+ $fs-utility-z-values: (
59
+ base: var(--fs-z-base, 0),
60
+ dropdown: var(--fs-z-dropdown, 1000),
61
+ sticky: var(--fs-z-sticky, 1020),
62
+ modal: var(--fs-z-modal, 1050),
63
+ offcanvas: var(--fs-z-offcanvas, 1060),
64
+ notification: var(--fs-z-notification, 1080),
65
+ toast: var(--fs-z-toast, 1090),
66
+ tooltip: var(--fs-z-tooltip, 1100)
67
+ ) !default;
68
+
69
+ $fs-utilities: (
70
+ object-fit: (
71
+ property: object-fit,
72
+ class: object,
73
+ values: $fs-utility-object-values,
74
+ category: layout,
75
+ responsive: false,
76
+ important: true
77
+ ),
78
+ z-index: (
79
+ property: z-index,
80
+ class: z,
81
+ values: $fs-utility-z-values,
82
+ category: interactivity,
83
+ responsive: false,
84
+ important: true
85
+ )
86
+ ) !default;
@@ -12,6 +12,7 @@
12
12
  // contraste com o branco); `info` não tem margem e fica sem alteração (100%).
13
13
  // Misturas em `$method: oklch` (ver tools/_mixins.scss) — recalibrado e
14
14
  // revalidado com `npm run contrast` após a migração para OKLCH.
15
+ @if fs-feature-enabled(dark-mode, true) {
15
16
  @layer tokens {
16
17
  $dark-color-weights: (
17
18
  primary: 95%,
@@ -51,6 +52,13 @@
51
52
  --fs-color-focus: var(--fs-color-primary);
52
53
  --fs-color-action-primary: var(--fs-color-primary);
53
54
  --fs-color-action-danger: var(--fs-color-danger);
55
+ --fs-control-bg: var(--fs-color-surface);
56
+ --fs-control-border-color: var(--fs-color-border);
57
+ --fs-control-hover-bg: var(--fs-color-subtle);
58
+ --fs-control-placeholder-color: var(--fs-color-muted);
59
+ --fs-control-invalid-color: var(--fs-color-danger);
60
+ --fs-control-valid-color: var(--fs-color-success);
61
+ --fs-control-addon-bg: var(--fs-color-subtle);
54
62
  --fs-shadow-sm: 0 1px 3px rgb(0 0 0 / 50%), 0 1px 2px rgb(0 0 0 / 40%);
55
63
  --fs-shadow-md: 0 6px 12px rgb(0 0 0 / 55%), 0 3px 6px rgb(0 0 0 / 45%);
56
64
  --fs-shadow-lg: 0 15px 30px rgb(0 0 0 / 60%), 0 6px 12px rgb(0 0 0 / 50%);
@@ -129,3 +137,4 @@
129
137
  }
130
138
  }
131
139
  }
140
+ }
@@ -50,9 +50,26 @@
50
50
  --fs-control-height: 38px;
51
51
  --fs-control-height-sm: 30px;
52
52
  --fs-control-height-lg: 46px;
53
+ --fs-control-height-xs: 26px;
54
+ --fs-control-height-xl: 52px;
53
55
  --fs-control-padding-x: 12px;
54
56
  --fs-control-padding-x-sm: 8px;
55
57
  --fs-control-padding-x-lg: 16px;
58
+ --fs-control-padding-x-xs: 6px;
59
+ --fs-control-padding-x-xl: 20px;
60
+ --fs-control-border-color: var(--fs-color-border);
61
+ --fs-control-bg: var(--fs-color-surface);
62
+ --fs-control-hover-bg: var(--fs-color-subtle);
63
+ --fs-control-placeholder-color: var(--fs-color-muted);
64
+ --fs-control-focus-color: var(--fs-focus-color);
65
+ --fs-control-invalid-color: var(--fs-color-danger);
66
+ --fs-control-valid-color: var(--fs-color-success);
67
+ --fs-control-disabled-opacity: var(--fs-disabled-opacity);
68
+ --fs-control-radius: var(--fs-radius-sm);
69
+ --fs-control-touch-target: 44px;
70
+ --fs-control-transition: color var(--fs-transition-fast) var(--fs-ease-standard), 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);
71
+ --fs-control-option-gap: var(--fs-space-2);
72
+ --fs-control-addon-bg: var(--fs-color-subtle);
56
73
  --fs-focus-width: 2px;
57
74
  --fs-focus-offset: 2px;
58
75
  --fs-focus-color: var(--fs-color-primary);
@@ -103,6 +120,12 @@
103
120
  @each $name, $bg in $theme-bg-colors {
104
121
  --fs-feedback-#{$name}-bg: #{rgb-fallback($bg)};
105
122
  }
123
+
124
+ @each $name, $color in $theme-colors {
125
+ --fs-color-#{$name}-bg-subtle: var(--fs-feedback-#{$name}-bg);
126
+ --fs-color-#{$name}-border-subtle: var(--fs-color-#{$name});
127
+ --fs-color-#{$name}-text-emphasis: var(--fs-alert-#{$name}-text);
128
+ }
106
129
  }
107
130
 
108
131
  // Bloco condicional: valores nativos em OKLCH. `@supports (color: oklch(0%