@inchurch/matcha-theme 20.0.3

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 (112) hide show
  1. package/README.md +303 -0
  2. package/abstracts/_colors.scss +405 -0
  3. package/abstracts/_elevation.scss +102 -0
  4. package/abstracts/_functions.scss +1213 -0
  5. package/abstracts/_media-breakpoint.scss +23 -0
  6. package/abstracts/_typography.scss +127 -0
  7. package/base/_reset.scss +438 -0
  8. package/components/matcha-accordion.scss +157 -0
  9. package/components/matcha-audio-player.scss +32 -0
  10. package/components/matcha-autocomplete.scss +134 -0
  11. package/components/matcha-avatar.scss +161 -0
  12. package/components/matcha-badge.scss +120 -0
  13. package/components/matcha-breadcrumb.scss +126 -0
  14. package/components/matcha-button-toggle.scss +363 -0
  15. package/components/matcha-buttons.scss +784 -0
  16. package/components/matcha-calendar.scss +154 -0
  17. package/components/matcha-cards.scss +205 -0
  18. package/components/matcha-chart-card.scss +60 -0
  19. package/components/matcha-checkbox.scss +554 -0
  20. package/components/matcha-chip.scss +212 -0
  21. package/components/matcha-color-pick.scss +35 -0
  22. package/components/matcha-command-palette.scss +89 -0
  23. package/components/matcha-crop.scss +172 -0
  24. package/components/matcha-date.scss +81 -0
  25. package/components/matcha-divider.scss +45 -0
  26. package/components/matcha-draggable.scss +24 -0
  27. package/components/matcha-drawer.scss +235 -0
  28. package/components/matcha-drop-list.scss +390 -0
  29. package/components/matcha-emoji.scss +69 -0
  30. package/components/matcha-empty-state.scss +118 -0
  31. package/components/matcha-flag.scss +62 -0
  32. package/components/matcha-footer.scss +187 -0
  33. package/components/matcha-form-field.scss +552 -0
  34. package/components/matcha-form-section.scss +101 -0
  35. package/components/matcha-header.scss +325 -0
  36. package/components/matcha-highlight.scss +296 -0
  37. package/components/matcha-hint-text.scss +66 -0
  38. package/components/matcha-horizontal-tree.scss +317 -0
  39. package/components/matcha-icon.scss +106 -0
  40. package/components/matcha-image.scss +62 -0
  41. package/components/matcha-list.scss +212 -0
  42. package/components/matcha-menu.scss +86 -0
  43. package/components/matcha-modal.scss +234 -0
  44. package/components/matcha-nav.scss +450 -0
  45. package/components/matcha-notification.scss +197 -0
  46. package/components/matcha-option.scss +95 -0
  47. package/components/matcha-page-builder.scss +4186 -0
  48. package/components/matcha-paginator.scss +235 -0
  49. package/components/matcha-panel.scss +167 -0
  50. package/components/matcha-profile-card.scss +50 -0
  51. package/components/matcha-progress-bar.scss +209 -0
  52. package/components/matcha-radio.scss +528 -0
  53. package/components/matcha-ripple.scss +7 -0
  54. package/components/matcha-scrollbar.scss +35 -0
  55. package/components/matcha-scrollbox-shadow.scss +123 -0
  56. package/components/matcha-section.scss +105 -0
  57. package/components/matcha-select.scss +661 -0
  58. package/components/matcha-skeleton.scss +138 -0
  59. package/components/matcha-slide-toggle.scss +590 -0
  60. package/components/matcha-slider.scss +188 -0
  61. package/components/matcha-snack-bar.scss +266 -0
  62. package/components/matcha-spin.scss +252 -0
  63. package/components/matcha-spinner.scss +78 -0
  64. package/components/matcha-stepper.scss +177 -0
  65. package/components/matcha-table-cell.scss +41 -0
  66. package/components/matcha-table.scss +785 -0
  67. package/components/matcha-tabs.scss +469 -0
  68. package/components/matcha-text-editor.scss +151 -0
  69. package/components/matcha-time.scss +33 -0
  70. package/components/matcha-timepicker.scss +13 -0
  71. package/components/matcha-toolbar.scss +206 -0
  72. package/components/matcha-tooltip.scss +128 -0
  73. package/components/matcha-uploader.scss +215 -0
  74. package/css/matcha-style.css +76772 -0
  75. package/fonts/CircularStd-Black.eot +0 -0
  76. package/fonts/CircularStd-Black.svg +3426 -0
  77. package/fonts/CircularStd-Black.ttf +0 -0
  78. package/fonts/CircularStd-Black.woff +0 -0
  79. package/fonts/CircularStd-Black.woff2 +0 -0
  80. package/fonts/CircularStd-Bold.eot +0 -0
  81. package/fonts/CircularStd-Bold.otf +0 -0
  82. package/fonts/CircularStd-Bold.svg +13532 -0
  83. package/fonts/CircularStd-Bold.ttf +0 -0
  84. package/fonts/CircularStd-Bold.woff +0 -0
  85. package/fonts/CircularStd-Bold.woff2 +0 -0
  86. package/fonts/CircularStd-Medium.eot +0 -0
  87. package/fonts/CircularStd-Medium.otf +0 -0
  88. package/fonts/CircularStd-Medium.svg +13511 -0
  89. package/fonts/CircularStd-Medium.ttf +0 -0
  90. package/fonts/CircularStd-Medium.woff +0 -0
  91. package/fonts/CircularStd-Medium.woff2 +0 -0
  92. package/fonts/CircularStd-Regular.eot +0 -0
  93. package/fonts/CircularStd-Regular.otf +0 -0
  94. package/fonts/CircularStd-Regular.svg +2378 -0
  95. package/fonts/CircularStd-Regular.ttf +0 -0
  96. package/fonts/CircularStd-Regular.woff +0 -0
  97. package/fonts/CircularStd-Regular.woff2 +0 -0
  98. package/main.scss +262 -0
  99. package/package.json +11 -0
  100. package/tokens/_animations-tokens.scss +37 -0
  101. package/tokens/_breakpoints-tokens.scss +26 -0
  102. package/tokens/_color-tokens.scss +1153 -0
  103. package/tokens/_css-custom-properties.scss +568 -0
  104. package/tokens/_elevation-tokens.scss +33 -0
  105. package/tokens/_spacing-tokens.scss +94 -0
  106. package/tokens/_typography-tokens.scss +65 -0
  107. package/vendors/angular-editor.scss +56 -0
  108. package/vendors/angular-material-fixes.scss +297 -0
  109. package/vendors/calendar.scss +2880 -0
  110. package/vendors/charts.scss +92 -0
  111. package/vendors/ng5-slider.scss +56 -0
  112. package/vendors/ngx-material-timepicker.scss +50 -0
