@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,235 @@
1
+ @use "sass:map";
2
+
3
+ // =============================================================================
4
+ // matcha-drawer.scss — Drawer / Sidenav (over, push, side)
5
+ // =============================================================================
6
+
7
+ // ── Animations ──────────────────────────────────────────────────────────────
8
+
9
+ @keyframes matcha-drawer-backdrop-in {
10
+ from { opacity: 0; }
11
+ to { opacity: 1; }
12
+ }
13
+
14
+ @keyframes matcha-drawer-backdrop-out {
15
+ from { opacity: 1; }
16
+ to { opacity: 0; }
17
+ }
18
+
19
+ @media (prefers-reduced-motion: reduce) {
20
+ matcha-drawer,
21
+ .matcha-drawer-backdrop,
22
+ matcha-drawer-content {
23
+ animation: none !important;
24
+ transition: none !important;
25
+ }
26
+ }
27
+
28
+ // =============================================================================
29
+ // Theme mixin
30
+ // =============================================================================
31
+
32
+ @mixin matcha-drawer-theme($theme) {
33
+ $is-dark: map.get($theme, is-dark);
34
+
35
+ // ── Container ──
36
+ matcha-drawer-container {
37
+ display: block;
38
+ position: relative;
39
+ z-index: 1;
40
+ box-sizing: border-box;
41
+ -webkit-overflow-scrolling: touch;
42
+ overflow: hidden;
43
+ background-color: var(--matcha-color-bg, #{getBackground($theme)});
44
+ color: var(--matcha-color-fg, #{getForeground($theme)});
45
+ }
46
+
47
+ // ── Backdrop ──
48
+ .matcha-drawer-backdrop {
49
+ position: absolute;
50
+ inset: 0;
51
+ z-index: 3;
52
+ display: block;
53
+ visibility: hidden;
54
+ cursor: pointer;
55
+ // Figma matcha/overlay Type=Drawer: scrim 30% + blur 4px
56
+ background-color: var(--matcha-scrim-drawer, rgba(0, 0, 0, 0.3));
57
+ backdrop-filter: blur(var(--matcha-scrim-drawer-blur, 4px));
58
+ opacity: 0;
59
+ transition: opacity var(--matcha-duration-normal, 200ms) ease,
60
+ visibility var(--matcha-duration-normal, 200ms) ease;
61
+ }
62
+
63
+ // Backdrop visible
64
+ matcha-drawer-container.matcha-drawer-container-has-open .matcha-drawer-backdrop {
65
+ visibility: visible;
66
+ opacity: 1;
67
+ }
68
+
69
+ // ── Content container ──
70
+ .matcha-drawer-content-container {
71
+ position: relative;
72
+ z-index: 0;
73
+ display: block;
74
+ height: 100%;
75
+ overflow: auto;
76
+ }
77
+
78
+ // ── Drawer ──
79
+ matcha-drawer {
80
+ display: block;
81
+ position: absolute;
82
+ top: 0;
83
+ bottom: 0;
84
+ z-index: 10;
85
+ outline: 0;
86
+ box-sizing: border-box;
87
+ overflow-y: auto;
88
+ overflow-x: hidden;
89
+ transform: translate3d(-100%, 0, 0);
90
+ visibility: hidden;
91
+ transition: transform var(--matcha-duration-normal, 200ms) cubic-bezier(0.16, 1, 0.3, 1),
92
+ visibility var(--matcha-duration-normal, 200ms) ease;
93
+ background-color: var(--matcha-color-surface, #{getSurface($theme)});
94
+ color: var(--matcha-color-fg, #{getForeground($theme)});
95
+ pointer-events: auto;
96
+
97
+ // Shadow level 3 (modals, drawers)
98
+ box-shadow: var(--matcha-shadow-3, #{if($is-dark, $shadow-3-dark, $shadow-3-light)});
99
+
100
+ @if $is-dark {
101
+ border-right: var(--matcha-border-hairline, 1px) solid rgba(255, 255, 255, 0.06);
102
+ }
103
+
104
+ // Position end (right)
105
+ &.matcha-drawer-end {
106
+ right: 0;
107
+ transform: translate3d(100%, 0, 0);
108
+
109
+ @if $is-dark {
110
+ border-right: none;
111
+ border-left: var(--matcha-border-hairline, 1px) solid rgba(255, 255, 255, 0.06);
112
+ }
113
+ }
114
+
115
+ // Position bottom (bottom sheet)
116
+ &.matcha-drawer-bottom {
117
+ top: auto;
118
+ left: 0;
119
+ right: 0;
120
+ bottom: 0;
121
+ width: 100%;
122
+ max-height: 90vh;
123
+ border-radius: var(--matcha-radius-xl, 16px) var(--matcha-radius-xl, 16px) 0 0;
124
+ transform: translate3d(0, 100%, 0);
125
+
126
+ @if $is-dark {
127
+ border-right: none;
128
+ border-top: var(--matcha-border-hairline, 1px) solid rgba(255, 255, 255, 0.06);
129
+ } @else {
130
+ border-right: none;
131
+ }
132
+
133
+ // Drag handle
134
+ &::before {
135
+ content: '';
136
+ display: block;
137
+ width: 32px;
138
+ height: 4px;
139
+ margin: var(--matcha-space-100, 8px) auto;
140
+ border-radius: var(--matcha-radius-sm, 2px);
141
+ background: var(--matcha-color-hint, #{getGrey($theme)});
142
+ opacity: 0.3;
143
+ }
144
+ }
145
+
146
+ // Opened state
147
+ &.matcha-drawer-opened {
148
+ transform: translate3d(0, 0, 0);
149
+ visibility: visible;
150
+ }
151
+
152
+ // Mode: over — floats above content with shadow
153
+ &.matcha-drawer-over {
154
+ z-index: 15;
155
+ }
156
+
157
+ // Mode: side — fixed, no shadow, border only
158
+ &.matcha-drawer-side {
159
+ z-index: 10;
160
+ border-right: var(--matcha-border-hairline, 1px) solid var(--matcha-color-border, #{getGrey($theme)});
161
+ box-shadow: none;
162
+
163
+ &.matcha-drawer-end {
164
+ border-right: none;
165
+ border-left: var(--matcha-border-hairline, 1px) solid var(--matcha-color-border, #{getGrey($theme)});
166
+ }
167
+ }
168
+
169
+ // Mode: push — pushes content, border only
170
+ &.matcha-drawer-push {
171
+ border-right: var(--matcha-border-hairline, 1px) solid var(--matcha-color-border, #{getGrey($theme)});
172
+ box-shadow: none;
173
+
174
+ &.matcha-drawer-end {
175
+ border-right: none;
176
+ border-left: var(--matcha-border-hairline, 1px) solid var(--matcha-color-border, #{getGrey($theme)});
177
+ }
178
+ }
179
+
180
+ // Inner container
181
+ .matcha-drawer-inner-container {
182
+ width: 100%;
183
+ height: 100%;
184
+ display: flex;
185
+ flex-direction: column;
186
+ -webkit-overflow-scrolling: touch;
187
+ }
188
+ }
189
+
190
+ // ── Drawer header ──
191
+ .matcha-drawer-header {
192
+ display: flex;
193
+ align-items: center;
194
+ justify-content: space-between;
195
+ gap: var(--matcha-space-150, 12px);
196
+ padding: var(--matcha-space-200, 16px) var(--matcha-space-300, 24px);
197
+ flex-shrink: 0;
198
+ color: var(--matcha-color-fg, #{getForeground($theme)});
199
+ }
200
+
201
+ // ── Drawer content ──
202
+ .matcha-drawer-content-area {
203
+ flex: 1;
204
+ overflow-y: auto;
205
+ overflow-x: hidden;
206
+ padding: var(--matcha-space-300, 24px);
207
+ color: var(--matcha-color-fg, #{getForeground($theme)});
208
+ }
209
+
210
+ // ── Drawer footer ──
211
+ .matcha-drawer-footer {
212
+ display: flex;
213
+ align-items: center;
214
+ justify-content: flex-end;
215
+ gap: var(--matcha-space-150, 12px);
216
+ padding: var(--matcha-space-200, 16px) var(--matcha-space-300, 24px);
217
+ flex-shrink: 0;
218
+ }
219
+
220
+ // ── Drawer content (main page) ──
221
+ matcha-drawer-content {
222
+ position: relative;
223
+ z-index: 1;
224
+ display: block;
225
+ height: 100%;
226
+ overflow: auto;
227
+ transition: margin var(--matcha-duration-normal, 200ms) cubic-bezier(0.16, 1, 0.3, 1);
228
+ }
229
+
230
+ // ── Focus ring ──
231
+ matcha-drawer:focus-visible {
232
+ outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent, #{getAccent($theme)});
233
+ outline-offset: var(--matcha-state-focus-ring-offset, 2px);
234
+ }
235
+ }
@@ -0,0 +1,390 @@
1
+ @use "sass:map";
2
+
3
+ // =============================================================================
4
+ // MATCHA DROP LIST STYLES
5
+ // =============================================================================
6
+
7
+ // Mixin para cores e temas
8
+ @mixin matcha-drop-list-theme($theme) {
9
+ $is-dark: map.get($theme, is-dark);
10
+
11
+ // =============================================================================
12
+ // COMPONENTE PRINCIPAL
13
+ // =============================================================================
14
+
15
+ .matcha-drop-list {
16
+ display: block;
17
+ position: relative;
18
+ }
19
+
20
+ // =============================================================================
21
+ // CONTAINER DAS LISTAS
22
+ // =============================================================================
23
+
24
+ .matcha-drop-list-container {
25
+ position: relative;
26
+ min-height: 48px;
27
+ display: flex;
28
+ flex-direction: column;
29
+ gap: var(--matcha-space-200, 16px);
30
+ padding: 0px;
31
+ border-radius: var(--matcha-radius-lg, 8px);
32
+ border-width: 0px;
33
+ transition: background-color 0.2s ease, border-color 0.2s ease, padding 0.2s ease;
34
+
35
+ &.matcha-drop-list-receiving {
36
+ background-color: getPrimaryAlpha($theme);
37
+ border-color: var(--matcha-color-accent, #{getAccent($theme)});
38
+ border-width: 2px;
39
+ border-style: dashed;
40
+ border-radius: var(--matcha-radius-lg, 8px);
41
+ padding: var(--matcha-space-100, 8px);
42
+ transition: background-color 0.2s ease, border-color 0.2s ease, padding 0.2s ease;
43
+
44
+ &::before {
45
+ content: '';
46
+ position: absolute;
47
+ top: 0;
48
+ left: 0;
49
+ right: 0;
50
+ bottom: 0;
51
+ background: linear-gradient(45deg,
52
+ transparent 25%,
53
+ getPrimaryAlpha($theme) 25%,
54
+ getPrimaryAlpha($theme) 50%,
55
+ transparent 50%,
56
+ transparent 75%,
57
+ getPrimaryAlpha($theme) 75%,
58
+ getPrimaryAlpha($theme));
59
+ background-size: 16px 16px;
60
+ animation: drop-zone-animation 2s linear infinite;
61
+ border-radius: var(--matcha-radius-md, 4px);
62
+ opacity: 0.4;
63
+ }
64
+ }
65
+
66
+ // Estados de aceitação de drop
67
+ &.matcha-drop-list-can-accept {
68
+ background-color: getGreenAlpha($theme);
69
+ border-color: getGreen($theme);
70
+ cursor: copy;
71
+
72
+ &::before {
73
+ background: linear-gradient(45deg,
74
+ transparent 25%,
75
+ getGreenAlpha($theme) 25%,
76
+ getGreenAlpha($theme) 50%,
77
+ transparent 50%,
78
+ transparent 75%,
79
+ getGreenAlpha($theme) 75%,
80
+ getGreenAlpha($theme));
81
+ background-size: 16px 16px;
82
+ animation: drop-zone-animation 1.5s linear infinite;
83
+ opacity: 0.5;
84
+ }
85
+ }
86
+
87
+
88
+
89
+ &.matcha-drop-list-cannot-accept {
90
+ background-color: getRedAlpha($theme);
91
+ border-color: getRed($theme);
92
+ pointer-events: none;
93
+ cursor: default;
94
+
95
+ &::before {
96
+ background: linear-gradient(45deg,
97
+ transparent 25%,
98
+ getRedAlpha($theme) 25%,
99
+ getRedAlpha($theme) 50%,
100
+ transparent 50%,
101
+ transparent 75%,
102
+ getRedAlpha($theme) 75%,
103
+ getRedAlpha($theme));
104
+ background-size: 16px 16px;
105
+ animation: drop-zone-animation 0.8s linear infinite;
106
+ opacity: 0.6;
107
+ }
108
+ }
109
+
110
+ &.matcha-drop-list-disabled {
111
+ color: var(--matcha-color-disabled-fg, #{getDisabledBgContrast($theme)});
112
+ background-color: var(--matcha-color-disabled-bg, #{getDisabled($theme)});
113
+ pointer-events: none;
114
+ cursor: default;
115
+ }
116
+ }
117
+
118
+ // =============================================================================
119
+ // ITENS ARRASTÁVEIS — Template A
120
+ // =============================================================================
121
+
122
+ .matcha-drag-item {
123
+ position: relative;
124
+ display: flex;
125
+ padding: var(--matcha-space-150, 12px);
126
+ border-radius: var(--matcha-radius-md, 4px);
127
+ overflow: hidden;
128
+ transition: box-shadow 0.2s ease, transform 0.2s ease, opacity 0.2s ease;
129
+ user-select: none;
130
+ background-color: var(--matcha-color-surface, #{getSurface($theme)});
131
+ color: var(--matcha-color-fg, #{getForeground($theme)});
132
+
133
+ // State layer (Template A)
134
+ &::before {
135
+ content: '';
136
+ position: absolute;
137
+ inset: 0;
138
+ background: currentColor;
139
+ opacity: 0;
140
+ border-radius: inherit;
141
+ pointer-events: none;
142
+ transition: opacity var(--matcha-duration-instant, 80ms) linear;
143
+ }
144
+
145
+ &:last-child {
146
+ margin-bottom: 0;
147
+ }
148
+
149
+ &:hover:not([disabled])::before { opacity: var(--matcha-state-hover, 0.08); }
150
+ &:active:not([disabled])::before { opacity: var(--matcha-state-active, 0.12); }
151
+
152
+ &:focus-visible:not([disabled]) {
153
+ outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent, #{getAccent($theme)});
154
+ outline-offset: var(--matcha-state-focus-ring-offset, 2px);
155
+ }
156
+
157
+ @media (prefers-reduced-motion: reduce) {
158
+ &::before { transition: none; }
159
+ }
160
+
161
+ &.matcha-drag-dragging {
162
+ z-index: 1000;
163
+ cursor: grabbing;
164
+ position: relative;
165
+ box-shadow: 0 8px 25px getDisabledContrastAlpha($theme);
166
+ background-color: var(--matcha-color-surface, #{getSurface($theme)});
167
+ transform: scale(1.02);
168
+ opacity: 0.95;
169
+
170
+ // Efeito de destaque sutil
171
+ &::before {
172
+ content: '';
173
+ position: absolute;
174
+ inset: 0;
175
+ border-radius: var(--matcha-radius-lg, 8px);
176
+ z-index: -1;
177
+ opacity: 0.1;
178
+ background: linear-gradient(45deg, getSurface($theme), getPrimary($theme));
179
+ animation: drag-glow 1s ease-in-out infinite alternate;
180
+ }
181
+ }
182
+
183
+ &.matcha-drag-disabled {
184
+ pointer-events: none;
185
+ cursor: default;
186
+ color: var(--matcha-color-disabled-fg, #{getDisabledBgContrast($theme)});
187
+ background-color: var(--matcha-color-disabled-bg, #{getDisabled($theme)});
188
+ }
189
+
190
+ &.disabled-item {
191
+ pointer-events: none;
192
+ cursor: default;
193
+ color: var(--matcha-color-disabled-fg, #{getDisabledBgContrast($theme)});
194
+ background-color: var(--matcha-color-disabled-bg, #{getDisabled($theme)});
195
+ }
196
+ }
197
+
198
+ // =============================================================================
199
+ // HANDLE DE DRAG
200
+ // =============================================================================
201
+
202
+ .matcha-drag-handle {
203
+ cursor: grab;
204
+ touch-action: none;
205
+
206
+ &:active {
207
+ cursor: grabbing;
208
+ }
209
+
210
+ &.disabled {
211
+ pointer-events: none;
212
+ cursor: default;
213
+ }
214
+ }
215
+
216
+ // =============================================================================
217
+ // CONTEÚDO DOS ITENS
218
+ // =============================================================================
219
+
220
+ .item-content {
221
+ flex: 1;
222
+ display: flex;
223
+ flex-direction: column;
224
+ gap: var(--matcha-space-050, 4px);
225
+
226
+ .item-title {
227
+ font-weight: 500;
228
+ color: var(--matcha-color-fg, #{getForeground($theme)});
229
+
230
+ &.completed {
231
+ text-decoration: line-through;
232
+ opacity: 0.7;
233
+ }
234
+ }
235
+
236
+ .item-id {
237
+ font-size: var(--matcha-text-body-sm, 12px);
238
+ font-family: monospace;
239
+ color: getDisabledContrastAlpha($theme);
240
+ }
241
+
242
+ small {
243
+ font-size: var(--matcha-text-caption, 11px);
244
+ font-style: italic;
245
+ color: getForegroundAlpha($theme);
246
+ }
247
+ }
248
+
249
+ // =============================================================================
250
+ // AÇÕES DOS ITENS
251
+ // =============================================================================
252
+
253
+ .item-actions {
254
+ display: flex;
255
+ align-items: center;
256
+ gap: var(--matcha-space-100, 8px);
257
+
258
+ i {
259
+ font-size: var(--matcha-icon-size-sm, 16px);
260
+ }
261
+ }
262
+
263
+ // =============================================================================
264
+ // INDICADOR DE DROP
265
+ // =============================================================================
266
+
267
+ .matcha-drop-indicator {
268
+ position: absolute;
269
+ left: 0;
270
+ right: 0;
271
+ height: 2px;
272
+ opacity: 0;
273
+ transition: opacity 0.2s ease;
274
+ transform: translateY(-8px);
275
+ z-index: 1000;
276
+ pointer-events: none;
277
+ margin: 0;
278
+ border-radius: var(--matcha-radius-sm, 2px);
279
+ background-color: var(--matcha-color-accent, #{getAccent($theme)});
280
+
281
+ &.active {
282
+ opacity: 1;
283
+ }
284
+ }
285
+
286
+ // =============================================================================
287
+ // PLACEHOLDER PARA LISTAS VAZIAS
288
+ // =============================================================================
289
+
290
+ .matcha-drop-list-placeholder {
291
+ position: absolute;
292
+ top: 0;
293
+ left: 0;
294
+ right: 0;
295
+ bottom: 0;
296
+ display: flex;
297
+ align-items: center;
298
+ justify-content: center;
299
+ z-index: 10;
300
+
301
+ .matcha-drop-list-empty-placeholder {
302
+ font-style: italic;
303
+ padding: var(--matcha-space-250, 20px);
304
+ text-align: center;
305
+ font-size: var(--matcha-text-body-md, 14px);
306
+ border-radius: var(--matcha-radius-md, 4px);
307
+ transition: color 0.2s ease, border-color 0.2s ease, background-color 0.2s ease;
308
+ color: getDisabledContrastAlpha($theme);
309
+ border-color: getForegroundAlpha($theme);
310
+
311
+ &.can-accept {
312
+ color: getGreen($theme);
313
+ border-color: getGreen($theme);
314
+ background-color: getGreenAlpha($theme);
315
+ }
316
+
317
+ &.cannot-accept {
318
+ color: getRed($theme);
319
+ border-color: getRed($theme);
320
+ background-color: getRedAlpha($theme);
321
+ animation: shake 0.5s ease-in-out;
322
+ }
323
+ }
324
+ }
325
+
326
+ // =============================================================================
327
+ // HIGH CONTRAST MODE SUPPORT
328
+ // =============================================================================
329
+
330
+ @media (prefers-contrast: high) {
331
+ .matcha-drop-list-container.matcha-drop-list-receiving {
332
+ border-color: var(--matcha-color-fg, #{getForeground($theme)});
333
+ background-color: getForegroundAlpha($theme);
334
+ }
335
+
336
+ .matcha-drag-item.matcha-drag-dragging {
337
+ border: 2px solid var(--matcha-color-fg, #{getForeground($theme)});
338
+ }
339
+ }
340
+ }
341
+
342
+ // =============================================================================
343
+ // ANIMAÇÕES
344
+ // =============================================================================
345
+
346
+ @keyframes drop-zone-animation {
347
+ 0% {
348
+ background-position: 0 0;
349
+ }
350
+ 100% {
351
+ background-position: 32px 0, 32px 0, 32px 0;
352
+ }
353
+ }
354
+
355
+ @keyframes pulse-reject {
356
+ 0% {
357
+ opacity: 0.5;
358
+ transform: scaleY(1);
359
+ }
360
+
361
+ 100% {
362
+ opacity: 1;
363
+ transform: scaleY(1.5);
364
+ }
365
+ }
366
+
367
+ @keyframes shake {
368
+ 0%,
369
+ 100% {
370
+ transform: translateX(0);
371
+ }
372
+
373
+ 25% {
374
+ transform: translateX(-2px);
375
+ }
376
+
377
+ 75% {
378
+ transform: translateX(2px);
379
+ }
380
+ }
381
+
382
+ @keyframes drag-glow {
383
+ 0% {
384
+ opacity: 0.1;
385
+ }
386
+
387
+ 100% {
388
+ opacity: 0.3;
389
+ }
390
+ }
@@ -0,0 +1,69 @@
1
+ @use "sass:map";
2
+
3
+ // =============================================================================
4
+ // matcha-emoji.scss — Pastoral sentiment emojis
5
+ // Aligned with Figma matcha/emoji:
6
+ // 9 sentimentos × 3 estilos = 27 variantes
7
+ // Sentimentos: Feliz, Grato, Abençoado, Doente, Sozinho, Triste, Pouca fé, Cuidado, Angustiado
8
+ // Estilos: Default (emoji nativo), Outline, Filled
9
+ // Tamanhos: sm (16px), md (24px), lg (32px)
10
+ // Angular: matcha-emoji
11
+ // =============================================================================
12
+
13
+ // ── Layout ──────────────────────────────────────────────────────────────────
14
+
15
+ .matcha-emoji {
16
+ display: inline-flex;
17
+ align-items: center;
18
+ justify-content: center;
19
+ flex-shrink: 0;
20
+ user-select: none;
21
+ }
22
+
23
+ // ── Sizes ───────────────────────────────────────────────────────────────────
24
+
25
+ .matcha-emoji--sm {
26
+ width: var(--matcha-icon-size-sm, 16px);
27
+ height: var(--matcha-icon-size-sm, 16px);
28
+ font-size: var(--matcha-icon-size-sm, 16px);
29
+ }
30
+
31
+ .matcha-emoji--md {
32
+ width: var(--matcha-icon-size-md, 24px);
33
+ height: var(--matcha-icon-size-md, 24px);
34
+ font-size: var(--matcha-icon-size-md, 24px);
35
+ }
36
+
37
+ .matcha-emoji--lg {
38
+ width: var(--matcha-icon-size-lg, 32px);
39
+ height: var(--matcha-icon-size-lg, 32px);
40
+ font-size: var(--matcha-icon-size-lg, 32px);
41
+ }
42
+
43
+ // ── Styles ──────────────────────────────────────────────────────────────────
44
+
45
+ .matcha-emoji--default {
46
+ // Native emoji — no additional styling needed
47
+ }
48
+
49
+ .matcha-emoji--outline,
50
+ .matcha-emoji--filled {
51
+ svg {
52
+ width: 100%;
53
+ height: 100%;
54
+ }
55
+ }
56
+
57
+ // ── Theme ───────────────────────────────────────────────────────────────────
58
+
59
+ @mixin matcha-emoji-theme($theme) {
60
+ .matcha-emoji--outline svg {
61
+ fill: none;
62
+ stroke: var(--matcha-color-fg, #{getForeground($theme)});
63
+ stroke-width: 1.5;
64
+ }
65
+
66
+ .matcha-emoji--filled svg {
67
+ fill: var(--matcha-color-fg, #{getForeground($theme)});
68
+ }
69
+ }