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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fokus-styles",
3
- "version": "2.6.2",
3
+ "version": "2.7.0",
4
4
  "description": "Fokus Styles is a complete CSS framework with components, utilities, vanilla JavaScript, icons, React wrappers, and a CLI.",
5
5
  "keywords": [
6
6
  "css",
@@ -65,6 +65,7 @@
65
65
  "./forms.css": "./dist/css/forms.css",
66
66
  "./components.css": "./dist/css/components.css",
67
67
  "./helpers.css": "./dist/css/helpers.css",
68
+ "./helpers-only.css": "./dist/css/fokus-helpers.css",
68
69
  "./core": "./dist/css/fokus-core.css",
69
70
  "./components": "./dist/css/fokus-components.css",
70
71
  "./utilities": "./dist/css/fokus-utilities.css",
@@ -11,4 +11,16 @@
11
11
  .fs-button-group > .fs-btn + .fs-btn { margin-inline-start: -1px; }
12
12
  .fs-button-group-vertical { flex-direction: column; align-items: flex-start; }
13
13
  .fs-button-group-vertical > .fs-btn { width: 100%; }
14
+
15
+ .fs-button-group[role="group"] {
16
+ isolation: isolate;
17
+ }
18
+
19
+ .fs-button-group > .fs-btn:focus-visible { z-index: 2; }
20
+
21
+ .fs-button-group > .fs-btn[aria-pressed="true"] {
22
+ --fs-btn-bg: var(--fs-color-primary);
23
+ --fs-btn-color: var(--fs-color-on-primary);
24
+ --fs-btn-border-color: var(--fs-color-primary);
25
+ }
14
26
  }
@@ -17,7 +17,9 @@
17
17
  justify-content: center;
18
18
  gap: var(--fs-space-1);
19
19
  min-height: var(--fs-control-height);
20
- padding: 0 var(--fs-control-padding-x);
20
+ min-block-size: var(--fs-control-height);
21
+ padding-block: 0;
22
+ padding-inline: var(--fs-control-padding-x);
21
23
  border: var(--fs-border-width) solid var(--fs-btn-border-color);
22
24
  border-radius: var(--fs-radius-sm);
23
25
  color: var(--fs-btn-color);
@@ -26,10 +28,8 @@
26
28
  font-weight: $font-weight-medium;
27
29
  text-decoration: none;
28
30
  cursor: pointer;
29
- transition: color var(--fs-transition-fast) var(--fs-ease-standard),
30
- background-color var(--fs-transition-fast) var(--fs-ease-standard),
31
- border-color var(--fs-transition-fast) var(--fs-ease-standard),
32
- box-shadow var(--fs-transition-fast) var(--fs-ease-standard);
31
+ transition: var(--fs-control-transition);
32
+ white-space: nowrap;
33
33
  }
34
34
 
35
35
  .fs-btn:hover {
@@ -45,11 +45,42 @@
45
45
  }
46
46
 
47
47
  .fs-btn:disabled,
