@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.
- package/dist/cjs/components/Alert/Alert.css +7 -0
- package/dist/cjs/components/DataPieChart/DataPieChart.css +29 -0
- package/dist/cjs/components/DataPieChart/DataPieChart.js +20 -3
- package/dist/cjs/components/DataPieChart/DataPieChart.js.map +1 -1
- package/dist/cjs/components/Dialog/Dialog.js +64 -7
- package/dist/cjs/components/Dialog/Dialog.js.map +1 -1
- package/dist/cjs/components/PhotoUploader/PhotoUploader.css +125 -0
- package/dist/cjs/components/PhotoUploader/PhotoUploader.js +257 -0
- package/dist/cjs/components/PhotoUploader/PhotoUploader.js.map +1 -0
- package/dist/cjs/components/PhotoUploader/index.js +6 -0
- package/dist/cjs/components/PhotoUploader/index.js.map +1 -0
- package/dist/cjs/components/ProgressAccordeon/ProgressAccordeon.css +32 -2
- package/dist/cjs/components/ProgressAccordeon/ProgressAccordeon.js +13 -2
- package/dist/cjs/components/ProgressAccordeon/ProgressAccordeon.js.map +1 -1
- package/dist/cjs/components/Thumbnail/Thumbnail.css +171 -0
- package/dist/cjs/components/Thumbnail/Thumbnail.js +55 -0
- package/dist/cjs/components/Thumbnail/Thumbnail.js.map +1 -0
- package/dist/cjs/components/Thumbnail/index.js +6 -0
- package/dist/cjs/components/Thumbnail/index.js.map +1 -0
- package/dist/cjs/components/index.js +5 -1
- package/dist/cjs/components/index.js.map +1 -1
- package/dist/esm/components/Alert/Alert.css +7 -0
- package/dist/esm/components/DataPieChart/DataPieChart.css +29 -0
- package/dist/esm/components/DataPieChart/DataPieChart.js +20 -3
- package/dist/esm/components/DataPieChart/DataPieChart.js.map +1 -1
- package/dist/esm/components/Dialog/Dialog.js +31 -7
- package/dist/esm/components/Dialog/Dialog.js.map +1 -1
- package/dist/esm/components/PhotoUploader/PhotoUploader.css +125 -0
- package/dist/esm/components/PhotoUploader/PhotoUploader.js +254 -0
- package/dist/esm/components/PhotoUploader/PhotoUploader.js.map +1 -0
- package/dist/esm/components/PhotoUploader/index.js +2 -0
- package/dist/esm/components/PhotoUploader/index.js.map +1 -0
- package/dist/esm/components/ProgressAccordeon/ProgressAccordeon.css +32 -2
- package/dist/esm/components/ProgressAccordeon/ProgressAccordeon.js +13 -2
- package/dist/esm/components/ProgressAccordeon/ProgressAccordeon.js.map +1 -1
- package/dist/esm/components/Thumbnail/Thumbnail.css +171 -0
- package/dist/esm/components/Thumbnail/Thumbnail.js +52 -0
- package/dist/esm/components/Thumbnail/Thumbnail.js.map +1 -0
- package/dist/esm/components/Thumbnail/index.js +2 -0
- package/dist/esm/components/Thumbnail/index.js.map +1 -0
- package/dist/esm/components/index.js +2 -0
- package/dist/esm/components/index.js.map +1 -1
- package/dist/styles/components/Alert.css +7 -0
- package/dist/styles/components/DataPieChart.css +29 -0
- package/dist/styles/components/PhotoUploader.css +125 -0
- package/dist/styles/components/ProgressAccordeon.css +32 -2
- package/dist/styles/components/Thumbnail.css +171 -0
- package/dist/styles/index.css +2726 -2358
- package/dist/styles/muka-dark.css +2726 -2358
- package/dist/styles/muka-light.css +2726 -2358
- package/dist/styles/wireframe-dark.css +2726 -2358
- package/dist/styles/wireframe-light.css +2726 -2358
- package/dist/types/components/DataPieChart/DataPieChart.d.ts +7 -0
- package/dist/types/components/DataPieChart/DataPieChart.d.ts.map +1 -1
- package/dist/types/components/Dialog/Dialog.d.ts.map +1 -1
- package/dist/types/components/FileUpload/FileUpload.d.ts +1 -1
- package/dist/types/components/FileUpload/FileUpload.d.ts.map +1 -1
- package/dist/types/components/FileUpload/FileUploadItem.d.ts +1 -1
- package/dist/types/components/FileUpload/FileUploadItem.d.ts.map +1 -1
- package/dist/types/components/PhotoUploader/PhotoUploader.d.ts +71 -0
- package/dist/types/components/PhotoUploader/PhotoUploader.d.ts.map +1 -0
- package/dist/types/components/PhotoUploader/index.d.ts +2 -0
- package/dist/types/components/PhotoUploader/index.d.ts.map +1 -0
- package/dist/types/components/ProgressAccordeon/ProgressAccordeon.d.ts.map +1 -1
- package/dist/types/components/Thumbnail/Thumbnail.d.ts +77 -0
- package/dist/types/components/Thumbnail/Thumbnail.d.ts.map +1 -0
- package/dist/types/components/Thumbnail/index.d.ts +2 -0
- package/dist/types/components/Thumbnail/index.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +2 -0
- package/dist/types/components/index.d.ts.map +1 -1
- 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":"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"}
|
|
@@ -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
|
|
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:
|
|
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
|
+
}
|