@banzamel/mineralui 1.6.3 → 1.6.4

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.
@@ -159,94 +159,100 @@ var D = {
159
159
  "16:9": "16 / 9",
160
160
  "21:9": "21 / 9"
161
161
  };
162
- function O({ src: t, fit: n = "cover", ratio: r = "auto", hidden: o, rounded: s = !1, bordered: c = !1, shadow: p = !1, preview: y = !1, previewGroup: S, hoverEffect: C = "none", clickEffect: w = "none", fallback: O, skeleton: k = !1, className: A, style: j, alt: M, onError: ee, ...N }) {
163
- let [P, F] = m(!1), [I, L] = m(!1), [R, z] = m([]), [B, V] = m(0), H = d(), { effectClassName: U, effectLayer: W, handlePointerDown: G } = a({ effect: k ? "none" : w }), K = (e) => {
164
- O && !P && (F(!0), e.currentTarget.src = O), ee?.(e);
165
- }, q = r !== "auto" && !!D[r], J = q ? {
166
- aspectRatio: D[r],
167
- ...j
168
- } : j, Y = P && O ? O : t, X = f(() => ({
169
- src: Y || "",
170
- alt: M ?? "",
171
- caption: typeof N.title == "string" ? N.title : void 0
162
+ function O(e) {
163
+ if (e != null) return typeof e == "number" ? `${e}px` : e;
164
+ }
165
+ function k({ src: t, fit: n = "cover", ratio: r = "auto", width: o, height: s, hidden: c, rounded: p = !1, bordered: y = !1, shadow: S = !1, preview: C = !1, previewGroup: w, hoverEffect: k = "none", clickEffect: ee = "none", fallback: A, skeleton: j = !1, className: M, style: te, alt: N, onError: ne, ...P }) {
166
+ let [re, ie] = m(!1), [F, I] = m(!1), [L, R] = m([]), [z, B] = m(0), V = d(), { effectClassName: ae, effectLayer: H, handlePointerDown: U } = a({ effect: j ? "none" : ee }), W = (e) => {
167
+ A && !re && (ie(!0), e.currentTarget.src = A), ne?.(e);
168
+ }, G = O(o), K = O(s), q = G != null || K != null, J = r !== "auto" && !!D[r], Y = {};
169
+ G != null && (Y.width = G), K != null && (Y.height = K);
170
+ let X = {
171
+ ...te,
172
+ ...J ? { aspectRatio: D[r] } : null,
173
+ ...Y
174
+ }, Z = re && A ? A : t, Q = f(() => ({
175
+ src: Z || "",
176
+ alt: N ?? "",
177
+ caption: typeof P.title == "string" ? P.title : void 0
172
178
  }), [
173
- M,
174
- Y,
175
- N.title
179
+ N,
180
+ Z,
181
+ P.title
176
182
  ]);
177
183
  if (u(() => {
178
- if (!(!y || !S || !Y)) return b(S, H, X);
184
+ if (!(!C || !w || !Z)) return b(w, V, Q);
179
185
  }, [
180
- y,
181
- S,
182
- H,
183
- X,
184
- Y
185
- ]), k) return /* @__PURE__ */ g(l, {
186
+ C,
187
+ w,
188
+ V,
189
+ Q,
190
+ Z
191
+ ]), j) return /* @__PURE__ */ g(l, {
186
192
  variant: "rectangle",
187
193
  animate: "pulse",
188
- className: i("image-skeleton", s && "rounded", c && "bordered", A),
189
- style: J,
194
+ className: i("image-skeleton", p && "rounded", y && "bordered", M),
195
+ style: X,
190
196
  "aria-label": "Loading",
191
- ...e(o)
197
+ ...e(c)
192
198
  });
193
- let te = () => {
194
- if (!(!y || !Y)) {
195
- if (S) {
196
- let e = x(S), t = e.findIndex((e) => e.id === H);
199
+ let oe = () => {
200
+ if (!(!C || !Z)) {
201
+ if (w) {
202
+ let e = x(w), t = e.findIndex((e) => e.id === V);
197
203
  if (e.length > 0 && t >= 0) {
198
- z(e.map(({ id: e, ...t }) => t)), V(t), L(!0);
204
+ R(e.map(({ id: e, ...t }) => t)), B(t), I(!0);
199
205
  return;
200
206
  }
201
207
  }
202
- z([X]), V(0), L(!0);
208
+ R([Q]), B(0), I(!0);
203
209
  }
204
- }, Z = i("image", n, !W && s && "rounded", !W && c && "bordered", !W && p && "shadow"), ne = q || !!W || y || C !== "none", Q = i("image-wrap", q && "has-ratio", s && "rounded", c && "bordered", p && "shadow", y && "preview", T(C) && "effect-zoom", E(C) && "effect-dim", U, A), $ = /* @__PURE__ */ g("img", {
205
- className: Z,
206
- onError: K,
207
- src: Y,
208
- ...N,
209
- alt: M ?? ""
210
+ }, se = i("image", n, !H && p && "rounded", !H && y && "bordered", !H && S && "shadow"), ce = J || q || !!H || C || k !== "none", le = i("image-wrap", J && "has-ratio", q && "has-size", p && "rounded", y && "bordered", S && "shadow", C && "preview", T(k) && "effect-zoom", E(k) && "effect-dim", ae, M), $ = /* @__PURE__ */ g("img", {
211
+ className: se,
212
+ onError: W,
213
+ src: Z,
214
+ ...P,
215
+ alt: N ?? ""
210
216
  });
211
- return ne ? /* @__PURE__ */ _(h, { children: [y ? /* @__PURE__ */ _("button", {
217
+ return ce ? /* @__PURE__ */ _(h, { children: [C ? /* @__PURE__ */ _("button", {
212
218
  type: "button",
213
- className: i(Q, "image-button"),
214
- "aria-label": `Preview ${M || "image"}`,
215
- onClick: te,
216
- onPointerDown: W ? G : void 0,
217
- disabled: !Y,
218
- ...e(o),
219
- style: J,
220
- children: [W, $]
219
+ className: i(le, "image-button"),
220
+ "aria-label": `Preview ${N || "image"}`,
221
+ onClick: oe,
222
+ onPointerDown: H ? U : void 0,
223
+ disabled: !Z,
224
+ ...e(c),
225
+ style: X,
226
+ children: [H, $]
221
227
  }) : /* @__PURE__ */ _("span", {
222
- className: Q,
223
- onPointerDown: W ? G : void 0,
224
- ...e(o),
225
- style: J,
226
- children: [W, $]
228
+ className: le,
229
+ onPointerDown: H ? U : void 0,
230
+ ...e(c),
231
+ style: X,
232
+ children: [H, $]
227
233
  }), /* @__PURE__ */ g(v, {
228
- open: I,
229
- items: R,
230
- activeIndex: B,
231
- onActiveIndexChange: V,
232
- onClose: () => L(!1)
234
+ open: F,
235
+ items: L,
236
+ activeIndex: z,
237
+ onActiveIndexChange: B,
238
+ onClose: () => I(!1)
233
239
  })] }) : /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("img", {
234
- className: i(Z, A),
235
- style: J,
236
- onError: K,
237
- src: Y,
238
- ...e(o),
239
- ...N,
240
- alt: M ?? ""
240
+ className: i(se, M),
241
+ style: X,
242
+ onError: W,
243
+ src: Z,
244
+ ...e(c),
245
+ ...P,
246
+ alt: N ?? ""
241
247
  }), /* @__PURE__ */ g(v, {
242
- open: I,
243
- items: R,
244
- activeIndex: B,
245
- onActiveIndexChange: V,
246
- onClose: () => L(!1)
248
+ open: F,
249
+ items: L,
250
+ activeIndex: z,
251
+ onActiveIndexChange: B,
252
+ onClose: () => I(!1)
247
253
  })] });
248
254
  }
249
255
  //#endregion
250
- export { S as a, T as i, w as n, C as o, E as r, v as s, O as t };
256
+ export { S as a, T as i, w as n, C as o, E as r, v as s, k as t };
251
257
 
252
- //# sourceMappingURL=MImage-gwFphZk2.js.map
258
+ //# sourceMappingURL=MImage-BKX-xBm3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MImage-BKX-xBm3.js","names":[],"sources":["../src/components/media/MMediaLightbox/MMediaLightbox.tsx","../src/components/media/mediaPreviewRegistry.ts","../src/components/media/mediaInteraction.ts","../src/components/media/MImage/MImage.tsx"],"sourcesContent":["import {useEffect, useRef} from 'react'\nimport type {MouseEvent} from 'react'\nimport {MButton} from '../../controls'\nimport {MBadge} from '../../feedback'\nimport {MPortal} from '../../primitives'\nimport {MCloseIcon, MChevronLeftIcon, MChevronRightIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MMediaLightbox.css'\n\nexport interface MMediaLightboxItem {\n src: string\n alt?: string\n caption?: string\n}\n\ninterface MMediaLightboxProps {\n open: boolean\n items: MMediaLightboxItem[]\n activeIndex: number\n onClose: () => void\n onActiveIndexChange: (index: number) => void\n}\n\nexport function MMediaLightbox({\n open,\n items,\n activeIndex,\n onClose,\n onActiveIndexChange,\n}: MMediaLightboxProps) {\n const currentItem = items[activeIndex]\n const frameRef = useRef<HTMLDivElement | null>(null)\n const canGoPrev = activeIndex > 0\n const canGoNext = activeIndex < items.length - 1\n\n useEffect(() => {\n if (!open) {\n return\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose()\n return\n }\n\n if (event.key === 'ArrowLeft' && canGoPrev) {\n onActiveIndexChange(activeIndex - 1)\n }\n\n if (event.key === 'ArrowRight' && canGoNext) {\n onActiveIndexChange(activeIndex + 1)\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [activeIndex, canGoNext, canGoPrev, onActiveIndexChange, onClose, open])\n\n useEffect(() => {\n if (!open) {\n return\n }\n\n const previousOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n\n return () => {\n document.body.style.overflow = previousOverflow\n }\n }, [open])\n\n if (!open || !currentItem) {\n return null\n }\n\n const handleBackdropMouseDown = (event: MouseEvent<HTMLDivElement>) => {\n const target = event.target as Node | null\n\n if (target && frameRef.current && !frameRef.current.contains(target)) {\n onClose()\n }\n }\n\n const previewLabel = currentItem.alt || currentItem.caption || 'Image preview'\n\n return (\n <MPortal>\n <div\n className={cn('mineral-backdrop', 'media-lightbox-backdrop')}\n onMouseDown={handleBackdropMouseDown}\n >\n <div className=\"media-lightbox-shell\" role=\"dialog\" aria-modal=\"true\" aria-label={previewLabel}>\n <div className=\"media-lightbox-stage\">\n <div ref={frameRef} className=\"media-lightbox-frame\">\n <div className=\"media-lightbox-topbar\">\n <MBadge color=\"dark\" size=\"sm\" rounded className=\"media-lightbox-counter\">\n {items.length > 1 ? `${activeIndex + 1} / ${items.length}` : 'Preview'}\n </MBadge>\n <MButton\n type=\"button\"\n variant=\"ghost\"\n color=\"primary\"\n size=\"lg\"\n shape=\"circle\"\n iconOnly\n className=\"media-lightbox-action\"\n aria-label=\"Close preview\"\n onClick={onClose}\n >\n <MCloseIcon />\n </MButton>\n </div>\n\n <MButton\n type=\"button\"\n variant=\"ghost\"\n color=\"primary\"\n size=\"lg\"\n shape=\"circle\"\n iconOnly\n className=\"media-lightbox-nav media-lightbox-nav-prev\"\n aria-label=\"Previous image\"\n disabled={items.length <= 1 || !canGoPrev}\n onClick={() => canGoPrev && onActiveIndexChange(activeIndex - 1)}\n >\n <MChevronLeftIcon />\n </MButton>\n\n <img className=\"media-lightbox-image\" src={currentItem.src} alt={currentItem.alt || ''} />\n\n <MButton\n type=\"button\"\n variant=\"ghost\"\n color=\"primary\"\n size=\"lg\"\n shape=\"circle\"\n iconOnly\n className=\"media-lightbox-nav media-lightbox-nav-next\"\n aria-label=\"Next image\"\n disabled={items.length <= 1 || !canGoNext}\n onClick={() => canGoNext && onActiveIndexChange(activeIndex + 1)}\n >\n <MChevronRightIcon />\n </MButton>\n\n {currentItem.caption || currentItem.alt ? (\n <MBadge color=\"dark\" size=\"sm\" rounded className=\"media-lightbox-caption\">\n {currentItem.caption || currentItem.alt}\n </MBadge>\n ) : null}\n </div>\n </div>\n </div>\n </div>\n </MPortal>\n )\n}\n","import type {MMediaLightboxItem} from './MMediaLightbox/MMediaLightbox'\n\ninterface MMediaPreviewRegistryItem extends MMediaLightboxItem {\n id: string\n}\n\nconst previewGroups = new Map<string, Map<string, MMediaPreviewRegistryItem>>()\n\nexport function registerMediaPreviewItem(group: string, id: string, item: MMediaLightboxItem) {\n let groupItems = previewGroups.get(group)\n\n if (!groupItems) {\n groupItems = new Map()\n previewGroups.set(group, groupItems)\n }\n\n groupItems.set(id, {id, ...item})\n\n return () => {\n const currentGroupItems = previewGroups.get(group)\n if (!currentGroupItems) {\n return\n }\n\n currentGroupItems.delete(id)\n\n if (currentGroupItems.size === 0) {\n previewGroups.delete(group)\n }\n }\n}\n\nexport function getMediaPreviewGroupItems(group: string) {\n return Array.from(previewGroups.get(group)?.values() ?? [])\n}\n","import type {MClickEffect} from '../../utils/useInteractionEffect'\n\nexport type MMediaInteractionEffect = MClickEffect | 'zoom' | 'dim' | 'zoom-ripple'\nexport type MMediaHoverEffect = 'none' | 'zoom' | 'dim' | 'zoom-dim'\n\nexport function usesRipple(effect: MMediaInteractionEffect): boolean {\n return effect === 'ripple' || effect === 'zoom-ripple'\n}\n\nexport function usesZoom(effect: MMediaInteractionEffect): boolean {\n return effect === 'zoom' || effect === 'zoom-ripple'\n}\n\nexport function usesDim(effect: MMediaInteractionEffect): boolean {\n return effect === 'dim'\n}\n\nexport function usesHoverZoom(effect: MMediaHoverEffect): boolean {\n return effect === 'zoom' || effect === 'zoom-dim'\n}\n\nexport function usesHoverDim(effect: MMediaHoverEffect): boolean {\n return effect === 'dim' || effect === 'zoom-dim'\n}\n","import {useEffect, useId, useMemo, useState} from 'react'\nimport type * as React from 'react'\nimport type {CSSProperties} from 'react'\nimport type {MImageProps, MImageSize} from './MImage.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {MSkeleton} from '../../feedback'\nimport {MMediaLightbox} from '../MMediaLightbox/MMediaLightbox'\nimport {getMediaPreviewGroupItems, registerMediaPreviewItem} from '../mediaPreviewRegistry'\nimport {usesHoverDim, usesHoverZoom} from '../mediaInteraction'\nimport './MImage.css'\n\nconst RATIO_MAP: Record<string, string> = {\n '1:1': '1 / 1',\n '4:3': '4 / 3',\n '16:9': '16 / 9',\n '21:9': '21 / 9',\n}\n\nfunction toCssSize(value: MImageSize | undefined): string | undefined {\n if (value == null) return undefined\n return typeof value === 'number' ? `${value}px` : value\n}\n\n// Render a styled image with aspect ratio, fit, and optional fallback.\nexport function MImage({\n src,\n fit = 'cover',\n ratio = 'auto',\n width,\n height,\n hidden,\n rounded = false,\n bordered = false,\n shadow = false,\n preview = false,\n previewGroup,\n hoverEffect = 'none',\n clickEffect = 'none',\n fallback,\n skeleton = false,\n className,\n style,\n alt,\n onError,\n ...rest\n}: MImageProps) {\n const [errored, setErrored] = useState(false)\n const [previewOpen, setPreviewOpen] = useState(false)\n const [previewItems, setPreviewItems] = useState<Array<{src: string; alt?: string; caption?: string}>>([])\n const [previewIndex, setPreviewIndex] = useState(0)\n const previewId = useId()\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLElement>({\n effect: skeleton ? 'none' : clickEffect,\n })\n\n const handleError = (e: React.SyntheticEvent<HTMLImageElement>) => {\n if (fallback && !errored) {\n setErrored(true)\n e.currentTarget.src = fallback\n }\n onError?.(e)\n }\n\n const widthValue = toCssSize(width)\n const heightValue = toCssSize(height)\n const hasExplicitSize = widthValue != null || heightValue != null\n const hasFixedRatio = ratio !== 'auto' && !!RATIO_MAP[ratio]\n const sizeStyle: CSSProperties = {}\n if (widthValue != null) sizeStyle.width = widthValue\n if (heightValue != null) sizeStyle.height = heightValue\n const ratioStyle: CSSProperties = {\n ...style,\n ...(hasFixedRatio ? {aspectRatio: RATIO_MAP[ratio]} : null),\n ...sizeStyle,\n }\n const resolvedSrc = errored && fallback ? fallback : src\n const previewItem = useMemo(\n () => ({\n src: resolvedSrc || '',\n alt: alt ?? '',\n caption: typeof rest.title === 'string' ? rest.title : undefined,\n }),\n [alt, resolvedSrc, rest.title]\n )\n\n useEffect(() => {\n if (!preview || !previewGroup || !resolvedSrc) {\n return\n }\n\n return registerMediaPreviewItem(previewGroup, previewId, previewItem)\n }, [preview, previewGroup, previewId, previewItem, resolvedSrc])\n\n // Skeleton placeholder\n if (skeleton) {\n return (\n <MSkeleton\n variant=\"rectangle\"\n animate=\"pulse\"\n className={cn('image-skeleton', rounded && 'rounded', bordered && 'bordered', className)}\n style={ratioStyle}\n aria-label=\"Loading\"\n {...getHiddenProps(hidden)}\n />\n )\n }\n\n const openPreview = () => {\n if (!preview || !resolvedSrc) {\n return\n }\n\n if (previewGroup) {\n const groupItems = getMediaPreviewGroupItems(previewGroup)\n const currentIndex = groupItems.findIndex((item) => item.id === previewId)\n\n if (groupItems.length > 0 && currentIndex >= 0) {\n setPreviewItems(groupItems.map(({id, ...item}) => item))\n setPreviewIndex(currentIndex)\n setPreviewOpen(true)\n return\n }\n }\n\n setPreviewItems([previewItem])\n setPreviewIndex(0)\n setPreviewOpen(true)\n }\n\n const imgClassName = cn(\n 'image',\n fit,\n !effectLayer && rounded && 'rounded',\n !effectLayer && bordered && 'bordered',\n !effectLayer && shadow && 'shadow'\n )\n const usesWrapper =\n hasFixedRatio || hasExplicitSize || Boolean(effectLayer) || preview || hoverEffect !== 'none'\n const wrapperClassName = cn(\n 'image-wrap',\n hasFixedRatio && 'has-ratio',\n hasExplicitSize && 'has-size',\n rounded && 'rounded',\n bordered && 'bordered',\n shadow && 'shadow',\n preview && 'preview',\n usesHoverZoom(hoverEffect) && 'effect-zoom',\n usesHoverDim(hoverEffect) && 'effect-dim',\n effectClassName,\n className\n )\n const imageNode = <img className={imgClassName} onError={handleError} src={resolvedSrc} {...rest} alt={alt ?? ''} />\n\n if (usesWrapper) {\n return (\n <>\n {preview ? (\n <button\n type=\"button\"\n className={cn(wrapperClassName, 'image-button')}\n aria-label={`Preview ${alt || 'image'}`}\n onClick={openPreview}\n onPointerDown={effectLayer ? handlePointerDown : undefined}\n disabled={!resolvedSrc}\n {...getHiddenProps(hidden)}\n style={ratioStyle}\n >\n {effectLayer}\n {imageNode}\n </button>\n ) : (\n <span\n className={wrapperClassName}\n onPointerDown={effectLayer ? handlePointerDown : undefined}\n {...getHiddenProps(hidden)}\n style={ratioStyle}\n >\n {effectLayer}\n {imageNode}\n </span>\n )}\n\n <MMediaLightbox\n open={previewOpen}\n items={previewItems}\n activeIndex={previewIndex}\n onActiveIndexChange={setPreviewIndex}\n onClose={() => setPreviewOpen(false)}\n />\n </>\n )\n }\n\n return (\n <>\n <img\n className={cn(imgClassName, className)}\n style={ratioStyle}\n onError={handleError}\n src={resolvedSrc}\n {...getHiddenProps(hidden)}\n {...rest}\n alt={alt ?? ''}\n />\n\n <MMediaLightbox\n open={previewOpen}\n items={previewItems}\n activeIndex={previewIndex}\n onActiveIndexChange={setPreviewIndex}\n onClose={() => setPreviewOpen(false)}\n />\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;AAuBA,SAAgB,EAAe,EAC3B,SACA,UACA,gBACA,YACA,0BACoB;CACpB,IAAM,IAAc,EAAM,IACpB,IAAW,EAA8B,KAAK,EAC9C,IAAY,IAAc,GAC1B,IAAY,IAAc,EAAM,SAAS;AAuC/C,KArCA,QAAgB;AACZ,MAAI,CAAC,EACD;EAGJ,IAAM,KAAiB,MAAyB;AAC5C,OAAI,EAAM,QAAQ,UAAU;AACxB,OAAS;AACT;;AAOJ,GAJI,EAAM,QAAQ,eAAe,KAC7B,EAAoB,IAAc,EAAE,EAGpC,EAAM,QAAQ,gBAAgB,KAC9B,EAAoB,IAAc,EAAE;;AAK5C,SADA,SAAS,iBAAiB,WAAW,EAAc,QACtC,SAAS,oBAAoB,WAAW,EAAc;IACpE;EAAC;EAAa;EAAW;EAAW;EAAqB;EAAS;EAAK,CAAC,EAE3E,QAAgB;AACZ,MAAI,CAAC,EACD;EAGJ,IAAM,IAAmB,SAAS,KAAK,MAAM;AAG7C,SAFA,SAAS,KAAK,MAAM,WAAW,gBAElB;AACT,YAAS,KAAK,MAAM,WAAW;;IAEpC,CAAC,EAAK,CAAC,EAEN,CAAC,KAAQ,CAAC,EACV,QAAO;CAGX,IAAM,KAA2B,MAAsC;EACnE,IAAM,IAAS,EAAM;AAErB,EAAI,KAAU,EAAS,WAAW,CAAC,EAAS,QAAQ,SAAS,EAAO,IAChE,GAAS;IAIX,IAAe,EAAY,OAAO,EAAY,WAAW;AAE/D,QACI,kBAAC,GAAD,EAAA,UACI,kBAAC,OAAD;EACI,WAAW,EAAG,oBAAoB,0BAA0B;EAC5D,aAAa;YAEb,kBAAC,OAAD;GAAK,WAAU;GAAuB,MAAK;GAAS,cAAW;GAAO,cAAY;aAC9E,kBAAC,OAAD;IAAK,WAAU;cACX,kBAAC,OAAD;KAAK,KAAK;KAAU,WAAU;eAA9B;MACI,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACI,kBAAC,GAAD;QAAQ,OAAM;QAAO,MAAK;QAAK,SAAA;QAAQ,WAAU;kBAC5C,EAAM,SAAS,IAAI,GAAG,IAAc,EAAE,KAAK,EAAM,WAAW;QACxD,CAAA,EACT,kBAAC,GAAD;QACI,MAAK;QACL,SAAQ;QACR,OAAM;QACN,MAAK;QACL,OAAM;QACN,UAAA;QACA,WAAU;QACV,cAAW;QACX,SAAS;kBAET,kBAAC,GAAD,EAAc,CAAA;QACR,CAAA,CACR;;MAEN,kBAAC,GAAD;OACI,MAAK;OACL,SAAQ;OACR,OAAM;OACN,MAAK;OACL,OAAM;OACN,UAAA;OACA,WAAU;OACV,cAAW;OACX,UAAU,EAAM,UAAU,KAAK,CAAC;OAChC,eAAe,KAAa,EAAoB,IAAc,EAAE;iBAEhE,kBAAC,GAAD,EAAoB,CAAA;OACd,CAAA;MAEV,kBAAC,OAAD;OAAK,WAAU;OAAuB,KAAK,EAAY;OAAK,KAAK,EAAY,OAAO;OAAM,CAAA;MAE1F,kBAAC,GAAD;OACI,MAAK;OACL,SAAQ;OACR,OAAM;OACN,MAAK;OACL,OAAM;OACN,UAAA;OACA,WAAU;OACV,cAAW;OACX,UAAU,EAAM,UAAU,KAAK,CAAC;OAChC,eAAe,KAAa,EAAoB,IAAc,EAAE;iBAEhE,kBAAC,GAAD,EAAqB,CAAA;OACf,CAAA;MAET,EAAY,WAAW,EAAY,MAChC,kBAAC,GAAD;OAAQ,OAAM;OAAO,MAAK;OAAK,SAAA;OAAQ,WAAU;iBAC5C,EAAY,WAAW,EAAY;OAC/B,CAAA,GACT;MACF;;IACJ,CAAA;GACJ,CAAA;EACJ,CAAA,EACA,CAAA;;;;ACrJlB,IAAM,oBAAgB,IAAI,KAAqD;AAE/E,SAAgB,EAAyB,GAAe,GAAY,GAA0B;CAC1F,IAAI,IAAa,EAAc,IAAI,EAAM;AASzC,QAPK,MACD,oBAAa,IAAI,KAAK,EACtB,EAAc,IAAI,GAAO,EAAW,GAGxC,EAAW,IAAI,GAAI;EAAC;EAAI,GAAG;EAAK,CAAC,QAEpB;EACT,IAAM,IAAoB,EAAc,IAAI,EAAM;AAC7C,QAIL,EAAkB,OAAO,EAAG,EAExB,EAAkB,SAAS,KAC3B,EAAc,OAAO,EAAM;;;AAKvC,SAAgB,EAA0B,GAAe;AACrD,QAAO,MAAM,KAAK,EAAc,IAAI,EAAM,EAAE,QAAQ,IAAI,EAAE,CAAC;;;;AC5B/D,SAAgB,EAAW,GAA0C;AACjE,QAAO,MAAW,YAAY,MAAW;;AAG7C,SAAgB,EAAS,GAA0C;AAC/D,QAAO,MAAW,UAAU,MAAW;;AAG3C,SAAgB,EAAQ,GAA0C;AAC9D,QAAO,MAAW;;AAGtB,SAAgB,EAAc,GAAoC;AAC9D,QAAO,MAAW,UAAU,MAAW;;AAG3C,SAAgB,EAAa,GAAoC;AAC7D,QAAO,MAAW,SAAS,MAAW;;;;ACT1C,IAAM,IAAoC;CACtC,OAAO;CACP,OAAO;CACP,QAAQ;CACR,QAAQ;CACX;AAED,SAAS,EAAU,GAAmD;AAC9D,UAAS,KACb,QAAO,OAAO,KAAU,WAAW,GAAG,EAAM,MAAM;;AAItD,SAAgB,EAAO,EACnB,QACA,SAAM,SACN,WAAQ,QACR,UACA,WACA,WACA,aAAU,IACV,cAAW,IACX,YAAS,IACT,aAAU,IACV,iBACA,iBAAc,QACd,kBAAc,QACd,aACA,cAAW,IACX,cACA,WACA,QACA,aACA,GAAG,KACS;CACZ,IAAM,CAAC,IAAS,MAAc,EAAS,GAAM,EACvC,CAAC,GAAa,KAAkB,EAAS,GAAM,EAC/C,CAAC,GAAc,KAAmB,EAA+D,EAAE,CAAC,EACpG,CAAC,GAAc,KAAmB,EAAS,EAAE,EAC7C,IAAY,GAAO,EACnB,EAAC,qBAAiB,gBAAa,yBAAqB,EAAkC,EACxF,QAAQ,IAAW,SAAS,IAC/B,CAAC,EAEI,KAAe,MAA8C;AAK/D,EAJI,KAAY,CAAC,OACb,GAAW,GAAK,EAChB,EAAE,cAAc,MAAM,IAE1B,KAAU,EAAE;IAGV,IAAa,EAAU,EAAM,EAC7B,IAAc,EAAU,EAAO,EAC/B,IAAkB,KAAc,QAAQ,KAAe,MACvD,IAAgB,MAAU,UAAU,CAAC,CAAC,EAAU,IAChD,IAA2B,EAAE;AAEnC,CADI,KAAc,SAAM,EAAU,QAAQ,IACtC,KAAe,SAAM,EAAU,SAAS;CAC5C,IAAM,IAA4B;EAC9B,GAAG;EACH,GAAI,IAAgB,EAAC,aAAa,EAAU,IAAO,GAAG;EACtD,GAAG;EACN,EACK,IAAc,MAAW,IAAW,IAAW,GAC/C,IAAc,SACT;EACH,KAAK,KAAe;EACpB,KAAK,KAAO;EACZ,SAAS,OAAO,EAAK,SAAU,WAAW,EAAK,QAAQ,KAAA;EAC1D,GACD;EAAC;EAAK;EAAa,EAAK;EAAM,CACjC;AAWD,KATA,QAAgB;AACR,SAAC,KAAW,CAAC,KAAgB,CAAC,GAIlC,QAAO,EAAyB,GAAc,GAAW,EAAY;IACtE;EAAC;EAAS;EAAc;EAAW;EAAa;EAAY,CAAC,EAG5D,EACA,QACI,kBAAC,GAAD;EACI,SAAQ;EACR,SAAQ;EACR,WAAW,EAAG,kBAAkB,KAAW,WAAW,KAAY,YAAY,EAAU;EACxF,OAAO;EACP,cAAW;EACX,GAAI,EAAe,EAAO;EAC5B,CAAA;CAIV,IAAM,WAAoB;AAClB,SAAC,KAAW,CAAC,IAIjB;OAAI,GAAc;IACd,IAAM,IAAa,EAA0B,EAAa,EACpD,IAAe,EAAW,WAAW,MAAS,EAAK,OAAO,EAAU;AAE1E,QAAI,EAAW,SAAS,KAAK,KAAgB,GAAG;AAG5C,KAFA,EAAgB,EAAW,KAAK,EAAC,OAAI,GAAG,QAAU,EAAK,CAAC,EACxD,EAAgB,EAAa,EAC7B,EAAe,GAAK;AACpB;;;AAMR,GAFA,EAAgB,CAAC,EAAY,CAAC,EAC9B,EAAgB,EAAE,EAClB,EAAe,GAAK;;IAGlB,KAAe,EACjB,SACA,GACA,CAAC,KAAe,KAAW,WAC3B,CAAC,KAAe,KAAY,YAC5B,CAAC,KAAe,KAAU,SAC7B,EACK,KACF,KAAiB,KAAmB,EAAQ,KAAgB,KAAW,MAAgB,QACrF,KAAmB,EACrB,cACA,KAAiB,aACjB,KAAmB,YACnB,KAAW,WACX,KAAY,YACZ,KAAU,UACV,KAAW,WACX,EAAc,EAAY,IAAI,eAC9B,EAAa,EAAY,IAAI,cAC7B,IACA,EACH,EACK,IAAY,kBAAC,OAAD;EAAK,WAAW;EAAc,SAAS;EAAa,KAAK;EAAa,GAAI;EAAM,KAAK,KAAO;EAAM,CAAA;AA0CpH,QAxCI,KAEI,kBAAA,GAAA,EAAA,UAAA,CACK,IACG,kBAAC,UAAD;EACI,MAAK;EACL,WAAW,EAAG,IAAkB,eAAe;EAC/C,cAAY,WAAW,KAAO;EAC9B,SAAS;EACT,eAAe,IAAc,IAAoB,KAAA;EACjD,UAAU,CAAC;EACX,GAAI,EAAe,EAAO;EAC1B,OAAO;YARX,CAUK,GACA,EACI;MAET,kBAAC,QAAD;EACI,WAAW;EACX,eAAe,IAAc,IAAoB,KAAA;EACjD,GAAI,EAAe,EAAO;EAC1B,OAAO;YAJX,CAMK,GACA,EACE;KAGX,kBAAC,GAAD;EACI,MAAM;EACN,OAAO;EACP,aAAa;EACb,qBAAqB;EACrB,eAAe,EAAe,GAAM;EACtC,CAAA,CACH,EAAA,CAAA,GAKP,kBAAA,GAAA,EAAA,UAAA,CACI,kBAAC,OAAD;EACI,WAAW,EAAG,IAAc,EAAU;EACtC,OAAO;EACP,SAAS;EACT,KAAK;EACL,GAAI,EAAe,EAAO;EAC1B,GAAI;EACJ,KAAK,KAAO;EACd,CAAA,EAEF,kBAAC,GAAD;EACI,MAAM;EACN,OAAO;EACP,aAAa;EACb,qBAAqB;EACrB,eAAe,EAAe,GAAM;EACtC,CAAA,CACH,EAAA,CAAA"}
@@ -1,2 +1,2 @@
1
- const e=require(`./theme-CgS-bND3.cjs`),t=require(`./icons-DWMgDKgt.cjs`),n=require(`./cn-CU5TNITO.cjs`),r=require(`./useInteractionEffect-D1ZdNbKU.cjs`),i=require(`./MPortal-Bi24xTGW.cjs`),a=require(`./MButton-DrkVdRDy.cjs`),o=require(`./MBadge-B4x-Lx7e.cjs`),s=require(`./MSkeleton-5j1h9s95.cjs`);require(`./core-AKWkE8Bx.cjs`);let c=require(`react`),l=require(`react/jsx-runtime`);function u({open:e,items:r,activeIndex:s,onClose:u,onActiveIndexChange:d}){let f=r[s],p=(0,c.useRef)(null),m=s>0,h=s<r.length-1;if((0,c.useEffect)(()=>{if(!e)return;let t=e=>{if(e.key===`Escape`){u();return}e.key===`ArrowLeft`&&m&&d(s-1),e.key===`ArrowRight`&&h&&d(s+1)};return document.addEventListener(`keydown`,t),()=>document.removeEventListener(`keydown`,t)},[s,h,m,d,u,e]),(0,c.useEffect)(()=>{if(!e)return;let t=document.body.style.overflow;return document.body.style.overflow=`hidden`,()=>{document.body.style.overflow=t}},[e]),!e||!f)return null;let g=e=>{let t=e.target;t&&p.current&&!p.current.contains(t)&&u()},_=f.alt||f.caption||`Image preview`;return(0,l.jsx)(i.t,{children:(0,l.jsx)(`div`,{className:n.t(`mineral-backdrop`,`media-lightbox-backdrop`),onMouseDown:g,children:(0,l.jsx)(`div`,{className:`media-lightbox-shell`,role:`dialog`,"aria-modal":`true`,"aria-label":_,children:(0,l.jsx)(`div`,{className:`media-lightbox-stage`,children:(0,l.jsxs)(`div`,{ref:p,className:`media-lightbox-frame`,children:[(0,l.jsxs)(`div`,{className:`media-lightbox-topbar`,children:[(0,l.jsx)(o.t,{color:`dark`,size:`sm`,rounded:!0,className:`media-lightbox-counter`,children:r.length>1?`${s+1} / ${r.length}`:`Preview`}),(0,l.jsx)(a.t,{type:`button`,variant:`ghost`,color:`primary`,size:`lg`,shape:`circle`,iconOnly:!0,className:`media-lightbox-action`,"aria-label":`Close preview`,onClick:u,children:(0,l.jsx)(t.Li,{})})]}),(0,l.jsx)(a.t,{type:`button`,variant:`ghost`,color:`primary`,size:`lg`,shape:`circle`,iconOnly:!0,className:`media-lightbox-nav media-lightbox-nav-prev`,"aria-label":`Previous image`,disabled:r.length<=1||!m,onClick:()=>m&&d(s-1),children:(0,l.jsx)(t.Fi,{})}),(0,l.jsx)(`img`,{className:`media-lightbox-image`,src:f.src,alt:f.alt||``}),(0,l.jsx)(a.t,{type:`button`,variant:`ghost`,color:`primary`,size:`lg`,shape:`circle`,iconOnly:!0,className:`media-lightbox-nav media-lightbox-nav-next`,"aria-label":`Next image`,disabled:r.length<=1||!h,onClick:()=>h&&d(s+1),children:(0,l.jsx)(t.Pi,{})}),f.caption||f.alt?(0,l.jsx)(o.t,{color:`dark`,size:`sm`,rounded:!0,className:`media-lightbox-caption`,children:f.caption||f.alt}):null]})})})})})}var d=new Map;function f(e,t,n){let r=d.get(e);return r||(r=new Map,d.set(e,r)),r.set(t,{id:t,...n}),()=>{let n=d.get(e);n&&(n.delete(t),n.size===0&&d.delete(e))}}function p(e){return Array.from(d.get(e)?.values()??[])}function m(e){return e===`ripple`||e===`zoom-ripple`}function h(e){return e===`zoom`||e===`zoom-ripple`}function g(e){return e===`dim`}function _(e){return e===`zoom`||e===`zoom-dim`}function v(e){return e===`dim`||e===`zoom-dim`}var y={"1:1":`1 / 1`,"4:3":`4 / 3`,"16:9":`16 / 9`,"21:9":`21 / 9`};function b({src:t,fit:i=`cover`,ratio:a=`auto`,hidden:o,rounded:d=!1,bordered:m=!1,shadow:h=!1,preview:g=!1,previewGroup:b,hoverEffect:x=`none`,clickEffect:S=`none`,fallback:C,skeleton:w=!1,className:T,style:E,alt:D,onError:O,...k}){let[A,j]=(0,c.useState)(!1),[M,N]=(0,c.useState)(!1),[P,F]=(0,c.useState)([]),[I,L]=(0,c.useState)(0),R=(0,c.useId)(),{effectClassName:z,effectLayer:B,handlePointerDown:V}=r.t({effect:w?`none`:S}),H=e=>{C&&!A&&(j(!0),e.currentTarget.src=C),O?.(e)},U=a!==`auto`&&!!y[a],W=U?{aspectRatio:y[a],...E}:E,G=A&&C?C:t,K=(0,c.useMemo)(()=>({src:G||``,alt:D??``,caption:typeof k.title==`string`?k.title:void 0}),[D,G,k.title]);if((0,c.useEffect)(()=>{if(!(!g||!b||!G))return f(b,R,K)},[g,b,R,K,G]),w)return(0,l.jsx)(s.t,{variant:`rectangle`,animate:`pulse`,className:n.t(`image-skeleton`,d&&`rounded`,m&&`bordered`,T),style:W,"aria-label":`Loading`,...e.r(o)});let q=()=>{if(!(!g||!G)){if(b){let e=p(b),t=e.findIndex(e=>e.id===R);if(e.length>0&&t>=0){F(e.map(({id:e,...t})=>t)),L(t),N(!0);return}}F([K]),L(0),N(!0)}},J=n.t(`image`,i,!B&&d&&`rounded`,!B&&m&&`bordered`,!B&&h&&`shadow`),Y=U||!!B||g||x!==`none`,X=n.t(`image-wrap`,U&&`has-ratio`,d&&`rounded`,m&&`bordered`,h&&`shadow`,g&&`preview`,_(x)&&`effect-zoom`,v(x)&&`effect-dim`,z,T),Z=(0,l.jsx)(`img`,{className:J,onError:H,src:G,...k,alt:D??``});return Y?(0,l.jsxs)(l.Fragment,{children:[g?(0,l.jsxs)(`button`,{type:`button`,className:n.t(X,`image-button`),"aria-label":`Preview ${D||`image`}`,onClick:q,onPointerDown:B?V:void 0,disabled:!G,...e.r(o),style:W,children:[B,Z]}):(0,l.jsxs)(`span`,{className:X,onPointerDown:B?V:void 0,...e.r(o),style:W,children:[B,Z]}),(0,l.jsx)(u,{open:M,items:P,activeIndex:I,onActiveIndexChange:L,onClose:()=>N(!1)})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(`img`,{className:n.t(J,T),style:W,onError:H,src:G,...e.r(o),...k,alt:D??``}),(0,l.jsx)(u,{open:M,items:P,activeIndex:I,onActiveIndexChange:L,onClose:()=>N(!1)})]})}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return b}});
2
- //# sourceMappingURL=MImage-L_zgfWRY.cjs.map
1
+ const e=require(`./theme-CgS-bND3.cjs`),t=require(`./icons-DWMgDKgt.cjs`),n=require(`./cn-CU5TNITO.cjs`),r=require(`./useInteractionEffect-D1ZdNbKU.cjs`),i=require(`./MPortal-Bi24xTGW.cjs`),a=require(`./MButton-DrkVdRDy.cjs`),o=require(`./MBadge-B4x-Lx7e.cjs`),s=require(`./MSkeleton-5j1h9s95.cjs`);require(`./core-AKWkE8Bx.cjs`);let c=require(`react`),l=require(`react/jsx-runtime`);function u({open:e,items:r,activeIndex:s,onClose:u,onActiveIndexChange:d}){let f=r[s],p=(0,c.useRef)(null),m=s>0,h=s<r.length-1;if((0,c.useEffect)(()=>{if(!e)return;let t=e=>{if(e.key===`Escape`){u();return}e.key===`ArrowLeft`&&m&&d(s-1),e.key===`ArrowRight`&&h&&d(s+1)};return document.addEventListener(`keydown`,t),()=>document.removeEventListener(`keydown`,t)},[s,h,m,d,u,e]),(0,c.useEffect)(()=>{if(!e)return;let t=document.body.style.overflow;return document.body.style.overflow=`hidden`,()=>{document.body.style.overflow=t}},[e]),!e||!f)return null;let g=e=>{let t=e.target;t&&p.current&&!p.current.contains(t)&&u()},_=f.alt||f.caption||`Image preview`;return(0,l.jsx)(i.t,{children:(0,l.jsx)(`div`,{className:n.t(`mineral-backdrop`,`media-lightbox-backdrop`),onMouseDown:g,children:(0,l.jsx)(`div`,{className:`media-lightbox-shell`,role:`dialog`,"aria-modal":`true`,"aria-label":_,children:(0,l.jsx)(`div`,{className:`media-lightbox-stage`,children:(0,l.jsxs)(`div`,{ref:p,className:`media-lightbox-frame`,children:[(0,l.jsxs)(`div`,{className:`media-lightbox-topbar`,children:[(0,l.jsx)(o.t,{color:`dark`,size:`sm`,rounded:!0,className:`media-lightbox-counter`,children:r.length>1?`${s+1} / ${r.length}`:`Preview`}),(0,l.jsx)(a.t,{type:`button`,variant:`ghost`,color:`primary`,size:`lg`,shape:`circle`,iconOnly:!0,className:`media-lightbox-action`,"aria-label":`Close preview`,onClick:u,children:(0,l.jsx)(t.Li,{})})]}),(0,l.jsx)(a.t,{type:`button`,variant:`ghost`,color:`primary`,size:`lg`,shape:`circle`,iconOnly:!0,className:`media-lightbox-nav media-lightbox-nav-prev`,"aria-label":`Previous image`,disabled:r.length<=1||!m,onClick:()=>m&&d(s-1),children:(0,l.jsx)(t.Fi,{})}),(0,l.jsx)(`img`,{className:`media-lightbox-image`,src:f.src,alt:f.alt||``}),(0,l.jsx)(a.t,{type:`button`,variant:`ghost`,color:`primary`,size:`lg`,shape:`circle`,iconOnly:!0,className:`media-lightbox-nav media-lightbox-nav-next`,"aria-label":`Next image`,disabled:r.length<=1||!h,onClick:()=>h&&d(s+1),children:(0,l.jsx)(t.Pi,{})}),f.caption||f.alt?(0,l.jsx)(o.t,{color:`dark`,size:`sm`,rounded:!0,className:`media-lightbox-caption`,children:f.caption||f.alt}):null]})})})})})}var d=new Map;function f(e,t,n){let r=d.get(e);return r||(r=new Map,d.set(e,r)),r.set(t,{id:t,...n}),()=>{let n=d.get(e);n&&(n.delete(t),n.size===0&&d.delete(e))}}function p(e){return Array.from(d.get(e)?.values()??[])}function m(e){return e===`ripple`||e===`zoom-ripple`}function h(e){return e===`zoom`||e===`zoom-ripple`}function g(e){return e===`dim`}function _(e){return e===`zoom`||e===`zoom-dim`}function v(e){return e===`dim`||e===`zoom-dim`}var y={"1:1":`1 / 1`,"4:3":`4 / 3`,"16:9":`16 / 9`,"21:9":`21 / 9`};function b(e){if(e!=null)return typeof e==`number`?`${e}px`:e}function x({src:t,fit:i=`cover`,ratio:a=`auto`,width:o,height:d,hidden:m,rounded:h=!1,bordered:g=!1,shadow:x=!1,preview:S=!1,previewGroup:C,hoverEffect:w=`none`,clickEffect:ee=`none`,fallback:T,skeleton:E=!1,className:D,style:te,alt:O,onError:ne,...k}){let[A,j]=(0,c.useState)(!1),[M,N]=(0,c.useState)(!1),[P,F]=(0,c.useState)([]),[I,L]=(0,c.useState)(0),R=(0,c.useId)(),{effectClassName:re,effectLayer:z,handlePointerDown:B}=r.t({effect:E?`none`:ee}),V=e=>{T&&!A&&(j(!0),e.currentTarget.src=T),ne?.(e)},H=b(o),U=b(d),W=H!=null||U!=null,G=a!==`auto`&&!!y[a],K={};H!=null&&(K.width=H),U!=null&&(K.height=U);let q={...te,...G?{aspectRatio:y[a]}:null,...K},J=A&&T?T:t,Y=(0,c.useMemo)(()=>({src:J||``,alt:O??``,caption:typeof k.title==`string`?k.title:void 0}),[O,J,k.title]);if((0,c.useEffect)(()=>{if(!(!S||!C||!J))return f(C,R,Y)},[S,C,R,Y,J]),E)return(0,l.jsx)(s.t,{variant:`rectangle`,animate:`pulse`,className:n.t(`image-skeleton`,h&&`rounded`,g&&`bordered`,D),style:q,"aria-label":`Loading`,...e.r(m)});let X=()=>{if(!(!S||!J)){if(C){let e=p(C),t=e.findIndex(e=>e.id===R);if(e.length>0&&t>=0){F(e.map(({id:e,...t})=>t)),L(t),N(!0);return}}F([Y]),L(0),N(!0)}},Z=n.t(`image`,i,!z&&h&&`rounded`,!z&&g&&`bordered`,!z&&x&&`shadow`),ie=G||W||!!z||S||w!==`none`,Q=n.t(`image-wrap`,G&&`has-ratio`,W&&`has-size`,h&&`rounded`,g&&`bordered`,x&&`shadow`,S&&`preview`,_(w)&&`effect-zoom`,v(w)&&`effect-dim`,re,D),$=(0,l.jsx)(`img`,{className:Z,onError:V,src:J,...k,alt:O??``});return ie?(0,l.jsxs)(l.Fragment,{children:[S?(0,l.jsxs)(`button`,{type:`button`,className:n.t(Q,`image-button`),"aria-label":`Preview ${O||`image`}`,onClick:X,onPointerDown:z?B:void 0,disabled:!J,...e.r(m),style:q,children:[z,$]}):(0,l.jsxs)(`span`,{className:Q,onPointerDown:z?B:void 0,...e.r(m),style:q,children:[z,$]}),(0,l.jsx)(u,{open:M,items:P,activeIndex:I,onActiveIndexChange:L,onClose:()=>N(!1)})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(`img`,{className:n.t(Z,D),style:q,onError:V,src:J,...e.r(m),...k,alt:O??``}),(0,l.jsx)(u,{open:M,items:P,activeIndex:I,onActiveIndexChange:L,onClose:()=>N(!1)})]})}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return x}});
2
+ //# sourceMappingURL=MImage-YbDKE-1t.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MImage-YbDKE-1t.cjs","names":[],"sources":["../src/components/media/MMediaLightbox/MMediaLightbox.tsx","../src/components/media/mediaPreviewRegistry.ts","../src/components/media/mediaInteraction.ts","../src/components/media/MImage/MImage.tsx"],"sourcesContent":["import {useEffect, useRef} from 'react'\nimport type {MouseEvent} from 'react'\nimport {MButton} from '../../controls'\nimport {MBadge} from '../../feedback'\nimport {MPortal} from '../../primitives'\nimport {MCloseIcon, MChevronLeftIcon, MChevronRightIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MMediaLightbox.css'\n\nexport interface MMediaLightboxItem {\n src: string\n alt?: string\n caption?: string\n}\n\ninterface MMediaLightboxProps {\n open: boolean\n items: MMediaLightboxItem[]\n activeIndex: number\n onClose: () => void\n onActiveIndexChange: (index: number) => void\n}\n\nexport function MMediaLightbox({\n open,\n items,\n activeIndex,\n onClose,\n onActiveIndexChange,\n}: MMediaLightboxProps) {\n const currentItem = items[activeIndex]\n const frameRef = useRef<HTMLDivElement | null>(null)\n const canGoPrev = activeIndex > 0\n const canGoNext = activeIndex < items.length - 1\n\n useEffect(() => {\n if (!open) {\n return\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose()\n return\n }\n\n if (event.key === 'ArrowLeft' && canGoPrev) {\n onActiveIndexChange(activeIndex - 1)\n }\n\n if (event.key === 'ArrowRight' && canGoNext) {\n onActiveIndexChange(activeIndex + 1)\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [activeIndex, canGoNext, canGoPrev, onActiveIndexChange, onClose, open])\n\n useEffect(() => {\n if (!open) {\n return\n }\n\n const previousOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n\n return () => {\n document.body.style.overflow = previousOverflow\n }\n }, [open])\n\n if (!open || !currentItem) {\n return null\n }\n\n const handleBackdropMouseDown = (event: MouseEvent<HTMLDivElement>) => {\n const target = event.target as Node | null\n\n if (target && frameRef.current && !frameRef.current.contains(target)) {\n onClose()\n }\n }\n\n const previewLabel = currentItem.alt || currentItem.caption || 'Image preview'\n\n return (\n <MPortal>\n <div\n className={cn('mineral-backdrop', 'media-lightbox-backdrop')}\n onMouseDown={handleBackdropMouseDown}\n >\n <div className=\"media-lightbox-shell\" role=\"dialog\" aria-modal=\"true\" aria-label={previewLabel}>\n <div className=\"media-lightbox-stage\">\n <div ref={frameRef} className=\"media-lightbox-frame\">\n <div className=\"media-lightbox-topbar\">\n <MBadge color=\"dark\" size=\"sm\" rounded className=\"media-lightbox-counter\">\n {items.length > 1 ? `${activeIndex + 1} / ${items.length}` : 'Preview'}\n </MBadge>\n <MButton\n type=\"button\"\n variant=\"ghost\"\n color=\"primary\"\n size=\"lg\"\n shape=\"circle\"\n iconOnly\n className=\"media-lightbox-action\"\n aria-label=\"Close preview\"\n onClick={onClose}\n >\n <MCloseIcon />\n </MButton>\n </div>\n\n <MButton\n type=\"button\"\n variant=\"ghost\"\n color=\"primary\"\n size=\"lg\"\n shape=\"circle\"\n iconOnly\n className=\"media-lightbox-nav media-lightbox-nav-prev\"\n aria-label=\"Previous image\"\n disabled={items.length <= 1 || !canGoPrev}\n onClick={() => canGoPrev && onActiveIndexChange(activeIndex - 1)}\n >\n <MChevronLeftIcon />\n </MButton>\n\n <img className=\"media-lightbox-image\" src={currentItem.src} alt={currentItem.alt || ''} />\n\n <MButton\n type=\"button\"\n variant=\"ghost\"\n color=\"primary\"\n size=\"lg\"\n shape=\"circle\"\n iconOnly\n className=\"media-lightbox-nav media-lightbox-nav-next\"\n aria-label=\"Next image\"\n disabled={items.length <= 1 || !canGoNext}\n onClick={() => canGoNext && onActiveIndexChange(activeIndex + 1)}\n >\n <MChevronRightIcon />\n </MButton>\n\n {currentItem.caption || currentItem.alt ? (\n <MBadge color=\"dark\" size=\"sm\" rounded className=\"media-lightbox-caption\">\n {currentItem.caption || currentItem.alt}\n </MBadge>\n ) : null}\n </div>\n </div>\n </div>\n </div>\n </MPortal>\n )\n}\n","import type {MMediaLightboxItem} from './MMediaLightbox/MMediaLightbox'\n\ninterface MMediaPreviewRegistryItem extends MMediaLightboxItem {\n id: string\n}\n\nconst previewGroups = new Map<string, Map<string, MMediaPreviewRegistryItem>>()\n\nexport function registerMediaPreviewItem(group: string, id: string, item: MMediaLightboxItem) {\n let groupItems = previewGroups.get(group)\n\n if (!groupItems) {\n groupItems = new Map()\n previewGroups.set(group, groupItems)\n }\n\n groupItems.set(id, {id, ...item})\n\n return () => {\n const currentGroupItems = previewGroups.get(group)\n if (!currentGroupItems) {\n return\n }\n\n currentGroupItems.delete(id)\n\n if (currentGroupItems.size === 0) {\n previewGroups.delete(group)\n }\n }\n}\n\nexport function getMediaPreviewGroupItems(group: string) {\n return Array.from(previewGroups.get(group)?.values() ?? [])\n}\n","import type {MClickEffect} from '../../utils/useInteractionEffect'\n\nexport type MMediaInteractionEffect = MClickEffect | 'zoom' | 'dim' | 'zoom-ripple'\nexport type MMediaHoverEffect = 'none' | 'zoom' | 'dim' | 'zoom-dim'\n\nexport function usesRipple(effect: MMediaInteractionEffect): boolean {\n return effect === 'ripple' || effect === 'zoom-ripple'\n}\n\nexport function usesZoom(effect: MMediaInteractionEffect): boolean {\n return effect === 'zoom' || effect === 'zoom-ripple'\n}\n\nexport function usesDim(effect: MMediaInteractionEffect): boolean {\n return effect === 'dim'\n}\n\nexport function usesHoverZoom(effect: MMediaHoverEffect): boolean {\n return effect === 'zoom' || effect === 'zoom-dim'\n}\n\nexport function usesHoverDim(effect: MMediaHoverEffect): boolean {\n return effect === 'dim' || effect === 'zoom-dim'\n}\n","import {useEffect, useId, useMemo, useState} from 'react'\nimport type * as React from 'react'\nimport type {CSSProperties} from 'react'\nimport type {MImageProps, MImageSize} from './MImage.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {MSkeleton} from '../../feedback'\nimport {MMediaLightbox} from '../MMediaLightbox/MMediaLightbox'\nimport {getMediaPreviewGroupItems, registerMediaPreviewItem} from '../mediaPreviewRegistry'\nimport {usesHoverDim, usesHoverZoom} from '../mediaInteraction'\nimport './MImage.css'\n\nconst RATIO_MAP: Record<string, string> = {\n '1:1': '1 / 1',\n '4:3': '4 / 3',\n '16:9': '16 / 9',\n '21:9': '21 / 9',\n}\n\nfunction toCssSize(value: MImageSize | undefined): string | undefined {\n if (value == null) return undefined\n return typeof value === 'number' ? `${value}px` : value\n}\n\n// Render a styled image with aspect ratio, fit, and optional fallback.\nexport function MImage({\n src,\n fit = 'cover',\n ratio = 'auto',\n width,\n height,\n hidden,\n rounded = false,\n bordered = false,\n shadow = false,\n preview = false,\n previewGroup,\n hoverEffect = 'none',\n clickEffect = 'none',\n fallback,\n skeleton = false,\n className,\n style,\n alt,\n onError,\n ...rest\n}: MImageProps) {\n const [errored, setErrored] = useState(false)\n const [previewOpen, setPreviewOpen] = useState(false)\n const [previewItems, setPreviewItems] = useState<Array<{src: string; alt?: string; caption?: string}>>([])\n const [previewIndex, setPreviewIndex] = useState(0)\n const previewId = useId()\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLElement>({\n effect: skeleton ? 'none' : clickEffect,\n })\n\n const handleError = (e: React.SyntheticEvent<HTMLImageElement>) => {\n if (fallback && !errored) {\n setErrored(true)\n e.currentTarget.src = fallback\n }\n onError?.(e)\n }\n\n const widthValue = toCssSize(width)\n const heightValue = toCssSize(height)\n const hasExplicitSize = widthValue != null || heightValue != null\n const hasFixedRatio = ratio !== 'auto' && !!RATIO_MAP[ratio]\n const sizeStyle: CSSProperties = {}\n if (widthValue != null) sizeStyle.width = widthValue\n if (heightValue != null) sizeStyle.height = heightValue\n const ratioStyle: CSSProperties = {\n ...style,\n ...(hasFixedRatio ? {aspectRatio: RATIO_MAP[ratio]} : null),\n ...sizeStyle,\n }\n const resolvedSrc = errored && fallback ? fallback : src\n const previewItem = useMemo(\n () => ({\n src: resolvedSrc || '',\n alt: alt ?? '',\n caption: typeof rest.title === 'string' ? rest.title : undefined,\n }),\n [alt, resolvedSrc, rest.title]\n )\n\n useEffect(() => {\n if (!preview || !previewGroup || !resolvedSrc) {\n return\n }\n\n return registerMediaPreviewItem(previewGroup, previewId, previewItem)\n }, [preview, previewGroup, previewId, previewItem, resolvedSrc])\n\n // Skeleton placeholder\n if (skeleton) {\n return (\n <MSkeleton\n variant=\"rectangle\"\n animate=\"pulse\"\n className={cn('image-skeleton', rounded && 'rounded', bordered && 'bordered', className)}\n style={ratioStyle}\n aria-label=\"Loading\"\n {...getHiddenProps(hidden)}\n />\n )\n }\n\n const openPreview = () => {\n if (!preview || !resolvedSrc) {\n return\n }\n\n if (previewGroup) {\n const groupItems = getMediaPreviewGroupItems(previewGroup)\n const currentIndex = groupItems.findIndex((item) => item.id === previewId)\n\n if (groupItems.length > 0 && currentIndex >= 0) {\n setPreviewItems(groupItems.map(({id, ...item}) => item))\n setPreviewIndex(currentIndex)\n setPreviewOpen(true)\n return\n }\n }\n\n setPreviewItems([previewItem])\n setPreviewIndex(0)\n setPreviewOpen(true)\n }\n\n const imgClassName = cn(\n 'image',\n fit,\n !effectLayer && rounded && 'rounded',\n !effectLayer && bordered && 'bordered',\n !effectLayer && shadow && 'shadow'\n )\n const usesWrapper =\n hasFixedRatio || hasExplicitSize || Boolean(effectLayer) || preview || hoverEffect !== 'none'\n const wrapperClassName = cn(\n 'image-wrap',\n hasFixedRatio && 'has-ratio',\n hasExplicitSize && 'has-size',\n rounded && 'rounded',\n bordered && 'bordered',\n shadow && 'shadow',\n preview && 'preview',\n usesHoverZoom(hoverEffect) && 'effect-zoom',\n usesHoverDim(hoverEffect) && 'effect-dim',\n effectClassName,\n className\n )\n const imageNode = <img className={imgClassName} onError={handleError} src={resolvedSrc} {...rest} alt={alt ?? ''} />\n\n if (usesWrapper) {\n return (\n <>\n {preview ? (\n <button\n type=\"button\"\n className={cn(wrapperClassName, 'image-button')}\n aria-label={`Preview ${alt || 'image'}`}\n onClick={openPreview}\n onPointerDown={effectLayer ? handlePointerDown : undefined}\n disabled={!resolvedSrc}\n {...getHiddenProps(hidden)}\n style={ratioStyle}\n >\n {effectLayer}\n {imageNode}\n </button>\n ) : (\n <span\n className={wrapperClassName}\n onPointerDown={effectLayer ? handlePointerDown : undefined}\n {...getHiddenProps(hidden)}\n style={ratioStyle}\n >\n {effectLayer}\n {imageNode}\n </span>\n )}\n\n <MMediaLightbox\n open={previewOpen}\n items={previewItems}\n activeIndex={previewIndex}\n onActiveIndexChange={setPreviewIndex}\n onClose={() => setPreviewOpen(false)}\n />\n </>\n )\n }\n\n return (\n <>\n <img\n className={cn(imgClassName, className)}\n style={ratioStyle}\n onError={handleError}\n src={resolvedSrc}\n {...getHiddenProps(hidden)}\n {...rest}\n alt={alt ?? ''}\n />\n\n <MMediaLightbox\n open={previewOpen}\n items={previewItems}\n activeIndex={previewIndex}\n onActiveIndexChange={setPreviewIndex}\n onClose={() => setPreviewOpen(false)}\n />\n </>\n )\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
1
  import { MImageProps } from './MImage.types';
2
- export declare function MImage({ src, fit, ratio, hidden, rounded, bordered, shadow, preview, previewGroup, hoverEffect, clickEffect, fallback, skeleton, className, style, alt, onError, ...rest }: MImageProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function MImage({ src, fit, ratio, width, height, hidden, rounded, bordered, shadow, preview, previewGroup, hoverEffect, clickEffect, fallback, skeleton, className, style, alt, onError, ...rest }: MImageProps): import("react/jsx-runtime").JSX.Element;
@@ -4,9 +4,14 @@ import { MClickEffect } from '../../../utils/useInteractionEffect';
4
4
  import { MMediaHoverEffect } from '../mediaInteraction';
5
5
  export type MImageFit = 'cover' | 'contain' | 'fill' | 'none';
6
6
  export type MImageRatio = '1:1' | '4:3' | '16:9' | '21:9' | 'auto';
7
- export interface MImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'hidden'>, MHiddenProps {
7
+ export type MImageSize = number | string;
8
+ export interface MImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'hidden' | 'width' | 'height'>, MHiddenProps {
8
9
  fit?: MImageFit;
9
10
  ratio?: MImageRatio;
11
+ /** Explicit width. Numbers are treated as pixels; strings pass through as CSS values (`'auto'`, `'100%'`, `'12rem'`). */
12
+ width?: MImageSize;
13
+ /** Explicit height. Numbers are treated as pixels; strings pass through as CSS values (`'auto'`, `'100%'`, `'12rem'`). */
14
+ height?: MImageSize;
10
15
  rounded?: boolean;
11
16
  bordered?: boolean;
12
17
  shadow?: boolean;
@@ -15,7 +15,7 @@ import { t as me } from "./MModal-BDTAgnrm.js";
15
15
  import { i as U, r as he } from "./MDropdownMenu-D79Cm5aS.js";
16
16
  import { t as ge } from "./locale-JX_gX03k.js";
17
17
  import { t as W } from "./MTimeAgo-C4p80NvI.js";
18
- import { t as _e } from "./MImage-gwFphZk2.js";
18
+ import { t as _e } from "./MImage-BKX-xBm3.js";
19
19
  import { t as ve } from "./MAvatar-BHASnoyu.js";
20
20
  import { t as ye } from "./MInputSearch-Dh4C3Tz5.js";
21
21
  import { a as be, c as xe, d as Se, f as Ce, i as we, l as Te, n as Ee, o as De, r as Oe, s as G, u as ke } from "./MSparkline-voNWOLNz.js";
@@ -2524,4 +2524,4 @@ function gn(e) {
2524
2524
  //#endregion
2525
2525
  export { Xe as _, Yt as a, We as b, Kt as c, wt as d, lt as f, Ze as g, Qe as h, pn as i, Jt as l, $e as m, hn as n, Wt as o, ct as p, mn as r, Gt as s, gn as t, qt as u, qe as v, Ue as x, Ke as y };
2526
2526
 
2527
- //# sourceMappingURL=data-CMSIr_Ac.js.map
2527
+ //# sourceMappingURL=data-BiwK5rfx.js.map