48
- .fs-btn.is-disabled {
48
+ .fs-btn.is-disabled,
49
+ .fs-btn[aria-disabled="true"] {
49
50
  opacity: var(--fs-disabled-opacity);
51
+ cursor: not-allowed;
52
+ }
53
+
54
+ .fs-btn[aria-disabled="true"] {
55
+ pointer-events: none;
56
+ }
57
+
58
+ .fs-btn.is-loading,
59
+ .fs-btn[aria-busy="true"] {
60
+ cursor: wait;
50
61
  pointer-events: none;
51
62
  }
52
63
 
64
+ .fs-btn.is-loading::after,
65
+ .fs-btn[aria-busy="true"]::after {
66
+ width: 1em;
67
+ height: 1em;
68
+ border: 2px solid currentcolor;
69
+ border-inline-end-color: transparent;
70
+ border-radius: 50%;
71
+ content: "";
72
+ animation: fokus-spin 650ms linear infinite;
73
+ }
74
+
75
+ .fs-btn-icon {
76
+ display: inline-grid;
77
+ width: var(--fs-control-touch-target);
78
+ min-width: var(--fs-control-touch-target);
79
+ min-height: var(--fs-control-touch-target);
80
+ padding: 0;
81
+ place-items: center;
82
+ }
83
+
53
84
  @each $name, $color in $theme-colors {
54
85
  .fs-btn-#{$name} {
55
86
  --fs-btn-color: var(--fs-color-on-#{$name});
@@ -74,12 +105,14 @@
74
105
 
75
106
  .fs-btn-sm {
76
107
  min-height: var(--fs-control-height-sm);
108
+ min-block-size: var(--fs-control-height-sm);
77
109
  padding: 0 var(--fs-control-padding-x-sm);
78
110
  font-size: $font-size-sm;
79
111
  }
80
112
 
81
113
  .fs-btn-lg {
82
114
  min-height: var(--fs-control-height-lg);
115
+ min-block-size: var(--fs-control-height-lg);
83
116
  padding: 0 var(--fs-control-padding-x-lg);
84
117
  font-size: $font-size-lg;
85
118
  }
@@ -7,10 +7,32 @@
7
7
  // (chrome do SO, não estilizável via token), que fica invisível sobre
8
8
  // --fs-color-surface escuro sem essa correção.
9
9
  [data-theme="dark"] .fs-form-control[type="date"]::-webkit-calendar-picker-indicator,
10
- [data-theme="dark"] .fs-form-control[type="time"]::-webkit-calendar-picker-indicator {
10
+ [data-theme="dark"] .fs-form-control[type="time"]::-webkit-calendar-picker-indicator,
11
+ [data-theme="dark"] .fs-form-date::-webkit-calendar-picker-indicator,
12
+ [data-theme="dark"] .fs-form-time::-webkit-calendar-picker-indicator {
11
13
  filter: invert(1);
12
14
  }
13
15
 
16
+ .fs-form-date,
17
+ .fs-form-time {
18
+ appearance: auto;
19
+ color-scheme: light;
20
+ }
21
+
22
+ [data-theme="dark"] .fs-form-date,
23
+ [data-theme="dark"] .fs-form-time,
24
+ [data-fs-theme="dark"] .fs-form-date,
25
+ [data-fs-theme="dark"] .fs-form-time,
26
+ [data-theme="dark"] .fs-datepicker-panel,
27
+ [data-fs-theme="dark"] .fs-datepicker-panel {
28
+ color-scheme: dark;
29
+ }
30
+
31
+ .fs-form-date::-webkit-calendar-picker-indicator,
32
+ .fs-form-time::-webkit-calendar-picker-indicator {
33
+ cursor: pointer;
34
+ }
35
+
14
36
  .fs-datepicker {
15
37
  position: relative;
16
38
  display: inline-flex;
@@ -27,6 +49,7 @@
27
49
  background-color: var(--fs-color-surface);
28
50
  box-shadow: var(--fs-shadow-md);
29
51
  z-index: var(--fs-z-dropdown);
52
+ color-scheme: light;
30
53
  }
31
54
 
32
55
  .fs-datepicker-panel.is-open {
@@ -134,4 +157,27 @@
134
157
  pointer-events: none;
135
158
  opacity: 0.4;
136
159
  }
160
+
161
+ .fs-datepicker-day[aria-current="date"] {
162
+ outline: var(--fs-border-width) solid var(--fs-color-primary);
163
+ outline-offset: -2px;
164
+ }
165
+
166
+ .fs-datepicker-title[aria-live="polite"] {
167
+ min-inline-size: 8rem;
168
+ text-align: center;
169
+ }
170
+
171
+ @media (forced-colors: active) {
172
+ .fs-datepicker-panel {
173
+ border: 1px solid CanvasText;
174
+ background: Canvas;
175
+ color: CanvasText;
176
+ }
177
+
178
+ .fs-datepicker-day.is-selected {
179
+ background: Highlight;
180
+ color: HighlightText;
181
+ }
182
+ }
137
183
  }
@@ -22,11 +22,21 @@
22
22
  }
23
23
 
24
24
  .fs-dropdown-menu {
25
+ --fs-dropdown-min-inline-size: 12rem;
26
+ --fs-dropdown-max-block-size: min(70vh, 28rem);
27
+ --fs-dropdown-offset: 0.25rem;
28
+ --fs-dropdown-padding-block: 0.375rem;
29
+ --fs-dropdown-item-padding-block: 0.5rem;
30
+ --fs-dropdown-item-padding-inline: 1rem;
31
+
25
32
  position: absolute;
26
33
  display: none;
27
- min-width: 180px;
34
+ min-inline-size: var(--fs-dropdown-min-inline-size);
35
+ max-block-size: var(--fs-dropdown-max-block-size);
36
+ overflow-y: auto;
28
37
  margin: 0;
29
- padding: 6px 0;
38
+ padding-block: var(--fs-dropdown-padding-block);
39
+ padding-inline: 0;
30
40
  border: var(--fs-border-width) solid var(--fs-color-border-default);
31
41
  border-radius: var(--fs-radius-md);
32
42
  color: var(--fs-color-text);
@@ -35,6 +45,23 @@
35
45
  z-index: var(--fs-z-dropdown);
36
46
  }
37
47
 
48
+ .fs-dropdown-menu[data-placement="top"] { transform-origin: bottom center; }
49
+ .fs-dropdown-menu[data-placement="bottom"] { transform-origin: top center; }
50
+ .fs-dropdown-menu[data-placement="left"] { transform-origin: right center; }
51
+ .fs-dropdown-menu[data-placement="right"] { transform-origin: left center; }
52
+
53
+ .fs-dropdown-menu.fs-dropdown-menu-sm {
54
+ --fs-dropdown-min-inline-size: 10rem;
55
+ --fs-dropdown-item-padding-block: 0.375rem;
56
+ --fs-dropdown-item-padding-inline: 0.75rem;
57
+ }
58
+
59
+ .fs-dropdown-menu.fs-dropdown-menu-lg {
60
+ --fs-dropdown-min-inline-size: 16rem;
61
+ --fs-dropdown-item-padding-block: 0.625rem;
62
+ --fs-dropdown-item-padding-inline: 1.25rem;
63
+ }
64
+
38
65
  .fs-dropdown-menu.is-open {
39
66
  display: block;
40
67
  }
@@ -43,12 +70,14 @@
43
70
  display: flex;
44
71
  align-items: center;
45
72
  width: 100%;
46
- padding: 8px 16px;
73
+ min-block-size: 2.5rem;
74
+ padding-block: var(--fs-dropdown-item-padding-block);
75
+ padding-inline: var(--fs-dropdown-item-padding-inline);
47
76
  border: 0;
48
77
  color: var(--fs-color-text);
49
78
  background-color: var(--fs-color-surface-raised);
50
79
  font-size: $font-size-md;
51
- text-align: left;
80
+ text-align: start;
52
81
  text-decoration: none;
53
82
  cursor: pointer;
54
83
  }
@@ -71,18 +100,195 @@
71
100
  opacity: 0.6;
72
101
  }
