deepsea-components 5.15.28 → 5.16.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.
@@ -0,0 +1,357 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
12
+ (()=>{
13
+ __webpack_require__.d = (exports1, definition)=>{
14
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
+ enumerable: true,
16
+ get: definition[key]
17
+ });
18
+ };
19
+ })();
20
+ (()=>{
21
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
22
+ })();
23
+ (()=>{
24
+ __webpack_require__.r = (exports1)=>{
25
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
26
+ value: 'Module'
27
+ });
28
+ Object.defineProperty(exports1, '__esModule', {
29
+ value: true
30
+ });
31
+ };
32
+ })();
33
+ var __webpack_exports__ = {};
34
+ __webpack_require__.r(__webpack_exports__);
35
+ __webpack_require__.d(__webpack_exports__, {
36
+ DraggableGrid: ()=>DraggableGrid
37
+ });
38
+ const jsx_runtime_namespaceObject = require("react/jsx-runtime");
39
+ const external_react_namespaceObject = require("react");
40
+ const external_deepsea_tools_namespaceObject = require("deepsea-tools");
41
+ const external_soda_hooks_namespaceObject = require("soda-hooks");
42
+ const external_DraggableGrid_module_cjs_namespaceObject = require("./DraggableGrid.module.cjs");
43
+ var external_DraggableGrid_module_cjs_default = /*#__PURE__*/ __webpack_require__.n(external_DraggableGrid_module_cjs_namespaceObject);
44
+ function isTheSameArray(a, b) {
45
+ if (a.length !== b.length) return false;
46
+ for(let i = 0; i < a.length; i++)if (a[i] !== b[i]) return false;
47
+ return true;
48
+ }
49
+ function isTheSameIterable(a, b) {
50
+ const aSet = a instanceof Set ? a : new Set(a);
51
+ const bSet = b instanceof Set ? b : new Set(b);
52
+ if (aSet.size !== bSet.size) return false;
53
+ return 0 === aSet.difference(bSet).size;
54
+ }
55
+ function getOrderMap({ prev, orders, keys }) {
56
+ const orderSet = new Set(orders);
57
+ const orderMap = new Map();
58
+ const newKeys = keys.filter((key)=>{
59
+ if (!prev) return true;
60
+ if (prev.has(key)) {
61
+ const prevOrder = prev.get(key);
62
+ orderMap.set(key, prevOrder);
63
+ orderSet.delete(prevOrder);
64
+ return false;
65
+ }
66
+ });
67
+ orders = Array.from(orderSet);
68
+ newKeys.forEach((key, index)=>orderMap.set(key, orders[index]));
69
+ console.log(Object.fromEntries(orderMap.entries()));
70
+ return orderMap;
71
+ }
72
+ function getPosition({ order, columns, gapX, gapY, itemWidth, itemHeight }) {
73
+ const row = Math.floor(order / columns);
74
+ const column = order % columns;
75
+ return {
76
+ x: column * (itemWidth + gapX),
77
+ y: row * (itemHeight + gapY)
78
+ };
79
+ }
80
+ function getOrderToKey(keyToOrder) {
81
+ return new Map(Array.from(keyToOrder.entries()).map(([key, order])=>[
82
+ order,
83
+ key
84
+ ]));
85
+ }
86
+ const DraggableGridItem = ({ onDragMoveStart, onDragMove, onDragMoveEnd, ...rest })=>{
87
+ const element = (0, external_react_namespaceObject.useRef)(null);
88
+ (0, external_soda_hooks_namespaceObject.useDragMove)({
89
+ element,
90
+ onDragMoveStart,
91
+ onDragMove,
92
+ onDragMoveEnd
93
+ });
94
+ return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("div", {
95
+ ref: element,
96
+ ...rest
97
+ });
98
+ };
99
+ let DraggableGrid_cache;
100
+ function log(value) {
101
+ if ((0, external_deepsea_tools_namespaceObject.equal)(DraggableGrid_cache, value)) return;
102
+ DraggableGrid_cache = value;
103
+ console.log(value);
104
+ }
105
+ function DraggableGrid({ className, classNames, style, items = [], disabled, columns, rows, gap = 0, gapX = gap, gapY = gap, itemWidth, itemHeight, orderMap, onOrderMapChange, render, keyExtractor, isItemDisabled, isOrderDisabled, orderPriority, ...rest }) {
106
+ const [itemToKey, keyToItem] = (0, external_react_namespaceObject.useMemo)(()=>{
107
+ const itemToKey = new Map();
108
+ const keyToItem = new Map();
109
+ items.forEach((item, index)=>{
110
+ const key = keyExtractor ? keyExtractor(item) : item;
111
+ itemToKey.set(item, key);
112
+ keyToItem.set(key, item);
113
+ });
114
+ return [
115
+ itemToKey,
116
+ keyToItem
117
+ ];
118
+ }, [
119
+ items,
120
+ keyExtractor
121
+ ]);
122
+ if (keyToItem.size !== items.length) throw new Error("there are duplicate keys in the items");
123
+ const orders = (0, external_react_namespaceObject.useMemo)(()=>{
124
+ let orders = (0, external_deepsea_tools_namespaceObject.getArray)(columns * rows);
125
+ if (isOrderDisabled) orders = orders.filter((order)=>Array.isArray(isOrderDisabled) ? !isOrderDisabled.includes(order) : !isOrderDisabled(order));
126
+ if (orderPriority) orders = orders.toSorted(orderPriority);
127
+ return orders;
128
+ }, [
129
+ columns,
130
+ rows,
131
+ isOrderDisabled,
132
+ orderPriority
133
+ ]);
134
+ const [keyToOrder, setKeyToOrder] = (0, external_react_namespaceObject.useState)(()=>{
135
+ if (orderMap) return orderMap;
136
+ const newOrderMap = getOrderMap({
137
+ prev: void 0,
138
+ orders,
139
+ keys: Array.from(keyToItem.keys())
140
+ });
141
+ onOrderMapChange?.(newOrderMap);
142
+ return newOrderMap;
143
+ });
144
+ const [dragging, setDragging] = (0, external_react_namespaceObject.useState)(void 0);
145
+ const { current: cache } = (0, external_react_namespaceObject.useRef)({
146
+ orders,
147
+ keys: Array.from(keyToItem.keys())
148
+ });
149
+ (0, external_react_namespaceObject.useEffect)(()=>{
150
+ if (!isTheSameArray(cache.orders, orders) || !isTheSameIterable(cache.keys, keyToItem.keys())) {
151
+ cache.orders = orders;
152
+ cache.keys = Array.from(keyToItem.keys());
153
+ const newOrderMap = getOrderMap({
154
+ prev: keyToOrder,
155
+ orders,
156
+ keys: cache.keys
157
+ });
158
+ setKeyToOrder(newOrderMap);
159
+ onOrderMapChange?.(newOrderMap);
160
+ const newRenderKeys = new Set(newOrderMap.keys());
161
+ setRenderKeys((prev)=>prev.intersection(newRenderKeys).union(newRenderKeys.difference(prev)));
162
+ }
163
+ }, [
164
+ dragging,
165
+ orders,
166
+ keyToItem,
167
+ keyToOrder,
168
+ onOrderMapChange
169
+ ]);
170
+ const [renderKeys, setRenderKeys] = (0, external_react_namespaceObject.useState)(()=>new Set(keyToOrder.keys()));
171
+ const recent = (0, external_react_namespaceObject.useRef)(void 0);
172
+ (0, external_react_namespaceObject.useEffect)(()=>{
173
+ if (!!dragging && (!isTheSameArray(dragging.orders, orders) || dragging.columns !== columns || dragging.rows !== rows || dragging.gapX !== gapX || dragging.gapY !== gapY || dragging.itemWidth !== itemWidth || dragging.itemHeight !== itemHeight || !isTheSameIterable(dragging.keyToOrder.keys(), keyToItem.keys()))) {
174
+ setDragging(void 0);
175
+ if (isTheSameArray(dragging.orders, orders) && isTheSameIterable(dragging.keyToOrder.keys(), keyToItem.keys())) {
176
+ setKeyToOrder(dragging.keyToOrder);
177
+ onOrderMapChange?.(dragging.keyToOrder);
178
+ }
179
+ }
180
+ }, [
181
+ orders,
182
+ keyToItem,
183
+ keyToOrder,
184
+ onOrderMapChange
185
+ ]);
186
+ (0, external_react_namespaceObject.useEffect)(()=>{
187
+ if (orderMap === keyToOrder) return;
188
+ if (orderMap) setKeyToOrder(orderMap);
189
+ else onOrderMapChange?.(keyToOrder);
190
+ }, [
191
+ orderMap,
192
+ keyToOrder,
193
+ onOrderMapChange
194
+ ]);
195
+ function onDragMoveStart(key, event) {
196
+ const position = getPosition({
197
+ order: keyToOrder.get(key),
198
+ columns,
199
+ gapX,
200
+ gapY,
201
+ itemWidth,
202
+ itemHeight
203
+ });
204
+ recent.current = key;
205
+ setDragging({
206
+ key,
207
+ startX: position.x,
208
+ startY: position.y,
209
+ deltaX: 0,
210
+ deltaY: 0,
211
+ orders,
212
+ columns,
213
+ rows,
214
+ gapX,
215
+ gapY,
216
+ itemWidth,
217
+ itemHeight,
218
+ keyToOrder: keyToOrder
219
+ });
220
+ }
221
+ function onDragMove(event) {
222
+ if (!dragging) return;
223
+ const { deltaX, deltaY } = event;
224
+ const { key, orders, keyToOrder, startX, startY, columns, gapX, gapY, itemWidth, itemHeight } = dragging;
225
+ log(key);
226
+ setDragging((prev)=>({
227
+ ...prev,
228
+ deltaX,
229
+ deltaY
230
+ }));
231
+ const x = startX + deltaX;
232
+ const y = startY + deltaY;
233
+ const currentOrder = keyToOrder.get(key);
234
+ const currentOrderIndex = orders.indexOf(currentOrder);
235
+ const nearestOrder = orders.toSorted((a, b)=>{
236
+ const aPosition = getPosition({
237
+ order: a,
238
+ columns,
239
+ gapX,
240
+ gapY,
241
+ itemWidth,
242
+ itemHeight
243
+ });
244
+ const bPosition = getPosition({
245
+ order: b,
246
+ columns,
247
+ gapX,
248
+ gapY,
249
+ itemWidth,
250
+ itemHeight
251
+ });
252
+ const aDistance = (x - aPosition.x) ** 2 + (y - aPosition.y) ** 2;
253
+ const bDistance = (x - bPosition.x) ** 2 + (y - bPosition.y) ** 2;
254
+ if (aDistance - bDistance !== 0) return aDistance - bDistance;
255
+ const aIndex = orders.indexOf(a);
256
+ const bIndex = orders.indexOf(b);
257
+ return Math.abs(aIndex - currentOrderIndex) - Math.abs(bIndex - currentOrderIndex);
258
+ })[0];
259
+ if (nearestOrder === currentOrder) {
260
+ setKeyToOrder(keyToOrder);
261
+ onOrderMapChange?.(keyToOrder);
262
+ return;
263
+ }
264
+ const newKeyToOrder = new Map(keyToOrder);
265
+ newKeyToOrder.set(key, nearestOrder);
266
+ const orderToKey = getOrderToKey(keyToOrder);
267
+ if (!orderToKey.has(nearestOrder)) {
268
+ setKeyToOrder(newKeyToOrder);
269
+ onOrderMapChange?.(newKeyToOrder);
270
+ return;
271
+ }
272
+ const nearestOrderIndex = orders.indexOf(nearestOrder);
273
+ const itemDirection = currentOrderIndex > nearestOrderIndex ? "decrease" : "increase";
274
+ const targetDirection = "decrease" === itemDirection && orders.slice(0, nearestOrderIndex).some((order)=>!orderToKey.has(order)) || "increase" === itemDirection && orders.slice(nearestOrderIndex + 1).every((order)=>orderToKey.has(order)) ? "decrease" : "increase";
275
+ function moveTargetOrder(targetOrder) {
276
+ const targetKey = orderToKey.get(targetOrder);
277
+ const targetOrderIndex = orders.indexOf(targetOrder);
278
+ const nextOrderIndex = targetOrderIndex + ("decrease" === targetDirection ? -1 : 1);
279
+ const nextOrder = orders[nextOrderIndex];
280
+ newKeyToOrder.set(targetKey, nextOrder);
281
+ if (nextOrder === currentOrder || !orderToKey.has(nextOrder)) return;
282
+ moveTargetOrder(nextOrder);
283
+ }
284
+ moveTargetOrder(nearestOrder);
285
+ setKeyToOrder(newKeyToOrder);
286
+ onOrderMapChange?.(newKeyToOrder);
287
+ }
288
+ function onDragMoveEnd() {
289
+ if (!dragging) return;
290
+ setDragging(void 0);
291
+ }
292
+ return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("div", {
293
+ className: (0, external_deepsea_tools_namespaceObject.clsx)(external_DraggableGrid_module_cjs_default().draggableGrid, "function" == typeof className ? className({
294
+ isDragging: !!dragging
295
+ }) : className, "function" == typeof classNames?.container ? classNames.container({
296
+ isDragging: !!dragging
297
+ }) : classNames?.container),
298
+ style: {
299
+ "--width": `${columns * (itemWidth + gapX) - gapX}px`,
300
+ "--height": `${rows * (itemHeight + gapY) - gapY}px`,
301
+ ..."function" == typeof style ? style({
302
+ isDragging: !!dragging
303
+ }) : style
304
+ },
305
+ ...rest,
306
+ children: Array.from(renderKeys).map((key)=>{
307
+ const item = keyToItem.get(key);
308
+ const order = keyToOrder.get(key);
309
+ const isDragging = dragging?.key === key;
310
+ const position = getPosition({
311
+ order,
312
+ columns,
313
+ gapX,
314
+ gapY,
315
+ itemWidth,
316
+ itemHeight
317
+ });
318
+ const style = isDragging ? {
319
+ "--width": `${itemWidth}px`,
320
+ "--height": `${itemHeight}px`,
321
+ "--translate-x": `${dragging.startX + dragging.deltaX}px`,
322
+ "--translate-y": `${dragging.startY + dragging.deltaY}px`,
323
+ "--transition-property": "none",
324
+ "--z-index": 999999
325
+ } : {
326
+ "--width": `${itemWidth}px`,
327
+ "--height": `${itemHeight}px`,
328
+ "--translate-x": `${position.x}px`,
329
+ "--translate-y": `${position.y}px`,
330
+ "--transition-property": "transform",
331
+ "--z-index": recent.current === key ? 999999 : keyToOrder.get(key)
332
+ };
333
+ const children = render ? render(item, {
334
+ order,
335
+ isDragging: isDragging
336
+ }) : item;
337
+ return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(DraggableGridItem, {
338
+ className: (0, external_deepsea_tools_namespaceObject.clsx)(external_DraggableGrid_module_cjs_default().draggableGridItem, "function" == typeof classNames?.item ? classNames.item({
339
+ order,
340
+ isDragging: isDragging
341
+ }) : classNames?.item),
342
+ style: style,
343
+ onDragMoveStart: disabled ? void 0 : (event)=>onDragMoveStart(key, event),
344
+ onDragMove: disabled ? void 0 : onDragMove,
345
+ onDragMoveEnd: disabled ? void 0 : onDragMoveEnd,
346
+ children: children
347
+ }, key);
348
+ })
349
+ });
350
+ }
351
+ exports.DraggableGrid = __webpack_exports__.DraggableGrid;
352
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
353
+ "DraggableGrid"
354
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
355
+ Object.defineProperty(exports, '__esModule', {
356
+ value: true
357
+ });
@@ -0,0 +1,82 @@
1
+ import { CSSProperties, ComponentProps, Key, ReactNode } from "react";
2
+ export type DraggableGridClassName = string | ((status: ContainerStatus) => string);
3
+ export type DraggableGridItemClassName = string | ((status: DraggableGridItemStatus) => string);
4
+ export type DraggableGridStyle = CSSProperties | ((status: ContainerStatus) => CSSProperties);
5
+ export interface DraggableGridClassNames {
6
+ /** 容器 */
7
+ container?: DraggableGridClassName;
8
+ /** 元素 */
9
+ item?: DraggableGridItemClassName;
10
+ }
11
+ export interface ContainerStatus {
12
+ /** 是否被拖拽 */
13
+ isDragging: boolean;
14
+ }
15
+ export interface DraggableGridItemStatus {
16
+ /** 当前次序 */
17
+ order: number;
18
+ /** 是否被拖拽 */
19
+ isDragging: boolean;
20
+ }
21
+ /** 元素的 key 到次序的映射 */
22
+ export type DraggableGridKeyToOrder = Map<Key, number>;
23
+ /** 次序到元素的 key 的映射 */
24
+ export type DraggableGridOrderToKey = Map<number, Key>;
25
+ export type DraggableGridProps<T> = Omit<ComponentProps<"div">, "className" | "children"> & {
26
+ /** 类名 */
27
+ className?: DraggableGridClassName;
28
+ /** 类名 */
29
+ classNames?: DraggableGridClassNames;
30
+ /** 样式 */
31
+ style?: DraggableGridStyle;
32
+ /** 数据源 */
33
+ items?: T[];
34
+ /** 是否禁用拖拽 */
35
+ disabled?: boolean;
36
+ /** 列数 */
37
+ columns: number;
38
+ /** 行数 */
39
+ rows: number;
40
+ /**
41
+ * 间距
42
+ * @default 0
43
+ */
44
+ gap?: number;
45
+ /**
46
+ * 水平间距
47
+ * @default 0
48
+ */
49
+ gapX?: number;
50
+ /**
51
+ * 垂直间距
52
+ * @default 0
53
+ */
54
+ gapY?: number;
55
+ /** 元素宽度 */
56
+ itemWidth: number;
57
+ /** 元素高度 */
58
+ itemHeight: number;
59
+ /** 元素的 key 到次序的映射 */
60
+ orderMap?: DraggableGridKeyToOrder;
61
+ /** 次序变化时回调 */
62
+ onOrderMapChange?: (orderMap: DraggableGridKeyToOrder) => void;
63
+ /** 禁用的元素 */
64
+ isItemDisabled?: Key[] | ((item: T) => boolean);
65
+ /** 禁用的次序 */
66
+ isOrderDisabled?: number[] | ((order: number) => boolean);
67
+ /** 次序的优先级,可以通过此函数调整元素的优先放置的方向,左上,右上,左下,右下,中心,顺时针,逆时针等等 */
68
+ orderPriority?: (a: number, b: number) => number;
69
+ } & (T extends ReactNode ? {
70
+ /** 渲染函数,当 T 为 ReactNode 时,render 为可选 */
71
+ render?: (item: T, status: DraggableGridItemStatus) => ReactNode;
72
+ } : {
73
+ /** 渲染函数,当 T 为 ReactNode 时,render 为可选 */
74
+ render: (item: T, status: DraggableGridItemStatus) => ReactNode;
75
+ }) & (T extends Key ? {
76
+ /** 获取 key 的函数,当 T 为 Key 时,keyExtractor 为可选 */
77
+ keyExtractor?: (item: T) => Key;
78
+ } : {
79
+ /** 获取 key 的函数,当 T 为 Key 时,keyExtractor 为可选 */
80
+ keyExtractor: (item: T) => Key;
81
+ });
82
+ export declare function DraggableGrid<T>({ className, classNames, style, items, disabled, columns, rows, gap, gapX, gapY, itemWidth, itemHeight, orderMap, onOrderMapChange, render, keyExtractor, isItemDisabled, isOrderDisabled, orderPriority, ...rest }: DraggableGridProps<T>): import("react/jsx-runtime").JSX.Element;