@revikornmann/muka-ui 0.27.2 → 0.28.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 (84) hide show
  1. package/dist/cjs/components/Avatar/Avatar.css +30 -7
  2. package/dist/cjs/components/Avatar/Avatar.js +4 -1
  3. package/dist/cjs/components/Avatar/Avatar.js.map +1 -1
  4. package/dist/cjs/components/DataPieChart/DataPieChart.css +4 -1
  5. package/dist/cjs/components/DataPieChart/DataPieChart.js +1 -1
  6. package/dist/cjs/components/DataPieChart/DataPieChart.js.map +1 -1
  7. package/dist/cjs/components/Dialog/Dialog.css +3 -0
  8. package/dist/cjs/components/Dialog/Dialog.js +66 -3
  9. package/dist/cjs/components/Dialog/Dialog.js.map +1 -1
  10. package/dist/cjs/components/Input/Input.css +21 -0
  11. package/dist/cjs/components/MediaViewer/MediaViewer.css +180 -0
  12. package/dist/cjs/components/MediaViewer/MediaViewer.js +271 -0
  13. package/dist/cjs/components/MediaViewer/MediaViewer.js.map +1 -0
  14. package/dist/cjs/components/MediaViewer/index.js +6 -0
  15. package/dist/cjs/components/MediaViewer/index.js.map +1 -0
  16. package/dist/cjs/components/MediaViewer/mediaViewerGestures.js +65 -0
  17. package/dist/cjs/components/MediaViewer/mediaViewerGestures.js.map +1 -0
  18. package/dist/cjs/components/Thumbnail/Thumbnail.css +11 -0
  19. package/dist/cjs/components/Thumbnail/Thumbnail.js +6 -2
  20. package/dist/cjs/components/Thumbnail/Thumbnail.js.map +1 -1
  21. package/dist/cjs/components/index.js +3 -1
  22. package/dist/cjs/components/index.js.map +1 -1
  23. package/dist/esm/components/Avatar/Avatar.css +30 -7
  24. package/dist/esm/components/Avatar/Avatar.js +4 -1
  25. package/dist/esm/components/Avatar/Avatar.js.map +1 -1
  26. package/dist/esm/components/DataPieChart/DataPieChart.css +4 -1
  27. package/dist/esm/components/DataPieChart/DataPieChart.js +1 -1
  28. package/dist/esm/components/DataPieChart/DataPieChart.js.map +1 -1
  29. package/dist/esm/components/Dialog/Dialog.css +3 -0
  30. package/dist/esm/components/Dialog/Dialog.js +66 -3
  31. package/dist/esm/components/Dialog/Dialog.js.map +1 -1
  32. package/dist/esm/components/Input/Input.css +21 -0
  33. package/dist/esm/components/MediaViewer/MediaViewer.css +180 -0
  34. package/dist/esm/components/MediaViewer/MediaViewer.js +267 -0
  35. package/dist/esm/components/MediaViewer/MediaViewer.js.map +1 -0
  36. package/dist/esm/components/MediaViewer/index.js +2 -0
  37. package/dist/esm/components/MediaViewer/index.js.map +1 -0
  38. package/dist/esm/components/MediaViewer/mediaViewerGestures.js +58 -0
  39. package/dist/esm/components/MediaViewer/mediaViewerGestures.js.map +1 -0
  40. package/dist/esm/components/Thumbnail/Thumbnail.css +11 -0
  41. package/dist/esm/components/Thumbnail/Thumbnail.js +6 -2
  42. package/dist/esm/components/Thumbnail/Thumbnail.js.map +1 -1
  43. package/dist/esm/components/index.js +1 -0
  44. package/dist/esm/components/index.js.map +1 -1
  45. package/dist/styles/base.css +2 -0
  46. package/dist/styles/components/Avatar.css +30 -7
  47. package/dist/styles/components/DataPieChart.css +4 -1
  48. package/dist/styles/components/Dialog.css +3 -0
  49. package/dist/styles/components/Input.css +21 -0
  50. package/dist/styles/components/MediaViewer.css +180 -0
  51. package/dist/styles/components/Thumbnail.css +11 -0
  52. package/dist/styles/index.css +554 -301
  53. package/dist/styles/muka-dark.css +554 -301
  54. package/dist/styles/muka-light.css +554 -301
  55. package/dist/styles/tokens-bouwplan-dark.css +8 -1
  56. package/dist/styles/tokens-bouwplan-light.css +8 -1
  57. package/dist/styles/tokens-fscl-dark.css +8 -1
  58. package/dist/styles/tokens-fscl-light.css +8 -1
  59. package/dist/styles/tokens-grip-dark.css +8 -1
  60. package/dist/styles/tokens-grip-light.css +8 -1
  61. package/dist/styles/tokens-muka-dark.css +8 -1
  62. package/dist/styles/tokens-muka-light.css +8 -1
  63. package/dist/styles/tokens-wireframe-dark.css +8 -1
  64. package/dist/styles/tokens-wireframe-light.css +8 -1
  65. package/dist/styles/wireframe-dark.css +554 -301
  66. package/dist/styles/wireframe-light.css +554 -301
  67. package/dist/types/components/Avatar/Avatar.d.ts +4 -1
  68. package/dist/types/components/Avatar/Avatar.d.ts.map +1 -1
  69. package/dist/types/components/Dialog/Dialog.d.ts.map +1 -1
  70. package/dist/types/components/MediaViewer/MediaViewer.d.ts +86 -0
  71. package/dist/types/components/MediaViewer/MediaViewer.d.ts.map +1 -0
  72. package/dist/types/components/MediaViewer/index.d.ts +2 -0
  73. package/dist/types/components/MediaViewer/index.d.ts.map +1 -0
  74. package/dist/types/components/MediaViewer/mediaViewerGestures.d.ts +35 -0
  75. package/dist/types/components/MediaViewer/mediaViewerGestures.d.ts.map +1 -0
  76. package/dist/types/components/Thumbnail/Thumbnail.d.ts +21 -0
  77. package/dist/types/components/Thumbnail/Thumbnail.d.ts.map +1 -1
  78. package/dist/types/components/index.d.ts +1 -0
  79. package/dist/types/components/index.d.ts.map +1 -1
  80. package/docs/consumers/brand.md +6 -2
  81. package/docs/consumers/setup-instructions.md +35 -3
  82. package/package.json +1 -1
  83. package/skills/setup-muka/SKILL.md +36 -3
  84. package/tokens/t4-components/avatar.json +33 -1