73
102
 
103
+ .fs-dropdown-item[aria-disabled="true"],
104
+ .fs-dropdown-item:disabled {
105
+ color: var(--fs-color-muted);
106
+ pointer-events: none;
107
+ opacity: 0.6;
108
+ cursor: not-allowed;
109
+ }
110
+
111
+ .fs-dropdown-item .fs-icon,
112
+ .fs-dropdown-item > svg {
113
+ flex: 0 0 auto;
114
+ }
115
+
74
116
  .fs-dropdown-divider {
75
117
  height: 1px;
76
- margin: 6px 0;
118
+ margin-block: 6px;
119
+ margin-inline: 0;
77
120
  border: none;
78
121
  background-color: var(--fs-color-border);
79
122
  }
80
123
 
81
124
  .fs-dropdown-header {
82
- padding: 4px 16px;
125
+ padding-block: 4px;
126
+ padding-inline: var(--fs-dropdown-item-padding-inline);
83
127
  color: var(--fs-color-muted);
84
128
  font-size: $font-size-xs;
85
129
  font-weight: $font-weight-medium;
86
130
  text-transform: uppercase;
87
131
  }
132
+
133
+ .fs-dropdown-content {
134
+ padding-block: var(--fs-dropdown-padding-block);
135
+ }
136
+
137
+ .fs-dropdown-content > .fs-dropdown-item {
138
+ min-block-size: auto;
139
+ }
140
+
141
+ // Conteúdo rico: painel composto com identidade, metadados e ações
142
+ // secundárias. Os itens continuam sendo links/botões reais, mas não
143
+ // recebem a aparência de uma lista simples quando carregam descrição.
144
+ .fs-dropdown-menu.fs-dropdown-rich {
145
+ --fs-dropdown-rich-inline-size: 22rem;
146
+
147
+ inline-size: min(var(--fs-dropdown-rich-inline-size), calc(100vw - 2rem));
148
+ min-inline-size: 0;
149
+ max-inline-size: calc(100vw - 2rem);
150
+ padding-block: 0;
151
+ overflow: hidden;
152
+ }
153
+
154
+ .fs-dropdown-rich-header {
155
+ display: flex;
156
+ align-items: flex-start;
157
+ gap: 0.75rem;
158
+ padding: 1rem;
159
+ }
160
+
161
+ .fs-dropdown-rich-avatar {
162
+ display: inline-grid;
163
+ flex: 0 0 2.25rem;
164
+ width: 2.25rem;
165
+ height: 2.25rem;
166
+ place-items: center;
167
+ border-radius: 50%;
168
+ color: var(--fs-color-on-primary);
169
+ background: var(--fs-color-primary);
170
+ font-size: $font-size-sm;
171
+ font-weight: $font-weight-bold;
172
+ }
173
+
174
+ .fs-dropdown-rich-heading {
175
+ display: grid;
176
+ min-inline-size: 0;
177
+ flex: 1 1 auto;
178
+ gap: 0.125rem;
179
+ }
180
+
181
+ .fs-dropdown-rich-title,
182
+ .fs-dropdown-rich-description,
183
+ .fs-dropdown-rich-item-title,
184
+ .fs-dropdown-rich-item-description {
185
+ overflow: hidden;
186
+ text-overflow: ellipsis;
187
+ white-space: nowrap;
188
+ }
189
+
190
+ .fs-dropdown-rich-title {
191
+ color: var(--fs-color-text);
192
+ font-size: $font-size-sm;
193
+ font-weight: $font-weight-semibold;
194
+ }
195
+
196
+ .fs-dropdown-rich-description,
197
+ .fs-dropdown-rich-item-description {
198
+ color: var(--fs-color-muted);
199
+ font-size: $font-size-xs;
200
+ }
201
+
202
+ .fs-dropdown-rich-status {
203
+ flex: 0 0 auto;
204
+ }
205
+
206
+ .fs-dropdown-rich-list {
207
+ display: grid;
208
+ gap: 0.25rem;
209
+ padding: 0.5rem;
210
+ }
211
+
212
+ .fs-dropdown-rich-list > .fs-dropdown-item {
213
+ min-block-size: 3.25rem;
214
+ gap: 0.75rem;
215
+ padding: 0.625rem 0.75rem;
216
+ border-radius: var(--fs-radius-sm);
217
+ background: transparent;
218
+ }
219
+
220
+ .fs-dropdown-rich-list > .fs-dropdown-item:hover,
221
+ .fs-dropdown-rich-list > .fs-dropdown-item:focus-visible {
222
+ background: var(--fs-color-subtle);
223
+ }
224
+
225
+ .fs-dropdown-rich-icon {
226
+ display: inline-grid;
227
+ flex: 0 0 2rem;
228
+ width: 2rem;
229
+ height: 2rem;
230
+ place-items: center;
231
+ border: 1px solid var(--fs-color-border-default);
232
+ border-radius: var(--fs-radius-sm);
233
+ color: var(--fs-color-primary);
234
+ background: var(--fs-color-surface);
235
+ }
236
+
237
+ .fs-dropdown-rich-icon > svg {
238
+ width: 1rem;
239
+ height: 1rem;
240
+ stroke: currentcolor;
241
+ }
242
+
243
+ .fs-dropdown-rich-copy {
244
+ display: grid;
245
+ min-inline-size: 0;
246
+ flex: 1 1 auto;
247
+ gap: 0.125rem;
248
+ }
249
+
250
+ .fs-dropdown-rich-item-title {
251
+ color: inherit;
252
+ font-size: $font-size-sm;
253
+ font-weight: $font-weight-semibold;
254
+ }
255
+
256
+ .fs-dropdown-rich-chevron {
257
+ flex: 0 0 auto;
258
+ color: var(--fs-color-muted);
259
+ font-size: $font-size-lg;
260
+ line-height: 1;
261
+ }
262
+
263
+ .fs-dropdown-rich-footer {
264
+ display: flex;
265
+ align-items: center;
266
+ justify-content: space-between;
267
+ gap: 0.75rem;
268
+ padding: 0.75rem 1rem;
269
+ color: var(--fs-color-muted);
270
+ background: var(--fs-color-subtle);
271
+ font-size: $font-size-xs;
272
+ }
273
+
274
+ .fs-dropdown-rich-footer a {
275
+ color: var(--fs-color-primary);
276
+ font-weight: $font-weight-semibold;
277
+ text-decoration: none;
278
+ }
279
+
280
+ .fs-dropdown-rich-footer a:hover,
281
+ .fs-dropdown-rich-footer a:focus-visible {
282
+ text-decoration: underline;
283
+ }
284
+
285
+ .fs-dropdown-item.fs-dropdown-item-danger {
286
+ color: var(--fs-color-danger);
287
+ }
288
+
289
+ .fs-dropdown-item.fs-dropdown-item-danger:hover,
290
+ .fs-dropdown-item.fs-dropdown-item-danger:focus-visible {
291
+ color: var(--fs-color-on-danger);
292
+ background-color: var(--fs-color-danger);
293
+ }
88
294
  }
