@revikornmann/muka-ui 0.7.0 → 0.8.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 (71) hide show
  1. package/dist/cjs/components/Alert/Alert.css +7 -0
  2. package/dist/cjs/components/DataPieChart/DataPieChart.css +29 -0
  3. package/dist/cjs/components/DataPieChart/DataPieChart.js +20 -3
  4. package/dist/cjs/components/DataPieChart/DataPieChart.js.map +1 -1
  5. package/dist/cjs/components/Dialog/Dialog.js +64 -7
  6. package/dist/cjs/components/Dialog/Dialog.js.map +1 -1
  7. package/dist/cjs/components/PhotoUploader/PhotoUploader.css +125 -0
  8. package/dist/cjs/components/PhotoUploader/PhotoUploader.js +257 -0
  9. package/dist/cjs/components/PhotoUploader/PhotoUploader.js.map +1 -0
  10. package/dist/cjs/components/PhotoUploader/index.js +6 -0
  11. package/dist/cjs/components/PhotoUploader/index.js.map +1 -0
  12. package/dist/cjs/components/ProgressAccordeon/ProgressAccordeon.css +32 -2
  13. package/dist/cjs/components/ProgressAccordeon/ProgressAccordeon.js +13 -2
  14. package/dist/cjs/components/ProgressAccordeon/ProgressAccordeon.js.map +1 -1
  15. package/dist/cjs/components/Thumbnail/Thumbnail.css +171 -0
  16. package/dist/cjs/components/Thumbnail/Thumbnail.js +55 -0
  17. package/dist/cjs/components/Thumbnail/Thumbnail.js.map +1 -0
  18. package/dist/cjs/components/Thumbnail/index.js +6 -0
  19. package/dist/cjs/components/Thumbnail/index.js.map +1 -0
  20. package/dist/cjs/components/index.js +5 -1
  21. package/dist/cjs/components/index.js.map +1 -1
  22. package/dist/esm/components/Alert/Alert.css +7 -0
  23. package/dist/esm/components/DataPieChart/DataPieChart.css +29 -0
  24. package/dist/esm/components/DataPieChart/DataPieChart.js +20 -3
  25. package/dist/esm/components/DataPieChart/DataPieChart.js.map +1 -1
  26. package/dist/esm/components/Dialog/Dialog.js +31 -7
  27. package/dist/esm/components/Dialog/Dialog.js.map +1 -1
  28. package/dist/esm/components/PhotoUploader/PhotoUploader.css +125 -0
  29. package/dist/esm/components/PhotoUploader/PhotoUploader.js +254 -0
  30. package/dist/esm/components/PhotoUploader/PhotoUploader.js.map +1 -0
  31. package/dist/esm/components/PhotoUploader/index.js +2 -0
  32. package/dist/esm/components/PhotoUploader/index.js.map +1 -0
  33. package/dist/esm/components/ProgressAccordeon/ProgressAccordeon.css +32 -2
  34. package/dist/esm/components/ProgressAccordeon/ProgressAccordeon.js +13 -2
  35. package/dist/esm/components/ProgressAccordeon/ProgressAccordeon.js.map +1 -1
  36. package/dist/esm/components/Thumbnail/Thumbnail.css +171 -0
  37. package/dist/esm/components/Thumbnail/Thumbnail.js +52 -0
  38. package/dist/esm/components/Thumbnail/Thumbnail.js.map +1 -0
  39. package/dist/esm/components/Thumbnail/index.js +2 -0
  40. package/dist/esm/components/Thumbnail/index.js.map +1 -0
  41. package/dist/esm/components/index.js +2 -0
  42. package/dist/esm/components/index.js.map +1 -1
  43. package/dist/styles/components/Alert.css +7 -0
  44. package/dist/styles/components/DataPieChart.css +29 -0
  45. package/dist/styles/components/PhotoUploader.css +125 -0
  46. package/dist/styles/components/ProgressAccordeon.css +32 -2
  47. package/dist/styles/components/Thumbnail.css +171 -0
  48. package/dist/styles/index.css +2726 -2358
  49. package/dist/styles/muka-dark.css +2726 -2358
  50. package/dist/styles/muka-light.css +2726 -2358
  51. package/dist/styles/wireframe-dark.css +2726 -2358
  52. package/dist/styles/wireframe-light.css +2726 -2358
  53. package/dist/types/components/DataPieChart/DataPieChart.d.ts +7 -0
  54. package/dist/types/components/DataPieChart/DataPieChart.d.ts.map +1 -1
  55. package/dist/types/components/Dialog/Dialog.d.ts.map +1 -1
  56. package/dist/types/components/FileUpload/FileUpload.d.ts +1 -1
  57. package/dist/types/components/FileUpload/FileUpload.d.ts.map +1 -1
  58. package/dist/types/components/FileUpload/FileUploadItem.d.ts +1 -1
  59. package/dist/types/components/FileUpload/FileUploadItem.d.ts.map +1 -1
  60. package/dist/types/components/PhotoUploader/PhotoUploader.d.ts +71 -0
  61. package/dist/types/components/PhotoUploader/PhotoUploader.d.ts.map +1 -0
  62. package/dist/types/components/PhotoUploader/index.d.ts +2 -0
  63. package/dist/types/components/PhotoUploader/index.d.ts.map +1 -0
  64. package/dist/types/components/ProgressAccordeon/ProgressAccordeon.d.ts.map +1 -1
  65. package/dist/types/components/Thumbnail/Thumbnail.d.ts +77 -0
  66. package/dist/types/components/Thumbnail/Thumbnail.d.ts.map +1 -0
  67. package/dist/types/components/Thumbnail/index.d.ts +2 -0
  68. package/dist/types/components/Thumbnail/index.d.ts.map +1 -0
  69. package/dist/types/components/index.d.ts +2 -0
  70. package/dist/types/components/index.d.ts.map +1 -1
  71. package/package.json +1 -1