@@ -0,0 +1,267 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
4
+ import { TopBar } from '../TopBar';
5
+ import { Button } from '../Button';
6
+ import { Icon } from '../Icon';
7
+ import { clampDragX, lockAxis, resolveDismiss, resolveSwipe, } from './mediaViewerGestures';
8
+ import './MediaViewer.css';
9
+ const defaultCounterLabel = (index, total) => `${index + 1} / ${total}`;
10
+ /** Fallback when `transitionend` does not fire (e.g. the element unmounted). */
11
+ const SETTLE_FALLBACK_MS = 400;
12
+ function prefersReducedMotion() {
13
+ return (typeof window !== 'undefined' &&
14
+ window.matchMedia?.('(prefers-reduced-motion: reduce)').matches === true);
15
+ }
16
+ /**
17
+ * MediaViewer Component
18
+ *
19
+ * Full-screen viewer that shows a list of images one at a time.
20
+ *
21
+ * - **Touch:** swipe sideways to page; the image follows the finger and snaps
22
+ * to the next or previous image past a quarter of the width or on a flick.
23
+ * It doesn't move past the first or last image. Swipe down to close.
24
+ * - **Desktop:** previous/next buttons on hover or focus, and ← / →.
25
+ * - **Close:** the close button, Escape, or swiping down. A tap on the dark
26
+ * stage does not close it, so a mis-aimed tap can't swallow an action.
27
+ * - **Slots:** `caption`, `meta` (a `Badge`) and `actions` (buttons) render
28
+ * under the image for the current `index`.
29
+ * - **Pagination:** `onEndReached` fires near the end so more items can be
30
+ * appended; appending does not move the current image.
31
+ *
32
+ * The images either side of the current one are rendered (and so preloaded).
33
+ *
34
+ * @accessibility
35
+ * - Native modal `<dialog>`: focus is trapped and returns to the opener
36
+ * - The track is a carousel; each image is a labelled slide
37
+ * - The counter is announced in a polite live region
38
+ * - With reduced motion, images swap without the slide
39
+ *
40
+ * Tokens used: color-black-alpha-12, color-surface-level3,
41
+ * color-text-default-default, color-text-subtle-default, spacing-*,
42
+ * motion-duration-component, motion-easing-default, motion-easing-enter.
43
+ */
44
+ export const MediaViewer = ({ open, items, index, onIndexChange, onClose, caption, meta, actions, onEndReached, endReachedThreshold = 3, counterLabel = defaultCounterLabel, closeLabel = 'Close', previousLabel = 'Previous', nextLabel = 'Next', 'aria-label': ariaLabel = 'Media viewer', className = '', }) => {
45
+ const dialogRef = useRef(null);
46
+ const stageRef = useRef(null);
47
+ const openerRef = useRef(null);
48
+ const total = items.length;
49
+ const hasPrevious = index > 0;
50
+ const hasNext = index < total - 1;
51
+ // Horizontal drag (px), vertical drag (px), and the slide shift (in slide
52
+ // widths) while a page change animates: -1 towards next, 1 towards previous.
53
+ const [dragX, setDragX] = useState(0);
54
+ const [dragY, setDragY] = useState(0);
55
+ const [dragging, setDragging] = useState(false);
56
+ const [shift, setShift] = useState(0);
57
+ const dragRef = useRef(null);
58
+ const pendingRef = useRef(null);
59
+ // ─── Open / close the native dialog ─────────────────
60
+ useLayoutEffect(() => {
61
+ const dialog = dialogRef.current;
62
+ if (!open || !dialog)
63
+ return;
64
+ const active = document.activeElement;
65
+ openerRef.current =
66
+ active instanceof HTMLElement && active !== document.body ? active : null;
67
+ if (!dialog.open)
68
+ dialog.showModal();
69
+ // A modal <dialog> does not stop the page behind it from scrolling.
70
+ const root = document.documentElement;
71
+ const previousOverflow = root.style.overflow;
72
+ root.style.overflow = 'hidden';
73
+ return () => {
74
+ root.style.overflow = previousOverflow;
75
+ if (dialog.open)
76
+ dialog.close();
77
+ const opener = openerRef.current;
78
+ openerRef.current = null;
79
+ if (opener?.isConnected)
80
+ opener.focus({ preventScroll: true });
81
+ };
82
+ }, [open]);
83
+ // Escape: the native `cancel` event. Keep the viewer controlled.
84
+ useEffect(() => {
85
+ const dialog = dialogRef.current;
86
+ if (!open || !dialog)
87
+ return;
88
+ const handleCancel = (e) => {
89
+ e.preventDefault();
90
+ onClose();
91
+ };
92
+ dialog.addEventListener('cancel', handleCancel);
93
+ return () => dialog.removeEventListener('cancel', handleCancel);
94
+ }, [open, onClose]);
95
+ // ─── Page changes ───────────────────────────────────
96
+ const commit = useCallback(() => {
97
+ const pending = pendingRef.current;
98
+ if (!pending)
99
+ return;
100
+ pendingRef.current = null;
101
+ window.clearTimeout(pending.timer);
102
+ setShift(0);
103
+ onIndexChange(pending.target);
104
+ }, [onIndexChange]);
105
+ /** Page by `direction` (1 = next, -1 = previous), animated unless reduced. */
106
+ const go = useCallback((direction) => {
107
+ if (pendingRef.current)
108
+ return;
109
+ const target = index + direction;
110
+ if (target < 0 || target >= total)
111
+ return;
112
+ if (prefersReducedMotion()) {
113
+ setDragX(0);
114
+ onIndexChange(target);
115
+ return;
116
+ }
117
+ setDragX(0);
118
+ setShift(-direction);
119
+ pendingRef.current = {
120
+ target,
121
+ timer: window.setTimeout(commit, SETTLE_FALLBACK_MS),
122
+ };
123
+ }, [index, total, onIndexChange, commit]);
124
+ // A new index from outside (or our own commit) cancels a pending animation.
125
+ useEffect(() => {
126
+ const pending = pendingRef.current;
127
+ if (pending && pending.target !== index) {
128
+ window.clearTimeout(pending.timer);
129
+ pendingRef.current = null;
130
+ }
131
+ setShift(0);
132
+ setDragX(0);
133
+ }, [index]);
134
+ useEffect(() => () => {
135
+ if (pendingRef.current)
136
+ window.clearTimeout(pendingRef.current.timer);
137
+ }, []);
138
+ // ─── Pagination ─────────────────────────────────────
139
+ const endReportedForRef = useRef(null);
140
+ useEffect(() => {
141
+ if (!open || !onEndReached || total === 0)
142
+ return;
143
+ if (total - 1 - index > endReachedThreshold)
144
+ return;
145
+ if (endReportedForRef.current === total)
146
+ return;
147
+ endReportedForRef.current = total;
148
+ onEndReached();
149
+ }, [open, index, total, endReachedThreshold, onEndReached]);
150
+ // ─── Keyboard ───────────────────────────────────────
151
+ const handleKeyDown = (e) => {
152
+ if (e.key === 'ArrowRight') {
153
+ e.preventDefault();
154
+ go(1);
155
+ }
156
+ else if (e.key === 'ArrowLeft') {
157
+ e.preventDefault();
158
+ go(-1);
159
+ }
160
+ };
161
+ // ─── Touch gestures ─────────────────────────────────
162
+ const handlePointerDown = (e) => {
163
+ // Desktop uses the buttons and arrow keys; a mouse drag would fight text
164
+ // selection and image dragging.
165
+ if (e.pointerType === 'mouse' || pendingRef.current)
166
+ return;
167
+ dragRef.current = {
168
+ pointerId: e.pointerId,
169
+ startX: e.clientX,
170
+ startY: e.clientY,
171
+ axis: null,
172
+ lastX: e.clientX,
173
+ lastY: e.clientY,
174
+ lastTime: e.timeStamp,
175
+ velocityX: 0,
176
+ velocityY: 0,
177
+ };
178
+ // Keep receiving moves when the finger leaves the stage. Capture throws
179
+ // when the pointer is already gone; the drag still works without it.
180
+ try {
181
+ e.currentTarget.setPointerCapture?.(e.pointerId);
182
+ }
183
+ catch {
184
+ // ignore
185
+ }
186
+ };
187
+ const handlePointerMove = (e) => {
188
+ const drag = dragRef.current;
189
+ if (!drag || drag.pointerId !== e.pointerId)
190
+ return;
191
+ const dt = e.timeStamp - drag.lastTime;
192
+ if (dt > 0) {
193
+ drag.velocityX = (e.clientX - drag.lastX) / dt;
194
+ drag.velocityY = (e.clientY - drag.lastY) / dt;
195
+ }
196
+ drag.lastX = e.clientX;
197
+ drag.lastY = e.clientY;
198
+ drag.lastTime = e.timeStamp;
199
+ const dx = e.clientX - drag.startX;
200
+ const dy = e.clientY - drag.startY;
201
+ if (!drag.axis) {
202
+ drag.axis = lockAxis(dx, dy);
203
+ if (!drag.axis)
204
+ return;
205
+ setDragging(true);
206
+ }
207
+ if (drag.axis === 'x') {
208
+ setDragX(clampDragX(dx, hasPrevious, hasNext));
209
+ }
210
+ else {
211
+ setDragY(Math.max(0, dy));
212
+ }
213
+ };
214
+ const endDrag = (e, cancelled) => {
215
+ const drag = dragRef.current;
216
+ if (!drag || drag.pointerId !== e.pointerId)
217
+ return;
218
+ dragRef.current = null;
219
+ setDragging(false);
220
+ if (drag.axis === 'x') {
221
+ const dx = clampDragX(e.clientX - drag.startX, hasPrevious, hasNext);
222
+ const width = stageRef.current?.clientWidth ?? 0;
223
+ const direction = cancelled ? 0 : resolveSwipe(dx, drag.velocityX, width);
224
+ if (direction === 0) {
225
+ setDragX(0);
226
+ }
227
+ else {
228
+ go(direction);
229
+ }
230
+ }
231
+ else if (drag.axis === 'y') {
232
+ const dy = Math.max(0, e.clientY - drag.startY);
233
+ setDragY(0);
234
+ if (!cancelled && resolveDismiss(dy, drag.velocityY))
235
+ onClose();
236
+ }
237
+ };
238
+ if (!open)
239
+ return null;
240
+ const counter = total > 0 ? counterLabel(Math.min(index, total - 1), total) : '';
241
+ const hasFooter = Boolean(caption || meta || actions);
242
+ const classes = [
243
+ 'muka-media-viewer',
244
+ dragging && 'muka-media-viewer--dragging',
245
+ className,
246
+ ]
247
+ .filter(Boolean)
248
+ .join(' ');
249
+ // Fade the stage as it is dragged down, so the dismiss reads as "away".
250
+ const dismissProgress = Math.min(1, dragY / 400);
251
+ const slides = [];
252
+ for (const offset of [-1, 0, 1]) {
253
+ const itemIndex = index + offset;
254
+ const item = items[itemIndex];
255
+ if (!item)
256
+ continue;
257
+ slides.push(_jsx("div", { className: "muka-media-viewer__slide", role: "group", "aria-roledescription": "slide", "aria-label": counterLabel(itemIndex, total), "aria-hidden": offset !== 0, style: {
258
+ transform: `translate3d(calc(${(offset + shift) * 100}% + ${dragX}px), ${dragY}px, 0)`,
259
+ }, onTransitionEnd: offset !== 0 && shift !== 0 ? commit : undefined, children: _jsx("img", { className: "muka-media-viewer__image", src: item.src, alt: item.alt ?? '', draggable: false, decoding: "async" }) }, item.id ?? `index-${itemIndex}`));
260
+ }
261
+ return (
262
+ // Native <dialog> handles Escape (via `cancel`); arrow keys page.
263
+ _jsxs("dialog", { ref: dialogRef, className: classes, "aria-label": ariaLabel, onKeyDown: handleKeyDown, children: [_jsx(TopBar, { className: "muka-media-viewer__topbar", title: counter, trailing: _jsx(Button, { variant: "ghost", size: "md", iconOnly: true, "aria-label": closeLabel, onClick: onClose, children: _jsx(Icon, { name: "close", variant: "line" }) }) }), _jsx("span", { className: "muka-media-viewer__live", "aria-live": "polite", "aria-atomic": "true", children: counter }), _jsxs("div", { ref: stageRef, className: "muka-media-viewer__stage", role: "region", "aria-roledescription": "carousel", "aria-label": ariaLabel, style: dismissProgress > 0 ? { opacity: 1 - dismissProgress * 0.6 } : undefined, onPointerDown: handlePointerDown, onPointerMove: handlePointerMove, onPointerUp: (e) => endDrag(e, false), onPointerCancel: (e) => endDrag(e, true), children: [slides, hasPrevious && (_jsx("div", { className: "muka-media-viewer__nav muka-media-viewer__nav--previous", children: _jsx(Button, { variant: "secondary", size: "md", iconOnly: true, "aria-label": previousLabel, onClick: () => go(-1), children: _jsx(Icon, { name: "arrow-left-s", variant: "line" }) }) })), hasNext && (_jsx("div", { className: "muka-media-viewer__nav muka-media-viewer__nav--next", children: _jsx(Button, { variant: "secondary", size: "md", iconOnly: true, "aria-label": nextLabel, onClick: () => go(1), children: _jsx(Icon, { name: "arrow-right-s", variant: "line" }) }) }))] }), hasFooter && (_jsxs("div", { className: "muka-media-viewer__footer", children: [(caption || meta) && (_jsxs("div", { className: "muka-media-viewer__details", children: [caption && _jsx("div", { className: "muka-media-viewer__caption", children: caption }), meta && _jsx("div", { className: "muka-media-viewer__meta", children: meta })] })), actions && _jsx("div", { className: "muka-media-viewer__actions", children: actions })] }))] }));
264
+ };
265
+ MediaViewer.displayName = 'MediaViewer';
266
+ export default MediaViewer;
267
+ //# sourceMappingURL=MediaViewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaViewer.js","sourceRoot":"","sources":["../../../../components/MediaViewer/MediaViewer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { MediaViewer } from './MediaViewer';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../components/MediaViewer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA+C,MAAM,eAAe,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Pure gesture maths for `MediaViewer`, kept out of the component so the
3
+ * swipe and dismiss decisions are unit-testable without pointer events.
4
+ */
5
+ /** Movement (px) before a drag commits to an axis. */
6
+ export const AXIS_LOCK_DISTANCE = 8;
7
+ /** Fraction of the stage width a slow horizontal drag must pass to page. */
8
+ export const SWIPE_DISTANCE_RATIO = 0.25;
9
+ /** Velocity (px/ms) that pages even on a short horizontal flick. */
10
+ export const SWIPE_VELOCITY = 0.5;
11
+ /** Minimum distance (px) a flick must travel to count. */
12
+ export const FLICK_MIN_DISTANCE = 20;
13
+ /** Downward distance (px) that dismisses on a slow drag. */
14
+ export const DISMISS_DISTANCE = 120;
15
+ /** Downward velocity (px/ms) that dismisses on a short flick. */
16
+ export const DISMISS_VELOCITY = 0.5;
17
+ /**
18
+ * Decide which axis a drag belongs to, or null while it is still within the
19
+ * lock distance. Horizontal wins ties so a diagonal flick still pages.
20
+ */
21
+ export function lockAxis(dx, dy) {
22
+ if (Math.max(Math.abs(dx), Math.abs(dy)) < AXIS_LOCK_DISTANCE)
23
+ return null;
24
+ return Math.abs(dx) >= Math.abs(dy) ? 'x' : 'y';
25
+ }
26
+ /**
27
+ * Clamp a horizontal drag so it cannot move past the first or last item:
28
+ * there is nothing to reveal there, so the image stays put (no rubber band).
29
+ */
30
+ export function clampDragX(dx, hasPrevious, hasNext) {
31
+ if (dx > 0 && !hasPrevious)
32
+ return 0;
33
+ if (dx < 0 && !hasNext)
34
+ return 0;
35
+ return dx;
36
+ }
37
+ /**
38
+ * Where a released horizontal drag goes: `1` to the next item, `-1` to the
39
+ * previous one, `0` back to the current one. `dx` is already clamped.
40
+ */
41
+ export function resolveSwipe(dx, velocityX, stageWidth) {
42
+ const far = stageWidth > 0 && Math.abs(dx) >= stageWidth * SWIPE_DISTANCE_RATIO;
43
+ const flick = Math.abs(velocityX) >= SWIPE_VELOCITY &&
44
+ Math.abs(dx) >= FLICK_MIN_DISTANCE &&
45
+ Math.sign(velocityX) === Math.sign(dx);
46
+ if (!far && !flick)
47
+ return 0;
48
+ return dx < 0 ? 1 : -1;
49
+ }
50
+ /** Whether a released downward drag dismisses the viewer. */
51
+ export function resolveDismiss(dy, velocityY) {
52
+ if (dy <= 0)
53
+ return false;
54
+ if (dy >= DISMISS_DISTANCE)
55
+ return true;
56
+ return velocityY >= DISMISS_VELOCITY && dy >= FLICK_MIN_DISTANCE;
57
+ }
58
+ //# sourceMappingURL=mediaViewerGestures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediaViewerGestures.js","sourceRoot":"","sources":["../../../../components/MediaViewer/mediaViewerGestures.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sDAAsD;AACtD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAEzC,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAElC,0DAA0D;AAC1D,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC,4DAA4D;AAC5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC,iEAAiE;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAIpC;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAU,EAAE,EAAU;IAC7C,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,kBAAkB;QAAE,OAAO,IAAI,CAAC;IAC3E,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,WAAoB,EAAE,OAAgB;IAC3E,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,CAAC;IACrC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU,EAAE,SAAiB,EAAE,UAAkB;IAC5E,MAAM,GAAG,GAAG,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,UAAU,GAAG,oBAAoB,CAAC;IAChF,MAAM,KAAK,GACT,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,cAAc;QACrC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,kBAAkB;QAClC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IAC7B,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,cAAc,CAAC,EAAU,EAAE,SAAiB;IAC1D,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1B,IAAI,EAAE,IAAI,gBAAgB;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,SAAS,IAAI,gBAAgB,IAAI,EAAE,IAAI,kBAAkB,CAAC;AACnE,CAAC"}
@@ -33,6 +33,17 @@
33
33
  height: 120px;
