@revikornmann/muka-ui 0.7.0 → 0.9.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 (172) hide show
  1. package/build/manifest.json +4 -1
  2. package/dist/cjs/components/Alert/Alert.css +7 -0
  3. package/dist/cjs/components/Button/Button.css +29 -0
  4. package/dist/cjs/components/Button/Button.js +1 -1
  5. package/dist/cjs/components/Checkbox/Checkbox.js +44 -5
  6. package/dist/cjs/components/Checkbox/Checkbox.js.map +1 -1
  7. package/dist/cjs/components/DataPieChart/DataPieChart.css +29 -0
  8. package/dist/cjs/components/DataPieChart/DataPieChart.js +20 -3
  9. package/dist/cjs/components/DataPieChart/DataPieChart.js.map +1 -1
  10. package/dist/cjs/components/DatePicker/DatePicker.js +51 -6
  11. package/dist/cjs/components/DatePicker/DatePicker.js.map +1 -1
  12. package/dist/cjs/components/Dialog/Dialog.js +64 -7
  13. package/dist/cjs/components/Dialog/Dialog.js.map +1 -1
  14. package/dist/cjs/components/Form/Form.css +17 -0
  15. package/dist/cjs/components/Form/Form.js +31 -0
  16. package/dist/cjs/components/Form/Form.js.map +1 -0
  17. package/dist/cjs/components/Form/index.js +13 -0
  18. package/dist/cjs/components/Form/index.js.map +1 -0
  19. package/dist/cjs/components/Form/useForm.js +95 -0
  20. package/dist/cjs/components/Form/useForm.js.map +1 -0
  21. package/dist/cjs/components/Input/Input.js +52 -5
  22. package/dist/cjs/components/Input/Input.js.map +1 -1
  23. package/dist/cjs/components/LicensePlateInput/LicensePlateInput.js +50 -5
  24. package/dist/cjs/components/LicensePlateInput/LicensePlateInput.js.map +1 -1
  25. package/dist/cjs/components/NumberInput/NumberInput.js +51 -6
  26. package/dist/cjs/components/NumberInput/NumberInput.js.map +1 -1
  27. package/dist/cjs/components/PhotoUploader/PhotoUploader.css +125 -0
  28. package/dist/cjs/components/PhotoUploader/PhotoUploader.js +257 -0
  29. package/dist/cjs/components/PhotoUploader/PhotoUploader.js.map +1 -0
  30. package/dist/cjs/components/PhotoUploader/index.js +6 -0
  31. package/dist/cjs/components/PhotoUploader/index.js.map +1 -0
  32. package/dist/cjs/components/ProgressAccordeon/ProgressAccordeon.css +32 -2
  33. package/dist/cjs/components/ProgressAccordeon/ProgressAccordeon.js +13 -2
  34. package/dist/cjs/components/ProgressAccordeon/ProgressAccordeon.js.map +1 -1
  35. package/dist/cjs/components/Radio/Radio.js +37 -5
  36. package/dist/cjs/components/Radio/Radio.js.map +1 -1
  37. package/dist/cjs/components/RangeSlider/RangeSlider.js +37 -5
  38. package/dist/cjs/components/RangeSlider/RangeSlider.js.map +1 -1
  39. package/dist/cjs/components/Select/Select.js +53 -7
  40. package/dist/cjs/components/Select/Select.js.map +1 -1
  41. package/dist/cjs/components/Textarea/Textarea.js +43 -5
  42. package/dist/cjs/components/Textarea/Textarea.js.map +1 -1
  43. package/dist/cjs/components/Thumbnail/Thumbnail.css +171 -0
  44. package/dist/cjs/components/Thumbnail/Thumbnail.js +55 -0
  45. package/dist/cjs/components/Thumbnail/Thumbnail.js.map +1 -0
  46. package/dist/cjs/components/Thumbnail/index.js +6 -0
  47. package/dist/cjs/components/Thumbnail/index.js.map +1 -0
  48. package/dist/cjs/components/Toggle/Toggle.js +37 -5
  49. package/dist/cjs/components/Toggle/Toggle.js.map +1 -1
  50. package/dist/cjs/components/index.js +10 -3
  51. package/dist/cjs/components/index.js.map +1 -1
  52. package/dist/esm/components/Alert/Alert.css +7 -0
  53. package/dist/esm/components/Button/Button.css +29 -0
  54. package/dist/esm/components/Button/Button.js +1 -1
  55. package/dist/esm/components/Checkbox/Checkbox.js +11 -4
  56. package/dist/esm/components/Checkbox/Checkbox.js.map +1 -1
  57. package/dist/esm/components/DataPieChart/DataPieChart.css +29 -0
  58. package/dist/esm/components/DataPieChart/DataPieChart.js +20 -3
  59. package/dist/esm/components/DataPieChart/DataPieChart.js.map +1 -1
  60. package/dist/esm/components/DatePicker/DatePicker.js +18 -5
  61. package/dist/esm/components/DatePicker/DatePicker.js.map +1 -1
  62. package/dist/esm/components/Dialog/Dialog.js +31 -7
  63. package/dist/esm/components/Dialog/Dialog.js.map +1 -1
  64. package/dist/esm/components/Form/Form.css +17 -0
  65. package/dist/esm/components/Form/Form.js +27 -0
  66. package/dist/esm/components/Form/Form.js.map +1 -0
  67. package/dist/esm/components/Form/index.js +4 -0
  68. package/dist/esm/components/Form/index.js.map +1 -0
  69. package/dist/esm/components/Form/useForm.js +92 -0
  70. package/dist/esm/components/Form/useForm.js.map +1 -0
  71. package/dist/esm/components/Input/Input.js +19 -4
  72. package/dist/esm/components/Input/Input.js.map +1 -1
  73. package/dist/esm/components/LicensePlateInput/LicensePlateInput.js +17 -4
  74. package/dist/esm/components/LicensePlateInput/LicensePlateInput.js.map +1 -1
  75. package/dist/esm/components/NumberInput/NumberInput.js +18 -5
  76. package/dist/esm/components/NumberInput/NumberInput.js.map +1 -1
  77. package/dist/esm/components/PhotoUploader/PhotoUploader.css +125 -0
  78. package/dist/esm/components/PhotoUploader/PhotoUploader.js +254 -0
  79. package/dist/esm/components/PhotoUploader/PhotoUploader.js.map +1 -0
  80. package/dist/esm/components/PhotoUploader/index.js +2 -0
  81. package/dist/esm/components/PhotoUploader/index.js.map +1 -0
  82. package/dist/esm/components/ProgressAccordeon/ProgressAccordeon.css +32 -2
  83. package/dist/esm/components/ProgressAccordeon/ProgressAccordeon.js +13 -2
  84. package/dist/esm/components/ProgressAccordeon/ProgressAccordeon.js.map +1 -1
  85. package/dist/esm/components/Radio/Radio.js +4 -4
  86. package/dist/esm/components/Radio/Radio.js.map +1 -1
  87. package/dist/esm/components/RangeSlider/RangeSlider.js +4 -4
  88. package/dist/esm/components/RangeSlider/RangeSlider.js.map +1 -1
  89. package/dist/esm/components/Select/Select.js +18 -5
  90. package/dist/esm/components/Select/Select.js.map +1 -1
  91. package/dist/esm/components/Textarea/Textarea.js +10 -4
  92. package/dist/esm/components/Textarea/Textarea.js.map +1 -1
  93. package/dist/esm/components/Thumbnail/Thumbnail.css +171 -0
  94. package/dist/esm/components/Thumbnail/Thumbnail.js +52 -0
  95. package/dist/esm/components/Thumbnail/Thumbnail.js.map +1 -0
  96. package/dist/esm/components/Thumbnail/index.js +2 -0
  97. package/dist/esm/components/Thumbnail/index.js.map +1 -0
  98. package/dist/esm/components/Toggle/Toggle.js +4 -4
  99. package/dist/esm/components/Toggle/Toggle.js.map +1 -1
  100. package/dist/esm/components/index.js +3 -0
  101. package/dist/esm/components/index.js.map +1 -1
  102. package/dist/styles/components/Alert.css +7 -0
  103. package/dist/styles/components/Button.css +29 -0
  104. package/dist/styles/components/DataPieChart.css +29 -0
  105. package/dist/styles/components/Form.css +17 -0
  106. package/dist/styles/components/PhotoUploader.css +125 -0
  107. package/dist/styles/components/ProgressAccordeon.css +32 -2
  108. package/dist/styles/components/Thumbnail.css +171 -0
  109. package/dist/styles/index.css +2554 -2099
  110. package/dist/styles/muka-dark.css +2554 -2099
  111. package/dist/styles/muka-light.css +2554 -2099
  112. package/dist/styles/tokens-bouwplan-dark.css +38 -0
  113. package/dist/styles/tokens-bouwplan-light.css +38 -0
  114. package/dist/styles/tokens-fscl-dark.css +38 -0
  115. package/dist/styles/tokens-fscl-light.css +38 -0
  116. package/dist/styles/tokens-grip-dark.css +38 -0
  117. package/dist/styles/tokens-grip-light.css +38 -0
  118. package/dist/styles/tokens-muka-dark.css +38 -0
  119. package/dist/styles/tokens-muka-light.css +38 -0
  120. package/dist/styles/tokens-wireframe-dark.css +80 -42
  121. package/dist/styles/tokens-wireframe-light.css +80 -42
  122. package/dist/styles/wireframe-dark.css +2596 -2141
  123. package/dist/styles/wireframe-light.css +2596 -2141
  124. package/dist/types/components/Button/Button.d.ts +2 -2
  125. package/dist/types/components/Button/Button.d.ts.map +1 -1
  126. package/dist/types/components/Checkbox/Checkbox.d.ts +1 -1
  127. package/dist/types/components/Checkbox/Checkbox.d.ts.map +1 -1
  128. package/dist/types/components/DataPieChart/DataPieChart.d.ts +7 -0
  129. package/dist/types/components/DataPieChart/DataPieChart.d.ts.map +1 -1
  130. package/dist/types/components/DatePicker/DatePicker.d.ts +5 -1
  131. package/dist/types/components/DatePicker/DatePicker.d.ts.map +1 -1
  132. package/dist/types/components/Dialog/Dialog.d.ts.map +1 -1
  133. package/dist/types/components/FileUpload/FileUpload.d.ts +1 -1
  134. package/dist/types/components/FileUpload/FileUpload.d.ts.map +1 -1
  135. package/dist/types/components/FileUpload/FileUploadItem.d.ts +1 -1
  136. package/dist/types/components/FileUpload/FileUploadItem.d.ts.map +1 -1
  137. package/dist/types/components/Form/Form.d.ts +34 -0
  138. package/dist/types/components/Form/Form.d.ts.map +1 -0
  139. package/dist/types/components/Form/index.d.ts +4 -0
  140. package/dist/types/components/Form/index.d.ts.map +1 -0
  141. package/dist/types/components/Form/useForm.d.ts +74 -0
  142. package/dist/types/components/Form/useForm.d.ts.map +1 -0
  143. package/dist/types/components/Input/Input.d.ts +5 -1
  144. package/dist/types/components/Input/Input.d.ts.map +1 -1
  145. package/dist/types/components/LicensePlateInput/LicensePlateInput.d.ts +5 -1
  146. package/dist/types/components/LicensePlateInput/LicensePlateInput.d.ts.map +1 -1
  147. package/dist/types/components/NumberInput/NumberInput.d.ts +5 -1
  148. package/dist/types/components/NumberInput/NumberInput.d.ts.map +1 -1
  149. package/dist/types/components/PhotoUploader/PhotoUploader.d.ts +71 -0
  150. package/dist/types/components/PhotoUploader/PhotoUploader.d.ts.map +1 -0
  151. package/dist/types/components/PhotoUploader/index.d.ts +2 -0
  152. package/dist/types/components/PhotoUploader/index.d.ts.map +1 -0
  153. package/dist/types/components/ProgressAccordeon/ProgressAccordeon.d.ts.map +1 -1
  154. package/dist/types/components/Radio/Radio.d.ts +1 -1
  155. package/dist/types/components/Radio/Radio.d.ts.map +1 -1
  156. package/dist/types/components/RangeSlider/RangeSlider.d.ts +1 -1
  157. package/dist/types/components/RangeSlider/RangeSlider.d.ts.map +1 -1
  158. package/dist/types/components/Select/Select.d.ts +7 -1
  159. package/dist/types/components/Select/Select.d.ts.map +1 -1
  160. package/dist/types/components/Textarea/Textarea.d.ts +5 -1
  161. package/dist/types/components/Textarea/Textarea.d.ts.map +1 -1
  162. package/dist/types/components/Thumbnail/Thumbnail.d.ts +77 -0
  163. package/dist/types/components/Thumbnail/Thumbnail.d.ts.map +1 -0
  164. package/dist/types/components/Thumbnail/index.d.ts +2 -0
  165. package/dist/types/components/Thumbnail/index.d.ts.map +1 -0
  166. package/dist/types/components/Toggle/Toggle.d.ts +1 -1
  167. package/dist/types/components/Toggle/Toggle.d.ts.map +1 -1
  168. package/dist/types/components/index.d.ts +3 -0
  169. package/dist/types/components/index.d.ts.map +1 -1
  170. package/package.json +1 -1
  171. package/tokens/t2-alias/brand/wireframe/radius.json +34 -0
  172. package/tokens/t4-components/button.json +56 -0