@@ -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
+ }
@@ -0,0 +1,52 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { forwardRef } from 'react';
4
+ import { DataPieChart } from '../DataPieChart';
5
+ import { Icon } from '../Icon';
6
+ import './Thumbnail.css';
7
+ /**
8
+ * Thumbnail Component
9
+ *
10
+ * A single uploaded-photo tile used by `PhotoUploader`. Shows an image cropped
11
+ * to fill a fixed frame, with several behaviours driven by props:
12
+ *
13
+ * - **processing** — a dark overlay with an indeterminate (spinning) donut for
14
+ * pre-upload work (e.g. HEIC conversion / compression).
15
+ * - **loading** — a dark overlay with a `DataPieChart` progress donut; swaps
16
+ * seamlessly from `processing` (same ring).
17
+ * - **error** — a red tile with an error icon + caption (filename); the × stays.
18
+ * - **loaded, interactive** — hovering scales the image up ~8px (motion tokens)
19
+ * and clicking activates `onClick` (e.g. to enlarge in a dialog).
20
+ * - **removable** — a tertiary × button in the top-right corner calls
21
+ * `onRemove` to delete the photo.
22
+ *
23
+ * Tokens used: border-radius-lg, color-black-alpha-3, dialog-color-backdrop,
24
+ * button-color-tertiary-*, alias-color-state-error-*, alert-color-error-accent,
25
+ * motion-duration-micro, motion-easing-enter.
26
+ */
27
+ export const Thumbnail = forwardRef(({ src, alt = '', shape = '4:3', loading = false, progress = 0, processing = false, error = false, caption, errorReason, onRemove, onClick, removeLabel = 'Remove photo', viewLabel = 'View photo', className = '', ...props }, ref) => {
28
+ const isBusy = loading || processing;
29
+ const isInteractive = !isBusy && !error && Boolean(onClick);
30
+ const showRemove = !isBusy && Boolean(onRemove);
31
+ const classes = [
32
+ 'muka-thumbnail',
33
+ // '4:3' → '--4-3', '1:1' → '--1-1', 'ellipse' → '--ellipse'
34
+ `muka-thumbnail--${shape.replace(':', '-')}`,
35
+ loading && 'muka-thumbnail--loading',
36
+ processing && 'muka-thumbnail--processing',
37
+ error && 'muka-thumbnail--error',
38
+ isInteractive && 'muka-thumbnail--interactive',
39
+ className,
40
+ ]
41
+ .filter(Boolean)
42
+ .join(' ');
43
+ const image = _jsx("img", { className: "muka-thumbnail__image", src: src, alt: alt });
44
+ const removeButton = showRemove ? (_jsx("button", { type: "button", className: "muka-thumbnail__remove", onClick: onRemove, "aria-label": removeLabel, children: _jsx(Icon, { name: "close", variant: "line", size: "xs" }) })) : null;
45
+ // The frame owns the shape's clip (border-radius + overflow), so the remove
46
+ // button — a sibling of the frame — is never clipped, even for the circle.
47
+ const frameContent = error ? (_jsxs("div", { className: "muka-thumbnail__error", children: [_jsx(Icon, { className: "muka-thumbnail__error-icon", name: "error-warning", variant: "fill", size: "lg", label: errorReason ?? 'Upload failed' }), caption && _jsx("span", { className: "muka-thumbnail__caption", children: caption })] })) : (_jsxs(_Fragment, { children: [isInteractive ? (_jsx("button", { type: "button", className: "muka-thumbnail__trigger", onClick: onClick, "aria-label": viewLabel, children: image })) : (image), isBusy && (_jsx("div", { className: "muka-thumbnail__overlay", children: _jsx(DataPieChart, { className: "muka-thumbnail__progress", value: progress, indeterminate: processing, size: 40, variant: "donut", "aria-label": processing ? 'Processing' : `Uploading, ${Math.round(progress)}%` }) }))] }));
48
+ return (_jsxs("div", { ref: ref, className: classes, title: error ? errorReason : undefined, ...props, children: [_jsx("div", { className: "muka-thumbnail__frame", children: frameContent }), removeButton] }));
49
+ });
50
+ Thumbnail.displayName = 'Thumbnail';
51
+ export default Thumbnail;
52
+ //# sourceMappingURL=Thumbnail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Thumbnail.js","sourceRoot":"","sources":["../../../../components/Thumbnail/Thumbnail.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAc,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,iBAAiB,CAAC;AAqEzB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CACjC,CACE,EACE,GAAG,EACH,GAAG,GAAG,EAAE,EACR,KAAK,GAAG,KAAK,EACb,OAAO,GAAG,KAAK,EACf,QAAQ,GAAG,CAAC,EACZ,UAAU,GAAG,KAAK,EAClB,KAAK,GAAG,KAAK,EACb,OAAO,EACP,WAAW,EACX,QAAQ,EACR,OAAO,EACP,WAAW,GAAG,cAAc,EAC5B,SAAS,GAAG,YAAY,EACxB,SAAS,GAAG,EAAE,EACd,GAAG,KAAK,EACT,EACD,GAAG,EACH,EAAE;IACF,MAAM,MAAM,GAAG,OAAO,IAAI,UAAU,CAAC;IACrC,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEhD,MAAM,OAAO,GAAG;QACd,gBAAgB;QAChB,4DAA4D;QAC5D,mBAAmB,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;QAC5C,OAAO,IAAI,yBAAyB;QACpC,UAAU,IAAI,4BAA4B;QAC1C,KAAK,IAAI,uBAAuB;QAChC,aAAa,IAAI,6BAA6B;QAC9C,SAAS;KACV;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,MAAM,KAAK,GAAG,cAAK,SAAS,EAAC,uBAAuB,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAI,CAAC;IAE5E,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAChC,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,wBAAwB,EAClC,OAAO,EAAE,QAAQ,gBACL,WAAW,YAEvB,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,GAAG,GACvC,CACV,CAAC,CAAC,CAAC,IAAI,CAAC;IAET,4EAA4E;IAC5E,2EAA2E;IAC3E,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAC3B,eAAK,SAAS,EAAC,uBAAuB,aACpC,KAAC,IAAI,IACH,SAAS,EAAC,4BAA4B,EACtC,IAAI,EAAC,eAAe,EACpB,OAAO,EAAC,MAAM,EACd,IAAI,EAAC,IAAI,EACT,KAAK,EAAE,WAAW,IAAI,eAAe,GACrC,EACD,OAAO,IAAI,eAAM,SAAS,EAAC,yBAAyB,YAAE,OAAO,GAAQ,IAClE,CACP,CAAC,CAAC,CAAC,CACF,8BACG,aAAa,CAAC,CAAC,CAAC,CACf,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,yBAAyB,EACnC,OAAO,EAAE,OAAO,gBACJ,SAAS,YAEpB,KAAK,GACC,CACV,CAAC,CAAC,CAAC,CACF,KAAK,CACN,EAEA,MAAM,IAAI,CACT,cAAK,SAAS,EAAC,yBAAyB,YACtC,KAAC,YAAY,IACX,SAAS,EAAC,0BAA0B,EACpC,KAAK,EAAE,QAAQ,EACf,aAAa,EAAE,UAAU,EACzB,IAAI,EAAE,EAAE,EACR,OAAO,EAAC,OAAO,gBAEb,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,GAEnE,GACE,CACP,IACA,CACJ,CAAC;IAEF,OAAO,CACL,eAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,KAAM,KAAK,aAClF,cAAK,SAAS,EAAC,uBAAuB,YAAE,YAAY,GAAO,EAC1D,YAAY,IACT,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;AAEpC,eAAe,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { Thumbnail } from './Thumbnail';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../components/Thumbnail/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAuB,MAAM,aAAa,CAAC"}
@@ -71,4 +71,6 @@ export { Combobox, } from './Combobox';
71
71
  export { SwipeActions, } from './SwipeActions';
