@inchurch/matcha-theme 20.0.8 → 20.276.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 (99) hide show
  1. package/abstracts/_colors.scss +404 -404
  2. package/abstracts/_elevation.scss +102 -102
  3. package/abstracts/_functions.scss +1212 -1212
  4. package/abstracts/_media-breakpoint.scss +23 -23
  5. package/abstracts/_typography.scss +127 -127
  6. package/base/_reset.scss +438 -438
  7. package/components/app-page-header.scss +260 -0
  8. package/components/matcha-accordion.scss +294 -157
  9. package/components/matcha-avatar.scss +171 -31
  10. package/components/matcha-badge.scss +4 -4
  11. package/components/matcha-breadcrumb.scss +232 -126
  12. package/components/matcha-button-toggle.scss +44 -0
  13. package/components/matcha-buttons.scss +908 -784
  14. package/components/matcha-calendar.scss +70 -2
  15. package/components/matcha-cards.scss +28 -2
  16. package/components/matcha-checkbox.scss +191 -490
  17. package/components/matcha-chip.scss +297 -212
  18. package/components/matcha-command-palette.scss +291 -63
  19. package/components/matcha-crop.scss +407 -172
  20. package/components/matcha-date.scss +81 -81
  21. package/components/matcha-divider.scss +86 -31
  22. package/components/matcha-drawer.scss +201 -50
  23. package/components/matcha-drop-image.scss +14 -0
  24. package/components/matcha-drop-list.scss +42 -1
  25. package/components/matcha-empty-state.scss +195 -83
  26. package/components/matcha-flag.scss +93 -52
  27. package/components/matcha-footer.scss +68 -164
  28. package/components/matcha-form-field.scss +52 -0
  29. package/components/matcha-form-section.scss +101 -101
  30. package/components/matcha-header.scss +135 -325
  31. package/components/matcha-highlight.scss +65 -197
  32. package/components/matcha-hint-text.scss +21 -0
  33. package/components/matcha-horizontal-tree.scss +317 -317
  34. package/components/matcha-icon.scss +17 -25
  35. package/components/matcha-list.scss +5 -5
  36. package/components/matcha-menu.scss +13 -0
  37. package/components/matcha-modal.scss +58 -84
  38. package/components/matcha-nav.scss +361 -230
  39. package/components/matcha-notification.scss +413 -197
  40. package/components/matcha-option.scss +79 -23
  41. package/components/matcha-paginator.scss +689 -235
  42. package/components/matcha-panel.scss +42 -26
  43. package/components/matcha-profile-card.scss +50 -50
  44. package/components/matcha-progress-bar.scss +257 -153
  45. package/components/matcha-radio.scss +244 -452
  46. package/components/matcha-scrollbox-shadow.scss +122 -122
  47. package/components/matcha-select.scss +3 -3
  48. package/components/matcha-skeleton.scss +18 -0
  49. package/components/matcha-slide-toggle.scss +47 -2
  50. package/components/matcha-slider.scss +172 -75
  51. package/components/matcha-snack-bar.scss +114 -121
  52. package/components/matcha-spinner.scss +76 -57
  53. package/components/matcha-status-pill.scss +82 -0
  54. package/components/matcha-stepper.scss +377 -177
  55. package/components/matcha-table.scss +569 -785
  56. package/components/matcha-tabs.scss +624 -469
  57. package/components/matcha-text-editor.scss +98 -144
  58. package/components/matcha-toolbar.scss +359 -206
  59. package/components/matcha-tooltip.scss +156 -62
  60. package/components/matcha-tree-view.scss +189 -0
  61. package/components/matcha-uploader.scss +240 -62
  62. package/fonts/manrope/manrope-latin-ext.woff2 +0 -0
  63. package/fonts/manrope/manrope-latin.woff2 +0 -0
  64. package/layout/matcha-page-layout.scss +776 -0
  65. package/main.scss +232 -261
  66. package/package.json +1 -1
  67. package/tokens/_animations-tokens.scss +37 -37
  68. package/tokens/_breakpoints-tokens.scss +35 -26
  69. package/tokens/_color-tokens.scss +1152 -1152
  70. package/tokens/_css-custom-properties.scss +650 -568
  71. package/tokens/_spacing-tokens.scss +94 -94
  72. package/vendors/angular-editor.scss +56 -56
  73. package/vendors/angular-material-fixes.scss +297 -297
  74. package/vendors/charts.scss +92 -92
  75. package/vendors/ng5-slider.scss +56 -56
  76. package/vendors/ngx-material-timepicker.scss +50 -50
  77. package/fonts/CircularStd-Black.eot +0 -0
  78. package/fonts/CircularStd-Black.svg +0 -3426
  79. package/fonts/CircularStd-Black.ttf +0 -0
  80. package/fonts/CircularStd-Black.woff +0 -0
  81. package/fonts/CircularStd-Black.woff2 +0 -0
  82. package/fonts/CircularStd-Bold.eot +0 -0
  83. package/fonts/CircularStd-Bold.otf +0 -0
  84. package/fonts/CircularStd-Bold.svg +0 -13532
  85. package/fonts/CircularStd-Bold.ttf +0 -0
  86. package/fonts/CircularStd-Bold.woff +0 -0
  87. package/fonts/CircularStd-Bold.woff2 +0 -0
  88. package/fonts/CircularStd-Medium.eot +0 -0
  89. package/fonts/CircularStd-Medium.otf +0 -0
  90. package/fonts/CircularStd-Medium.svg +0 -13511
  91. package/fonts/CircularStd-Medium.ttf +0 -0
  92. package/fonts/CircularStd-Medium.woff +0 -0
  93. package/fonts/CircularStd-Medium.woff2 +0 -0
  94. package/fonts/CircularStd-Regular.eot +0 -0
  95. package/fonts/CircularStd-Regular.otf +0 -0
  96. package/fonts/CircularStd-Regular.svg +0 -2378
  97. package/fonts/CircularStd-Regular.ttf +0 -0
  98. package/fonts/CircularStd-Regular.woff +0 -0
  99. package/fonts/CircularStd-Regular.woff2 +0 -0