@@ -4,6 +4,7 @@
4
4
  @use "badges";
5
5
  @use "tables";
6
6
  @use "navbar";
7
+ @use "menu";
7
8
  @use "combobox";
8
9
  @use "datepicker";
9
10
  @use "datatable";
@@ -0,0 +1,95 @@
1
+ @use "../../../fokus-core/scss/settings" as *;
2
+ @use "../../../fokus-core/scss/tools" as *;
3
+
4
+ @layer components {
5
+ .fs-menu {
6
+ --fs-menu-item-padding-block: 0.5rem;
7
+ --fs-menu-item-padding-inline: 0.75rem;
8
+ --fs-menu-item-radius: var(--fs-radius-sm);
9
+ --fs-menu-label-color: var(--fs-color-muted);
10
+ --fs-menu-nested-indent: 0.875rem;
11
+
12
+ min-inline-size: 12rem;
13
+ }
14
+
15
+ .fs-menu-label {
16
+ margin-block: 1rem 0.375rem;
17
+ padding-inline: var(--fs-menu-item-padding-inline);
18
+ color: var(--fs-menu-label-color);
19
+ font-size: $font-size-xs;
20
+ font-weight: $font-weight-medium;
21
+ letter-spacing: 0.06em;
22
+ text-transform: uppercase;
23
+ }
24
+
25
+ .fs-menu-label:first-child { margin-block-start: 0; }
26
+
27
+ .fs-menu-list,
28
+ .fs-menu-list ul {
29
+ margin: 0;
30
+ padding: 0;
31
+ list-style: none;
32
+ }
33
+
34
+ .fs-menu-list ul {
35
+ margin-block-start: 0.25rem;
36
+ padding-inline-start: var(--fs-menu-nested-indent);
37
+ border-inline-start: var(--fs-border-width) solid var(--fs-color-border-default);
38
+ }
39
+
40
+ .fs-menu-list a,
41
+ .fs-menu-list button {
42
+ display: flex;
43
+ align-items: center;
44
+ gap: 0.5rem;
45
+ inline-size: 100%;
46
+ min-block-size: 2.5rem;
47
+ padding-block: var(--fs-menu-item-padding-block);
48
+ padding-inline: var(--fs-menu-item-padding-inline);
49
+ border: 0;
50
+ border-radius: var(--fs-menu-item-radius);
51
+ color: var(--fs-color-text);
52
+ background: transparent;
53
+ font: inherit;
54
+ text-align: start;
55
+ text-decoration: none;
56
+ cursor: pointer;
57
+ }
58
+
59
+ .fs-menu-list a:hover,
60
+ .fs-menu-list a:focus-visible,
61
+ .fs-menu-list button:hover,
62
+ .fs-menu-list button:focus-visible {
63
+ color: var(--fs-color-text);
64
+ background-color: var(--fs-color-subtle);
65
+ outline: none;
66
+ }
67
+
68
+ .fs-menu-list .is-active,
69
+ .fs-menu-list [aria-current="page"] {
70
+ color: var(--fs-alert-primary-text);
71
+ background-color: var(--fs-color-primary-bg-subtle);
72
+ font-weight: $font-weight-medium;
73
+ }
74
+
75
+ .fs-menu-list .is-disabled,
76
+ .fs-menu-list [aria-disabled="true"],
77
+ .fs-menu-list :disabled {
78
+ color: var(--fs-color-muted);
79
+ pointer-events: none;
80
+ opacity: 0.6;
81
+ }
82
+
83
+ .fs-menu-compact {
84
+ --fs-menu-item-padding-block: 0.375rem;
85
+ --fs-menu-item-padding-inline: 0.625rem;
86
+ }
87
+
88
+ .fs-menu-bordered {
89
+ padding: 0.375rem;
90
+ border: var(--fs-border-width) solid var(--fs-color-border-default);
91
+ border-radius: var(--fs-radius-md);
92
+ background-color: var(--fs-color-surface);
93
+ box-shadow: var(--fs-shadow-sm);
94
+ }
95
+ }
@@ -8,6 +8,21 @@
8
8
  margin: 0;
