@haklex/rich-ext-gallery 0.4.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,407 +1,6 @@
1
- import { A as galleryImageList, C as galleryHeaderClose, D as galleryImageDragHandle, E as galleryImageDeleteBtn, M as galleryImageThumbPlaceholder, O as galleryImageFields, S as galleryHeaderActions, T as galleryImageCard, _ as galleryEmptyState, a as GalleryRenderer, b as galleryFooterBtnSave, c as galleryDialogBody, d as galleryDialogHeader, f as galleryDialogPopup, g as galleryEditOverlay, h as galleryEditLabel, i as _defineProperty, j as galleryImageThumb, k as galleryImageInput, l as galleryDialogEmpty, m as galleryEditContainer, n as $isGalleryNode, o as GalleryRenderer_default, p as galleryDialogTitle, r as GalleryNode, s as galleryAddBtn, t as $createGalleryNode, u as galleryDialogFooter, v as galleryFooterActions, w as galleryImageActions, x as galleryFooterInfo, y as galleryFooterBtnCancel } from "./GalleryNode-DBVAUkDV.js";
2
- import { createRendererDecoration } from "@haklex/rich-editor/renderers";
3
- import { $getNodeByKey, $insertNodes } from "lexical";
4
- import { GripVertical, ImageIcon, Images, Pencil, Plus, Trash2, X } from "lucide-react";
5
- import { createElement, useCallback, useRef, useState } from "react";
6
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
- import { DndContext, DragOverlay, PointerSensor, closestCenter, useSensor, useSensors } from "@dnd-kit/core";
8
- import { SortableContext, arrayMove, useSortable, verticalListSortingStrategy } from "@dnd-kit/sortable";
9
- import { CSS } from "@dnd-kit/utilities";
10
- import { useColorScheme } from "@haklex/rich-editor";
11
- import { SegmentedControl, presentDialog } from "@haklex/rich-editor-ui";
12
- import { usePortalTheme, vars } from "@haklex/rich-style-token";
13
- import { createPortal } from "react-dom";
14
- //#region src/GalleryEditNode.ts
15
- var GalleryEditNode = class GalleryEditNode extends GalleryNode {
16
- static clone(node) {
17
- return new GalleryEditNode({
18
- images: node.__images.map((img) => ({ ...img })),
19
- layout: node.__layout
20
- }, node.__key);
21
- }
22
- constructor(payload, key) {
23
- super(payload, key);
24
- }
25
- static importJSON(serializedNode) {
26
- return new GalleryEditNode({
27
- images: serializedNode.images,
28
- layout: serializedNode.layout
29
- });
30
- }
31
- decorate(editor, _config) {
32
- const nodeKey = this.__key;
33
- return createRendererDecoration("Gallery", GalleryRenderer, {
34
- images: this.__images,
35
- layout: this.__layout,
36
- onImagesChange: (images) => {
37
- editor.update(() => {
38
- const node = $getNodeByKey(nodeKey);
39
- if (node) node.setImages(images);
40
- });
41
- },
42
- onLayoutChange: (layout) => {
43
- editor.update(() => {
44
- const node = $getNodeByKey(nodeKey);
45
- if (node) node.setLayout(layout);
46
- });
47
- }
48
- });
49
- }
50
- };
51
- _defineProperty(GalleryEditNode, "commandItems", [{
52
- title: "Gallery",
53
- icon: createElement(Images, { size: 20 }),
54
- description: "Image gallery grid",
55
- keywords: [
56
- "gallery",
57
- "images",
58
- "grid"
59
- ],
60
- section: "MEDIA",
61
- placement: ["slash", "toolbar"],
62
- group: "insert",
63
- onSelect: (editor) => {
64
- editor.update(() => {
65
- $insertNodes([$createGalleryEditNode({ images: [] })]);
66
- });
67
- }
68
- }]);
69
- function $createGalleryEditNode(payload) {
70
- return new GalleryEditNode(payload);
71
- }
72
- function $isGalleryEditNode(node) {
73
- return node instanceof GalleryEditNode;
74
- }
75
- //#endregion
76
- //#region src/GalleryEditRenderer.tsx
77
- var layoutItems = [
78
- {
79
- value: "grid",
80
- label: "Grid"
81
- },
82
- {
83
- value: "masonry",
84
- label: "Masonry"
85
- },
86
- {
87
- value: "carousel",
88
- label: "Carousel"
89
- }
90
- ];
91
- var nextId = 0;
92
- function genId() {
93
- return `img-${++nextId}`;
94
- }
95
- var SortableImageCard = ({ id, image, index, isLast, lastInputRef, onUpdate, onRemove }) => {
96
- const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id });
97
- return /* @__PURE__ */ jsxs("div", {
98
- className: galleryImageCard,
99
- ref: setNodeRef,
100
- style: {
101
- transform: CSS.Transform.toString(transform),
102
- transition: isDragging ? void 0 : transition,
103
- opacity: isDragging ? .4 : 1
104
- },
105
- children: [
106
- /* @__PURE__ */ jsx("div", {
107
- className: galleryImageDragHandle,
108
- ...attributes,
109
- ...listeners,
110
- children: /* @__PURE__ */ jsx(GripVertical, { size: 14 })
111
- }),
112
- /* @__PURE__ */ jsx("div", {
113
- className: galleryImageThumb,
114
- children: image.src ? /* @__PURE__ */ jsx("img", {
115
- alt: image.alt || "",
116
- src: image.src
117
- }) : /* @__PURE__ */ jsx("span", {
118
- className: galleryImageThumbPlaceholder,
119
- children: /* @__PURE__ */ jsx(ImageIcon, { size: 20 })
120
- })
121
- }),
122
- /* @__PURE__ */ jsxs("div", {
123
- className: galleryImageFields,
124
- children: [/* @__PURE__ */ jsx("input", {
125
- className: galleryImageInput,
126
- placeholder: "Image URL",
127
- ref: isLast ? lastInputRef : void 0,
128
- type: "text",
129
- value: image.src,
130
- onChange: (e) => onUpdate(index, "src", e.target.value)
131
- }), /* @__PURE__ */ jsx("input", {
132
- className: galleryImageInput,
133
- placeholder: "Alt text (optional)",
134
- type: "text",
135
- value: image.alt || "",
136
- onChange: (e) => onUpdate(index, "alt", e.target.value)
137
- })]
138
- }),
139
- /* @__PURE__ */ jsx("div", {
140
- className: galleryImageActions,
141
- children: /* @__PURE__ */ jsx("button", {
142
- className: galleryImageDeleteBtn,
143
- title: "Remove",
144
- type: "button",
145
- onClick: () => onRemove(index),
146
- children: /* @__PURE__ */ jsx(Trash2, { size: 14 })
147
- })
148
- })
149
- ]
150
- });
151
- };
152
- var DragOverlayCard = ({ image }) => /* @__PURE__ */ jsxs("div", {
153
- className: galleryImageCard,
154
- style: { opacity: .9 },
155
- children: [
156
- /* @__PURE__ */ jsx("div", {
157
- className: galleryImageDragHandle,
158
- children: /* @__PURE__ */ jsx(GripVertical, { size: 14 })
159
- }),
160
- /* @__PURE__ */ jsx("div", {
161
- className: galleryImageThumb,
162
- children: image.src ? /* @__PURE__ */ jsx("img", {
163
- alt: image.alt || "",
164
- src: image.src
165
- }) : /* @__PURE__ */ jsx("span", {
166
- className: galleryImageThumbPlaceholder,
167
- children: /* @__PURE__ */ jsx(ImageIcon, { size: 20 })
168
- })
169
- }),
170
- /* @__PURE__ */ jsx("div", {
171
- className: galleryImageFields,
172
- children: /* @__PURE__ */ jsx("span", {
173
- style: {
174
- fontSize: vars.typography.fontSizeSm,
175
- overflow: "hidden",
176
- textOverflow: "ellipsis",
177
- whiteSpace: "nowrap"
178
- },
179
- children: image.src || "No URL"
180
- })
181
- })
182
- ]
183
- });
184
- var GalleryEditorDialogContent = ({ dismiss, initialImages, initialLayout, onImagesChange, onLayoutChange }) => {
185
- const { className: portalClassName } = usePortalTheme();
186
- const [entries, setEntries] = useState(() => initialImages.map((img) => ({
187
- id: genId(),
188
- image: { ...img }
189
- })));
190
- const [layout, setLayout] = useState(initialLayout);
191
- const newInputRef = useRef(null);
192
- const [dragActiveId, setDragActiveId] = useState(null);
193
- const itemIds = entries.map((e) => e.id);
194
- const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 5 } }));
195
- const handleAddImage = useCallback(() => {
196
- setEntries((prev) => [...prev, {
197
- id: genId(),
198
- image: {
199
- src: "",
200
- alt: ""
201
- }
202
- }]);
203
- requestAnimationFrame(() => {
204
- newInputRef.current?.focus();
205
- });
206
- }, []);
207
- const handleRemoveImage = useCallback((index) => {
208
- setEntries((prev) => prev.filter((_, i) => i !== index));
209
- }, []);
210
- const handleUpdateImage = useCallback((index, field, value) => {
211
- setEntries((prev) => prev.map((entry, i) => i === index ? {
212
- ...entry,
213
- image: {
214
- ...entry.image,
215
- [field]: value
216
- }
217
- } : entry));
218
- }, []);
219
- const handleDragEnd = useCallback((event) => {
220
- const { active, over } = event;
221
- setDragActiveId(null);
222
- if (!over || active.id === over.id) return;
223
- setEntries((prev) => {
224
- const oldIndex = prev.findIndex((e) => e.id === String(active.id));
225
- const newIndex = prev.findIndex((e) => e.id === String(over.id));
226
- if (oldIndex === -1 || newIndex === -1) return prev;
227
- return arrayMove(prev, oldIndex, newIndex);
228
- });
229
- }, []);
230
- const handleSave = useCallback(() => {
231
- onImagesChange(entries.map((e) => e.image).filter((img) => img.src.trim()));
232
- onLayoutChange(layout);
233
- dismiss();
234
- }, [
235
- entries,
236
- layout,
237
- onImagesChange,
238
- onLayoutChange,
239
- dismiss
240
- ]);
241
- const dragActiveEntry = dragActiveId ? entries.find((e) => e.id === dragActiveId) : null;
242
- return /* @__PURE__ */ jsxs(Fragment, { children: [
243
- /* @__PURE__ */ jsxs("div", {
244
- className: galleryDialogHeader,
245
- children: [
246
- /* @__PURE__ */ jsxs("div", {
247
- className: galleryDialogTitle,
248
- children: [/* @__PURE__ */ jsx(Images, { size: 18 }), /* @__PURE__ */ jsx("span", { children: "Gallery Editor" })]
249
- }),
250
- /* @__PURE__ */ jsx("div", {
251
- className: galleryHeaderActions,
252
- children: /* @__PURE__ */ jsx(SegmentedControl, {
253
- items: layoutItems,
254
- value: layout,
255
- onChange: setLayout
256
- })
257
- }),
258
- /* @__PURE__ */ jsx("button", {
259
- className: galleryHeaderClose,
260
- type: "button",
261
- onClick: dismiss,
262
- children: /* @__PURE__ */ jsx(X, { size: 18 })
263
- })
264
- ]
265
- }),
266
- /* @__PURE__ */ jsx("div", {
267
- className: galleryDialogBody,
268
- children: entries.length === 0 ? /* @__PURE__ */ jsxs("div", {
269
- className: galleryDialogEmpty,
270
- children: [
271
- /* @__PURE__ */ jsx(ImageIcon, { size: 32 }),
272
- /* @__PURE__ */ jsx("span", { children: "Add your first image" }),
273
- /* @__PURE__ */ jsxs("button", {
274
- className: galleryAddBtn,
275
- style: { maxWidth: 200 },
276
- type: "button",
277
- onClick: handleAddImage,
278
- children: [/* @__PURE__ */ jsx(Plus, { size: 14 }), "Add Image"]
279
- })
280
- ]
281
- }) : /* @__PURE__ */ jsxs("div", {
282
- className: galleryImageList,
283
- children: [/* @__PURE__ */ jsxs(DndContext, {
284
- collisionDetection: closestCenter,
285
- sensors,
286
- onDragCancel: () => setDragActiveId(null),
287
- onDragEnd: handleDragEnd,
288
- onDragStart: (event) => {
289
- setDragActiveId(String(event.active.id));
290
- },
291
- children: [/* @__PURE__ */ jsx(SortableContext, {
292
- items: itemIds,
293
- strategy: verticalListSortingStrategy,
294
- children: entries.map((entry, index) => /* @__PURE__ */ jsx(SortableImageCard, {
295
- id: entry.id,
296
- image: entry.image,
297
- index,
298
- isLast: index === entries.length - 1,
299
- lastInputRef: newInputRef,
300
- onRemove: handleRemoveImage,
301
- onUpdate: handleUpdateImage
302
- }, entry.id))
303
- }), typeof document !== "undefined" ? createPortal(/* @__PURE__ */ jsx("div", {
304
- className: portalClassName,
305
- children: /* @__PURE__ */ jsx(DragOverlay, {
306
- dropAnimation: null,
307
- children: dragActiveEntry ? /* @__PURE__ */ jsx(DragOverlayCard, { image: dragActiveEntry.image }) : null
308
- })
309
- }), document.body) : null]
310
- }), /* @__PURE__ */ jsxs("button", {
311
- className: galleryAddBtn,
312
- type: "button",
313
- onClick: handleAddImage,
314
- children: [/* @__PURE__ */ jsx(Plus, { size: 14 }), "Add Image"]
315
- })]
316
- })
317
- }),
318
- /* @__PURE__ */ jsxs("div", {
319
- className: galleryDialogFooter,
320
- children: [/* @__PURE__ */ jsx("span", {
321
- className: galleryFooterInfo,
322
- children: `${entries.filter((e) => e.image.src.trim()).length} ${entries.filter((e) => e.image.src.trim()).length !== 1 ? "images" : "image"}`
323
- }), /* @__PURE__ */ jsxs("div", {
324
- className: galleryFooterActions,
325
- children: [/* @__PURE__ */ jsx("button", {
326
- className: galleryFooterBtnCancel,
327
- type: "button",
328
- onClick: dismiss,
329
- children: "Cancel"
330
- }), /* @__PURE__ */ jsx("button", {
331
- className: galleryFooterBtnSave,
332
- type: "button",
333
- onClick: handleSave,
334
- children: "Save"
335
- })]
336
- })]
337
- })
338
- ] });
339
- };
340
- var GalleryEditRenderer = ({ images, layout, onImagesChange, onLayoutChange }) => {
341
- const { className: portalClassName } = usePortalTheme();
342
- const theme = useColorScheme();
343
- const handleOpenEditor = useCallback(() => {
344
- if (!onImagesChange || !onLayoutChange) return;
345
- presentDialog({
346
- content: ({ dismiss }) => /* @__PURE__ */ jsx(GalleryEditorDialogContent, {
347
- dismiss,
348
- initialImages: images,
349
- initialLayout: layout,
350
- onImagesChange,
351
- onLayoutChange
352
- }),
353
- className: galleryDialogPopup,
354
- portalClassName,
355
- theme,
356
- showCloseButton: false,
357
- clickOutsideToDismiss: false
358
- });
359
- }, [
360
- images,
361
- layout,
362
- onImagesChange,
363
- onLayoutChange,
364
- portalClassName,
365
- theme
366
- ]);
367
- if (!onImagesChange) return /* @__PURE__ */ jsx(GalleryRenderer, {
368
- images,
369
- layout
370
- });
371
- if (images.length === 0) return /* @__PURE__ */ jsxs("div", {
372
- className: galleryEditContainer,
373
- children: [/* @__PURE__ */ jsxs("div", {
374
- className: galleryEmptyState,
375
- children: [/* @__PURE__ */ jsx(ImageIcon, { size: 32 }), /* @__PURE__ */ jsx("span", { children: "Empty gallery" })]
376
- }), /* @__PURE__ */ jsx("button", {
377
- className: galleryEditOverlay,
378
- type: "button",
379
- onClick: handleOpenEditor,
380
- children: /* @__PURE__ */ jsxs("span", {
381
- className: galleryEditLabel,
382
- children: [/* @__PURE__ */ jsx(Pencil, { size: 16 }), "Edit Gallery"]
383
- })
384
- })]
385
- });
386
- return /* @__PURE__ */ jsxs("div", {
387
- className: galleryEditContainer,
388
- children: [/* @__PURE__ */ jsx(GalleryRenderer, {
389
- images,
390
- layout
391
- }), /* @__PURE__ */ jsx("button", {
392
- className: galleryEditOverlay,
393
- type: "button",
394
- onClick: handleOpenEditor,
395
- children: /* @__PURE__ */ jsxs("span", {
396
- className: galleryEditLabel,
397
- children: [/* @__PURE__ */ jsx(Pencil, { size: 16 }), "Edit Gallery"]
398
- })
399
- })]
400
- });
401
- };
402
- //#endregion
403
- //#region src/index.ts
404
- var galleryNodes = [GalleryNode];
405
- var galleryEditNodes = [GalleryEditNode];
406
- //#endregion
407
- export { $createGalleryEditNode, $createGalleryNode, $isGalleryEditNode, $isGalleryNode, GalleryEditNode, GalleryEditRenderer, GalleryNode, GalleryRenderer, GalleryRenderer_default as default, galleryEditNodes, galleryNodes };
1
+ import { t as GalleryRenderer } from "./GalleryRenderer-CyyWUTT0.js";
2
+ import { a as GALLERY_NODE_KEY, n as $isGalleryNode, r as GalleryNode, t as $createGalleryNode } from "./GalleryNode-CKcqJG5T.js";
3
+ import { a as GalleryEditNode, i as $isGalleryEditNode, n as GalleryEditRenderer, r as $createGalleryEditNode, t as galleryEditNodes } from "./edit-BQnC2MpC.js";
4
+ import { galleryNodes } from "./node.mjs";
5
+ import "./renderer.mjs";
6
+ export { $createGalleryEditNode, $createGalleryNode, $isGalleryEditNode, $isGalleryNode, GALLERY_NODE_KEY, GalleryEditNode, GalleryEditRenderer, GalleryNode, GalleryRenderer, galleryEditNodes, galleryNodes };
package/dist/node.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { Klass, LexicalNode } from 'lexical';
2
+ export type { GalleryNodePayload, SerializedGalleryNode } from './GalleryNode';
3
+ export { $createGalleryNode, $isGalleryNode, GalleryNode } from './GalleryNode';
4
+ export { GALLERY_NODE_KEY } from './slot';
5
+ export type { GalleryImage, GalleryRendererProps } from './types';
6
+ export declare const galleryNodes: Array<Klass<LexicalNode>>;
7
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAIlD,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAElE,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAiB,CAAC"}
package/dist/node.mjs ADDED
@@ -0,0 +1,5 @@
1
+ import { a as GALLERY_NODE_KEY, n as $isGalleryNode, r as GalleryNode, t as $createGalleryNode } from "./GalleryNode-CKcqJG5T.js";
2
+ //#region src/node.ts
3
+ var galleryNodes = [GalleryNode];
4
+ //#endregion
5
+ export { $createGalleryNode, $isGalleryNode, GALLERY_NODE_KEY, GalleryNode, galleryNodes };
@@ -0,0 +1,3 @@
1
+ export { default, GalleryRenderer } from './GalleryRenderer';
2
+ export type { GalleryImage, GalleryRendererProps } from './types';
3
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC;AACtB,OAAO,WAAW,CAAC;AAEnB,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC7D,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { n as GalleryRenderer_default, t as GalleryRenderer } from "./GalleryRenderer-CyyWUTT0.js";
2
+ export { GalleryRenderer, GalleryRenderer_default as default };
@@ -1,2 +1,2 @@
1
- ._10ydd1n0{width:100%;margin:16px 0;position:relative}._10ydd1n1{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px;display:grid}._10ydd1n2{column-count:3;column-gap:12px}._10ydd1n2 figure{break-inside:avoid;margin-bottom:12px}._10ydd1n3{position:relative}._10ydd1n4{white-space:nowrap;scroll-behavior:smooth;scrollbar-width:none;-ms-overflow-style:none;width:100%;overflow-x:auto}._10ydd1n4::-webkit-scrollbar{display:none}._10ydd1n5{cursor:pointer;margin:0;transition:transform .2s;display:inline-block}._10ydd1n5:hover{transform:scale(1.02)}._10ydd1n5 img{border-radius:4px;display:block}._10ydd1n6{border:1px solid var(--rc-border);background:var(--rc-bg-secondary);width:32px;height:32px;color:var(--rc-text-secondary);cursor:pointer;-webkit-backdrop-filter:blur(20px)saturate(180%);backdrop-filter:blur(20px)saturate(180%);z-index:10;border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute;top:50%;transform:translateY(-50%)}._10ydd1n7{left:8px}._10ydd1n8{right:8px}._10ydd1n9{z-index:10;gap:8px;display:flex;position:absolute;bottom:12px;left:50%;transform:translate(-50%)}._10ydd1na{background:var(--rc-text-secondary);opacity:.5;-webkit-backdrop-filter:blur(20px)saturate(180%);backdrop-filter:blur(20px)saturate(180%);cursor:pointer;border-radius:50%;width:6px;height:6px;transition:opacity .2s}._10ydd1na:hover,._10ydd1nb{opacity:1}._10ydd1nc{border:1px solid var(--rc-border);border-radius:.5rem;width:100%;min-height:120px;margin:16px 0;position:relative;overflow:hidden}._10ydd1nd{z-index:5;cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;transition:background .2s;display:flex;position:absolute;top:0;bottom:0;left:0;right:0}._10ydd1nd:hover{background:color-mix(in srgb, currentColor 6%, transparent)}._10ydd1ne{background:var(--rc-bg);border:1px solid var(--rc-border);color:var(--rc-text);font-size:var(--rc-font-size-sm);opacity:0;border-radius:6px;align-items:center;gap:6px;padding:6px 14px;font-weight:500;transition:opacity .2s;display:flex}._10ydd1nc:hover ._10ydd1ne{opacity:1}._10ydd1nf{color:var(--rc-text-secondary);font-size:var(--rc-font-size-md);flex-direction:column;justify-content:center;align-items:center;gap:.75rem;min-height:120px;padding:2rem;display:flex}._10ydd1ng._10ydd1ng{border-radius:.5rem;flex-direction:column;gap:0;width:calc(100vw - 2rem);height:min(720px,85vh);padding:0;display:flex;overflow:hidden}._10ydd1ng._10ydd1ng[data-open],._10ydd1ng._10ydd1ng[data-closed]{animation:none}._10ydd1nh{border-bottom:1px solid var(--rc-border);flex-shrink:0;align-items:center;gap:10px;height:48px;padding:0 12px 0 16px;display:flex}._10ydd1ni{font-size:var(--rc-font-size-md);color:var(--rc-text);align-items:center;gap:.5rem;font-weight:600;line-height:1;display:flex}._10ydd1nj{align-items:center;gap:2px;margin-left:auto;display:flex}._10ydd1nk{width:32px;height:32px;color:var(--rc-text-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;margin-left:8px;transition:background .15s,color .15s;display:flex}._10ydd1nk:hover{background:color-mix(in srgb, currentColor 8%, transparent);color:var(--rc-text)}._10ydd1nl{flex:1;min-height:0;padding:1rem;overflow-y:auto}._10ydd1nm{flex-direction:column;gap:.75rem;display:flex}._10ydd1nn{border:1px solid var(--rc-border);background:color-mix(in srgb, var(--rc-text) 2%, transparent);border-radius:.5rem;align-items:flex-start;gap:.75rem;padding:.75rem;display:flex}._10ydd1no{width:24px;height:24px;color:var(--rc-text-secondary);cursor:grab;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;margin-top:4px;transition:background .15s,color .15s;display:flex}._10ydd1no:hover{background:color-mix(in srgb, currentColor 8%, transparent);color:var(--rc-text)}._10ydd1no:active{cursor:grabbing}._10ydd1np{background-color:color-mix(in srgb, var(--rc-text) 5%, transparent);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;width:64px;height:64px;display:flex;overflow:hidden}._10ydd1np img{object-fit:cover;width:100%;height:100%}._10ydd1nq{color:color-mix(in srgb, var(--rc-text-secondary) 40%, transparent)}._10ydd1nr{flex-direction:column;flex:1;gap:6px;min-width:0;display:flex}._10ydd1ns{border:1px solid var(--rc-border);background:var(--rc-bg);width:100%;color:var(--rc-text);font-size:var(--rc-font-size-sm);border-radius:4px;outline:none;padding:4px 8px;transition:border-color .15s}._10ydd1ns:focus{border-color:color-mix(in srgb, var(--rc-text) 30%, transparent)}._10ydd1ns::placeholder{color:color-mix(in srgb, var(--rc-text-secondary) 50%, transparent)}._10ydd1nt{flex-direction:column;flex-shrink:0;gap:2px;display:flex}._10ydd1nu{width:28px;height:28px;color:var(--rc-text-secondary);cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;transition:background .15s,color .15s;display:inline-flex}._10ydd1nu:hover{background:color-mix(in srgb, var(--rc-alert-caution) 10%, transparent);color:var(--rc-alert-caution)}._10ydd1nv{border:1px dashed var(--rc-border);width:100%;color:var(--rc-text-secondary);font-size:var(--rc-font-size-sm);cursor:pointer;background:0 0;border-radius:.5rem;justify-content:center;align-items:center;gap:6px;padding:.625rem;transition:border-color .15s,color .15s,background .15s;display:flex}._10ydd1nv:hover{border-color:color-mix(in srgb, var(--rc-text) 20%, transparent);color:var(--rc-text);background:color-mix(in srgb, var(--rc-text) 2%, transparent)}._10ydd1nw{border-top:1px solid var(--rc-border);background-color:color-mix(in srgb, var(--rc-text) 1.5%, transparent);flex-shrink:0;justify-content:space-between;align-items:center;height:44px;padding:0 1rem;display:flex}._10ydd1nx{font-size:var(--rc-font-size-xs);color:var(--rc-text-secondary)}._10ydd1ny{align-items:center;gap:.5rem;display:flex}._10ydd1nz{font-size:var(--rc-font-size-xs);cursor:pointer;border-radius:.375rem;height:28px;padding:.25rem .75rem;font-weight:500;transition:background-color .15s,border-color .15s}._10ydd1n10{color:var(--rc-text-secondary);border:1px solid var(--rc-border);background-color:#0000}._10ydd1n10:hover{background-color:color-mix(in srgb, var(--rc-text) 4%, transparent)}._10ydd1n11{background-color:var(--rc-text);color:var(--rc-bg);border:1px solid #0000}._10ydd1n11:hover{background-color:color-mix(in srgb, var(--rc-text) 85%, transparent)}._10ydd1n12{color:var(--rc-text-secondary);font-size:var(--rc-font-size-md);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:1rem;padding:2rem;display:flex}@media (max-width:768px){._10ydd1n2{column-count:2}}@media (max-width:480px){._10ydd1n1{grid-template-columns:1fr}._10ydd1n2{column-count:1}}@media (min-width:640px){._10ydd1ng._10ydd1ng{max-width:56rem}}
1
+ :root{--rc-text:#000;--rc-text-secondary:#262626;--rc-text-tertiary:#737373;--rc-text-quaternary:#a3a3a3;--rc-bg:#fff;--rc-bg-secondary:#fafafa;--rc-bg-tertiary:#f5f5f5;--rc-fill:#e8e8e8;--rc-fill-secondary:#eee;--rc-fill-tertiary:#f5f5f5;--rc-fill-quaternary:#fafafa;--rc-border:#f5f5f5;--rc-accent:#2563eb;--rc-accent-light:#2563eb20;--rc-link:#2563eb;--rc-code-text:#404040;--rc-code-bg:#f5f5f5;--rc-hr-border:#e5e5e5;--rc-quote-border:#2563eb;--rc-quote-bg:#f5f5f5;--rc-alert-info:#006bb7;--rc-alert-warning:#c50;--rc-alert-tip:#1c0;--rc-alert-caution:#c01;--rc-alert-important:#50c;--rc-max-width:700px;--rc-shadow-top-bar:0 8px 30px #0000001f, 0 2px 8px #0000000f;--rc-shadow-modal:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--rc-shadow-menu:0 1px 4px #0000000a, 0 4px 16px #00000014;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-font-family-sans:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif:"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai:"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono:"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:16px;--rc-font-size-small:14px;--rc-line-height:1.7;--rc-line-height-tight:1.4;--rc-font-family:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}:root.dark,[data-theme=dark]{--rc-text:#fafafa;--rc-text-secondary:#a3a3a3;--rc-text-tertiary:#737373;--rc-text-quaternary:#525252;--rc-bg:#0a0a0a;--rc-bg-secondary:#171717;--rc-bg-tertiary:#262626;--rc-fill:#2a2a2a;--rc-fill-secondary:#222;--rc-fill-tertiary:#1a1a1a;--rc-fill-quaternary:#141414;--rc-border:#262626;--rc-accent:#60a5fa;--rc-accent-light:#60a5fa20;--rc-link:#60a5fa;--rc-code-text:#d4d4d4;--rc-code-bg:#262626;--rc-hr-border:#262626;--rc-quote-border:#60a5fa;--rc-quote-bg:#262626;--rc-alert-info:#7db9e5;--rc-alert-warning:#da864a;--rc-alert-tip:#54da48;--rc-alert-caution:#e16973;--rc-alert-important:#9966e0;--rc-max-width:700px;--rc-shadow-top-bar:0 8px 30px #00000073, 0 2px 8px #0000004d;--rc-shadow-modal:0 10px 15px -3px #0006, 0 4px 6px -4px #00000059;--rc-shadow-menu:0 1px 4px #00000040, 0 4px 16px #0006;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-font-family-sans:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif:"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai:"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono:"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:16px;--rc-font-size-small:14px;--rc-line-height:1.7;--rc-line-height-tight:1.4;--rc-font-family:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}.yectnr0{--rc-text:#000;--rc-text-secondary:#262626;--rc-text-tertiary:#737373;--rc-text-quaternary:#a3a3a3;--rc-bg:#fff;--rc-bg-secondary:#fafafa;--rc-bg-tertiary:#f5f5f5;--rc-fill:#e8e8e8;--rc-fill-secondary:#eee;--rc-fill-tertiary:#f5f5f5;--rc-fill-quaternary:#fafafa;--rc-border:#f5f5f5;--rc-accent:#2563eb;--rc-accent-light:#2563eb20;--rc-link:#2563eb;--rc-code-text:#404040;--rc-code-bg:#f5f5f5;--rc-hr-border:#e5e5e5;--rc-quote-border:#2563eb;--rc-quote-bg:#f5f5f5;--rc-alert-info:#006bb7;--rc-alert-warning:#c50;--rc-alert-tip:#1c0;--rc-alert-caution:#c01;--rc-alert-important:#50c;--rc-max-width:700px;--rc-shadow-top-bar:0 8px 30px #0000001f, 0 2px 8px #0000000f;--rc-shadow-modal:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--rc-shadow-menu:0 1px 4px #0000000a, 0 4px 16px #00000014;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-font-family-sans:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif:"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai:"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono:"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:16px;--rc-font-size-small:14px;--rc-line-height:1.7;--rc-line-height-tight:1.4;--rc-font-family:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}.yectnr1{--rc-text:#000;--rc-text-secondary:#262626;--rc-text-tertiary:#737373;--rc-text-quaternary:#a3a3a3;--rc-bg:#fff;--rc-bg-secondary:#fafafa;--rc-bg-tertiary:#f5f5f5;--rc-fill:#e8e8e8;--rc-fill-secondary:#eee;--rc-fill-tertiary:#f5f5f5;--rc-fill-quaternary:#fafafa;--rc-border:#f5f5f5;--rc-accent:#2563eb;--rc-accent-light:#2563eb20;--rc-link:#2563eb;--rc-code-text:#404040;--rc-code-bg:#f5f5f5;--rc-hr-border:#e5e5e5;--rc-quote-border:#2563eb;--rc-quote-bg:#f5f5f5;--rc-alert-info:#006bb7;--rc-alert-warning:#c50;--rc-alert-tip:#1c0;--rc-alert-caution:#c01;--rc-alert-important:#50c;--rc-max-width:700px;--rc-shadow-top-bar:0 8px 30px #0000001f, 0 2px 8px #0000000f;--rc-shadow-modal:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--rc-shadow-menu:0 1px 4px #0000000a, 0 4px 16px #00000014;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-font-family-sans:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif:"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai:"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono:"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:16px;--rc-font-size-small:14px;--rc-line-height:1.8;--rc-line-height-tight:1.4;--rc-font-family:"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}.yectnr2{--rc-text:#000;--rc-text-secondary:#262626;--rc-text-tertiary:#737373;--rc-text-quaternary:#a3a3a3;--rc-bg:#fff;--rc-bg-secondary:#fafafa;--rc-bg-tertiary:#f5f5f5;--rc-fill:#e8e8e8;--rc-fill-secondary:#eee;--rc-fill-tertiary:#f5f5f5;--rc-fill-quaternary:#fafafa;--rc-border:#f5f5f5;--rc-accent:#2563eb;--rc-accent-light:#2563eb20;--rc-link:#2563eb;--rc-code-text:#404040;--rc-code-bg:#f5f5f5;--rc-hr-border:#e5e5e5;--rc-quote-border:#a3a3a3;--rc-quote-bg:#fafafa;--rc-alert-info:#006bb7;--rc-alert-warning:#c50;--rc-alert-tip:#1c0;--rc-alert-caution:#c01;--rc-alert-important:#50c;--rc-max-width:none;--rc-shadow-top-bar:0 8px 30px #0000001f, 0 2px 8px #0000000f;--rc-shadow-modal:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--rc-shadow-menu:0 1px 4px #0000000a, 0 4px 16px #00000014;--rc-space-xs:2px;--rc-space-sm:4px;--rc-space-md:10px;--rc-space-lg:16px;--rc-space-xl:20px;--rc-font-family-sans:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif:"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai:"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono:"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:14px;--rc-font-size-small:12px;--rc-line-height:1.5;--rc-line-height-tight:1.3;--rc-font-family:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-radius-sm:3px;--rc-radius-md:6px;--rc-radius-lg:12px}.dark .yectnr0,[data-theme=dark] .yectnr0,.dark.yectnr0,[data-theme=dark].yectnr0,.dark .yectnr1,[data-theme=dark] .yectnr1,.dark.yectnr1,[data-theme=dark].yectnr1,.dark .yectnr2,[data-theme=dark] .yectnr2,.dark.yectnr2,[data-theme=dark].yectnr2{--rc-text:#fafafa;--rc-text-secondary:#a3a3a3;--rc-text-tertiary:#737373;--rc-text-quaternary:#525252;--rc-bg:#0a0a0a;--rc-bg-secondary:#171717;--rc-bg-tertiary:#262626;--rc-fill:#2a2a2a;--rc-fill-secondary:#222;--rc-fill-tertiary:#1a1a1a;--rc-fill-quaternary:#141414;--rc-border:#262626;--rc-accent:#60a5fa;--rc-accent-light:#60a5fa20;--rc-link:#60a5fa;--rc-code-text:#d4d4d4;--rc-code-bg:#262626;--rc-hr-border:#262626;--rc-quote-border:#60a5fa;--rc-quote-bg:#262626;--rc-alert-info:#7db9e5;--rc-alert-warning:#da864a;--rc-alert-tip:#54da48;--rc-alert-caution:#e16973;--rc-alert-important:#9966e0;--rc-shadow-top-bar:0 8px 30px #00000073, 0 2px 8px #0000004d;--rc-shadow-modal:0 10px 15px -3px #0006, 0 4px 6px -4px #00000059;--rc-shadow-menu:0 1px 4px #00000040, 0 4px 16px #0006}._10ydd1n0{width:100%;margin:16px 0;position:relative}._10ydd1n1{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px;display:grid}._10ydd1n2{column-count:3;column-gap:12px}._10ydd1n2 figure{break-inside:avoid;margin-bottom:12px}._10ydd1n3{position:relative}._10ydd1n4{white-space:nowrap;scroll-behavior:smooth;scrollbar-width:none;-ms-overflow-style:none;width:100%;overflow-x:auto}._10ydd1n4::-webkit-scrollbar{display:none}._10ydd1n5{cursor:pointer;margin:0;transition:transform .2s;display:inline-block}._10ydd1n5:hover{transform:scale(1.02)}._10ydd1n5 img{border-radius:4px;display:block}._10ydd1n6{border:1px solid var(--rc-border);background:var(--rc-bg-secondary);width:32px;height:32px;color:var(--rc-text-secondary);cursor:pointer;-webkit-backdrop-filter:blur(20px)saturate(180%);backdrop-filter:blur(20px)saturate(180%);z-index:10;border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute;top:50%;transform:translateY(-50%)}._10ydd1n7{left:8px}._10ydd1n8{right:8px}._10ydd1n9{z-index:10;gap:8px;display:flex;position:absolute;bottom:12px;left:50%;transform:translate(-50%)}._10ydd1na{background:var(--rc-text-secondary);opacity:.5;-webkit-backdrop-filter:blur(20px)saturate(180%);backdrop-filter:blur(20px)saturate(180%);cursor:pointer;border-radius:50%;width:6px;height:6px;transition:opacity .2s}._10ydd1na:hover,._10ydd1nb{opacity:1}._10ydd1nc{border:1px solid var(--rc-border);border-radius:.5rem;width:100%;min-height:120px;margin:16px 0;position:relative;overflow:hidden}._10ydd1nd{z-index:5;cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;transition:background .2s;display:flex;position:absolute;top:0;bottom:0;left:0;right:0}._10ydd1nd:hover{background:color-mix(in srgb, currentColor 6%, transparent)}._10ydd1ne{background:var(--rc-bg);border:1px solid var(--rc-border);color:var(--rc-text);font-size:var(--rc-font-size-sm);opacity:0;border-radius:6px;align-items:center;gap:6px;padding:6px 14px;font-weight:500;transition:opacity .2s;display:flex}._10ydd1nc:hover ._10ydd1ne{opacity:1}._10ydd1nf{color:var(--rc-text-secondary);font-size:var(--rc-font-size-md);flex-direction:column;justify-content:center;align-items:center;gap:.75rem;min-height:120px;padding:2rem;display:flex}._10ydd1ng._10ydd1ng{border-radius:.5rem;flex-direction:column;gap:0;width:calc(100vw - 2rem);height:min(720px,85vh);padding:0;display:flex;overflow:hidden}._10ydd1ng._10ydd1ng[data-open],._10ydd1ng._10ydd1ng[data-closed]{animation:none}._10ydd1nh{border-bottom:1px solid var(--rc-border);flex-shrink:0;align-items:center;gap:10px;height:48px;padding:0 12px 0 16px;display:flex}._10ydd1ni{font-size:var(--rc-font-size-md);color:var(--rc-text);align-items:center;gap:.5rem;font-weight:600;line-height:1;display:flex}._10ydd1nj{align-items:center;gap:2px;margin-left:auto;display:flex}._10ydd1nk{width:32px;height:32px;color:var(--rc-text-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;margin-left:8px;transition:background .15s,color .15s;display:flex}._10ydd1nk:hover{background:color-mix(in srgb, currentColor 8%, transparent);color:var(--rc-text)}._10ydd1nl{flex:1;min-height:0;padding:1rem;overflow-y:auto}._10ydd1nm{flex-direction:column;gap:.75rem;display:flex}._10ydd1nn{border:1px solid var(--rc-border);background:color-mix(in srgb, var(--rc-text) 2%, transparent);border-radius:.5rem;align-items:flex-start;gap:.75rem;padding:.75rem;display:flex}._10ydd1no{width:24px;height:24px;color:var(--rc-text-secondary);cursor:grab;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;margin-top:4px;transition:background .15s,color .15s;display:flex}._10ydd1no:hover{background:color-mix(in srgb, currentColor 8%, transparent);color:var(--rc-text)}._10ydd1no:active{cursor:grabbing}._10ydd1np{background-color:color-mix(in srgb, var(--rc-text) 5%, transparent);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;width:64px;height:64px;display:flex;overflow:hidden}._10ydd1np img{object-fit:cover;width:100%;height:100%}._10ydd1nq{color:color-mix(in srgb, var(--rc-text-secondary) 40%, transparent)}._10ydd1nr{flex-direction:column;flex:1;gap:6px;min-width:0;display:flex}._10ydd1ns{border:1px solid var(--rc-border);background:var(--rc-bg);width:100%;color:var(--rc-text);font-size:var(--rc-font-size-sm);border-radius:4px;outline:none;padding:4px 8px;transition:border-color .15s}._10ydd1ns:focus{border-color:color-mix(in srgb, var(--rc-text) 30%, transparent)}._10ydd1ns::placeholder{color:color-mix(in srgb, var(--rc-text-secondary) 50%, transparent)}._10ydd1nt{flex-direction:column;flex-shrink:0;gap:2px;display:flex}._10ydd1nu{width:28px;height:28px;color:var(--rc-text-secondary);cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;transition:background .15s,color .15s;display:inline-flex}._10ydd1nu:hover{background:color-mix(in srgb, var(--rc-alert-caution) 10%, transparent);color:var(--rc-alert-caution)}._10ydd1nv{border:1px dashed var(--rc-border);width:100%;color:var(--rc-text-secondary);font-size:var(--rc-font-size-sm);cursor:pointer;background:0 0;border-radius:.5rem;justify-content:center;align-items:center;gap:6px;padding:.625rem;transition:border-color .15s,color .15s,background .15s;display:flex}._10ydd1nv:hover{border-color:color-mix(in srgb, var(--rc-text) 20%, transparent);color:var(--rc-text);background:color-mix(in srgb, var(--rc-text) 2%, transparent)}._10ydd1nw{border-top:1px solid var(--rc-border);background-color:color-mix(in srgb, var(--rc-text) 1.5%, transparent);flex-shrink:0;justify-content:space-between;align-items:center;height:44px;padding:0 1rem;display:flex}._10ydd1nx{font-size:var(--rc-font-size-xs);color:var(--rc-text-secondary)}._10ydd1ny{align-items:center;gap:.5rem;display:flex}._10ydd1nz{font-size:var(--rc-font-size-xs);cursor:pointer;border-radius:.375rem;height:28px;padding:.25rem .75rem;font-weight:500;transition:background-color .15s,border-color .15s}._10ydd1n10{color:var(--rc-text-secondary);border:1px solid var(--rc-border);background-color:#0000}._10ydd1n10:hover{background-color:color-mix(in srgb, var(--rc-text) 4%, transparent)}._10ydd1n11{background-color:var(--rc-text);color:var(--rc-bg);border:1px solid #0000}._10ydd1n11:hover{background-color:color-mix(in srgb, var(--rc-text) 85%, transparent)}._10ydd1n12{color:var(--rc-text-secondary);font-size:var(--rc-font-size-md);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:1rem;padding:2rem;display:flex}@media (max-width:768px){._10ydd1n2{column-count:2}}@media (max-width:480px){._10ydd1n1{grid-template-columns:1fr}._10ydd1n2{column-count:1}}@media (min-width:640px){._10ydd1ng._10ydd1ng{max-width:56rem}}
2
2
  /*$vite$:1*/
package/dist/slot.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * RendererConfig slot key for `@haklex/rich-ext-gallery`.
3
+ *
4
+ * Override modules should reference this constant instead of the bare string
5
+ * literal so renames stay searchable across the workspace.
6
+ */
7
+ export declare const GALLERY_NODE_KEY: "Gallery";
8
+ //# sourceMappingURL=slot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slot.d.ts","sourceRoot":"","sources":["../src/slot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAG,SAAkB,CAAC"}
package/dist/static.d.ts CHANGED
@@ -1,6 +1,4 @@
1
- import { Klass, LexicalNode } from 'lexical';
2
- export type { GalleryNodePayload, SerializedGalleryNode } from './GalleryNode';
3
- export { $createGalleryNode, $isGalleryNode, GalleryNode } from './GalleryNode';
4
- export { default, GalleryRenderer } from './GalleryRenderer';
5
- export declare const galleryNodes: Array<Klass<LexicalNode>>;
1
+ export * from './node';
2
+ export { default } from './renderer';
3
+ export * from './renderer';
6
4
  //# sourceMappingURL=static.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../src/static.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAIjD,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC/E,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAE5D,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAiB,CAAA"}
1
+ {"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../src/static.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,cAAc,YAAY,CAAC"}
package/dist/static.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { a as GalleryRenderer, n as $isGalleryNode, o as GalleryRenderer_default, r as GalleryNode, t as $createGalleryNode } from "./GalleryNode-DBVAUkDV.js";
2
- //#region src/static.ts
3
- var galleryNodes = [GalleryNode];
4
- //#endregion
5
- export { $createGalleryNode, $isGalleryNode, GalleryNode, GalleryRenderer, GalleryRenderer_default as default, galleryNodes };
1
+ import { n as GalleryRenderer_default, t as GalleryRenderer } from "./GalleryRenderer-CyyWUTT0.js";
2
+ import { a as GALLERY_NODE_KEY, n as $isGalleryNode, r as GalleryNode, t as $createGalleryNode } from "./GalleryNode-CKcqJG5T.js";
3
+ import { galleryNodes } from "./node.mjs";
4
+ import "./renderer.mjs";
5
+ export { $createGalleryNode, $isGalleryNode, GALLERY_NODE_KEY, GalleryNode, GalleryRenderer, GalleryRenderer_default as default, galleryNodes };
@@ -0,0 +1,14 @@
1
+ export interface GalleryImage {
2
+ alt?: string;
3
+ height?: number;
4
+ src: string;
5
+ thumbhash?: string;
6
+ width?: number;
7
+ }
8
+ export interface GalleryRendererProps {
9
+ images: GalleryImage[];
10
+ layout: 'grid' | 'masonry' | 'carousel';
11
+ onImagesChange?: (images: GalleryImage[]) => void;
12
+ onLayoutChange?: (layout: 'grid' | 'masonry' | 'carousel') => void;
13
+ }
14
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;IACxC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAClD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,KAAK,IAAI,CAAC;CACpE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haklex/rich-ext-gallery",
3
- "version": "0.4.1",
3
+ "version": "0.6.0",
4
4
  "description": "Image gallery extension with drag-and-drop",
5
5
  "repository": {
6
6
  "type": "git",
@@ -14,6 +14,18 @@
14
14
  "import": "./dist/index.mjs",
15
15
  "types": "./dist/index.d.ts"
16
16
  },
17
+ "./node": {
18
+ "import": "./dist/node.mjs",
19
+ "types": "./dist/node.d.ts"
20
+ },
21
+ "./renderer": {
22
+ "import": "./dist/renderer.mjs",
23
+ "types": "./dist/renderer.d.ts"
24
+ },
25
+ "./edit": {
26
+ "import": "./dist/edit.mjs",
27
+ "types": "./dist/edit.d.ts"
28
+ },
17
29
  "./static": {
18
30
  "import": "./dist/static.mjs",
19
31
  "types": "./dist/static.d.ts"
@@ -45,13 +57,13 @@
45
57
  "vite-plugin-dts": "^4.5.4"
46
58
  },
47
59
  "peerDependencies": {
48
- "@haklex/rich-editor": ">=0.3.0",
49
- "@haklex/rich-editor-ui": ">=0.3.0",
50
- "@haklex/rich-style-token": ">=0.3.0",
51
60
  "lexical": "^0.44.0",
52
61
  "lucide-react": "^1.0.0",
53
62
  "react": ">=19",
54
- "react-dom": ">=19"
63
+ "react-dom": ">=19",
64
+ "@haklex/rich-editor": "0.6.0",
65
+ "@haklex/rich-editor-ui": "0.6.0",
66
+ "@haklex/rich-style-token": "0.6.0"
55
67
  },
56
68
  "publishConfig": {
57
69
  "access": "public"