34
34
  }
35
35
 
36
+ /* Fluid: fill the parent's width; the shape sets the height via aspect-ratio. */
37
+ .muka-thumbnail--fluid {
38
+ width: 100%;
39
+ height: auto;
40
+ aspect-ratio: 1 / 1;
41
+ }
42
+
43
+ .muka-thumbnail--fluid.muka-thumbnail--4-3 {
44
+ aspect-ratio: 4 / 3;
45
+ }
46
+
36
47
  .muka-thumbnail--ellipse .muka-thumbnail__frame {
37
48
  border-radius: var(--border-radius-full);
38
49
  }
@@ -19,12 +19,15 @@ import './Thumbnail.css';
19
19
  * and clicking activates `onClick` (e.g. to enlarge in a dialog).
20
20
  * - **removable** — a tertiary × button in the top-right corner calls
21
21
  * `onRemove` to delete the photo.
22
+ * - **fluid** — fills its parent's width at the shape's aspect ratio, for
23
+ * responsive grids; **lazy** defers loading the image until it nears the
24
+ * viewport.
22
25
  *
23
26
  * Tokens used: border-radius-lg, color-black-alpha-3, dialog-color-backdrop,
24
27
  * button-color-tertiary-*, alias-color-state-error-*, alert-color-error-accent,