9
9
  padding: 0;
10
10
  list-style: none;
11
+ align-items: center;
12
+ flex-wrap: wrap;
13
+ }
14
+
15
+ .fs-pagination-centered { justify-content: center; }
16
+ .fs-pagination-right { justify-content: flex-end; }
17
+
18
+ .fs-pagination-list {
19
+ display: flex;
20
+ align-items: center;
21
+ flex-wrap: wrap;
22
+ gap: 0.25rem;
23
+ margin: 0;
24
+ padding: 0;
25
+ list-style: none;
11
26
  }
12
27
 
13
28
  .fs-pagination-scroll {
@@ -24,19 +39,21 @@
24
39
  display: inline-flex;
25
40
  align-items: center;
26
41
  justify-content: center;
27
- min-width: 32px;
28
- height: 32px;
29
- padding: 0 8px;
30
- border: 1px solid var(--fs-color-border);
42
+ min-inline-size: 2rem;
43
+ min-block-size: 2rem;
44
+ padding-inline: 0.5rem;
45
+ border: var(--fs-border-width) solid var(--fs-color-border-default);
31
46
  border-radius: var(--fs-radius-sm);
32
47
  color: var(--fs-color-text);
33
48
  background-color: var(--fs-color-surface);
34
49
  text-decoration: none;
35
- transition: background-color 0.15s ease-in-out;
50
+ 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);
36
51
  }