@@ -0,0 +1,125 @@
1
+ /* PhotoUploader Component Styles - Using Muka Design Tokens */
2
+
3
+ .muka-photo-uploader {
4
+ display: flex;
5
+ flex-direction: column;
6
+ align-items: flex-start;
7
+ gap: var(--spacing-4);
8
+ width: 100%;
9
+ }
10
+
11
+ /* Visually-hidden native file input */
12
+ .muka-photo-uploader__input {
13
+ position: absolute;
14
+ width: 1px;
15
+ height: 1px;
16
+ padding: 0;
17
+ margin: -1px;
18
+ overflow: hidden;
19
+ clip: rect(0, 0, 0, 0);
20
+ white-space: nowrap;
21
+ border: 0;
22
+ }
23
+
24
+ /* ─── Error feedback alert ────────────────────────────── */
25
+ .muka-photo-uploader__alert {
26
+ width: 100%;
27
+ }
28
+
29
+ /* ─── Thumbnail grid ──────────────────────────────────── */
30
+ .muka-photo-uploader__grid {
31
+ display: flex;
32
+ flex-wrap: wrap;
33
+ gap: var(--spacing-3);
34
+ width: 100%;
35
+ margin: 0;
36
+ padding: 0;
37
+ list-style: none;
38
+ }
39
+
40
+ .muka-photo-uploader__grid-item {
41
+ margin: 0;
42
+ padding: 0;
43
+ }
44
+
45
+ /* ─── Drop zone card ──────────────────────────────────── */
46
+ .muka-photo-uploader__dropzone {
47
+ display: flex;
48
+ flex-direction: column;
49
+ align-items: center;
50
+ justify-content: center;
51
+ gap: var(--spacing-4);
52
+ width: 100%;
53
+ padding: var(--card-padding-lg);
54
+ background-color: var(--card-color-default-background);
55
+ border: var(--border-width-regular, 1px) solid var(--card-color-default-border);
56
+ border-radius: var(--border-radius-lg);
57
+ cursor: pointer;
58
+ text-align: center;
59
+ transition: background-color var(--motion-duration-micro) var(--motion-easing-enter),
60
+ border-color var(--motion-duration-micro) var(--motion-easing-enter);
61
+ }
62
+
63
+ .muka-photo-uploader__dropzone:hover,
64
+ .muka-photo-uploader__dropzone--active {
65
+ border-color: var(--color-border-focus);
66
+ background-color: var(--color-surface-level1);
67
+ }
68
+
69
+ .muka-photo-uploader__dropzone:focus-visible {
70
+ outline: 2px solid var(--color-border-focus);
71
+ outline-offset: 2px;
72
+ }
73
+
74
+ .muka-photo-uploader__dropzone-icon {
75
+ display: flex;
76
+ align-items: center;
77
+ justify-content: center;
78
+ color: var(--color-icon-subtle-default);
79
+ }
80
+
81
+ .muka-photo-uploader__dropzone-text {
82
+ font-family: var(--text-body-md-regular-fontFamily);
83
+ font-size: var(--text-body-md-regular-fontSize);
84
+ font-weight: var(--text-body-md-regular-fontWeight);
85
+ line-height: var(--text-body-md-regular-lineHeight);
86
+ color: var(--color-text-subtle-default);
87
+ }
88
+
89
+ /* ─── Disabled ────────────────────────────────────────── */
90
+ .muka-photo-uploader--disabled .muka-photo-uploader__dropzone {
91
+ cursor: not-allowed;
92
+ opacity: 0.6;
93
+ }
94
+
95
+ .muka-photo-uploader--disabled .muka-photo-uploader__dropzone:hover {
96
+ border-color: var(--card-color-default-border);
97
+ background-color: var(--card-color-default-background);
98
+ }
99
+
100
+ /* ─── Enlarged photo dialog ───────────────────────────── */
101
+ .muka-photo-uploader__preview {
102
+ display: flex;
103
+ align-items: center;
104
+ justify-content: center;
105
+ width: 100%;
106
+ height: 100%;
107
+ }
108
+
109
+ /* Fits the dialog while preserving the photo's original aspect ratio. */
110
+ .muka-photo-uploader__preview-image {
111
+ display: block;
112
+ max-width: 100%;
113
+ max-height: 100%;
114
+ width: auto;
115
+ height: auto;
116
+ object-fit: contain;
117
+ border-radius: var(--border-radius-lg);
118
+ }
119
+
120
+ /* ─── Reduced motion ──────────────────────────────────── */
121
+ @media (prefers-reduced-motion: reduce) {
122
+ .muka-photo-uploader__dropzone {
123
+ transition: none;
124
+ }
125
+ }
@@ -22,11 +22,13 @@
22
22
  gap: var(--spacing-8);
