@fangxinyan/lumina 0.6.17 → 0.6.18

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/index.cjs CHANGED
@@ -31,7 +31,7 @@ var chunkP2OQTJZP_cjs = require('./chunk-P2OQTJZP.cjs');
31
31
  var chunkULUD3FED_cjs = require('./chunk-ULUD3FED.cjs');
32
32
  var chunkES7AWMNH_cjs = require('./chunk-ES7AWMNH.cjs');
33
33
  var chunkFDUQPAQE_cjs = require('./chunk-FDUQPAQE.cjs');
34
- var chunkRMFSX7DO_cjs = require('./chunk-RMFSX7DO.cjs');
34
+ var chunkHSAJUEO7_cjs = require('./chunk-HSAJUEO7.cjs');
35
35
  var chunk262ED6WQ_cjs = require('./chunk-262ED6WQ.cjs');
36
36
  var chunkBW76ENTW_cjs = require('./chunk-BW76ENTW.cjs');
37
37
  var chunkRSSOX4RQ_cjs = require('./chunk-RSSOX4RQ.cjs');
@@ -55,7 +55,7 @@ var chunk4KDABJSY_cjs = require('./chunk-4KDABJSY.cjs');
55
55
  var chunkQMX67CVT_cjs = require('./chunk-QMX67CVT.cjs');
56
56
 
57
57
  // src/index.ts
58
- var VERSION = "0.6.17";
58
+ var VERSION = "0.6.18";
59
59
 