37
52
 
38
53
  .fs-page-link:hover {
54
+ color: var(--fs-color-primary);
39
55
  background-color: var(--fs-color-subtle);
56
+ border-color: var(--fs-color-primary);
40
57
  }
41
58
 
42
59
  .fs-page-link:focus-visible {
@@ -55,6 +72,16 @@
55
72
  pointer-events: none;
56
73
  }
57
74
 
75
+ .fs-page-item[aria-disabled="true"] .fs-page-link,
76
+ .fs-page-link[aria-disabled="true"] {
77
+ color: var(--fs-color-muted);
78
+ opacity: 0.6;
79
+ pointer-events: none;
80
+ cursor: not-allowed;
81
+ }
82
+
83
+ .fs-pagination-rounded .fs-page-link { border-radius: 999px; }
84
+
58
85
  // Bordered: itens colados (sem gap), borda contínua fundida (técnica do
59
86
  // Input Group — margin negativo + z-index no item ativo/hover), cantos
60
87
  // arredondados só nas pontas.
@@ -67,17 +94,17 @@
67
94
  }
68
95
 
69
96
  .fs-pagination-bordered .fs-page-item:not(:first-child) .fs-page-link {
70
- margin-left: -1px;
97
+ margin-inline-start: -1px;
71
98
  }
