@inchurch/matcha-theme 20.0.11 → 20.277.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 (116) hide show
  1. package/abstracts/_colors.scss +404 -404
  2. package/abstracts/_elevation.scss +102 -102
  3. package/abstracts/_functions.scss +1186 -1212
  4. package/abstracts/_media-breakpoint.scss +23 -23
  5. package/abstracts/_theme-api.scss +230 -0
  6. package/abstracts/_typography.scss +127 -127
  7. package/base/_reset.scss +438 -438
  8. package/components/app-page-header.scss +259 -0
  9. package/components/matcha-accordion.scss +293 -157
  10. package/components/matcha-audio-player.scss +1 -2
  11. package/components/matcha-autocomplete.scss +10 -11
  12. package/components/matcha-avatar.scss +173 -33
  13. package/components/matcha-badge.scss +15 -15
  14. package/components/matcha-breadcrumb.scss +231 -126
  15. package/components/matcha-button-toggle.scss +46 -2
  16. package/components/matcha-buttons.scss +908 -784
  17. package/components/matcha-calendar.scss +99 -35
  18. package/components/matcha-cards.scss +58 -33
  19. package/components/matcha-chart-card.scss +5 -12
  20. package/components/matcha-checkbox.scss +191 -490
  21. package/components/matcha-chip.scss +297 -212
  22. package/components/matcha-color-pick.scss +1 -2
  23. package/components/matcha-command-palette.scss +290 -63
  24. package/components/matcha-crop.scss +406 -172
  25. package/components/matcha-date.scss +81 -81
  26. package/components/matcha-divider.scss +86 -31
  27. package/components/matcha-draggable.scss +4 -5
  28. package/components/matcha-drawer.scss +207 -66
  29. package/components/matcha-drop-image.scss +14 -0
  30. package/components/matcha-drop-list.scss +87 -47
  31. package/components/matcha-emoji.scss +2 -2
  32. package/components/matcha-empty-state.scss +195 -83
  33. package/components/matcha-file-uploader.scss +462 -0
  34. package/components/matcha-flag.scss +93 -52
  35. package/components/matcha-footer.scss +67 -164
  36. package/components/matcha-form-field.scss +55 -3
  37. package/components/matcha-form-section.scss +100 -101
  38. package/components/matcha-header.scss +134 -325
  39. package/components/matcha-highlight.scss +65 -197
  40. package/components/matcha-hint-text.scss +25 -4
  41. package/components/matcha-horizontal-tree.scss +316 -317
  42. package/components/matcha-icon.scss +37 -45
  43. package/components/matcha-image.scss +2 -3
  44. package/components/matcha-list.scss +14 -15
  45. package/components/matcha-menu.scss +15 -2
  46. package/components/matcha-modal.scss +59 -86
  47. package/components/matcha-nav.scss +362 -231
  48. package/components/matcha-notification.scss +412 -197
  49. package/components/matcha-option.scss +98 -23
  50. package/components/matcha-page-builder.scss +16 -16
  51. package/components/matcha-paginator.scss +688 -235
  52. package/components/matcha-panel.scss +42 -27
  53. package/components/matcha-profile-card.scss +50 -50
  54. package/components/matcha-progress-bar.scss +257 -153
  55. package/components/matcha-radio.scss +244 -452
  56. package/components/matcha-scrollbar.scss +1 -2
  57. package/components/matcha-scrollbox-shadow.scss +120 -122
  58. package/components/matcha-section.scss +5 -9
  59. package/components/matcha-select-multiple.scss +56 -0
  60. package/components/matcha-select.scss +10 -10
  61. package/components/matcha-skeleton.scss +24 -7
  62. package/components/matcha-slide-toggle.scss +80 -301
  63. package/components/matcha-slider.scss +174 -77
  64. package/components/matcha-snack-bar.scss +123 -131
  65. package/components/matcha-spin.scss +12 -103
  66. package/components/matcha-spinner.scss +76 -57
  67. package/components/matcha-status-pill.scss +82 -0
  68. package/components/matcha-stepper.scss +376 -177
  69. package/components/matcha-table.scss +568 -785
  70. package/components/matcha-tabs.scss +622 -469
  71. package/components/matcha-text-editor.scss +78 -78
  72. package/components/matcha-time.scss +2 -2
  73. package/components/matcha-toolbar.scss +359 -206
  74. package/components/matcha-tooltip.scss +158 -62
  75. package/components/matcha-tree-view.scss +189 -0
  76. package/fonts/manrope/manrope-latin-ext.woff2 +0 -0
  77. package/fonts/manrope/manrope-latin.woff2 +0 -0
  78. package/layout/matcha-page-layout.scss +4 -4
  79. package/main.scss +237 -265
  80. package/package.json +1 -1
  81. package/tokens/_animations-tokens.scss +37 -37
  82. package/tokens/_breakpoints-tokens.scss +35 -26
  83. package/tokens/_color-tokens.scss +1149 -1152
  84. package/tokens/_css-custom-properties.scss +704 -568
  85. package/tokens/_primitives.scss +82 -0
  86. package/tokens/_semantic-aliases.scss +120 -0
  87. package/tokens/_spacing-tokens.scss +94 -94
  88. package/vendors/angular-editor.scss +56 -56
  89. package/vendors/angular-material-fixes.scss +297 -297
  90. package/vendors/charts.scss +92 -92
  91. package/vendors/ng5-slider.scss +56 -56
  92. package/vendors/ngx-material-timepicker.scss +50 -50
  93. package/components/matcha-uploader.scss +0 -215
  94. package/fonts/CircularStd-Black.eot +0 -0
  95. package/fonts/CircularStd-Black.svg +0 -3426
  96. package/fonts/CircularStd-Black.ttf +0 -0
  97. package/fonts/CircularStd-Black.woff +0 -0
  98. package/fonts/CircularStd-Black.woff2 +0 -0
  99. package/fonts/CircularStd-Bold.eot +0 -0
  100. package/fonts/CircularStd-Bold.otf +0 -0
  101. package/fonts/CircularStd-Bold.svg +0 -13532
  102. package/fonts/CircularStd-Bold.ttf +0 -0
  103. package/fonts/CircularStd-Bold.woff +0 -0
  104. package/fonts/CircularStd-Bold.woff2 +0 -0
  105. package/fonts/CircularStd-Medium.eot +0 -0
  106. package/fonts/CircularStd-Medium.otf +0 -0
  107. package/fonts/CircularStd-Medium.svg +0 -13511
  108. package/fonts/CircularStd-Medium.ttf +0 -0
  109. package/fonts/CircularStd-Medium.woff +0 -0
  110. package/fonts/CircularStd-Medium.woff2 +0 -0
  111. package/fonts/CircularStd-Regular.eot +0 -0
  112. package/fonts/CircularStd-Regular.otf +0 -0
  113. package/fonts/CircularStd-Regular.svg +0 -2378
  114. package/fonts/CircularStd-Regular.ttf +0 -0
  115. package/fonts/CircularStd-Regular.woff +0 -0
  116. package/fonts/CircularStd-Regular.woff2 +0 -0