23
23
  }
24
24
 
25
- /* Past-expanded groups header + slot with a tighter internal gap */
25
+ /* Past steps group header + slot. The header↔content gap lives inside the
26
+ collapsing slot (as padding-top) so it collapses with the content, so the
27
+ body gap itself is 0. */
26
28
  .muka-progress-accordeon__body {
27
29
  display: flex;
28
30
  flex-direction: column;
29
- gap: var(--spacing-4);
31
+ gap: 0;
30
32
  width: 100%;
31
33
  }
32
34
 
@@ -159,6 +161,34 @@
159
161
  width: 100%;
160
162
  }
161
163
 
164
+ /* ─── Collapse/expand animation (past steps) ─────────────────
165
+ The grid-template-rows 1fr → 0fr technique animates the content to/from its
166
+ intrinsic (auto) height with no magic max-height. Under prefers-reduced-motion
167
+ --motion-duration-view resolves to 0ms, so the toggle stays instant. */
168
+ .muka-progress-accordeon__slot-wrapper {
169
+ display: grid;
170
+ grid-template-rows: 1fr;
171
+ transition: grid-template-rows var(--motion-duration-view) var(--motion-easing-enter);
172
+ }
173
+
174
+ .muka-progress-accordeon__slot-wrapper--collapsed {
175
+ grid-template-rows: 0fr;
176
+ }
177
+
178
+ /* The direct grid child clips and must have NO padding/border of its own —
179
+ min-height:0 lets it shrink, and with no padding the 0fr track reaches a true
180
+ 0 height (padding on the item would leave a residual gap when collapsed). */
181
+ .muka-progress-accordeon__slot-clip {
182
+ overflow: hidden;
183
+ min-height: 0;
184
+ }
185
+
186
+ /* The header↔content spacing lives on the inner slot (inside the clip region)
187
+ so it collapses together with the content. */
188
+ .muka-progress-accordeon__slot-wrapper .muka-progress-accordeon__slot {
189
+ padding-top: var(--spacing-4);
190
+ }
191
+
162
192
  /* ─── Action buttons (current state) ─────────────────────── */