@@ -0,0 +1,317 @@
1
+ @use "sass:map";
2
+
3
+ // =============================================================================
4
+ // matcha-horizontal-tree.scss — Horizontal org tree with connector lines
5
+ // Angular: matcha-horizontal-tree
6
+ // =============================================================================
7
+
8
+ @mixin matcha-horizontal-tree-theme($theme) {
9
+ $is-dark: map.get($theme, is-dark);
10
+
11
+ .svg-line line {
12
+ stroke: var(--matcha-color-text-placeholder, #{getBlueGrey($theme)});
13
+ }
14
+
15
+ .child {
16
+ .the-line-connect-first {
17
+ box-shadow: inset 2px -2px 0 2px var(--matcha-color-accent, #{getAccent($theme)});
18
+ }
19
+
20
+ .the-line-connect {
21
+ box-shadow: inset 2px -2px 0 2px var(--matcha-color-accent, #{getAccent($theme)});
22
+ }
23
+
24
+ .the-line-connect-last {
25
+ box-shadow: inset 2px -2px 0 2px var(--matcha-color-accent, #{getAccent($theme)});
26
+ }
27
+
28
+ .the-line-connect-first-modal {
29
+ box-shadow: inset 2px -2px 0 2px var(--matcha-color-accent-alpha, #{getAccentAlpha($theme)});
30
+ }
31
+
32
+ .the-line-connect-second-modal {
33
+ box-shadow: inset 2px -2px 0 2px var(--matcha-color-accent-alpha, #{getAccentAlpha($theme)});
34
+ }
35
+
36
+ .the-line-connect-last-modal {
37
+ box-shadow: inset 2px -2px 0 2px var(--matcha-color-accent-alpha, #{getAccentAlpha($theme)});
38
+ }
39
+
40
+ .the-line-connect-start-modal {
41
+ box-shadow: inset 2px -2px 0 2px var(--matcha-color-accent-alpha, #{getAccentAlpha($theme)});
42
+ }
43
+
44
+ .the-line-connect-middle {
45
+ box-shadow: inset 2px -2px 0 2px var(--matcha-color-border, #{getGrey($theme)});
46
+ }
47
+ }
48
+
49
+ .tree-node {
50
+ &-content {
51
+ &-btn-add-node {
52
+ background: var(--matcha-color-surface, #{getSurface($theme)});
53
+ box-shadow: inset 0 0 0 3px var(--matcha-color-accent, #{getAccent($theme)});
54
+
55
+ &-i {
56
+ color: var(--matcha-color-accent, #{getAccent($theme)});
57
+ }
58
+ }
59
+ }
60
+ }
61
+
62
+ .tree-first-node {
63
+ &-begin {
64
+ &-btn-add-node {
65
+ background: var(--matcha-color-surface, #{getSurface($theme)});
66
+ box-shadow: inset 0 0 0 3px var(--matcha-color-accent, #{getAccent($theme)});
67
+
68
+ &-i {
69
+ color: var(--matcha-color-accent, #{getAccent($theme)});
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }
75
+
76
+ // ── Layout ──────────────────────────────────────────────────────────────────
77
+
78
+ .svg-line {
79
+ position: absolute;
80
+ top: 0;
81
+ left: 0;
82
+ width: 100%;
83
+ height: 100%;
84
+ z-index: 0;
85
+ pointer-events: none;
86
+
87
+ line {
88
+ stroke-width: var(--matcha-border-medium, 4px);
89
+ }
90
+ }
91
+
92
+ .child {
93
+ display: flex;
94
+ position: relative;
95
+ pointer-events: none;
96
+
97
+ div {
98
+ pointer-events: all;
99
+ }
100
+
101
+ .the-line-connect-first {
102
+ width: 56px;
103
+ height: var(--matcha-border-medium, 4px);
104
+ margin: 56px -16px 56px -40px;
105
+ display: flex;
106
+ position: absolute;
107
+ z-index: 0;
108
+ background: transparent;
109
+ }
110
+
111
+ .the-line-connect {
112
+ width: 56px;
113
+ height: 92px;
114
+ margin: -34px -16px 56px -40px;
115
+ display: flex;
116
+ position: absolute;
117
+ z-index: 0;
118
+ background: transparent;
119
+ border-radius: 0 0 0 40px;
120
+ }
121
+
122
+ .the-line-connect-last {
123
+ width: 56px;
124
+ height: 136px;
125
+ margin: -80px -16px 56px -40px;
126
+ display: flex;
127
+ position: absolute;
128
+ z-index: 0;
129
+ border-radius: 0 0 0 40px;
130
+ background: transparent;
131
+ }
132
+
133
+ .the-line-connect-first-modal {
134
+ width: 56px;
135
+ height: var(--matcha-border-medium, 4px);
136
+ margin: 56px -16px 56px -40px;
137
+ display: flex;
138
+ position: absolute;
139
+ z-index: 0;
140
+ background: transparent;
141
+ }
142
+
143
+ .the-line-connect-second-modal {
144
+ width: 56px;
145
+ border-radius: 0 0 0 40px;
146
+ z-index: 1;
147
+ margin: -16px -16px 56px -40px;
148
+ height: 72px;
149
+ display: flex;
150
+ position: absolute;
151
+ background: transparent;
152
+ }
153
+
154
+ .the-line-connect-last-modal {
155
+ width: 56px;
156
+ height: 150px;
157
+ margin: -90px -16px 56px -40px;
158
+ display: flex;
159
+ position: absolute;
160
+ border-radius: 0 0 0 40px;
161
+ z-index: 1;
162
+ background: transparent;
163
+ }
164
+
165
+ .the-line-connect-start-modal {
166
+ height: 92px;
167
+ margin: -34px -16px 56px -40px;
168
+ width: 56px;
169
+ border-radius: 0 0 0 40px;
170
+ z-index: 1;
171
+ display: flex;
172
+ position: absolute;
173
+ background: transparent;
174
+ }
175
+
176
+ .the-line-connect-middle {
177
+ height: 92px;
178
+ margin: -34px -16px 56px -40px;
179
+ width: 56px;
180
+ border-radius: 0 0 0 40px;
181
+ z-index: 0;
182
+ display: flex;
183
+ position: absolute;
184
+ background: transparent;
185
+ }
186
+ }
187
+
188
+ .tree-node {
189
+ min-width: 264px;
190
+ max-width: 264px;
191
+ width: 264px;
192
+ height: 80px;
193
+ z-index: 1;
194
+
195
+ &-header {
196
+ display: flex;
197
+ justify-content: space-between;
198
+ margin-bottom: var(--matcha-space-050, 4px);
199
+
200
+ &-title {
201
+ font-family: var(--matcha-font-family);
202
+ font-size: var(--matcha-text-body-sm, 12px);
203
+ line-height: var(--matcha-leading-body-sm, 16px);
204
+ display: flex;
205
+ margin: 0 0 var(--matcha-space-050, 4px) 0;
206
+ align-items: center;
207
+ letter-spacing: 0.08em;
208
+ text-transform: uppercase;
209
+ font-weight: var(--matcha-weight-bold, 700);
210
+
211
+ &-bullet {
212
+ height: var(--matcha-space-200, 16px);
213
+ width: var(--matcha-space-100, 8px);
214
+ margin: 0 var(--matcha-space-100, 8px) 0 0;
215
+ display: inline-block;
216
+ position: relative;
217
+ border-radius: var(--matcha-radius-pill, 9999px);
218
+ }
219
+ }
220
+ }
221
+
222
+ &-content {
223
+ display: flex;
224
+ justify-content: space-between;
225
+
226
+ &-profile {
227
+ display: flex;
228
+ align-items: center;
229
+ width: 100%;
230
+
231
+ &-avatar {
232
+ border-radius: var(--matcha-radius-pill, 9999px);
233
+ min-width: var(--matcha-icon-size-md, 24px);
234
+ min-height: var(--matcha-icon-size-md, 24px);
235
+ width: var(--matcha-icon-size-md, 24px);
236
+ height: var(--matcha-icon-size-md, 24px);
237
+ max-width: var(--matcha-icon-size-md, 24px);
238
+ max-height: var(--matcha-icon-size-md, 24px);
239
+ }
240
+
241
+ &-name {
242
+ width: calc(100% - 48px);
243
+ display: flex;
244
+ line-height: var(--matcha-leading-body-md, 20px);
245
+ font-size: var(--matcha-text-title-sm, 16px);
246
+ margin: 0 0 0 var(--matcha-space-100, 8px);
247
+ -webkit-line-clamp: 2;
248
+ overflow: hidden;
249
+ text-overflow: ellipsis;
250
+ word-break: break-word;
251
+ white-space: nowrap;
252
+ -webkit-box-orient: vertical;
253
+ }
254
+ }
255
+
256
+ &-btn-add-node {
257
+ position: absolute;
258
+ margin: var(--matcha-space-300, 24px) 0 0 236px;
259
+ width: var(--matcha-icon-size-md, 24px);
260
+ height: var(--matcha-icon-size-md, 24px);
261
+
262
+ &-i {
263
+ line-height: var(--matcha-leading-body-sm, 16px);
264
+ border-radius: var(--matcha-radius-pill, 9999px);
265
+ }
266
+ }
267
+ }
268
+ }
269
+
270
+ .tree-first-node {
271
+ display: flex;
272
+ justify-content: center;
273
+ align-items: center;
274
+ min-width: 264px;
275
+ max-width: 264px;
276
+ width: 264px;
277
+ height: 80px;
278
+ margin: var(--matcha-space-200, 16px) var(--matcha-space-200, 16px) -10px var(--matcha-space-200, 16px);
279
+ border-radius: var(--matcha-radius-lg, 8px);
280
+ position: relative;
281
+ z-index: 1;
282
+
283
+ &-begin {
284
+ font-family: var(--matcha-font-family);
285
+ font-size: var(--matcha-text-title-sm, 16px);
286
+ font-weight: var(--matcha-weight-bold, 700);
287
+ line-height: var(--matcha-leading-body-sm, 16px);
288
+ display: -webkit-box;
289
+ -webkit-line-clamp: 2;
290
+ overflow: hidden;
291
+ text-overflow: ellipsis;
292
+ word-break: break-word;
293
+ white-space: initial;
294
+ -webkit-box-orient: vertical;
295
+ text-transform: capitalize;
296
+
297
+ &-btn-add-node {
298
+ width: var(--matcha-icon-size-md, 24px);
299
+ height: var(--matcha-icon-size-md, 24px);
300
+ display: block;
301
+ margin: 0 auto;
302
+ position: relative;
303
+ z-index: 1;
304
+
305
+ &-i {
306
+ line-height: var(--matcha-leading-body-sm, 16px);
307
+ border-radius: var(--matcha-radius-pill, 9999px);
308
+ }
309
+ }
310
+ }
311
+ }
312
+
313
+ .matcha-horizontal-tree {
314
+ overflow: auto;
315
+ user-select: none;
316
+ -webkit-user-select: none;
317
+ }
@@ -0,0 +1,106 @@
1
+ // =============================================================================
2
+ // matcha-icon.scss — Icon sizing and theming tokens
3
+ // Aligned with Figma matcha/icon-slot (glyph + container)
4
+ // =============================================================================
5
+
6
+ // ── Icon glyph sizes ────────────────────────────────────────────────────────
7
+ // These override the generated matcha-icons.css with CSS custom properties
8
+ // so consumers can adjust icon sizes at runtime.
9
+ //
10
+ // Glyph scale: xs(12) → sm(16) → md(24) → lg(32) → xl(48)
11
+ // Container: 24px 32px 40px 48px 64px (glyph + 2×8px padding)
12
+
13
+ $icon-size-xs: 12px;
14
+ $icon-size-sm: 16px;
15
+ $icon-size-md: 24px;
16
+ $icon-size-lg: 32px;
17
+ $icon-size-xl: 48px;
18
+
19
+ // ── Material Symbols Rounded — aplicação global da font ─────────────────
20
+ // Usa as propriedades herdáveis (font-family, font-feature-settings) no host
21
+ // para que o texto filho (ligature) renderize como glyph.
22
+ matcha-icon[library="symbols"] {
23
+ font-family: 'Material Symbols Rounded', sans-serif !important;
24
+ font-weight: normal;
25
+ font-style: normal;
26
+ letter-spacing: normal;
27
+ text-transform: none;
28
+ white-space: nowrap;
29
+ word-wrap: normal;
30
+ direction: ltr;
31
+ -webkit-font-smoothing: antialiased;
32
+ -moz-osx-font-smoothing: grayscale;
33
+ text-rendering: optimizeLegibility;
34
+ font-feature-settings: 'liga' !important;
35
+ overflow: hidden;
36
+ }
37
+
38
+ [class^="i-matcha-"],
39
+ [class*=" i-matcha-"],
40
+ matcha-icon[library="symbols"] {
41
+ font-size: var(--matcha-icon-size-md, #{$icon-size-md});
42
+ width: var(--matcha-icon-size-md, #{$icon-size-md});
43
+ height: var(--matcha-icon-size-md, #{$icon-size-md});
44
+ line-height: var(--matcha-icon-size-md, #{$icon-size-md});
45
+
46
+ &.i-size-xs,
47
+ &[size="xs"] {
48
+ font-size: var(--matcha-icon-size-xs, #{$icon-size-xs});
49
+ width: var(--matcha-icon-size-xs, #{$icon-size-xs});
50
+ height: var(--matcha-icon-size-xs, #{$icon-size-xs});
51
+ line-height: var(--matcha-icon-size-xs, #{$icon-size-xs});
52
+ }
53
+
54
+ &.i-size-sm,
55
+ &[size="sm"] {
56
+ font-size: var(--matcha-icon-size-sm, #{$icon-size-sm});
57
+ width: var(--matcha-icon-size-sm, #{$icon-size-sm});
58
+ height: var(--matcha-icon-size-sm, #{$icon-size-sm});
59
+ line-height: var(--matcha-icon-size-sm, #{$icon-size-sm});
60
+ }
61
+
62
+ &.i-size-md,
63
+ &[size="md"] {
64
+ font-size: var(--matcha-icon-size-md, #{$icon-size-md});
65
+ width: var(--matcha-icon-size-md, #{$icon-size-md});
66
+ height: var(--matcha-icon-size-md, #{$icon-size-md});
67
+ line-height: var(--matcha-icon-size-md, #{$icon-size-md});
68
+ }
69
+
70
+ &.i-size-lg,
71
+ &[size="lg"] {
72
+ font-size: var(--matcha-icon-size-lg, #{$icon-size-lg});
73
+ width: var(--matcha-icon-size-lg, #{$icon-size-lg});
74
+ height: var(--matcha-icon-size-lg, #{$icon-size-lg});
75
+ line-height: var(--matcha-icon-size-lg, #{$icon-size-lg});
76
+ }
77
+
78
+ &.i-size-xl,
79
+ &[size="xl"] {
80
+ font-size: var(--matcha-icon-size-xl, #{$icon-size-xl});
81
+ width: var(--matcha-icon-size-xl, #{$icon-size-xl});
82
+ height: var(--matcha-icon-size-xl, #{$icon-size-xl});
83
+ line-height: var(--matcha-icon-size-xl, #{$icon-size-xl});
84
+ }
85
+ }
86
+
87
+ // ── Theme mixin (color inheritance) ─────────────────────────────────────────
88
+ @mixin matcha-icon-theme($theme) {
89
+ matcha-icon,
90
+ [class^="i-matcha-"],
91
+ [class*=" i-matcha-"] {
92
+ color: var(--matcha-color-icon-default, #{getBlueGrey($theme)});
93
+
94
+ &.color-fg, &[color="fg"] { color: var(--matcha-color-fg, #{getForeground($theme)}); }
95
+ &.color-accent, &[color="accent"] { color: var(--matcha-color-accent, #{getAccent($theme)}); }
96
+ &.color-primary, &[color="primary"] { color: var(--matcha-color-primary, #{getPrimary($theme)}); }
97
+ &.color-danger, &[color="danger"] { color: var(--matcha-color-danger, #{getDanger($theme)}); }
98
+ &.color-warn, &[color="warn"] { color: var(--matcha-color-warn, #{getWarn($theme)}); }
99
+ &.color-success, &[color="success"] { color: var(--matcha-color-success, #{getSuccess($theme)}); }
100
+
101
+ &[disabled],
102
+ &.disabled {
103
+ opacity: var(--matcha-opacity-disabled, 0.38);
104
+ }
105
+ }
106
+ }
@@ -0,0 +1,62 @@
1
+ @use "sass:map";
2
+
3
+ // =============================================================================
4
+ // matcha-image.scss — Image container with aspect ratio support
5
+ // Aligned with Figma matcha/image:
6
+ // Estado(2: Desativo, Ativado) × Ratio(16:9 default)
7
+ // Angular: matcha-image
8
+ // =============================================================================
9
+
10
+ @mixin matcha-image-theme($theme) {
11
+ $is-dark: map.get($theme, is-dark);
12
+
13
+ .matcha-image {
14
+ background: var(--matcha-color-surface, #{getSurface($theme)});
15
+ }
16
+
17
+ .matcha-image__placeholder-icon {
18
+ color: var(--matcha-color-text-placeholder, #{getBlueGrey($theme)});
19
+ }
20
+ }
21
+
22
+ // ── Layout ──────────────────────────────────────────────────────────────────
23
+
24
+ .matcha-image {
25
+ position: relative;
26
+ display: flex;
27
+ align-items: center;
28
+ justify-content: center;
29
+ border-radius: var(--matcha-radius-lg, 8px);
30
+ overflow: hidden;
31
+ width: 100%;
32
+ aspect-ratio: 16 / 9;
33
+ }
34
+
35
+ .matcha-image__img {
36
+ width: 100%;
37
+ height: 100%;
38
+ object-fit: cover;
39
+ display: block;
40
+ }
41
+
42
+ .matcha-image__placeholder-icon {
43
+ width: var(--matcha-icon-size-lg, 48px);
44
+ height: var(--matcha-icon-size-lg, 48px);
45
+ opacity: 0.5;
46
+ }
47
+
48
+ // ── Ratios ──────────────────────────────────────────────────────────────────
49
+
50
+ .matcha-image--1x1 {
51
+ aspect-ratio: 1 / 1;
52
+ }
53
+
54
+ .matcha-image--4x3 {
55
+ aspect-ratio: 4 / 3;
56
+ }
57
+
58
+ .matcha-image--3x2 {
59
+ aspect-ratio: 3 / 2;
60
+ }
61
+
62
+ // 16:9 is default, no modifier needed
@@ -0,0 +1,212 @@
1
+ @use "sass:map";
2
+
3
+ // =============================================================================
4
+ // matcha-list.scss — List & List Item (navigation, settings, content lists)
5
+ // =============================================================================
6
+
7
+ // ── State layer ─────────────────────────────────────────────────────────────
8
+
9
+ .matcha-list-item {
10
+ position: relative;
11
+ overflow: hidden;
12
+
13
+ &::before {
14
+ content: '';
15
+ position: absolute;
16
+ inset: 0;
17
+ background: currentColor;
18
+ opacity: 0;
19
+ border-radius: inherit;
20
+ pointer-events: none;
21
+ transition: opacity var(--matcha-duration-instant, 80ms) linear;
22
+ }
23
+
24
+ &:hover:not(.matcha-list-item--disabled)::before {
25
+ opacity: var(--matcha-state-hover, 0.08);
26
+ }
27
+
28
+ &:active:not(.matcha-list-item--disabled)::before {
29
+ opacity: var(--matcha-state-active, 0.12);
30
+ }
31
+
32
+ @media (prefers-reduced-motion: reduce) {
33
+ &::before { transition: none; }
34
+ }
35
+ }
36
+
37
+ // =============================================================================
38
+ // Theme mixin
39
+ // =============================================================================
40
+
41
+ @mixin matcha-list-theme($theme) {
42
+ $is-dark: map.get($theme, is-dark);
43
+
44
+ // ── List container ──
45
+ matcha-list,
46
+ matcha-nav-list {
47
+ display: block;
48
+ padding: var(--matcha-space-100, 8px) 0;
49
+
50
+ &.matcha-list-dense {
51
+ matcha-list-item,
52
+ .matcha-list-item {
53
+ min-height: 36px;
54
+ }
55
+ }
56
+ }
57
+
58
+ // ── List item ──
59
+ matcha-list-item,
60
+ a[matcha-list-item],
61
+ button[matcha-list-item],
62
+ .matcha-list-item {
63
+ display: flex;
64
+ align-items: center;
65
+ min-height: 48px;
66
+ padding: var(--matcha-space-100, 8px) var(--matcha-space-200, 16px);
67
+ border-radius: var(--matcha-radius-md, 4px);
68
+ cursor: pointer;
69
+ outline: none;
70
+ color: var(--matcha-color-fg, #{getForeground($theme)});
71
+ text-decoration: none;
72
+ transition: background-color 150ms;
73
+
74
+ // Focus ring
75
+ &:focus-visible {
76
+ outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent, #{getAccent($theme)});
77
+ outline-offset: var(--matcha-state-focus-ring-offset, 2px);
78
+ }
79
+
80
+ // Disabled
81
+ &.matcha-list-item--disabled,
82
+ &.matcha-list-item-disabled {
83
+ opacity: var(--matcha-opacity-disabled, 0.38);
84
+ pointer-events: none;
85
+ cursor: default;
86
+ }
87
+
88
+ // Active/Selected
89
+ &.matcha-list-item--active {
90
+ background-color: var(--matcha-color-accent-surface, #{getAccentAlpha($theme)});
91
+
92
+ .matcha-list-item__label {
93
+ color: var(--matcha-color-accent, #{getAccent($theme)});
94
+ font-weight: 600;
95
+ }
96
+
97
+ .matcha-list-item__leading {
98
+ color: var(--matcha-color-accent, #{getAccent($theme)});
99
+ }
100
+ }
101
+ }
102
+
103
+ // ── Item content layout ──
104
+ .matcha-list-item-content,
105
+ .matcha-list-item__content {
106
+ display: flex;
107
+ align-items: center;
108
+ width: 100%;
109
+ gap: var(--matcha-space-150, 12px);
110
+ }
111
+
112
+ // ── Leading (icon, avatar) ──
113
+ .matcha-list-item__leading {
114
+ flex-shrink: 0;
115
+ display: flex;
116
+ align-items: center;
117
+ justify-content: center;
118
+ color: var(--matcha-color-hint, #{getGrey($theme)});
119
+ }
120
+
121
+ // ── Text area (label + description) ──
122
+ .matcha-list-item__text {
123
+ flex: 1;
124
+ min-width: 0;
125
+ display: flex;
126
+ flex-direction: column;
127
+ gap: var(--matcha-space-025, 2px);
128
+ }
129
+
130
+ .matcha-list-item__label {
131
+ font-size: var(--matcha-text-body-md, 14px);
132
+ font-weight: var(--matcha-weight-regular, 400);
133
+ line-height: var(--matcha-leading-body-md, 20px);
134
+ color: var(--matcha-color-fg, #{getForeground($theme)});
135
+ overflow: hidden;
136
+ text-overflow: ellipsis;
137
+ white-space: nowrap;
138
+ }
139
+
140
+ .matcha-list-item__description {
141
+ font-size: var(--matcha-text-body-sm, 12px);
142
+ font-weight: var(--matcha-weight-regular, 400);
143
+ line-height: var(--matcha-leading-body-sm, 16px);
144
+ color: var(--matcha-color-hint, #{getGrey($theme)});
145
+ overflow: hidden;
146
+ text-overflow: ellipsis;
147
+ white-space: nowrap;
148
+ }
149
+
150
+ // ── Trailing (chevron, badge, switch, meta) ──
151
+ .matcha-list-item__trailing {
152
+ flex-shrink: 0;
153
+ display: flex;
154
+ align-items: center;
155
+ gap: var(--matcha-space-100, 8px);
156
+ color: var(--matcha-color-hint, #{getGrey($theme)});
157
+ }
158
+
159
+ // ── Divider between items ──
160
+ .matcha-list-divider {
161
+ height: var(--matcha-border-hairline, 1px);
162
+ margin: var(--matcha-space-050, 4px) var(--matcha-space-200, 16px);
163
+ background-color: var(--matcha-color-border, #{getGrey($theme)});
164
+ opacity: var(--matcha-opacity-subtle, 0.10);
165
+ }
166
+
167
+ // ── Section header ──
168
+ .matcha-list-subheader {
169
+ display: flex;
170
+ align-items: center;
171
+ padding: var(--matcha-space-200, 16px) var(--matcha-space-200, 16px) var(--matcha-space-075, 6px);
172
+ font-size: var(--matcha-text-caption, 11px);
173
+ font-weight: var(--matcha-weight-medium, 500);
174
+ line-height: var(--matcha-leading-caption, 14px);
175
+ letter-spacing: var(--matcha-letter-spacing-wide, 0.5px);
176
+ text-transform: uppercase;
177
+ color: var(--matcha-color-hint, #{getGrey($theme)});
178
+ }
179
+
180
+ // ── 2-line variant (with description) ──
181
+ .matcha-list-item--two-line,
182
+ matcha-list-item.matcha-list-item--two-line {
183
+ min-height: 64px;
184
+ padding-top: var(--matcha-space-150, 12px);
185
+ padding-bottom: var(--matcha-space-150, 12px);
186
+ }
187
+
188
+ // ── Dense variant ──
189
+ .matcha-list--dense {
190
+ matcha-list-item,
191
+ .matcha-list-item {
192
+ min-height: 36px;
193
+ padding: var(--matcha-space-050, 4px) var(--matcha-space-200, 16px);
194
+
195
+ .matcha-list-item__label {
196
+ font-size: var(--matcha-text-button-sm, 13px);
197
+ }
198
+ }
199
+ }
200
+
201
+ // ── Inset (leading space without icon) ──
202
+ .matcha-list-item--inset {
203
+ padding-left: calc(var(--matcha-space-200, 16px) + 36px);
204
+ }
205
+
206
+ @media (prefers-reduced-motion: reduce) {
207
+ matcha-list-item,
208
+ .matcha-list-item {
209
+ transition: none;
210
+ }
211
+ }
212
+ }