@@ -1,469 +1,622 @@
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);
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);
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
+
291
+ // ── Component-level tokens (overridable pelo consumer via CSS vars) ───
292
+ matcha-tabs {
293
+ --matcha-tab-min-width-underline: var(--matcha-space-1500, 120px);
294
+ --matcha-tab-min-width-card-horizontal: 107px;
295
+ --matcha-tab-min-width-card-vertical: var(--matcha-space-1100, 88px);
296
+ --matcha-tab-close-size: var(--matcha-icon-size-xs, 14px);
297
+ --matcha-tab-state-opacity-hover: var(--matcha-state-hover, 0.08);
298
+ --matcha-tab-state-opacity-active: var(--matcha-state-active, 0.12);
299
+ --matcha-tab-state-opacity-disabled: var(--matcha-state-opacity-disabled, 0.5);
300
+ --matcha-tab-focus-halo: 4px;
301
+ --matcha-tab-focus-halo-alpha: 0.16;
302
+
303
+ // Layout do host — canon WAI-ARIA tablist:
304
+ // horizontal → nav em cima, content embaixo (column)
305
+ // vertical → nav à esquerda, content à direita (row, sidenav-like)
306
+ // Override do legacy `matcha-tabs { display: flex }` que assumia row sempre
307
+ // (legado button-group). Aria-orientation vem do host binding do component.
308
+ flex-direction: column;
309
+ // 24px (space-300) é o vertical rhythm canon entre blocos no painel —
310
+ // mesmo gap entre seções dentro do content. Evita "tab↔content maior que
311
+ // section↔section" que rompe a hierarquia visual.
312
+ gap: var(--matcha-space-300, 24px);
313
+
314
+ &[aria-orientation="vertical"] {
315
+ flex-direction: row;
316
+ gap: var(--matcha-space-300, 24px);
317
+ }
318
+ }
319
+
320
+ // ── Underline Tab (1:1 Figma DSV3 — border per item) ──────────────────
321
+ // Cada item tem bg surface-card + border-bottom 4px (surface-border default,
322
+ // accent selected). Container não tem border próprio (canon Figma).
323
+ // Sliding indicator absoluto desliza entre tabs (Material 3 style).
324
+ // Sempre horizontal (vertical não é canon).
325
+ .matcha-tab-underline {
326
+ display: flex;
327
+ align-items: stretch;
328
+ background: transparent;
329
+ position: relative;
330
+
331
+ // Mobile-friendly horizontal scroll
332
+ &.matcha-tab-scrollable {
333
+ overflow-x: auto;
334
+ scrollbar-width: thin;
335
+ -webkit-overflow-scrolling: touch;
336
+ }
337
+
338
+ // ── Sliding indicator (Material 3 magic underline) ──
339
+ // Cantos retos + 2px de altura (canon Figma — sem rounded).
340
+ .matcha-tab-indicator {
341
+ position: absolute;
342
+ bottom: 0;
343
+ left: var(--matcha-tab-indicator-left, 0);
344
+ width: var(--matcha-tab-indicator-width, 0);
345
+ height: var(--matcha-border-thin, 2px);
346
+ background: var(--matcha-color-accent);
347
+ border-radius: 0;
348
+ transition:
349
+ left var(--matcha-duration-fast, 200ms) var(--matcha-easing-emphasized, cubic-bezier(0.2, 0, 0, 1)),
350
+ width var(--matcha-duration-fast, 200ms) var(--matcha-easing-emphasized, cubic-bezier(0.2, 0, 0, 1));
351
+ pointer-events: none;
352
+ z-index: 1;
353
+ }
354
+
355
+ .matcha-tab-item {
356
+ display: flex;
357
+ align-items: center;
358
+ justify-content: center;
359
+ gap: var(--matcha-space-100, 8px);
360
+ padding: var(--matcha-space-200, 16px) var(--matcha-space-500, 40px);
361
+ border: none;
362
+ // Border bottom 2px — per item (track surface-border, slider sobrepõe accent)
363
+ border-bottom: var(--matcha-border-thin, 2px) solid
364
+ var(--matcha-color-surface-border);
365
+ background: var(--matcha-color-surface-card);
366
+ cursor: pointer;
367
+ position: relative;
368
+ overflow: hidden;
369
+ font-family: var(--matcha-font-family);
370
+ font-size: var(--matcha-text-body-lg, 16px);
371
+ font-weight: var(--matcha-weight-regular, 400);
372
+ line-height: var(--matcha-leading-body-lg, 24px);
373
+ color: var(--matcha-color-text-secondary,
374
+ color-mix(in srgb, var(--matcha-color-fg) 70%, transparent));
375
+ white-space: nowrap;
376
+ flex-shrink: 0;
377
+ min-width: var(--matcha-tab-min-width-underline);
378
+ transition:
379
+ color var(--matcha-duration-fast, 200ms) var(--matcha-easing-standard, cubic-bezier(0.4, 0, 0.2, 1)),
380
+ border-bottom-color var(--matcha-duration-fast, 200ms) var(--matcha-easing-standard, cubic-bezier(0.4, 0, 0.2, 1)),
381
+ font-weight var(--matcha-duration-fast, 200ms) ease;
382
+
383
+ // State layer (hover + active visual feedback)
384
+ &::before {
385
+ content: '';
386
+ position: absolute;
387
+ inset: 0;
388
+ background: currentColor;
389
+ opacity: 0;
390
+ pointer-events: none;
391
+ transition: opacity var(--matcha-duration-instant, 80ms) linear;
392
+ }
393
+ &:hover:not(:disabled)::before { opacity: var(--matcha-tab-state-opacity-hover); }
394
+ &:active:not(:disabled)::before { opacity: var(--matcha-tab-state-opacity-active); }
395
+
396
+ // ── Selecionado (border-bottom muda pra accent ALÉM do sliding indicator
397
+ // cobre 100% mesmo com subpixel mismatch do indicator) ──
398
+ &.active,
399
+ &[aria-selected="true"] {
400
+ color: var(--matcha-color-accent);
401
+ font-weight: var(--matcha-weight-semibold, 600);
402
+ line-height: var(--matcha-leading-title-sm, 22px);
403
+ border-bottom-color: var(--matcha-color-accent);
404
+ }
405
+
406
+ // ── Disabled ──
407
+ &:disabled,
408
+ &[disabled] {
409
+ opacity: var(--matcha-tab-state-opacity-disabled);
410
+ pointer-events: none;
411
+ cursor: default;
412
+ }
413
+
414
+ // ── Focus ring polido (offset 4px + halo 16% alpha) ──
415
+ &:focus-visible {
416
+ outline: var(--matcha-state-focus-ring-width, 2px) solid
417
+ var(--matcha-color-accent);
418
+ outline-offset: var(--matcha-state-focus-ring-offset, 4px);
419
+ border-radius: var(--matcha-radius-sm, 4px);
420
+ box-shadow: 0 0 0 var(--matcha-tab-focus-halo)
421
+ color-mix(in srgb, var(--matcha-color-accent) calc(var(--matcha-tab-focus-halo-alpha) * 100%), transparent);
422
+ }
423
+ }
424
+ }
425
+
426
+ // ── Card Tab (canon Figma) ────────────────────────────────────────────
427
+ // Card 2px border accent quando selected · texto text-primary (NÃO accent).
428
+ // Suporta horizontal (default) e vertical (icon stacked).
429
+ .matcha-tab-card {
430
+ display: flex;
431
+ // Tamanho natural por item — stretch vertical antes esticava cards quando
432
+ // pai tinha altura expandida (bug reportado em pages com page-content flex-fill).
433
+ align-items: flex-start;
434
+ gap: var(--matcha-space-100, 8px);
435
+ flex-wrap: wrap;
436
+
437
+ // Equal-width layout — cada tab ocupa fatia igual da row (paginador-like).
438
+ // Habilitado via prop `equalWidth` no consumer. Icon stacked acima do label
439
+ // (look canon de paginator), independente de orientation do host.
440
+ &.matcha-tab-equal-width {
441
+ flex-wrap: nowrap;
442
+
443
+ .matcha-tab-item {
444
+ flex: 1 1 0;
445
+ min-width: 0;
446
+ flex-direction: column;
447
+ text-align: center;
448
+ padding: var(--matcha-space-150, 12px) var(--matcha-space-200, 16px);
449
+ }
450
+ }
451
+
452
+ // Vertical layout — empilha icon + label
453
+ &.matcha-tab-vertical .matcha-tab-item {
454
+ flex-direction: column;
455
+ min-width: var(--matcha-tab-min-width-card-vertical);
456
+ padding: var(--matcha-space-100, 8px) var(--matcha-space-200, 16px);
457
+ text-align: center;
458
+ }
459
+
460
+ .matcha-tab-item {
461
+ display: flex;
462
+ align-items: center;
463
+ justify-content: center;
464
+ gap: var(--matcha-space-100, 8px);
465
+ padding: var(--matcha-space-150, 12px) var(--matcha-space-200, 16px);
466
+ border: var(--matcha-border-thin, 1px) solid transparent;
467
+ // radius-lg (8px) escala 1:2 com cards (xl=16px) — hierarquia visual
468
+ // canon: atom interativo / container. Antes era md (4px), o que dava
469
+ // disparidade 1:4 e quebrava a leitura conjunta tabs + cards.
470
+ border-radius: var(--matcha-radius-lg, 8px);
471
+ background: var(--matcha-color-surface-card);
472
+ cursor: pointer;
473
+ position: relative;
474
+ overflow: hidden;
475
+ font-family: var(--matcha-font-family);
476
+ font-size: var(--matcha-text-body-md, 14px);
477
+ font-weight: var(--matcha-weight-regular, 400);
478
+ line-height: var(--matcha-leading-body-md, 20px);
479
+ color: var(--matcha-color-text-secondary,
480
+ color-mix(in srgb, var(--matcha-color-fg) 70%, transparent));
481
+ flex-shrink: 0;
482
+ min-width: var(--matcha-tab-min-width-card-horizontal);
483
+ transition:
484
+ border-color var(--matcha-duration-fast, 200ms) var(--matcha-easing-standard, cubic-bezier(0.4, 0, 0.2, 1)),
485
+ color var(--matcha-duration-fast, 200ms) var(--matcha-easing-standard, cubic-bezier(0.4, 0, 0.2, 1)),
486
+ transform var(--matcha-duration-instant, 80ms) ease;
487
+
488
+ // State layer
489
+ &::before {
490
+ content: '';
491
+ position: absolute;
492
+ inset: 0;
493
+ background: currentColor;
494
+ opacity: 0;
495
+ border-radius: inherit;
496
+ pointer-events: none;
497
+ transition: opacity var(--matcha-duration-instant, 80ms) linear;
498
+ }
499
+ &:hover:not(:disabled) {
500
+ &::before { opacity: var(--matcha-tab-state-opacity-hover); }
501
+ transform: translateY(calc(-1 * var(--matcha-border-hairline, 1px)));
502
+ }
503
+ &:active:not(:disabled)::before { opacity: var(--matcha-tab-state-opacity-active); }
504
+
505
+ // ── Selecionado (Figma: border accent · texto text-primary NÃO accent) ──
506
+ &.active,
507
+ &[aria-selected="true"] {
508
+ border-color: var(--matcha-color-accent);
509
+ color: var(--matcha-color-fg);
510
+ font-weight: var(--matcha-weight-medium, 500);
511
+ }
512
+
513
+ // ── Disabled ──
514
+ &:disabled,
515
+ &[disabled] {
516
+ opacity: var(--matcha-tab-state-opacity-disabled);
517
+ pointer-events: none;
518
+ cursor: default;
519
+ }
520
+
521
+ // ── Focus ring polido ──
522
+ &:focus-visible {
523
+ outline: var(--matcha-state-focus-ring-width, 2px) solid
524
+ var(--matcha-color-accent);
525
+ outline-offset: var(--matcha-border-thin, 2px);
526
+ box-shadow: 0 0 0 var(--matcha-tab-focus-halo)
527
+ color-mix(in srgb, var(--matcha-color-accent) calc(var(--matcha-tab-focus-halo-alpha) * 100%), transparent);
528
+ }
529
+ }
530
+ }
531
+
532
+ // ── Icon inside tab items ──
533
+ .matcha-tab-underline,
534
+ .matcha-tab-card {
535
+ .matcha-tab-item matcha-icon { flex-shrink: 0; }
536
+ }
537
+
538
+ // ── Badge (notificações, contagens) ───────────────────────────────────
539
+ .matcha-tab-item__badge {
540
+ display: inline-flex;
541
+ align-items: center;
542
+ justify-content: center;
543
+ min-width: var(--matcha-space-250, 20px);
544
+ height: var(--matcha-space-250, 20px);
545
+ padding: 0 var(--matcha-space-075, 6px);
546
+ background: var(--matcha-color-accent);
547
+ color: var(--matcha-color-accent-text-on,
548
+ var(--matcha-color-accent-contrast));
549
+ border-radius: var(--matcha-radius-pill, 9999px);
550
+ font-size: var(--matcha-text-body-xs, 11px);
551
+ font-weight: var(--matcha-weight-semibold, 600);
552
+ line-height: 1;
553
+ flex-shrink: 0;
554
+ }
555
+
556
+ // ── Close button (closable tabs) ──────────────────────────────────────
557
+ .matcha-tab-item__close {
558
+ display: inline-flex;
559
+ align-items: center;
560
+ justify-content: center;
561
+ width: var(--matcha-space-300, 24px);
562
+ height: var(--matcha-space-300, 24px);
563
+ border-radius: 50%;
564
+ color: var(--matcha-color-text-secondary,
565
+ color-mix(in srgb, var(--matcha-color-fg) 70%, transparent));
566
+ transition:
567
+ background-color var(--matcha-duration-instant, 80ms) ease,
568
+ color var(--matcha-duration-instant, 80ms) ease;
569
+ flex-shrink: 0;
570
+ cursor: pointer;
571
+ margin-left: var(--matcha-space-050, 4px);
572
+
573
+ &:hover {
574
+ background: var(--matcha-color-surface-hover,
575
+ color-mix(in srgb, var(--matcha-color-fg) 8%, transparent));
576
+ color: var(--matcha-color-fg);
577
+ }
578
+
579
+ &:focus-visible {
580
+ outline: var(--matcha-state-focus-ring-width, 2px) solid
581
+ var(--matcha-color-accent);
582
+ outline-offset: var(--matcha-border-thin, 2px);
583
+ }
584
+
585
+ svg {
586
+ display: block;
587
+ width: var(--matcha-tab-close-size, 14px);
588
+ height: var(--matcha-tab-close-size, 14px);
589
+ }
590
+ }
591
+ }
592
+
593
+ // ── Mobile: reset min-width pra evitar overflow + auto-scroll ───────────
594
+ @media (max-width: 639px) {
595
+ .matcha-tab-underline .matcha-tab-item,
596
+ .matcha-tab-card .matcha-tab-item {
597
+ min-width: auto;
598
+ }
599
+ }
600
+
601
+ // ── Mobile: Underline auto-scrollable em viewports estreitos ────────────
602
+ @media (max-width: 639px) {
603
+ .matcha-tab-underline:not(.matcha-tab-scrollable) {
604
+ overflow-x: auto;
605
+ scrollbar-width: thin;
606
+ }
607
+ }
608
+
609
+ // ── Reduced motion (WCAG 2.2.2) ─────────────────────────────────────────
610
+ @media (prefers-reduced-motion: reduce) {
611
+ .matcha-tab-underline .matcha-tab-item,
612
+ .matcha-tab-underline .matcha-tab-item::before,
613
+ .matcha-tab-card .matcha-tab-item,
614
+ .matcha-tab-card .matcha-tab-item::before,
615
+ .matcha-tab-indicator,
616
+ .matcha-tab-item__close {
617
+ transition: none;
618
+ }
619
+ .matcha-tab-card .matcha-tab-item:hover {
620
+ transform: none;
621
+ }
622
+ }