72
99
 
73
100
  .fs-pagination-bordered .fs-page-item:first-child .fs-page-link {
74
- border-top-left-radius: var(--fs-radius-sm);
75
- border-bottom-left-radius: var(--fs-radius-sm);
101
+ border-start-start-radius: var(--fs-radius-sm);
102
+ border-end-start-radius: var(--fs-radius-sm);
76
103
  }
77
104
 
78
105
  .fs-pagination-bordered .fs-page-item:last-child .fs-page-link {
79
- border-top-right-radius: var(--fs-radius-sm);
80
- border-bottom-right-radius: var(--fs-radius-sm);
106
+ border-start-end-radius: var(--fs-radius-sm);
107
+ border-end-end-radius: var(--fs-radius-sm);
81
108
  }
82
109
 
83
110
  .fs-pagination-bordered .fs-page-link:hover,
@@ -88,16 +115,16 @@
88
115
 
89
116
  // Compacta / grande — mesma escala sm/lg dos outros componentes.
90
117
  .fs-pagination-sm .fs-page-link {
91
- min-width: 26px;
92
- height: 26px;
93
- padding: 0 6px;
118
+ min-inline-size: 1.625rem;
119
+ min-block-size: 1.625rem;
120
+ padding-inline: 0.375rem;
94
121
  font-size: $font-size-xs;
95
122
  }
96
123
 
97
124
  .fs-pagination-lg .fs-page-link {
98
- min-width: 40px;
99
- height: 40px;
100
- padding: 0 12px;
125
+ min-inline-size: 2.5rem;
126
+ min-block-size: 2.5rem;
127
+ padding-inline: 0.75rem;
101
128
  font-size: $font-size-md;
102
129
  }
103
130
 
@@ -13,8 +13,11 @@
13
13
  border: 1px solid var(--fs-color-border);
14
14
  border-radius: var(--fs-radius-sm);
15
15
  overflow: hidden;
16
+ max-inline-size: 100%;
16
17
  }
17
18
 
19
+ .fs-segmented-control-vertical { flex-direction: column; }
20
+
18
21
  .fs-segmented-item {
19
22
  display: flex;
20
23
  }
@@ -41,6 +44,7 @@
41
44
  align-items: center;
42
45
  justify-content: center;
43
46
  min-height: 38px;
47
+ min-block-size: var(--fs-control-touch-target);
44
48
  padding: 0 12px;
45
49
  color: var(--fs-color-text);
46
50
  background-color: var(--fs-color-surface);
@@ -50,7 +54,7 @@
50
54
  white-space: nowrap;
51
55
  cursor: pointer;
52
56
  user-select: none;
53
- transition: background-color 0.15s ease-in-out, color 0.15s ease-in-out;
57
+ transition: var(--fs-control-transition);
54
58
  }
55
59
 
56
60
  .fs-segmented-label:hover {
@@ -74,6 +78,17 @@
74
78
  pointer-events: none;
75
79
  }
76
80
 
81
+ .fs-segmented-input[aria-invalid="true"] + .fs-segmented-label,
82
+ .fs-segmented-control.is-invalid {
83
+ outline: var(--fs-border-width) solid var(--fs-control-invalid-color);
84
+ outline-offset: var(--fs-focus-offset);
85
+ }
86
+
87
+ .fs-segmented-control-vertical .fs-segmented-item:not(:first-child) .fs-segmented-label {
88
+ border-block-start: 1px solid var(--fs-color-border);
89
+ border-inline-start: 0;
90
+ }
91
+
77
92
  .fs-segmented-control-sm .fs-segmented-label {
78
93
  min-height: 30px;
79
94
  padding: 0 8px;