60
60
  Object.defineProperty(exports, "Timeline", {
61
61
  enumerable: true,
@@ -271,19 +271,19 @@ Object.defineProperty(exports, "useForm", {
271
271
  });
272
272
  Object.defineProperty(exports, "Image", {
273
273
  enumerable: true,
274
- get: function () { return chunkRMFSX7DO_cjs.Image; }
274
+ get: function () { return chunkHSAJUEO7_cjs.Image; }
275
275
  });
276
276
  Object.defineProperty(exports, "ImageGrid", {
277
277
  enumerable: true,
278
- get: function () { return chunkRMFSX7DO_cjs.ImageGrid; }
278
+ get: function () { return chunkHSAJUEO7_cjs.ImageGrid; }
279
279
  });
280
280
  Object.defineProperty(exports, "LayeredImage", {
281
281
  enumerable: true,
282
- get: function () { return chunkRMFSX7DO_cjs.LayeredImage; }
282
+ get: function () { return chunkHSAJUEO7_cjs.LayeredImage; }
283
283
  });
284
284
  Object.defineProperty(exports, "SpriteImage", {
285
285
  enumerable: true,
286
- get: function () { return chunkRMFSX7DO_cjs.SpriteImage; }
286
+ get: function () { return chunkHSAJUEO7_cjs.SpriteImage; }
287
287
  });
288
288
  Object.defineProperty(exports, "Card", {
289
289
  enumerable: true,
package/dist/index.d.cts CHANGED
@@ -40,7 +40,7 @@ export { ErrorField, Form, FormInstance, FormItem, FormItemProps, FormLayout, Fo
40
40
  export { Empty, EmptyProps } from './Empty.cjs';
41
41
  export { Spin, SpinProps, SpinSize } from './Spin.cjs';
42
42
  export { Skeleton, SkeletonAvatarConfig, SkeletonParagraphConfig, SkeletonProps, SkeletonTitleConfig } from './Skeleton.cjs';
43
- export { Image, ImageGrid, ImageGridItem, ImageGridProps, ImageProps, ImageVariant, LayeredImage, LayeredImageInset, LayeredImageLayer, LayeredImageProps, SpriteImage, SpriteImageProps, SpriteRect } from './Image.cjs';
43
+ export { Image, ImageGrid, ImageGridItem, ImageGridProps, ImagePreviewMode, ImagePreviewToolbarRenderProps, ImageProps, ImageVariant, LayeredImage, LayeredImageInset, LayeredImageLayer, LayeredImageProps, SpriteImage, SpriteImageProps, SpriteRect } from './Image.cjs';
44
44
  export { Cascader, CascaderOption, CascaderProps, CascaderShowSearchConfig } from './Cascader.cjs';
45
45
  export { BaseTypographyProps, CopyableConfig, EditableConfig, EllipsisConfig, Link, LinkProps, Paragraph, ParagraphProps, Text, TextProps, Title, TitleLevel, TitleProps, Typography, TypographyProps, TypographyType } from './Typography.cjs';
46
46
  export { ColorPicker, ColorPickerProps } from './ColorPicker.cjs';
@@ -52,6 +52,6 @@ import 'react/jsx-runtime';
52
52
  import 'react';
53
53
 
54
54
  /** Package version — bumped by release scripts. */
55
- declare const VERSION = "0.6.17";
55
+ declare const VERSION = "0.6.18";
56
56
 
57
57
  export { VERSION };
package/dist/index.d.ts CHANGED
@@ -40,7 +40,7 @@ export { ErrorField, Form, FormInstance, FormItem, FormItemProps, FormLayout, Fo
40
40
  export { Empty, EmptyProps } from './Empty.js';
41
41
  export { Spin, SpinProps, SpinSize } from './Spin.js';
42
42
  export { Skeleton, SkeletonAvatarConfig, SkeletonParagraphConfig, SkeletonProps, SkeletonTitleConfig } from './Skeleton.js';
43
- export { Image, ImageGrid, ImageGridItem, ImageGridProps, ImageProps, ImageVariant, LayeredImage, LayeredImageInset, LayeredImageLayer, LayeredImageProps, SpriteImage, SpriteImageProps, SpriteRect } from './Image.js';
43
+ export { Image, ImageGrid, ImageGridItem, ImageGridProps, ImagePreviewMode, ImagePreviewToolbarRenderProps, ImageProps, ImageVariant, LayeredImage, LayeredImageInset, LayeredImageLayer, LayeredImageProps, SpriteImage, SpriteImageProps, SpriteRect } from './Image.js';
44
44
  export { Cascader, CascaderOption, CascaderProps, CascaderShowSearchConfig } from './Cascader.js';
45
45
  export { BaseTypographyProps, CopyableConfig, EditableConfig, EllipsisConfig, Link, LinkProps, Paragraph, ParagraphProps, Text, TextProps, Title, TitleLevel, TitleProps, Typography, TypographyProps, TypographyType } from './Typography.js';
46
46
  export { ColorPicker, ColorPickerProps } from './ColorPicker.js';
@@ -52,6 +52,6 @@ import 'react/jsx-runtime';
52
52
  import 'react';
53
53
 
54
54
  /** Package version — bumped by release scripts. */
55
- declare const VERSION = "0.6.17";
55
+ declare const VERSION = "0.6.18";
56
56
 
57
57
  export { VERSION };
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ export { Divider } from './chunk-HBO7ZDEQ.js';
29
29
  export { Drawer } from './chunk-WMGMIE2D.js';
30
30
  export { Empty } from './chunk-6MEOLYNQ.js';
31
31
  export { Form, FormItem, useForm } from './chunk-ZR4IMROK.js';
32
- export { Image, ImageGrid, LayeredImage, SpriteImage } from './chunk-EQ4FPOQQ.js';
32
+ export { Image, ImageGrid, LayeredImage, SpriteImage } from './chunk-5VOUUQF5.js';
33
33
  export { Card } from './chunk-ARUPS7JH.js';
34
34
  export { Spin } from './chunk-FYSXJXNW.js';
35
35
  export { Cascader } from './chunk-4HJBF4GY.js';
@@ -53,6 +53,6 @@ export { Calendar } from './chunk-I7TOBKJO.js';
53
53
  export { AimOutlined, AppstoreOutlined, BarChartOutlined, BlockOutlined, BorderOutlined, CameraOutlined, CaretDownOutlined, CaretUpOutlined, CheckCircleFilled, CheckCircleOutlined, CheckOutlined, ClockCircleFilled, CloseCircleOutlined, CloseOutlined, CopyOutlined, DashboardOutlined, DeleteOutlined, DownOutlined, EnvironmentOutlined, ExclamationCircleOutlined, FolderOpenOutlined, ICON_NAMES, Icon, LeftOutlined, LoadingOutlined, MinusCircleOutlined, MinusOutlined, NAMED_ICON_MAP, PictureOutlined, PlusOutlined, QqOutlined, ReloadOutlined, RightOutlined, RobotOutlined, SearchOutlined, SettingOutlined, StarFilled, StarOutlined, SwapOutlined, SwapRightOutlined, SyncOutlined, ThunderboltOutlined, TranslationOutlined, UnorderedListOutlined, UserOutlined, isIconName, renderIconSlot, resolveIconName } from './chunk-FDZG27IG.js';
54
54
 
55
55
  // src/index.ts
56
- var VERSION = "0.6.17";
56
+ var VERSION = "0.6.18";
57
57
 
58
58
  export { VERSION };
package/dist/styles.css CHANGED
@@ -3191,14 +3191,92 @@ input, textarea, select { font-family: inherit; color: inherit; }
3191
3191
  background: var(--image-preview-mask-bg, var(--mask-bg));
3192
3192
  backdrop-filter: blur(16px);
3193
3193
  display: grid; place-items: center;
3194
+ overflow: hidden;
3195
+ padding: min(8vh, 72px) var(--gap-8) var(--gap-8);
3194
3196
  z-index: 500;
3195
3197
  animation: fadeIn var(--dur) var(--ease);
3196
3198
  }
3197
- .image-preview-overlay img {
3199
+ .image-preview-overlay:focus {
3200
+ outline: none;
3201
+ }
3202
+ .image-preview-toolbar {
3203
+ --image-preview-toolbar-ink: color-mix(in oklch, var(--accent) 42%, var(--fg-muted));
3204
+ --image-preview-toolbar-ink-hover: color-mix(in oklch, var(--accent) 48%, var(--fg));
3205
+ position: absolute;
3206
+ top: var(--gap-5);
3207
+ left: 50%;
3208
+ z-index: 1;
3209
+ display: flex;
3210
+ align-items: center;
3211
+ gap: var(--gap-2);
3212
+ max-width: min(calc(100vw - 32px), 720px);
3213
+ padding: 6px;
3214
+ overflow-x: auto;
3215
+ color: var(--image-preview-toolbar-ink);
3216
+ border: 1px solid color-mix(in oklch, var(--accent) 14%, var(--border));
3217
+ border-radius: var(--r-pill);
3218
+ background: color-mix(in oklch, var(--bg-raised) 92%, var(--accent-soft));
3219
+ box-shadow:
3220
+ var(--neu-float),
3221
+ 0 0 0 1px color-mix(in oklch, var(--accent-glow) 22%, transparent);
3222
+ backdrop-filter: blur(18px) saturate(1.2);
3223
+ transform: translateX(-50%);
3224
+ }
3225
+ .image-preview-toolbar .btn {
3226
+ flex: 0 0 auto;
3227
+ }
3228
+ .image-preview-toolbar .btn.ghost {
3229
+ color: var(--image-preview-toolbar-ink);
3230
+ }
3231
+ .image-preview-toolbar .btn.ghost:hover {
3232
+ color: var(--image-preview-toolbar-ink-hover);
3233
+ background: color-mix(in oklch, var(--accent-soft) 36%, var(--bg));
3234
+ box-shadow: var(--neu-shadow-subtle);
3235
+ }
3236
+ .image-preview-toolbar .btn.ghost:active,
3237
+ .image-preview-toolbar .btn.ghost.pressed {
3238
+ color: var(--image-preview-toolbar-ink-hover);
3239
+ background: color-mix(in oklch, var(--accent-soft) 48%, var(--bg));
3240
+ box-shadow: var(--neu-shadow-inset-strong);
3241
+ }
3242
+ .image-preview-scale {
3243
+ min-width: 48px;
3244
+ color: var(--image-preview-toolbar-ink);
3245
+ font-family: var(--font-mono);
3246
+ font-size: var(--fs-sm);
3247
+ font-weight: 500;
3248
+ line-height: 1;
3249
+ text-align: center;
3250
+ }
3251
+ .image-preview-ratio {
3252
+ min-width: 46px;
3253
+ padding-inline: 10px;
3254
+ font-family: var(--font-mono);
3255
+ }
3256
+ .image-preview-toolbar-slot {
3257
+ display: inline-flex;
3258
+ flex: 0 0 auto;
3259
+ align-items: center;
3260
+ gap: var(--gap-2);
3261
+ }
3262
+ .image-preview-img {
3198
3263
  max-width: 80vw;
3199
3264
  max-height: 80vh;
3200
3265
  border-radius: var(--r-lg);
3201
3266
  box-shadow: var(--neu-shadow-float);
3267
+ transform-origin: center;
3268
+ transition: transform var(--dur-fast) var(--ease);
3269
+ user-select: none;
3270
+ will-change: transform;
3271
+ }
3272
+ @media (max-width: 640px) {
3273
+ .image-preview-overlay {
3274
+ padding: 76px var(--gap-4) var(--gap-4);
3275
+ }
3276
+ .image-preview-toolbar {
3277
+ top: var(--gap-4);
3278
+ border-radius: var(--r-lg);
3279
+ }
3202
3280
  }
3203
3281
  /* ============ SpriteImage / LayeredImage ============ */
3204
3282
  .n-sprite-image,
@@ -28,6 +28,25 @@ import { Image, ImageGrid, SpriteImage, LayeredImage } from "@fangxinyan/lumina"
28
28
  />
29
29
  ```
30
30
 
31
+ ### 精细预览
32
+
33
+ 预览层内置放大、缩小、适配窗口、1:1、滚轮缩放和拖拽平移;previewMaxWidth / previewMaxHeight 控制适配态尺寸,renderPreviewToolbar 可追加业务按钮。
34
+
35
+ ```tsx
36
+ <Image
37
+ src={url}
38
+ width={260}
39
+ height={180}
40
+ previewMaxWidth="90vw"
41
+ previewMaxHeight="76vh"
42
+ renderPreviewToolbar={({ fitToWindow, scale }) => (
43
+ <Button size="sm" variant="ghost" icon="star" onClick={fitToWindow}>
44
+ 标记 {Math.round(scale * 100)}%
45
+ </Button>
46
+ )}
47
+ />
48
+ ```
49
+
31
50
  ### 图标 / 原始资源
32
51
 
33
52
  variant="icon" 会默认去掉外层 padding,适合 1:1 装备、物品、头像缩略图;variant="raw" 保留原始图片比例。
@@ -82,6 +101,8 @@ LayeredImage 将多张图片叠在同一个盒子里,适合头像 + 头像框、
82
101
  | preview | `boolean` | `true` | 支持点击全屏预览 |
83
102
  | previewClassName | `string` | — | 预览蒙层 className |
84
103
  | previewStyle | `CSSProperties` | — | 预览蒙层内联样式 |
104
+ | previewMaxWidth / previewMaxHeight | `number | string` | `"80vw" / "80vh"` | 预览适配态的最大尺寸 |
105
+ | renderPreviewToolbar | `(controls) => ReactNode` | — | 在预览工具栏追加自定义按钮 |
85
106
  | hover | `boolean` | `true` | 悬浮放大 |
86
107
  | placeholder | `ReactNode` | — | 占位/错误时内容 |
87
108
  | imgProps | `ImgHTMLAttributes` | — | 透传到底层 img 的属性 |
package/docs/llms.md CHANGED
@@ -3,7 +3,7 @@
3
3
  > 拟态风格的 React 18 组件库,目标是 Electron 桌面应用。**写给 AI 编程助手**的按需文档 —— 每个组件单独一个 `.md`,避免一次性读取全部。示例源自 playground 的 demo,可直接复制运行。
4
4
 
5
5
  - **包名**: `@fangxinyan/lumina`
6
- - **版本**: `0.6.17`
6
+ - **版本**: `0.6.18`
7
7
  - **React 最低版本**: 18
8
8
  - **环境**: 带打包器的 React 工程(Vite / Next.js / Webpack / Remix / Electron + Vite 等)
9
9
  - **零运行时依赖**: 只依赖 `react` / `react-dom` (peer deps)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fangxinyan/lumina",
3
- "version": "0.6.17",
3
+ "version": "0.6.18",
4
4
  "description": "Lumina — Neumorphic component library for Electron & React apps",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -1,253 +0,0 @@
1
- import { Icon } from './chunk-FDZG27IG.js';
2
- import './tokens-RYJ3DFTU.css';
3
- import './shared-NJHRNLRH.css';
4
- import './Image-TDCXJISG.css';
5
- import * as React from 'react';
6
- import ReactDOM from 'react-dom';
7
- import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
8
-
9
- var Image = React.forwardRef(({
10
- src,
11
- alt,
12
- width = 200,
13
- height,
14
- variant = "framed",
15
- frame,
16
- padding,
17
- objectFit,
18
- objectPosition,
19
- preview,
20
- previewClassName = "",
21
- previewStyle,
22
- hover = true,
23
- placeholder,
24
- imgProps,
25
- className = "",
26
- style,
27
- ...rest
28
- }, ref) => {
29
- const [loaded, setLoaded] = React.useState(false);
30
- const [err, setErr] = React.useState(false);
31
- const [open, setOpen] = React.useState(false);
32
- const visualFrame = frame ?? variant === "framed";
33
- const resolvedHeight = height ?? (variant === "icon" ? width : 140);
34
- const resolvedPadding = padding ?? (visualFrame ? void 0 : 0);
35
- const resolvedObjectFit = objectFit ?? (variant === "icon" ? "contain" : "cover");
36
- const canPreview = (preview ?? variant === "framed") && loaded && !err;
37
- const {
38
- className: imgClassName = "",
39
- style: imgStyle,
40
- onLoad,
41
- onError,
42
- ...imageRest
43
- } = imgProps ?? {};
44
- React.useEffect(() => {
45
- setLoaded(false);
46
- setErr(false);
47
- setOpen(false);
48
- }, [src]);
49
- return /* @__PURE__ */ jsxs(Fragment, { children: [
50
- /* @__PURE__ */ jsx(
51
- "div",
52
- {
53
- ref,
54
- className: `n-image ${variant} ${visualFrame ? "framed" : "unframed"} ${hover ? "hover" : ""} ${canPreview ? "clickable" : ""} ${className}`,
55
- style: { width, ...resolvedPadding !== void 0 ? { padding: resolvedPadding } : {}, ...style },
56
- onClick: () => canPreview && setOpen(true),
57
- ...rest,
58
- children: /* @__PURE__ */ jsxs("div", { className: "n-image-frame", style: { width: "100%", height: resolvedHeight }, children: [
59
- !err && src && /* @__PURE__ */ jsx(
60
- "img",
61
- {
62
- ...imageRest,
63
- src,
64
- alt,
65
- className: imgClassName,
66
- style: { objectFit: resolvedObjectFit, objectPosition, ...imgStyle },
67
- onLoad: (event) => {
68
- setLoaded(true);
69
- onLoad?.(event);
70
- },
71
- onError: (event) => {
72
- setErr(true);
73
- onError?.(event);
74
- }
75
- }
76
- ),
77
- /* @__PURE__ */ jsx("div", { className: `n-image-placeholder ${loaded && !err ? "loaded" : ""}`, children: placeholder ?? /* @__PURE__ */ jsx(Icon, { name: "image", size: 28 }) }),
78
- canPreview && /* @__PURE__ */ jsxs(Fragment, { children: [
79
- /* @__PURE__ */ jsxs("div", { className: "image-hint", children: [
80
- /* @__PURE__ */ jsx(Icon, { name: "eye", size: 14 }),
81
- /* @__PURE__ */ jsx("span", { children: "\u70B9\u51FB\u67E5\u770B" })
82
- ] }),
83
- /* @__PURE__ */ jsxs("div", { className: "image-actions", onClick: (e) => e.stopPropagation(), children: [
84
- /* @__PURE__ */ jsx(
85
- "button",
86
- {
87
- type: "button",
88
- className: "ia-btn",
89
- onClick: () => setOpen(true),
90
- "aria-label": "\u9884\u89C8",
91
- children: /* @__PURE__ */ jsx(Icon, { name: "eye", size: 13 })
92
- }
93
- ),
94
- src && /* @__PURE__ */ jsx("a", { className: "ia-btn", href: src, download: true, "aria-label": "\u4E0B\u8F7D", children: /* @__PURE__ */ jsx(Icon, { name: "download", size: 13 }) })
95
- ] })
96
- ] })
97
- ] })
98
- }
99
- ),
100
- open && typeof document !== "undefined" && ReactDOM.createPortal(
101
- /* @__PURE__ */ jsx(
102
- "div",
103
- {
104
- className: ["image-preview-overlay", previewClassName].filter(Boolean).join(" "),
105
- style: previewStyle,
106
- onClick: () => setOpen(false),
107
- children: /* @__PURE__ */ jsx("img", { src, alt, onClick: (e) => e.stopPropagation() })
108
- }
109
- ),
110
- document.body
111
- )
112
- ] });
113
- });
114
- Image.displayName = "Image";
115
- var ImageGrid = React.forwardRef(({
116
- images,
117
- columns,
118
- itemHeight = 130,
119
- minItemWidth = 160,
120
- gap = 14,
121
- imageProps,
122
- className = "",
123
- style,
124
- ...rest
125
- }, ref) => /* @__PURE__ */ jsx(
126
- "div",
127
- {
128
- ref,
129
- className,
130
- style: {
131
- display: "grid",
132
- gap,
133
- gridTemplateColumns: columns ? `repeat(${columns}, 1fr)` : `repeat(auto-fill, minmax(${typeof minItemWidth === "number" ? `${minItemWidth}px` : minItemWidth}, 1fr))`,
134
- ...style
135
- },
136
- ...rest,
137
- children: images.map((img, i) => /* @__PURE__ */ jsx(
138
- Image,
139
- {
140
- ...imageProps,
141
- ...img,
142
- src: img.src,
143
- alt: img.alt,
144
- width: img.width ?? "100%",
145
- height: img.height ?? itemHeight
146
- },
147
- i
148
- ))
149
- }
150
- ));
151
- ImageGrid.displayName = "ImageGrid";
152
- var SpriteImage = React.forwardRef(({
153
- src,
154
- sprite,
155
- alt,
156
- width,
157
- height,
158
- scale = 1,
159
- backgroundSize,
160
- variant = "icon",
161
- frame,
162
- padding,
163
- className = "",
164
- style,
165
- ...rest
166
- }, ref) => {
167
- const visualFrame = frame ?? variant === "framed";
168
- const resolvedWidth = width ?? sprite.width * scale;
169
- const resolvedHeight = height ?? sprite.height * scale;
170
- const resolvedPadding = padding ?? (visualFrame ? void 0 : 0);
171
- return /* @__PURE__ */ jsx(
172
- "div",
173
- {
174
- ref,
175
- className: `n-sprite-image ${variant} ${visualFrame ? "framed" : "unframed"} ${className}`,
176
- role: alt ? "img" : void 0,
177
- "aria-label": alt || void 0,
178
- "aria-hidden": alt === "" ? true : void 0,
179
- style: { width: resolvedWidth, ...resolvedPadding !== void 0 ? { padding: resolvedPadding } : {}, ...style },
180
- ...rest,
181
- children: /* @__PURE__ */ jsx("div", { className: "n-sprite-image-frame", style: { height: resolvedHeight }, children: /* @__PURE__ */ jsx(
182
- "span",
183
- {
184
- className: "n-sprite-image-sprite",
185
- style: {
186
- width: sprite.width,
187
- height: sprite.height,
188
- backgroundImage: `url(${JSON.stringify(src)})`,
189
- backgroundPosition: `${-sprite.x}px ${-sprite.y}px`,
190
- backgroundSize,
191
- transform: scale !== 1 ? `scale(${scale})` : void 0
192
- }
193
- }
194
- ) })
195
- }
196
- );
197
- });
198
- SpriteImage.displayName = "SpriteImage";
199
- var insetStyle = (inset) => {
200
- if (inset == null) return { inset: 0 };
201
- if (typeof inset === "number" || typeof inset === "string") return { inset };
202
- return inset;
203
- };
204
- var LayeredImage = React.forwardRef(({
205
- layers,
206
- width = 64,
207
- height = 64,
208
- variant = "icon",
209
- frame,
210
- padding,
211
- className = "",
212
- style,
213
- ...rest
214
- }, ref) => {
215
- const visualFrame = frame ?? variant === "framed";
216
- const resolvedPadding = padding ?? (visualFrame ? void 0 : 0);
217
- return /* @__PURE__ */ jsx(
218
- "div",
219
- {
220
- ref,
221
- className: `n-layered-image ${variant} ${visualFrame ? "framed" : "unframed"} ${className}`,
222
- style: { width, ...resolvedPadding !== void 0 ? { padding: resolvedPadding } : {}, ...style },
223
- ...rest,
224
- children: /* @__PURE__ */ jsx("div", { className: "n-layered-image-frame", style: { height }, children: layers.map(({ src: layerSrc, alt: layerAlt = "", fit = "contain", inset, zIndex, className: layerClassName = "", style: layerStyle, ...layerRest }, index) => /* @__PURE__ */ jsx(
225
- "span",
226
- {
227
- className: "n-layered-image-layer",
228
- style: {
229
- zIndex,
230
- ...insetStyle(inset)
231
- },
232
- children: /* @__PURE__ */ jsx(
233
- "img",
234
- {
235
- ...layerRest,
236
- src: layerSrc,
237
- alt: layerAlt,
238
- className: layerClassName,
239
- style: {
240
- objectFit: fit,
241
- ...layerStyle
242
- }
243
- }
244
- )
245
- },
246
- `${layerSrc}-${index}`
247
- )) })
248
- }
249
- );
250
- });
251
- LayeredImage.displayName = "LayeredImage";
252
-
253
- export { Image, ImageGrid, LayeredImage, SpriteImage };