163
193
  .muka-progress-accordeon__actions {
164
194
  display: flex;
@@ -0,0 +1,171 @@
1
+ /* Thumbnail Component Styles - Using Muka Design Tokens */
2
+
3
+ .muka-thumbnail {
4
+ position: relative;
5
+ flex-shrink: 0;
6
+ }
7
+
8
+ /* The frame carries the border, background and shape clip. Keeping it separate
9
+ from the root lets the remove (×) button sit outside the clip (needed for the
10
+ circular/ellipse shape, whose corners would otherwise clip the button). */
11
+ .muka-thumbnail__frame {
12
+ position: absolute;
13
+ inset: 0;
14
+ overflow: hidden;
15
+ border: var(--border-width-regular, 1px) solid var(--color-black-alpha-3);
16
+ border-radius: var(--border-radius-lg);
17
+ background-color: var(--color-surface-level1);
18
+ }
19
+
20
+ /* ─── Shapes ──────────────────────────────────────────── */
21
+ .muka-thumbnail--4-3 {
22
+ width: 160px;
23
+ height: 120px;
24
+ }
25
+
26
+ .muka-thumbnail--1-1 {
27
+ width: 120px;
28
+ height: 120px;
29
+ }
30
+
31
+ .muka-thumbnail--ellipse {
32
+ width: 120px;
33
+ height: 120px;
34
+ }
35
+
36
+ .muka-thumbnail--ellipse .muka-thumbnail__frame {
37
+ border-radius: var(--border-radius-full);
38
+ }
39
+
40
+ /* Image fills the frame, cropped to cover. Sits at scale(1) by default so the
41
+ interactive hover zoom has a clean origin. */
42
+ .muka-thumbnail__image {
43
+ position: absolute;
44
+ inset: 0;
45
+ width: 100%;
46
+ height: 100%;
47
+ object-fit: cover;
48
+ display: block;
49
+ transform-origin: center;
50
+ /* Micro-interaction: hover zoom eases out over the "micro" duration. */
51
+ transition: transform var(--motion-duration-micro) var(--motion-easing-enter);
52
+ }
53
+
54
+ /* ─── Interactive (click-to-enlarge) ──────────────────── */
55
+ .muka-thumbnail__trigger {
56
+ position: absolute;
57
+ inset: 0;
58
+ padding: 0;
59
+ border: 0;
60
+ background: none;
61
+ cursor: pointer;
62
+ overflow: hidden;
63
+ }
64
+
65
+ .muka-thumbnail__trigger:focus-visible {
66
+ outline: 2px solid var(--color-border-focus);
67
+ outline-offset: -2px;
68
+ }
69
+
70
+ /* On hover the image scales up ~8px (160px → 168px) with an ease-out feel. */
71
+ .muka-thumbnail--interactive:hover .muka-thumbnail__image {
72
+ transform: scale(1.05);
73
+ }
74
+
75
+ /* ─── Loading overlay + progress donut ────────────────── */
76
+ .muka-thumbnail__overlay {
77
+ position: absolute;
78
+ inset: 0;
79
+ display: flex;
80
+ align-items: center;
81
+ justify-content: center;
82
+ background-color: var(--dialog-color-backdrop);
83
+ }
84
+
85
+ .muka-thumbnail__progress {
86
+ width: 40px;
87
+ height: 40px;
88
+ }
89
+
90
+ /* ─── Error / corrupt state ───────────────────────────── */
91
+ .muka-thumbnail--error .muka-thumbnail__frame {
92
+ background-color: var(--alias-color-state-error-muted);
93
+ border-color: var(--alias-color-state-error-default);
94
+ }
95
+
96
+ .muka-thumbnail__error {
97
+ position: absolute;
98
+ inset: 0;
99
+ display: flex;
100
+ flex-direction: column;
101
+ align-items: center;
102
+ justify-content: center;
103
+ gap: var(--spacing-2);
104
+ padding: var(--spacing-3);
105
+ text-align: center;
106
+ }
107
+
108
+ .muka-thumbnail__error-icon {
109
+ color: var(--alert-color-error-accent);
110
+ }
111
+
112
+ .muka-thumbnail__caption {
113
+ max-width: 100%;
114
+ overflow: hidden;
115
+ text-overflow: ellipsis;
116
+ white-space: nowrap;
117
+ color: var(--alert-color-error-accent);
118
+ font-family: var(--text-body-sm-regular-fontFamily);
119
+ font-size: var(--text-body-sm-regular-fontSize);
120
+ font-weight: var(--text-body-sm-regular-fontWeight);
121
+ line-height: var(--text-body-sm-regular-lineHeight);
122
+ }
123
+
124
+ /* ─── Remove (×) button ───────────────────────────────── */
125
+ .muka-thumbnail__remove {
126
+ position: absolute;
127
+ top: var(--spacing-2);
128
+ right: var(--spacing-2);
129
+ display: flex;
130
+ align-items: center;
131
+ justify-content: center;
132
+ width: var(--size-2xl);
133
+ height: var(--size-2xl);
134
+ padding: 0;
135
+ color: var(--button-color-tertiary-foreground-default);
136
+ background-color: var(--button-color-tertiary-background-default);
137
+ border: var(--border-width-regular, 1px) solid var(--button-color-tertiary-border-default);
138
+ border-radius: var(--border-radius-lg);
139
+ cursor: pointer;
140
+ transition: background-color var(--motion-duration-micro) var(--motion-easing-enter),
141
+ border-color var(--motion-duration-micro) var(--motion-easing-enter);
142
+ }
143
+
144
+ .muka-thumbnail__remove:hover {
145
+ color: var(--button-color-tertiary-foreground-hover);
146
+ background-color: var(--button-color-tertiary-background-hover);
147
+ border-color: var(--button-color-tertiary-border-hover);
148
+ }
149
+
150
+ .muka-thumbnail__remove:active {
151
+ color: var(--button-color-tertiary-foreground-pressed);
152
+ background-color: var(--button-color-tertiary-background-pressed);
153
+ border-color: var(--button-color-tertiary-border-pressed);
154
+ }
155
+
156
+ .muka-thumbnail__remove:focus-visible {
157
+ outline: 2px solid var(--color-border-focus);
158
+ outline-offset: 2px;
159
+ }
160
+
161
+ /* ─── Reduced motion ──────────────────────────────────── */
162
+ @media (prefers-reduced-motion: reduce) {
163
+ .muka-thumbnail__image,
164
+ .muka-thumbnail__remove {
165
+ transition: none;
166
+ }
167
+
168
+ .muka-thumbnail--interactive:hover .muka-thumbnail__image {
169
+ transform: none;
170
+ }
171
+ }