25
28
  * motion-duration-micro, motion-easing-enter.
26
29
  */
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) => {
30
+ export const Thumbnail = forwardRef(({ src, alt = '', shape = '4:3', fluid = false, lazy = false, imgProps, loading = false, progress = 0, processing = false, error = false, caption, errorReason, onRemove, onClick, removeLabel = 'Remove photo', viewLabel = 'View photo', className = '', ...props }, ref) => {
28
31
  const isBusy = loading || processing;
29
32
  const isInteractive = !isBusy && !error && Boolean(onClick);
30
33
  const showRemove = !isBusy && Boolean(onRemove);
@@ -32,6 +35,7 @@ export const Thumbnail = forwardRef(({ src, alt = '', shape = '4:3', loading = f
32
35
  'muka-thumbnail',
33
36
  // '4:3' → '--4-3', '1:1' → '--1-1', 'ellipse' → '--ellipse'
34
37
  `muka-thumbnail--${shape.replace(':', '-')}`,
38
+ fluid && 'muka-thumbnail--fluid',
35
39
  loading && 'muka-thumbnail--loading',
36
40
  processing && 'muka-thumbnail--processing',
37
41
  error && 'muka-thumbnail--error',
@@ -40,7 +44,7 @@ export const Thumbnail = forwardRef(({ src, alt = '', shape = '4:3', loading = f
40
44
  ]
41
45
  .filter(Boolean)
42
46
  .join(' ');
43
- const image = _jsx("img", { className: "muka-thumbnail__image", src: src, alt: alt });
47
+ const image = (_jsx("img", { ...(lazy && { loading: 'lazy' }), decoding: "async", ...imgProps, className: "muka-thumbnail__image", src: src, alt: alt }));
44
48
  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
49
  // The frame owns the shape's clip (border-radius + overflow), so the remove
46
50
  // button — a sibling of the frame — is never clipped, even for the circle.
@@ -1 +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"}
1
+ {"version":3,"file":"Thumbnail.js","sourceRoot":"","sources":["../../../../components/Thumbnail/Thumbnail.tsx"],"names":[],"mappings":"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"}
@@ -87,6 +87,7 @@ export { PullToRefresh } from './PullToRefresh';
87
87
  export { LicensePlateInput, } from './LicensePlateInput';
88
88
  export { SocialSignInButton, } from './SocialSignInButton';
89
89
  export { Thumbnail } from './Thumbnail';
90
+ export { MediaViewer, } from './MediaViewer';
90
91
  export { PhotoUploader, } from './PhotoUploader';
91
92
  export { TextLink } from './TextLink';
92
93
  //# 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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"}
@@ -116,4 +116,6 @@ body {
116
116
  padding: 0;
117
117
  /* Page background uses Muka surface token so it matches theme (e.g. dark for muka-dark, wireframe-dark) */
118
118
  background-color: var(--color-surface-level3);
119
+ /* Default text color so bare text (h1–h6, p, span outside components) follows the theme instead of browser black */
120
+ color: var(--color-text-default-default);
119
121
  }
@@ -7,7 +7,8 @@
7
7
  align-items: center;
8
8
  justify-content: center;
9
9
  flex-shrink: 0;
10
- overflow: hidden;
10
+ /* No overflow clipping: the status dot sits on the edge. The image and the
11
+ loading shimmer round themselves to the avatar shape instead. */
11
12
  user-select: none;
12
13
  vertical-align: middle;
13
14
  background-color: var(--avatar-color-background-default);
@@ -80,9 +81,10 @@
80
81
  border-radius: var(--avatar-radius-square-sm);
81
82
  }
82
83
 
83
- /* 4xs is too small for initials, the fallback icon or a status dot:
84
+ /* 4xs is too small for initials, an icon, the fallback icon or a status dot:
84
85
  it shows the picture, or the plain background */
85
86
  .muka-avatar--4xs .muka-avatar__initials,
87
+ .muka-avatar--4xs .muka-avatar__icon,
86
88
  .muka-avatar--4xs .muka-avatar__fallback,
87
89
  .muka-avatar--4xs .muka-avatar__status {
88
90
  display: none;
@@ -118,38 +120,59 @@
118
120
  .muka-avatar__skeleton {
119
121
  position: absolute;
120
122
  inset: 0;
123
+ border-radius: inherit;
121
124
  background: linear-gradient(
122
125
  90deg,
123
126
  transparent 0%,
124
127
  var(--color-surface-level1) 50%,
125
128
  transparent 100%
126
- );
129
+ ) no-repeat;
130
+ background-size: 50% 100%;
127
131
  animation: avatar-loading 1.5s ease-in-out infinite;
128
132
  }
129
133
 
134
+ /* The highlight sweeps by background position, so it stays inside the
135
+ rounded shape without the avatar clipping its overflow */
130
136
  @keyframes avatar-loading {
131
137
  0% {
132
- transform: translateX(-100%);
138
+ background-position: -100% 0;
133
139
  }
134
140
  100% {
135
- transform: translateX(100%);
141
+ background-position: 200% 0;
136
142
  }
137
143
  }
138
144
 
139
145
  /* Avatar content */
140
146
  .muka-avatar__image {
147
+ border-radius: inherit;
141
148
  width: 100%;
142
149
  height: 100%;
143
150
  object-fit: cover;
144
151
  display: block;
145
152
  }
146
153
 
154
+ /* Icon slot: a fixed icon size per avatar size, in the initials colour
155
+ (subtle text) */
147
156
  .muka-avatar__icon {
148
- width: 60%;
149
- height: 60%;
150
157
  display: flex;
151
158
  align-items: center;
152
159
  justify-content: center;
160
+ color: var(--avatar-color-foreground-default);
161
+ }
162
+
163
+ .muka-avatar--3xs .muka-avatar__icon { width: var(--avatar-icon-size-3xs); height: var(--avatar-icon-size-3xs); }
164
+ .muka-avatar--2xs .muka-avatar__icon { width: var(--avatar-icon-size-2xs); height: var(--avatar-icon-size-2xs); }
165
+ .muka-avatar--xs .muka-avatar__icon { width: var(--avatar-icon-size-xs); height: var(--avatar-icon-size-xs); }
166
+ .muka-avatar--sm .muka-avatar__icon { width: var(--avatar-icon-size-sm); height: var(--avatar-icon-size-sm); }
167
+ .muka-avatar--md .muka-avatar__icon { width: var(--avatar-icon-size-md); height: var(--avatar-icon-size-md); }
168
+ .muka-avatar--lg .muka-avatar__icon { width: var(--avatar-icon-size-lg); height: var(--avatar-icon-size-lg); }
169
+ .muka-avatar--xl .muka-avatar__icon { width: var(--avatar-icon-size-xl); height: var(--avatar-icon-size-xl); }
170
+
171
+ /* A Muka Icon fills the slot and takes its colour (its own `color` prop still wins) */
172
+ .muka-avatar__icon .muka-icon {
173
+ width: 100%;
174
+ height: 100%;
175
+ color: inherit;
153
176
  }
154
177
 
155
178
  .muka-avatar__icon svg {
@@ -24,7 +24,10 @@
24
24
  fill: none;
25
25
  /* Subtle lift on the filled segment, matching the Figma elevation */
26
26
  filter: drop-shadow(0 2px 4px var(--color-black-alpha-5, rgba(0, 0, 0, 0.05)));
27
- transition: stroke-dasharray 0.3s ease;
27
+ /* Butt caps keep the always-rendered 0% arc invisible (round caps would draw a dot) */
28
+ stroke-linecap: butt;
29
+ /* view duration (300ms) reads at the 24px size; tokens zero it for reduced motion */
30
+ transition: stroke-dasharray var(--motion-duration-view) var(--motion-easing-default);
28
31
  }
29
32
 
30
33
  /* ─── Indeterminate (spinner) ─────────────────────────── */
@@ -38,6 +38,7 @@
38
38
  height: 100%;
39
39
  max-width: 100vw;
40
40
  max-height: 100vh;
41
+ max-height: 100dvh;
41
42
  margin: 0;
42
43
  display: flex;
43
44
  flex-direction: column;
@@ -72,6 +73,8 @@
72
73
 
73
74
  .muka-dialog--lg .muka-dialog__surface {
74
75
  height: calc(100vh - var(--dialog-margin-top-mobile));
76
+ /* dvh tracks the visible area as mobile toolbars show and hide */
77
+ height: calc(100dvh - var(--dialog-margin-top-mobile));
75
78
  }
76
79
 
77
80
  /* Body */
@@ -192,6 +192,9 @@
192
192
  flex-shrink: 0;
193
193
  width: var(--size-2xl, 2rem);
194
194
  height: var(--size-2xl, 2rem);
195
+ /* Bleed into the field's vertical padding: keeps the full hit area without
196
+ making a password or clearable field taller than a plain one. */
197
+ margin-block: calc(var(--input-field-padding-y) * -1);
195
198
  padding: 0;
196
199
  border: none;
197
200
  background: transparent;
@@ -199,6 +202,24 @@
199
202
  cursor: pointer;
200
203
  }
201
204
 
205
+ /* The outermost button bleeds into the right padding by the same amount, so
206
+ its glyph sits as close to the edge as it does to the top and bottom. */
207
+ .muka-input__clear:last-child,
208
+ .muka-input__reveal:last-child {
209
+ margin-inline-end: calc(var(--input-field-padding-y) * -1);
210
+ }
211
+
212
+ /* md: match the right gap to the gap above and below the vertically centred
213
+ button exactly, i.e. (field height − borders − button) / 2. Holds in the
214
+ focus/error state too, where border and padding trade 1px. */
215
+ .muka-input__field--md .muka-input__clear:last-child,
216
+ .muka-input__field--md .muka-input__reveal:last-child {
217
+ margin-inline-end: calc(
218
+ (var(--input-field-height-default) - 2 * var(--border-width-regular) - var(--size-2xl, 2rem)) / 2
219
+ - var(--input-field-padding-x)
220
+ );
221
+ }
222
+
202
223
  .muka-input__field--sm .muka-input__clear,
203
224
  .muka-input__field--sm .muka-input__reveal {
204
225
  width: var(--size-xl, 1.5rem);