@@ -1,469 +1,624 @@
1
- @use "sass:map";
2
-
3
- @mixin _colorize-inactive-type-basic($theme, $color-functions) {
4
- &[inactivetype="basic"] {
5
- @each $colorName, $colorFn in $color-functions {
6
- &[inactivecolor="#{'' + $colorName}"] {
7
- .button-group matcha-tab-item {
8
-
9
- button[matcha-button],
10
- a[matcha-button] {
11
- &:not([active-item="true"]) {
12
- background: var(--matcha-color-surface, #{getSurface($theme)});
13
- color: call(#{$colorFn}, $theme);
14
- box-shadow: 0 0 0 0px inset;
15
-
16
- .ripple {
17
- background: call(#{$colorFn}Alpha, $theme); // ok: legacy ripple color token
18
- }
19
- }
20
- }
21
- }
22
- }
23
- }
24
-
25
- &[disabled],
26
- &[disabled]:not([disabled="false"]),
27
- &[disabled="true"] {
28
- &:not([active-item="true"]) {
29
- .button-group matcha-tab-item {
30
-
31
- button[matcha-button],
32
- a[matcha-button] {
33
- @include _disabled-basic-button($theme);
34
- }
35
- }
36
- }
37
- }
38
- }
39
- }
40
-
41
- @mixin _colorize-inactive-type-outline($theme, $color-functions) {
42
- &[inactivetype="outline"] {
43
-
44
- //disabled false
45
- &:not([disabled="true"]) {
46
- @each $colorName, $colorFn in $color-functions {
47
- &[inactivecolor="#{'' + $colorName}"] {
48
- .button-group matcha-tab-item {
49
-
50
- button[matcha-button],
51
- a[matcha-button] {
52
-
53
- //botão não ativo
54
- &:not([active-item="true"]) {
55
- color: call(#{$colorFn}, $theme);
56
- background: transparent;
57
- box-shadow: 0 0 0 2px call(#{$colorFn}, $theme) inset;
58
-
59
- .ripple {
60
- background: call(#{$colorFn}Alpha, $theme); // ok: legacy ripple color token
61
- }
62
- }
63
- }
64
- }
65
- }
66
- }
67
- }
68
-
69
- //disabled true
70
- &[disabled],
71
- &[disabled]:not([disabled="false"]),
72
- &[disabled="true"] {
73
- >.button-group matcha-tab-item {
74
-
75
- button[matcha-button],
76
- a[matcha-button] {
77
-
78
- //botão não ativo
79
- &:not([active-item="true"]) {
80
- @include _disabled-outline-button($theme);
81
- }
82
- }
83
- }
84
- }
85
- }
86
- }
87
-
88
- @mixin _colorize-inactive-type-alpha($theme, $color-functions) {
89
- &[inactivetype="alpha"] {
90
- @each $colorName, $colorFn in $color-functions {
91
- &[inactivecolor="#{'' + $colorName}"] {
92
- .button-group matcha-tab-item {
93
-
94
- button[matcha-button],
95
- a[matcha-button] {
96
- &:not([active-item="true"]) {
97
- color: call(#{$colorFn}, $theme);
98
- background: call(#{$colorFn}Alpha, $theme);
99
- box-shadow: 0 0 0 0px;
100
-
101
- .ripple {
102
- background: call(#{$colorFn}ContrastAlpha, $theme); // ok: legacy ripple color token
103
- }
104
- }
105
- }
106
- }
107
- }
108
- }
109
-
110
- &[disabled],
111
- &[disabled]:not([disabled="false"]),
112
- &[disabled="true"] {
113
- .button-group matcha-tab-item {
114
-
115
- button[matcha-button],
116
- a[matcha-button] {
117
-
118
- //botão não ativo
119
- &:not([active-item="true"]) {
120
- @include _disabled-alpha-button($theme);
121
- }
122
- }
123
- }
124
- }
125
- }
126
- }
127
-
128
- @mixin _colorize-inactive-type-link($theme, $color-functions) {
129
-
130
- &[inactivetype="link"] {
131
- @each $colorName, $colorFn in $color-functions {
132
- &[inactivecolor="#{'' + $colorName}"] {
133
- .button-group matcha-tab-item {
134
-
135
- button[matcha-button],
136
- a[matcha-button] {
137
- &:not([active-item="true"]) {
138
-
139
- background: transparent;
140
- color: call(#{$colorFn}, $theme);
141
- box-shadow: 0 0 0 0px;
142
-
143
- .ripple {
144
- background: call(#{$colorFn}Alpha, $theme); // ok: legacy ripple color token
145
- }
146
-
147
- }
148
- }
149
- }
150
- }
151
- }
152
-
153
- &[disabled],
154
- &[disabled]:not([disabled="false"]),
155
- &[disabled="true"] {
156
- .button-group matcha-tab-item {
157
-
158
- button[matcha-button],
159
- a[matcha-button] {
160
-
161
- //botão não ativo
162
- &:not([active-item="true"]) {
163
- @include _disabled-link-button($theme);
164
- }
165
- }
166
- }
167
- }
168
- }
169
- }
170
-
171
-
172
-
173
-
174
- @mixin matcha-tabs($theme) {
175
- $color-functions: (
176
- red: getRed,
177
- pink: getPink,
178
- purple: getPurple,
179
- deep-purple: getDeepPurple,
180
- indigo: getIndigo,
181
- blue: getBlue,
182
- light-blue: getLightBlue,
183
- cyan: getCyan,
184
- teal: getTeal,
185
- green: getGreen,
186
- light-green: getLightGreen,
187
- lime: getLime,
188
- yellow: getYellow,
189
- amber: getAmber,
190
- orange: getOrange,
191
- deep-orange: getDeepOrange,
192
- brown: getBrown,
193
- grey: getGrey,
194
- blue-grey: getBlueGrey,
195
- primary: getPrimary,
196
- accent: getAccent,
197
- success: getSuccess,
198
- warn: getWarn,
199
- danger: getDanger,
200
- info: getInfo,
201
- disabled: getDisabled,
202
- );
203
-
204
- matcha-tabs {
205
- display: flex;
206
- @include _colorize-inactive-type-basic($theme, $color-functions);
207
- @include _colorize-inactive-type-outline($theme, $color-functions);
208
- @include _colorize-inactive-type-alpha($theme, $color-functions);
209
- @include _colorize-inactive-type-link($theme, $color-functions);
210
-
211
- .button-group matcha-tab-item {
212
- button[matcha-button],
213
- a[matcha-button] {
214
- &:focus-visible:not([disabled]):not([disabled="true"]) {
215
- outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent, #{getAccent($theme)});
216
- outline-offset: var(--matcha-state-focus-ring-offset, 2px);
217
- }
218
- }
219
- }
220
-
221
- &[disabled],
222
- &[disabled]:not([disabled="false"]),
223
- &[disabled="true"] {
224
- .button-group matcha-tab-item {
225
-
226
- button[matcha-button],
227
- a[matcha-button] {
228
- &[active-item="true"] {
229
-
230
- &[outline],
231
- &[outline]:not([outline="false"]),
232
- &[outline="true"] {
233
- @include _disabled-outline-button($theme);
234
- }
235
-
236
- &[basic],
237
- &[basic]:not([basic="false"]),
238
- &[basic="true"] {
239
- @include _disabled-basic-button($theme);
240
- }
241
-
242
- &[alpha],
243
- &[alpha]:not([alpha="false"]),
244
- &[alpha="true"] {
245
- @include _disabled-alpha-button($theme);
246
- }
247
-
248
- &[link],
249
- &[link]:not([link="false"]),
250
- &[link="true"] {
251
- @include _disabled-link-button($theme);
252
- }
253
- }
254
- }
255
- }
256
-
257
- }
258
- }
259
- }
260
-
261
- .button-group {
262
- &.gap-0 {
263
- gap: 0 !important;
264
-
265
- // Ajuste border-radius quando gap = 0
266
- matcha-tab-item:first-child button[matcha-button] {
267
- border-top-right-radius: 0;
268
- border-bottom-right-radius: 0;
269
- }
270
-
271
- matcha-tab-item:last-child button[matcha-button] {
272
- border-top-left-radius: 0;
273
- border-bottom-left-radius: 0;
274
- }
275
-
276
- matcha-tab-item:not(:first-child):not(:last-child) button[matcha-button] {
277
- border-radius: 0;
278
- }
279
- }
280
- }
281
-
282
- // =============================================================================
283
- // MODERNIZED TAB STYLES — Aligned with Figma matcha/tab/item
284
- // Tipo: Underline (classic nav) | Card (icon card)
285
- // Estado: Default | Selecionado | Disabled
286
- // =============================================================================
287
-
288
- @mixin matcha-tabs-modern($theme) {
289
- $is-dark: map.get($theme, is-dark);
290
-
291
- // ── Underline Tab ──────────────────────────────────────────────────────
292
- // Figma: bottom-border 4px, surface/card bg, accent when selected
293
-
294
- .matcha-tab-underline {
295
- display: flex;
296
- align-items: stretch;
297
- background: transparent; // herda fundo da página (funciona light + dark)
298
- border-radius: var(--matcha-radius-md, 4px);
299
- overflow: hidden;
300
-
301
- // Subtle bottom divider on the container
302
- border-bottom: var(--matcha-border-hairline, 1px) solid var(--matcha-color-surface-border, #{getDisabled($theme)});
303
-
304
- .matcha-tab-item {
305
- display: flex;
306
- align-items: center;
307
- justify-content: center;
308
- gap: var(--matcha-space-100, 8px);
309
- padding: var(--matcha-space-200, 16px) var(--matcha-space-500, 40px);
310
- border: none;
311
- background: none;
312
- cursor: pointer;
313
- position: relative;
314
- overflow: hidden;
315
- font-family: var(--matcha-font-family);
316
- font-size: var(--matcha-text-body-lg, 16px);
317
- font-weight: var(--matcha-weight-regular, 400);
318
- line-height: var(--matcha-leading-body-lg, 24px);
319
- color: var(--matcha-color-text-label, #{getBlueGrey($theme)});
320
- white-space: nowrap;
321
-
322
- // Bottom indicator (inactive: transparent, active: accent)
323
- &::after {
324
- content: '';
325
- position: absolute;
326
- bottom: 0;
327
- left: 0;
328
- right: 0;
329
- height: 4px;
330
- background: transparent;
331
- transition: background var(--matcha-duration-instant, 80ms) linear;
332
- }
333
-
334
- // State layer
335
- &::before {
336
- content: '';
337
- position: absolute;
338
- inset: 0;
339
- background: currentColor;
340
- opacity: 0;
341
- pointer-events: none;
342
- transition: opacity var(--matcha-duration-instant, 80ms) linear;
343
- }
344
- &:hover:not(:disabled):not([disabled])::before { opacity: var(--matcha-state-hover, 0.08); }
345
- &:active:not(:disabled):not([disabled])::before { opacity: var(--matcha-state-active, 0.12); }
346
-
347
- // ── Selected ──
348
- &.active,
349
- &[aria-selected="true"] {
350
- color: var(--matcha-color-accent, #{getAccent($theme)});
351
- font-weight: var(--matcha-weight-semibold, 600);
352
- line-height: var(--matcha-leading-title-sm, 22px);
353
-
354
- &::after {
355
- background: var(--matcha-color-accent, #{getAccent($theme)});
356
- }
357
- }
358
-
359
- // ── Disabled ──
360
- &:disabled,
361
- &[disabled] {
362
- opacity: 0.5;
363
- pointer-events: none; cursor: default;
364
- pointer-events: none;
365
- }
366
-
367
- // ── Focus ──
368
- &:focus-visible {
369
- outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent, #{getAccent($theme)});
370
- outline-offset: var(--matcha-state-focus-ring-offset, 2px);
371
- }
372
- }
373
-
374
- // Equal-width tabs (mobile/responsive)
375
- &.matcha-tab-equal .matcha-tab-item {
376
- flex: 1 0 0;
377
- }
378
- }
379
-
380
- // ── Card Tab ───────────────────────────────────────────────────────────
381
- // Figma: card with radius-md, 2px accent border when selected
382
-
383
- .matcha-tab-card {
384
- display: flex;
385
- align-items: stretch;
386
- gap: var(--matcha-space-100, 8px);
387
- flex-wrap: wrap;
388
-
389
- .matcha-tab-item {
390
- display: flex;
391
- align-items: center;
392
- justify-content: center;
393
- gap: var(--matcha-space-100, 8px);
394
- padding: var(--matcha-space-100, 8px) var(--matcha-space-200, 16px);
395
- border: 2px solid transparent;
396
- border-radius: var(--matcha-radius-md, 4px);
397
- background: var(--matcha-color-surface, #{getSurface($theme)});
398
- cursor: pointer;
399
- position: relative;
400
- overflow: hidden;
401
- font-family: var(--matcha-font-family);
402
- font-size: var(--matcha-text-body-md, 14px);
403
- font-weight: var(--matcha-weight-regular, 400);
404
- line-height: var(--matcha-leading-body-md, 20px);
405
- color: var(--matcha-color-text-label, #{getBlueGrey($theme)});
406
-
407
- // State layer
408
- &::before {
409
- content: '';
410
- position: absolute;
411
- inset: 0;
412
- background: currentColor;
413
- opacity: 0;
414
- border-radius: inherit;
415
- pointer-events: none;
416
- transition: opacity var(--matcha-duration-instant, 80ms) linear;
417
- }
418
- &:hover:not(:disabled):not([disabled])::before { opacity: var(--matcha-state-hover, 0.08); }
419
- &:active:not(:disabled):not([disabled])::before { opacity: var(--matcha-state-active, 0.12); }
420
-
421
- // ── Selected ──
422
- &.active,
423
- &[aria-selected="true"] {
424
- border-color: var(--matcha-color-accent, #{getAccent($theme)});
425
- color: var(--matcha-color-accent, #{getAccent($theme)});
426
- font-weight: var(--matcha-weight-medium, 500);
427
- }
428
-
429
- // ── Disabled ──
430
- &:disabled,
431
- &[disabled] {
432
- opacity: 0.5;
433
- pointer-events: none; cursor: default;
434
- pointer-events: none;
435
- }
436
-
437
- // ── Focus ──
438
- &:focus-visible {
439
- outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent, #{getAccent($theme)});
440
- outline-offset: var(--matcha-state-focus-ring-offset, 2px);
441
- }
442
-
443
- // ── Vertical layout ──
444
- &.matcha-tab-vertical {
445
- flex-direction: column;
446
- text-align: center;
447
- }
448
- }
449
- }
450
-
451
- // ── Icon inside tab items ──
452
- .matcha-tab-underline,
453
- .matcha-tab-card {
454
- .matcha-tab-item {
455
- matcha-icon {
456
- flex-shrink: 0;
457
- }
458
- }
459
- }
460
- }
461
-
462
- // ── Reduced motion ──────────────────────────────────────────────────────
463
- @media (prefers-reduced-motion: reduce) {
464
- .matcha-tab-underline .matcha-tab-item::before,
465
- .matcha-tab-underline .matcha-tab-item::after,
466
- .matcha-tab-card .matcha-tab-item::before {
467
- transition: none;
468
- }
469
- }
1
+ @use "sass:map";
2
+
3
+ @mixin _colorize-inactive-type-basic($theme, $color-functions) {
4
+ &[inactivetype="basic"] {
5
+ @each $colorName, $colorFn in $color-functions {
6
+ &[inactivecolor="#{'' + $colorName}"] {
7
+ .button-group matcha-tab-item {
8
+
9
+ button[matcha-button],
10
+ a[matcha-button] {
11
+ &:not([active-item="true"]) {
12
+ background: var(--matcha-color-surface, #{getSurface($theme)});
13
+ color: call(#{$colorFn}, $theme);
14
+ box-shadow: 0 0 0 0px inset;
15
+
16
+ .ripple {
17
+ background: call(#{$colorFn}Alpha, $theme); // ok: legacy ripple color token
18
+ }
19
+ }
20
+ }
21
+ }
22
+ }
23
+ }
24
+
25
+ &[disabled],
26
+ &[disabled]:not([disabled="false"]),
27
+ &[disabled="true"] {
28
+ &:not([active-item="true"]) {
29
+ .button-group matcha-tab-item {
30
+
31
+ button[matcha-button],
32
+ a[matcha-button] {
33
+ @include _disabled-basic-button($theme);
34
+ }
35
+ }
36
+ }
37
+ }
38
+ }
39
+ }
40
+
41
+ @mixin _colorize-inactive-type-outline($theme, $color-functions) {
42
+ &[inactivetype="outline"] {
43
+
44
+ //disabled false
45
+ &:not([disabled="true"]) {
46
+ @each $colorName, $colorFn in $color-functions {
47
+ &[inactivecolor="#{'' + $colorName}"] {
48
+ .button-group matcha-tab-item {
49
+
50
+ button[matcha-button],
51
+ a[matcha-button] {
52
+
53
+ //botão não ativo
54
+ &:not([active-item="true"]) {
55
+ color: call(#{$colorFn}, $theme);
56
+ background: transparent;
57
+ box-shadow: 0 0 0 2px call(#{$colorFn}, $theme) inset;
58
+
59
+ .ripple {
60
+ background: call(#{$colorFn}Alpha, $theme); // ok: legacy ripple color token
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+
69
+ //disabled true
70
+ &[disabled],
71
+ &[disabled]:not([disabled="false"]),
72
+ &[disabled="true"] {
73
+ >.button-group matcha-tab-item {
74
+
75
+ button[matcha-button],
76
+ a[matcha-button] {
77
+
78
+ //botão não ativo
79
+ &:not([active-item="true"]) {
80
+ @include _disabled-outline-button($theme);
81
+ }
82
+ }
83
+ }
84
+ }
85
+ }
86
+ }
87
+
88
+ @mixin _colorize-inactive-type-alpha($theme, $color-functions) {
89
+ &[inactivetype="alpha"] {
90
+ @each $colorName, $colorFn in $color-functions {
91
+ &[inactivecolor="#{'' + $colorName}"] {
92
+ .button-group matcha-tab-item {
93
+
94
+ button[matcha-button],
95
+ a[matcha-button] {
96
+ &:not([active-item="true"]) {
97
+ color: call(#{$colorFn}, $theme);
98
+ background: call(#{$colorFn}Alpha, $theme);
99
+ box-shadow: 0 0 0 0px;
100
+
101
+ .ripple {
102
+ background: call(#{$colorFn}ContrastAlpha, $theme); // ok: legacy ripple color token
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
109
+
110
+ &[disabled],
111
+ &[disabled]:not([disabled="false"]),
112
+ &[disabled="true"] {
113
+ .button-group matcha-tab-item {
114
+
115
+ button[matcha-button],
116
+ a[matcha-button] {
117
+
118
+ //botão não ativo
119
+ &:not([active-item="true"]) {
120
+ @include _disabled-alpha-button($theme);
121
+ }
122
+ }
123
+ }
124
+ }
125
+ }
126
+ }
127
+
128
+ @mixin _colorize-inactive-type-link($theme, $color-functions) {
129
+
130
+ &[inactivetype="link"] {
131
+ @each $colorName, $colorFn in $color-functions {
132
+ &[inactivecolor="#{'' + $colorName}"] {
133
+ .button-group matcha-tab-item {
134
+
135
+ button[matcha-button],
136
+ a[matcha-button] {
137
+ &:not([active-item="true"]) {
138
+
139
+ background: transparent;
140
+ color: call(#{$colorFn}, $theme);
141
+ box-shadow: 0 0 0 0px;
142
+
143
+ .ripple {
144
+ background: call(#{$colorFn}Alpha, $theme); // ok: legacy ripple color token
145
+ }
146
+
147
+ }
148
+ }
149
+ }
150
+ }
151
+ }
152
+
153
+ &[disabled],
154
+ &[disabled]:not([disabled="false"]),
155
+ &[disabled="true"] {
156
+ .button-group matcha-tab-item {
157
+
158
+ button[matcha-button],
159
+ a[matcha-button] {
160
+
161
+ //botão não ativo
162
+ &:not([active-item="true"]) {
163
+ @include _disabled-link-button($theme);
164
+ }
165
+ }
166
+ }
167
+ }
168
+ }
169
+ }
170
+
171
+
172
+
173
+
174
+ @mixin matcha-tabs($theme) {
175
+ $color-functions: (
176
+ red: getRed,
177
+ pink: getPink,
178
+ purple: getPurple,
179
+ deep-purple: getDeepPurple,
180
+ indigo: getIndigo,
181
+ blue: getBlue,
182
+ light-blue: getLightBlue,
183
+ cyan: getCyan,
184
+ teal: getTeal,
185
+ green: getGreen,
186
+ light-green: getLightGreen,
187
+ lime: getLime,
188
+ yellow: getYellow,
189
+ amber: getAmber,
190
+ orange: getOrange,
191
+ deep-orange: getDeepOrange,
192
+ brown: getBrown,
193
+ grey: getGrey,
194
+ blue-grey: getBlueGrey,
195
+ primary: getPrimary,
196
+ accent: getAccent,
197
+ success: getSuccess,
198
+ warn: getWarn,
199
+ danger: getDanger,
200
+ info: getInfo,
201
+ disabled: getDisabled,
202
+ );
203
+
204
+ matcha-tabs {
205
+ display: flex;
206
+ @include _colorize-inactive-type-basic($theme, $color-functions);
207
+ @include _colorize-inactive-type-outline($theme, $color-functions);
208
+ @include _colorize-inactive-type-alpha($theme, $color-functions);
209
+ @include _colorize-inactive-type-link($theme, $color-functions);
210
+
211
+ .button-group matcha-tab-item {
212
+ button[matcha-button],
213
+ a[matcha-button] {
214
+ &:focus-visible:not([disabled]):not([disabled="true"]) {
215
+ outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent, #{getAccent($theme)});
216
+ outline-offset: var(--matcha-state-focus-ring-offset, 2px);
217
+ }
218
+ }
219
+ }
220
+
221
+ &[disabled],
222
+ &[disabled]:not([disabled="false"]),
223
+ &[disabled="true"] {
224
+ .button-group matcha-tab-item {
225
+
226
+ button[matcha-button],
227
+ a[matcha-button] {
228
+ &[active-item="true"] {
229
+
230
+ &[outline],
231
+ &[outline]:not([outline="false"]),
232
+ &[outline="true"] {
233
+ @include _disabled-outline-button($theme);
234
+ }
235
+
236
+ &[basic],
237
+ &[basic]:not([basic="false"]),
238
+ &[basic="true"] {
239
+ @include _disabled-basic-button($theme);
240
+ }
241
+
242
+ &[alpha],
243
+ &[alpha]:not([alpha="false"]),
244
+ &[alpha="true"] {
245
+ @include _disabled-alpha-button($theme);
246
+ }
247
+
248
+ &[link],
249
+ &[link]:not([link="false"]),
250
+ &[link="true"] {
251
+ @include _disabled-link-button($theme);
252
+ }
253
+ }
254
+ }
255
+ }
256
+
257
+ }
258
+ }
259
+ }
260
+
261
+ .button-group {
262
+ &.gap-0 {
263
+ gap: 0 !important;
264
+
265
+ // Ajuste border-radius quando gap = 0
266
+ matcha-tab-item:first-child button[matcha-button] {
267
+ border-top-right-radius: 0;
268
+ border-bottom-right-radius: 0;
269
+ }
270
+
271
+ matcha-tab-item:last-child button[matcha-button] {
272
+ border-top-left-radius: 0;
273
+ border-bottom-left-radius: 0;
274
+ }
275
+
276
+ matcha-tab-item:not(:first-child):not(:last-child) button[matcha-button] {
277
+ border-radius: 0;
278
+ }
279
+ }
280
+ }
281
+
282
+ // =============================================================================
283
+ // MODERNIZED TAB STYLES — 1:1 Figma DSV3 matcha/tabs/tab (15768:76)
284
+ // Tipo: Underline ( horizontal) · Card (horizontal + vertical)
285
+ // Estado: Default · Selecionado · Disabled
286
+ // Ícone: opcional
287
+ // =============================================================================
288
+
289
+ @mixin matcha-tabs-modern($theme) {
290
+ $is-dark: map.get($theme, is-dark);
291
+
292
+ // ── Component-level tokens (overridable pelo consumer via CSS vars) ───
293
+ matcha-tabs {
294
+ --matcha-tab-min-width-underline: var(--matcha-space-1500, 120px);
295
+ --matcha-tab-min-width-card-horizontal: 107px;
296
+ --matcha-tab-min-width-card-vertical: var(--matcha-space-1100, 88px);
297
+ --matcha-tab-close-size: var(--matcha-icon-size-xs, 14px);
298
+ --matcha-tab-state-opacity-hover: var(--matcha-state-hover, 0.08);
299
+ --matcha-tab-state-opacity-active: var(--matcha-state-active, 0.12);
300
+ --matcha-tab-state-opacity-disabled: var(--matcha-state-opacity-disabled, 0.5);
301
+ --matcha-tab-focus-halo: 4px;
302
+ --matcha-tab-focus-halo-alpha: 0.16;
303
+
304
+ // Layout do host — canon WAI-ARIA tablist:
305
+ // horizontal → nav em cima, content embaixo (column)
306
+ // vertical → nav à esquerda, content à direita (row, sidenav-like)
307
+ // Override do legacy `matcha-tabs { display: flex }` que assumia row sempre
308
+ // (legado button-group). Aria-orientation vem do host binding do component.
309
+ flex-direction: column;
310
+ // 24px (space-300) é o vertical rhythm canon entre blocos no painel —
311
+ // mesmo gap entre seções dentro do content. Evita "tab↔content maior que
312
+ // section↔section" que rompe a hierarquia visual.
313
+ gap: var(--matcha-space-300, 24px);
314
+
315
+ &[aria-orientation="vertical"] {
316
+ flex-direction: row;
317
+ gap: var(--matcha-space-300, 24px);
318
+ }
319
+ }
320
+
321
+ // ── Underline Tab (1:1 Figma DSV3 — border per item) ──────────────────
322
+ // Cada item tem bg surface-card + border-bottom 4px (surface-border default,
323
+ // accent selected). Container não tem border próprio (canon Figma).
324
+ // Sliding indicator absoluto desliza entre tabs (Material 3 style).
325
+ // Sempre horizontal (vertical não é canon).
326
+ .matcha-tab-underline {
327
+ display: flex;
328
+ align-items: stretch;
329
+ background: transparent;
330
+ position: relative;
331
+
332
+ // Mobile-friendly horizontal scroll
333
+ &.matcha-tab-scrollable {
334
+ overflow-x: auto;
335
+ scrollbar-width: thin;
336
+ -webkit-overflow-scrolling: touch;
337
+ }
338
+
339
+ // ── Sliding indicator (Material 3 magic underline) ──
340
+ // Cantos retos + 2px de altura (canon Figma — sem rounded).
341
+ .matcha-tab-indicator {
342
+ position: absolute;
343
+ bottom: 0;
344
+ left: var(--matcha-tab-indicator-left, 0);
345
+ width: var(--matcha-tab-indicator-width, 0);
346
+ height: var(--matcha-border-thin, 2px);
347
+ background: var(--matcha-color-accent, #{getAccent($theme)});
348
+ border-radius: 0;
349
+ transition:
350
+ left var(--matcha-duration-fast, 200ms) var(--matcha-easing-emphasized, cubic-bezier(0.2, 0, 0, 1)),
351
+ width var(--matcha-duration-fast, 200ms) var(--matcha-easing-emphasized, cubic-bezier(0.2, 0, 0, 1));
352
+ pointer-events: none;
353
+ z-index: 1;
354
+ }
355
+
356
+ .matcha-tab-item {
357
+ display: flex;
358
+ align-items: center;
359
+ justify-content: center;
360
+ gap: var(--matcha-space-100, 8px);
361
+ padding: var(--matcha-space-200, 16px) var(--matcha-space-500, 40px);
362
+ border: none;
363
+ // Border bottom 2px — per item (track surface-border, slider sobrepõe accent)
364
+ border-bottom: var(--matcha-border-thin, 2px) solid
365
+ var(--matcha-color-surface-border, #{getDisabled($theme)});
366
+ background: var(--matcha-color-surface-card, #{getSurface($theme)});
367
+ cursor: pointer;
368
+ position: relative;
369
+ overflow: hidden;
370
+ font-family: var(--matcha-font-family);
371
+ font-size: var(--matcha-text-body-lg, 16px);
372
+ font-weight: var(--matcha-weight-regular, 400);
373
+ line-height: var(--matcha-leading-body-lg, 24px);
374
+ color: var(--matcha-color-text-secondary,
375
+ rgba(getForeground($theme), 0.7));
376
+ white-space: nowrap;
377
+ flex-shrink: 0;
378
+ min-width: var(--matcha-tab-min-width-underline);
379
+ transition:
380
+ color var(--matcha-duration-fast, 200ms) var(--matcha-easing-standard, cubic-bezier(0.4, 0, 0.2, 1)),
381
+ border-bottom-color var(--matcha-duration-fast, 200ms) var(--matcha-easing-standard, cubic-bezier(0.4, 0, 0.2, 1)),
382
+ font-weight var(--matcha-duration-fast, 200ms) ease;
383
+
384
+ // State layer (hover + active visual feedback)
385
+ &::before {
386
+ content: '';
387
+ position: absolute;
388
+ inset: 0;
389
+ background: currentColor;
390
+ opacity: 0;
391
+ pointer-events: none;
392
+ transition: opacity var(--matcha-duration-instant, 80ms) linear;
393
+ }
394
+ &:hover:not(:disabled)::before { opacity: var(--matcha-tab-state-opacity-hover); }
395
+ &:active:not(:disabled)::before { opacity: var(--matcha-tab-state-opacity-active); }
396
+
397
+ // ── Selecionado (border-bottom muda pra accent ALÉM do sliding indicator
398
+ // — cobre 100% mesmo com subpixel mismatch do indicator) ──
399
+ &.active,
400
+ &[aria-selected="true"] {
401
+ color: var(--matcha-color-accent, #{getAccent($theme)});
402
+ font-weight: var(--matcha-weight-semibold, 600);
403
+ line-height: var(--matcha-leading-title-sm, 22px);
404
+ border-bottom-color: var(--matcha-color-accent, #{getAccent($theme)});
405
+ }
406
+
407
+ // ── Disabled ──
408
+ &:disabled,
409
+ &[disabled] {
410
+ opacity: var(--matcha-tab-state-opacity-disabled);
411
+ pointer-events: none;
412
+ cursor: default;
413
+ }
414
+
415
+ // ── Focus ring polido (offset 4px + halo 16% alpha) ──
416
+ &:focus-visible {
417
+ outline: var(--matcha-state-focus-ring-width, 2px) solid
418
+ var(--matcha-color-accent, #{getAccent($theme)});
419
+ outline-offset: var(--matcha-state-focus-ring-offset, 4px);
420
+ border-radius: var(--matcha-radius-sm, 4px);
421
+ box-shadow: 0 0 0 var(--matcha-tab-focus-halo)
422
+ rgba(getAccent($theme), var(--matcha-tab-focus-halo-alpha));
423
+ }
424
+ }
425
+ }
426
+
427
+ // ── Card Tab (canon Figma) ────────────────────────────────────────────
428
+ // Card 2px border accent quando selected · texto text-primary (NÃO accent).
429
+ // Suporta horizontal (default) e vertical (icon stacked).
430
+ .matcha-tab-card {
431
+ display: flex;
432
+ // Tamanho natural por item — stretch vertical antes esticava cards quando
433
+ // pai tinha altura expandida (bug reportado em pages com page-content flex-fill).
434
+ align-items: flex-start;
435
+ gap: var(--matcha-space-100, 8px);
436
+ flex-wrap: wrap;
437
+
438
+ // Equal-width layout — cada tab ocupa fatia igual da row (paginador-like).
439
+ // Habilitado via prop `equalWidth` no consumer. Icon stacked acima do label
440
+ // (look canon de paginator), independente de orientation do host.
441
+ &.matcha-tab-equal-width {
442
+ flex-wrap: nowrap;
443
+
444
+ .matcha-tab-item {
445
+ flex: 1 1 0;
446
+ min-width: 0;
447
+ flex-direction: column;
448
+ text-align: center;
449
+ padding: var(--matcha-space-150, 12px) var(--matcha-space-200, 16px);
450
+ }
451
+ }
452
+
453
+ // Vertical layout — empilha icon + label
454
+ &.matcha-tab-vertical .matcha-tab-item {
455
+ flex-direction: column;
456
+ min-width: var(--matcha-tab-min-width-card-vertical);
457
+ padding: var(--matcha-space-100, 8px) var(--matcha-space-200, 16px);
458
+ text-align: center;
459
+ }
460
+
461
+ .matcha-tab-item {
462
+ display: flex;
463
+ align-items: center;
464
+ justify-content: center;
465
+ gap: var(--matcha-space-100, 8px);
466
+ padding: var(--matcha-space-150, 12px) var(--matcha-space-200, 16px);
467
+ border: var(--matcha-border-thin, 1px) solid transparent;
468
+ // radius-lg (8px) escala 1:2 com cards (xl=16px) — hierarquia visual
469
+ // canon: atom interativo / container. Antes era md (4px), o que dava
470
+ // disparidade 1:4 e quebrava a leitura conjunta tabs + cards.
471
+ border-radius: var(--matcha-radius-lg, 8px);
472
+ background: var(--matcha-color-surface-card,
473
+ #{getSurface($theme)});
474
+ cursor: pointer;
475
+ position: relative;
476
+ overflow: hidden;
477
+ font-family: var(--matcha-font-family);
478
+ font-size: var(--matcha-text-body-md, 14px);
479
+ font-weight: var(--matcha-weight-regular, 400);
480
+ line-height: var(--matcha-leading-body-md, 20px);
481
+ color: var(--matcha-color-text-secondary,
482
+ rgba(getForeground($theme), 0.7));
483
+ flex-shrink: 0;
484
+ min-width: var(--matcha-tab-min-width-card-horizontal);
485
+ transition:
486
+ border-color var(--matcha-duration-fast, 200ms) var(--matcha-easing-standard, cubic-bezier(0.4, 0, 0.2, 1)),
487
+ color var(--matcha-duration-fast, 200ms) var(--matcha-easing-standard, cubic-bezier(0.4, 0, 0.2, 1)),
488
+ transform var(--matcha-duration-instant, 80ms) ease;
489
+
490
+ // State layer
491
+ &::before {
492
+ content: '';
493
+ position: absolute;
494
+ inset: 0;
495
+ background: currentColor;
496
+ opacity: 0;
497
+ border-radius: inherit;
498
+ pointer-events: none;
499
+ transition: opacity var(--matcha-duration-instant, 80ms) linear;
500
+ }
501
+ &:hover:not(:disabled) {
502
+ &::before { opacity: var(--matcha-tab-state-opacity-hover); }
503
+ transform: translateY(calc(-1 * var(--matcha-border-hairline, 1px)));
504
+ }
505
+ &:active:not(:disabled)::before { opacity: var(--matcha-tab-state-opacity-active); }
506
+
507
+ // ── Selecionado (Figma: border accent · texto text-primary NÃO accent) ──
508
+ &.active,
509
+ &[aria-selected="true"] {
510
+ border-color: var(--matcha-color-accent, #{getAccent($theme)});
511
+ color: var(--matcha-color-fg, #{getForeground($theme)});
512
+ font-weight: var(--matcha-weight-medium, 500);
513
+ }
514
+
515
+ // ── Disabled ──
516
+ &:disabled,
517
+ &[disabled] {
518
+ opacity: var(--matcha-tab-state-opacity-disabled);
519
+ pointer-events: none;
520
+ cursor: default;
521
+ }
522
+
523
+ // ── Focus ring polido ──
524
+ &:focus-visible {
525
+ outline: var(--matcha-state-focus-ring-width, 2px) solid
526
+ var(--matcha-color-accent, #{getAccent($theme)});
527
+ outline-offset: var(--matcha-border-thin, 2px);
528
+ box-shadow: 0 0 0 var(--matcha-tab-focus-halo)
529
+ rgba(getAccent($theme), var(--matcha-tab-focus-halo-alpha));
530
+ }
531
+ }
532
+ }
533
+
534
+ // ── Icon inside tab items ──
535
+ .matcha-tab-underline,
536
+ .matcha-tab-card {
537
+ .matcha-tab-item matcha-icon { flex-shrink: 0; }
538
+ }
539
+
540
+ // ── Badge (notificações, contagens) ───────────────────────────────────
541
+ .matcha-tab-item__badge {
542
+ display: inline-flex;
543
+ align-items: center;
544
+ justify-content: center;
545
+ min-width: var(--matcha-space-250, 20px);
546
+ height: var(--matcha-space-250, 20px);
547
+ padding: 0 var(--matcha-space-075, 6px);
548
+ background: var(--matcha-color-accent, #{getAccent($theme)});
549
+ color: var(--matcha-color-accent-text-on,
550
+ var(--matcha-color-accent-contrast, #{getAccentContrast($theme)}));
551
+ border-radius: var(--matcha-radius-pill, 9999px);
552
+ font-size: var(--matcha-text-body-xs, 11px);
553
+ font-weight: var(--matcha-weight-semibold, 600);
554
+ line-height: 1;
555
+ flex-shrink: 0;
556
+ }
557
+
558
+ // ── Close button (closable tabs) ──────────────────────────────────────
559
+ .matcha-tab-item__close {
560
+ display: inline-flex;
561
+ align-items: center;
562
+ justify-content: center;
563
+ width: var(--matcha-space-300, 24px);
564
+ height: var(--matcha-space-300, 24px);
565
+ border-radius: 50%;
566
+ color: var(--matcha-color-text-secondary,
567
+ rgba(getForeground($theme), 0.7));
568
+ transition:
569
+ background-color var(--matcha-duration-instant, 80ms) ease,
570
+ color var(--matcha-duration-instant, 80ms) ease;
571
+ flex-shrink: 0;
572
+ cursor: pointer;
573
+ margin-left: var(--matcha-space-050, 4px);
574
+
575
+ &:hover {
576
+ background: var(--matcha-color-surface-hover,
577
+ rgba(getForeground($theme), 0.08));
578
+ color: var(--matcha-color-fg, #{getForeground($theme)});
579
+ }
580
+
581
+ &:focus-visible {
582
+ outline: var(--matcha-state-focus-ring-width, 2px) solid
583
+ var(--matcha-color-accent, #{getAccent($theme)});
584
+ outline-offset: var(--matcha-border-thin, 2px);
585
+ }
586
+
587
+ svg {
588
+ display: block;
589
+ width: var(--matcha-tab-close-size, 14px);
590
+ height: var(--matcha-tab-close-size, 14px);
591
+ }
592
+ }
593
+ }
594
+
595
+ // ── Mobile: reset min-width pra evitar overflow + auto-scroll ───────────
596
+ @media (max-width: 639px) {
597
+ .matcha-tab-underline .matcha-tab-item,
598
+ .matcha-tab-card .matcha-tab-item {
599
+ min-width: auto;
600
+ }
601
+ }
602
+
603
+ // ── Mobile: Underline auto-scrollable em viewports estreitos ────────────
604
+ @media (max-width: 639px) {
605
+ .matcha-tab-underline:not(.matcha-tab-scrollable) {
606
+ overflow-x: auto;
607
+ scrollbar-width: thin;
608
+ }
609
+ }
610
+
611
+ // ── Reduced motion (WCAG 2.2.2) ─────────────────────────────────────────
612
+ @media (prefers-reduced-motion: reduce) {
613
+ .matcha-tab-underline .matcha-tab-item,
614
+ .matcha-tab-underline .matcha-tab-item::before,
615
+ .matcha-tab-card .matcha-tab-item,
616
+ .matcha-tab-card .matcha-tab-item::before,
617
+ .matcha-tab-indicator,
618
+ .matcha-tab-item__close {
619
+ transition: none;
620
+ }
621
+ .matcha-tab-card .matcha-tab-item:hover {
622
+ transform: none;
623
+ }
624
+ }