72
72
  export { PullToRefresh } from './PullToRefresh';
73
73
  export { LicensePlateInput, } from './LicensePlateInput';
74
+ export { Thumbnail } from './Thumbnail';
75
+ export { PhotoUploader, } from './PhotoUploader';
74
76
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../components/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../components/index.ts"],"names":[],"mappings":"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"}
@@ -109,6 +109,13 @@
109
109
  height: 100%;
110
110
  }
111
111
 
112
+ /* The leading icon and the dismiss (×) icon inherit the variant accent set on
113
+ their container, overriding the Icon component's default color. */
114
+ .muka-alert__icon .muka-icon,
115
+ .muka-alert__dismiss .muka-icon {
116
+ color: inherit;
117
+ }
118
+
112
119
  /* Content */
113
120
  .muka-alert__content {
114
121
  flex: 1;
@@ -27,6 +27,35 @@
27
27
  transition: stroke-dasharray 0.3s ease;
28
28
  }
29
29
 
30
+ /* ─── Indeterminate (spinner) ─────────────────────────── */
31
+ /* A masked ring filled with an angular (conic) gradient that rotates. The mask
32
+ band matches the donut geometry (r=40, strokeWidth=16 → 64%–96% of radius) so
33
+ it swaps seamlessly with the value-based progress donut. */
34
+ .muka-data-pie-chart__spinner-track,
35
+ .muka-data-pie-chart__spinner {
36
+ position: absolute;
37
+ inset: 0;
38
+ border-radius: 50%;
39
+ -webkit-mask: radial-gradient(farthest-side, transparent 63%, #000 65%, #000 95%, transparent 97%);
40
+ mask: radial-gradient(farthest-side, transparent 63%, #000 65%, #000 95%, transparent 97%);
41
+ }
42
+
43
+ .muka-data-pie-chart__spinner {
44
+ animation: muka-data-pie-chart-spin 0.9s linear infinite;
45
+ }
46
+
47
+ @keyframes muka-data-pie-chart-spin {
48
+ to {
49
+ transform: rotate(360deg);
50
+ }
51
+ }
52
+
53
+ @media (prefers-reduced-motion: reduce) {
54
+ .muka-data-pie-chart__spinner {
55
+ animation-duration: 2.5s;
56
+ }
57
+ }
58
+
30
59
  .muka-data-pie-chart__value {
31
60
  position: absolute;
32
61
  inset: 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
+ }