@chenzy-design/core 0.2.1 → 0.4.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/ai-chat-dialogue.d.ts +300 -0
- package/dist/ai-chat-dialogue.d.ts.map +1 -0
- package/dist/ai-chat-dialogue.js +699 -0
- package/dist/ai-chat-dialogue.js.map +1 -0
- package/dist/ai-chat-dialogue.test.d.ts +2 -0
- package/dist/ai-chat-dialogue.test.d.ts.map +1 -0
- package/dist/ai-chat-dialogue.test.js +338 -0
- package/dist/ai-chat-dialogue.test.js.map +1 -0
- package/dist/ai-chat-input.d.ts +191 -0
- package/dist/ai-chat-input.d.ts.map +1 -0
- package/dist/ai-chat-input.js +274 -0
- package/dist/ai-chat-input.js.map +1 -0
- package/dist/ai-chat-input.test.d.ts +2 -0
- package/dist/ai-chat-input.test.d.ts.map +1 -0
- package/dist/ai-chat-input.test.js +339 -0
- package/dist/ai-chat-input.test.js.map +1 -0
- package/dist/audio-player.d.ts +154 -0
- package/dist/audio-player.d.ts.map +1 -0
- package/dist/audio-player.js +254 -0
- package/dist/audio-player.js.map +1 -0
- package/dist/audio-player.test.d.ts +2 -0
- package/dist/audio-player.test.d.ts.map +1 -0
- package/dist/audio-player.test.js +275 -0
- package/dist/audio-player.test.js.map +1 -0
- package/dist/back-top.d.ts +4 -1
- package/dist/back-top.d.ts.map +1 -1
- package/dist/back-top.js +5 -2
- package/dist/back-top.js.map +1 -1
- package/dist/back-top.test.js +3 -2
- package/dist/back-top.test.js.map +1 -1
- package/dist/calendar.d.ts +132 -44
- package/dist/calendar.d.ts.map +1 -1
- package/dist/calendar.js +413 -70
- package/dist/calendar.js.map +1 -1
- package/dist/calendar.test.js +160 -76
- package/dist/calendar.test.js.map +1 -1
- package/dist/chat.d.ts +172 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +210 -0
- package/dist/chat.js.map +1 -0
- package/dist/chat.test.d.ts +2 -0
- package/dist/chat.test.d.ts.map +1 -0
- package/dist/chat.test.js +181 -0
- package/dist/chat.test.js.map +1 -0
- package/dist/code-highlight.d.ts +30 -0
- package/dist/code-highlight.d.ts.map +1 -0
- package/dist/code-highlight.js +37 -0
- package/dist/code-highlight.js.map +1 -0
- package/dist/code-highlight.test.d.ts +2 -0
- package/dist/code-highlight.test.d.ts.map +1 -0
- package/dist/code-highlight.test.js +36 -0
- package/dist/code-highlight.test.js.map +1 -0
- package/dist/collapsible.d.ts +41 -0
- package/dist/collapsible.d.ts.map +1 -0
- package/dist/collapsible.js +33 -0
- package/dist/collapsible.js.map +1 -0
- package/dist/collapsible.test.d.ts +2 -0
- package/dist/collapsible.test.d.ts.map +1 -0
- package/dist/collapsible.test.js +57 -0
- package/dist/collapsible.test.js.map +1 -0
- package/dist/color-value.d.ts +60 -0
- package/dist/color-value.d.ts.map +1 -0
- package/dist/color-value.js +165 -0
- package/dist/color-value.js.map +1 -0
- package/dist/color-value.test.d.ts +2 -0
- package/dist/color-value.test.d.ts.map +1 -0
- package/dist/color-value.test.js +104 -0
- package/dist/color-value.test.js.map +1 -0
- package/dist/config-provider.d.ts +76 -37
- package/dist/config-provider.d.ts.map +1 -1
- package/dist/config-provider.js +107 -32
- package/dist/config-provider.js.map +1 -1
- package/dist/config-provider.test.js +123 -60
- package/dist/config-provider.test.js.map +1 -1
- package/dist/cropper.d.ts +164 -0
- package/dist/cropper.d.ts.map +1 -0
- package/dist/cropper.js +841 -0
- package/dist/cropper.js.map +1 -0
- package/dist/cropper.test.d.ts +2 -0
- package/dist/cropper.test.d.ts.map +1 -0
- package/dist/cropper.test.js +259 -0
- package/dist/cropper.test.js.map +1 -0
- package/dist/drag-move.d.ts +119 -0
- package/dist/drag-move.d.ts.map +1 -0
- package/dist/drag-move.js +237 -0
- package/dist/drag-move.js.map +1 -0
- package/dist/drag-move.test.d.ts +2 -0
- package/dist/drag-move.test.d.ts.map +1 -0
- package/dist/drag-move.test.js +304 -0
- package/dist/drag-move.test.js.map +1 -0
- package/dist/editable.d.ts +24 -4
- package/dist/editable.d.ts.map +1 -1
- package/dist/editable.js +18 -0
- package/dist/editable.js.map +1 -1
- package/dist/editable.test.js +55 -2
- package/dist/editable.test.js.map +1 -1
- package/dist/ellipsis.d.ts +13 -0
- package/dist/ellipsis.d.ts.map +1 -1
- package/dist/ellipsis.js +36 -0
- package/dist/ellipsis.js.map +1 -1
- package/dist/ellipsis.test.js +37 -1
- package/dist/ellipsis.test.js.map +1 -1
- package/dist/form-path.d.ts +19 -0
- package/dist/form-path.d.ts.map +1 -0
- package/dist/form-path.js +97 -0
- package/dist/form-path.js.map +1 -0
- package/dist/form-path.test.d.ts +2 -0
- package/dist/form-path.test.d.ts.map +1 -0
- package/dist/form-path.test.js +57 -0
- package/dist/form-path.test.js.map +1 -0
- package/dist/form-validate.d.ts +13 -0
- package/dist/form-validate.d.ts.map +1 -0
- package/dist/form-validate.js +204 -0
- package/dist/form-validate.js.map +1 -0
- package/dist/form.d.ts +91 -18
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +170 -115
- package/dist/form.js.map +1 -1
- package/dist/form.test.js +349 -76
- package/dist/form.test.js.map +1 -1
- package/dist/highlight.d.ts +42 -32
- package/dist/highlight.d.ts.map +1 -1
- package/dist/highlight.js +67 -41
- package/dist/highlight.js.map +1 -1
- package/dist/highlight.test.js +73 -32
- package/dist/highlight.test.js.map +1 -1
- package/dist/hotkeys.d.ts +151 -0
- package/dist/hotkeys.d.ts.map +1 -0
- package/dist/hotkeys.js +188 -0
- package/dist/hotkeys.js.map +1 -0
- package/dist/hotkeys.test.d.ts +2 -0
- package/dist/hotkeys.test.d.ts.map +1 -0
- package/dist/hotkeys.test.js +170 -0
- package/dist/hotkeys.test.js.map +1 -0
- package/dist/index.d.ts +33 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -13
- package/dist/index.js.map +1 -1
- package/dist/input.d.ts +34 -0
- package/dist/input.d.ts.map +1 -0
- package/dist/input.js +54 -0
- package/dist/input.js.map +1 -0
- package/dist/input.test.d.ts +2 -0
- package/dist/input.test.d.ts.map +1 -0
- package/dist/input.test.js +56 -0
- package/dist/input.test.js.map +1 -0
- package/dist/markdown-render.d.ts +49 -0
- package/dist/markdown-render.d.ts.map +1 -0
- package/dist/markdown-render.js +61 -0
- package/dist/markdown-render.js.map +1 -0
- package/dist/markdown-render.test.d.ts +2 -0
- package/dist/markdown-render.test.d.ts.map +1 -0
- package/dist/markdown-render.test.js +106 -0
- package/dist/markdown-render.test.js.map +1 -0
- package/dist/notification.d.ts +40 -31
- package/dist/notification.d.ts.map +1 -1
- package/dist/notification.js +86 -70
- package/dist/notification.js.map +1 -1
- package/dist/notification.test.js +62 -39
- package/dist/notification.test.js.map +1 -1
- package/dist/numeral.d.ts +32 -0
- package/dist/numeral.d.ts.map +1 -0
- package/dist/numeral.js +67 -0
- package/dist/numeral.js.map +1 -0
- package/dist/numeral.test.d.ts +2 -0
- package/dist/numeral.test.d.ts.map +1 -0
- package/dist/numeral.test.js +59 -0
- package/dist/numeral.test.js.map +1 -0
- package/dist/overflow-list.d.ts +9 -40
- package/dist/overflow-list.d.ts.map +1 -1
- package/dist/overflow-list.js +9 -70
- package/dist/overflow-list.js.map +1 -1
- package/dist/overflow-list.test.js +1 -122
- package/dist/overflow-list.test.js.map +1 -1
- package/dist/pagination.d.ts +17 -0
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +48 -0
- package/dist/pagination.js.map +1 -1
- package/dist/pagination.test.js +40 -1
- package/dist/pagination.test.js.map +1 -1
- package/dist/pincode.d.ts +79 -0
- package/dist/pincode.d.ts.map +1 -0
- package/dist/pincode.js +119 -0
- package/dist/pincode.js.map +1 -0
- package/dist/pincode.test.d.ts +2 -0
- package/dist/pincode.test.d.ts.map +1 -0
- package/dist/pincode.test.js +151 -0
- package/dist/pincode.test.js.map +1 -0
- package/dist/progress.d.ts +32 -30
- package/dist/progress.d.ts.map +1 -1
- package/dist/progress.js +257 -64
- package/dist/progress.js.map +1 -1
- package/dist/progress.test.js +50 -47
- package/dist/progress.test.js.map +1 -1
- package/dist/resizable.d.ts +200 -0
- package/dist/resizable.d.ts.map +1 -0
- package/dist/resizable.js +329 -0
- package/dist/resizable.js.map +1 -0
- package/dist/resizable.test.d.ts +2 -0
- package/dist/resizable.test.d.ts.map +1 -0
- package/dist/resizable.test.js +302 -0
- package/dist/resizable.test.js.map +1 -0
- package/dist/scroll-list.d.ts +69 -62
- package/dist/scroll-list.d.ts.map +1 -1
- package/dist/scroll-list.js +103 -144
- package/dist/scroll-list.js.map +1 -1
- package/dist/scroll-list.test.js +100 -110
- package/dist/scroll-list.test.js.map +1 -1
- package/dist/sidebar.d.ts +46 -0
- package/dist/sidebar.d.ts.map +1 -0
- package/dist/sidebar.js +65 -0
- package/dist/sidebar.js.map +1 -0
- package/dist/sidebar.test.d.ts +2 -0
- package/dist/sidebar.test.d.ts.map +1 -0
- package/dist/sidebar.test.js +88 -0
- package/dist/sidebar.test.js.map +1 -0
- package/dist/spin.d.ts +5 -5
- package/dist/spin.d.ts.map +1 -1
- package/dist/spin.js +13 -39
- package/dist/spin.js.map +1 -1
- package/dist/spin.test.js +2 -26
- package/dist/spin.test.js.map +1 -1
- package/dist/toast.d.ts +33 -30
- package/dist/toast.d.ts.map +1 -1
- package/dist/toast.js +77 -72
- package/dist/toast.js.map +1 -1
- package/dist/toast.test.js +63 -37
- package/dist/toast.test.js.map +1 -1
- package/dist/tree.d.ts +22 -5
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +61 -9
- package/dist/tree.js.map +1 -1
- package/dist/tree.test.js +72 -1
- package/dist/tree.test.js.map +1 -1
- package/dist/user-guide.d.ts +73 -0
- package/dist/user-guide.d.ts.map +1 -0
- package/dist/user-guide.js +95 -0
- package/dist/user-guide.js.map +1 -0
- package/dist/user-guide.test.d.ts +2 -0
- package/dist/user-guide.test.d.ts.map +1 -0
- package/dist/user-guide.test.js +109 -0
- package/dist/user-guide.test.js.map +1 -0
- package/dist/video-player.d.ts +196 -0
- package/dist/video-player.d.ts.map +1 -0
- package/dist/video-player.js +461 -0
- package/dist/video-player.js.map +1 -0
- package/dist/video-player.test.d.ts +2 -0
- package/dist/video-player.test.d.ts.map +1 -0
- package/dist/video-player.test.js +435 -0
- package/dist/video-player.test.js.map +1 -0
- package/package.json +17 -1
- package/dist/banner.d.ts +0 -19
- package/dist/banner.d.ts.map +0 -1
- package/dist/banner.js +0 -20
- package/dist/banner.js.map +0 -1
- package/dist/banner.test.d.ts +0 -2
- package/dist/banner.test.d.ts.map +0 -1
- package/dist/banner.test.js +0 -29
- package/dist/banner.test.js.map +0 -1
- package/dist/breakpoints.d.ts +0 -30
- package/dist/breakpoints.d.ts.map +0 -1
- package/dist/breakpoints.js +0 -45
- package/dist/breakpoints.js.map +0 -1
- package/dist/breakpoints.test.d.ts +0 -2
- package/dist/breakpoints.test.d.ts.map +0 -1
- package/dist/breakpoints.test.js +0 -46
- package/dist/breakpoints.test.js.map +0 -1
- package/dist/lottie-icon.d.ts +0 -88
- package/dist/lottie-icon.d.ts.map +0 -1
- package/dist/lottie-icon.js +0 -84
- package/dist/lottie-icon.js.map +0 -1
- package/dist/lottie-icon.test.d.ts +0 -2
- package/dist/lottie-icon.test.d.ts.map +0 -1
- package/dist/lottie-icon.test.js +0 -88
- package/dist/lottie-icon.test.js.map +0 -1
- package/dist/sider.d.ts +0 -26
- package/dist/sider.d.ts.map +0 -1
- package/dist/sider.js +0 -55
- package/dist/sider.js.map +0 -1
- package/dist/sider.test.d.ts +0 -2
- package/dist/sider.test.d.ts.map +0 -1
- package/dist/sider.test.js +0 -29
- package/dist/sider.test.js.map +0 -1
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* drag-move — framework-agnostic drag-to-move geometry primitive for the
|
|
3
|
+
* DragMove component. Second shared drag primitive lowered to core (after
|
|
4
|
+
* createResizeDrag): moves an element's position within an optional constrainer
|
|
5
|
+
* region. Designed to converge Modal's draggable title bar + Cropper's canvas
|
|
6
|
+
* drag (see specs/components/other/DragMove.spec.md §12).
|
|
7
|
+
*
|
|
8
|
+
* Geometry ported from semi-foundation/dragMove/foundation. No framework deps,
|
|
9
|
+
* no reactive attachments — the start listener is bound on the handler and the
|
|
10
|
+
* document move/up listeners are bound imperatively on pointerdown and released
|
|
11
|
+
* on up/destroy (DragMove.spec.md §3, redline #3).
|
|
12
|
+
*
|
|
13
|
+
* Unlike createResizeDrag (which changes size), createDragMove changes the
|
|
14
|
+
* element's top/left position, clamping into the constrainer bounds.
|
|
15
|
+
*/
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Helpers
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
/** Clamp `value` into `[min, max]`. */
|
|
20
|
+
export const clampValueInRange = (value, min, max) => Math.min(Math.max(value, min), max);
|
|
21
|
+
/**
|
|
22
|
+
* Compute the pixel range within which `element` may move so it stays inside
|
|
23
|
+
* `constrainer`. Ported from semi-foundation dragMove `_calcMoveRange`: walks
|
|
24
|
+
* offsetParent chain from the element up to the constrainer, accumulating the
|
|
25
|
+
* offset, then derives min/max from the constrainer box minus the element box.
|
|
26
|
+
* Returns `null` when there is no constrainer (free move).
|
|
27
|
+
*/
|
|
28
|
+
export const calcMoveRange = (element, constrainer) => {
|
|
29
|
+
if (!constrainer)
|
|
30
|
+
return null;
|
|
31
|
+
let node = element.offsetParent;
|
|
32
|
+
let startX = 0;
|
|
33
|
+
let startY = 0;
|
|
34
|
+
while (node !== constrainer && node !== null) {
|
|
35
|
+
startX -= node.offsetLeft;
|
|
36
|
+
startY -= node.offsetTop;
|
|
37
|
+
node = node.offsetParent;
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
xMin: startX,
|
|
41
|
+
xMax: startX + constrainer.offsetWidth - element.offsetWidth,
|
|
42
|
+
yMin: startY,
|
|
43
|
+
yMax: startY + constrainer.offsetHeight - element.offsetHeight,
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Given the pointer position, the recorded start offset, and an optional move
|
|
48
|
+
* range, compute the clamped `{ top, left }` for the element. Pure — no DOM
|
|
49
|
+
* writes, so it is trivially unit-testable.
|
|
50
|
+
*/
|
|
51
|
+
export const computeNextPosition = (clientX, clientY, startOffsetX, startOffsetY, range) => {
|
|
52
|
+
let left = clientX - startOffsetX;
|
|
53
|
+
let top = clientY - startOffsetY;
|
|
54
|
+
if (range) {
|
|
55
|
+
left = clampValueInRange(left, range.xMin, range.xMax);
|
|
56
|
+
top = clampValueInRange(top, range.yMin, range.yMax);
|
|
57
|
+
}
|
|
58
|
+
return { top, left };
|
|
59
|
+
};
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// createDragMove — drag-to-move lifecycle primitive
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
/**
|
|
64
|
+
* createDragMove — manages the full drag-to-move lifecycle:
|
|
65
|
+
* `init()` binds mousedown/touchstart on the handler and forces the drag
|
|
66
|
+
* element to `position: absolute`. On pointerdown it records the pointer→element
|
|
67
|
+
* offset + move range, binds document move/up listeners, then each move computes
|
|
68
|
+
* the clamped position and applies it (via `customMove` or `style.top/left`),
|
|
69
|
+
* and up releases the document listeners. `destroy()` is an unmount safety net.
|
|
70
|
+
*
|
|
71
|
+
* Covers the Modal draggable-title-bar case (DragMove.spec.md §12): supply a
|
|
72
|
+
* `handler` returning the title bar, `getElement` returning the dialog, and a
|
|
73
|
+
* `constrainer` returning the viewport/parent.
|
|
74
|
+
*/
|
|
75
|
+
export function createDragMove(options) {
|
|
76
|
+
const doc = options.ownerDocument ??
|
|
77
|
+
(typeof document !== 'undefined' ? document : undefined);
|
|
78
|
+
let element = null;
|
|
79
|
+
let handlerEl = null;
|
|
80
|
+
let dragging = false;
|
|
81
|
+
let startOffsetX = 0;
|
|
82
|
+
let startOffsetY = 0;
|
|
83
|
+
let range = null;
|
|
84
|
+
let initialized = false;
|
|
85
|
+
const resolveHandler = () => {
|
|
86
|
+
if (options.handler)
|
|
87
|
+
return options.handler();
|
|
88
|
+
return options.getElement();
|
|
89
|
+
};
|
|
90
|
+
const allow = (e) => {
|
|
91
|
+
// Clicking an input/textarea should be allowed, but dragging from it
|
|
92
|
+
// should not (avoids hijacking text selection) unless opted in.
|
|
93
|
+
if (!options.allowInputDrag) {
|
|
94
|
+
const target = e.target;
|
|
95
|
+
const tag = target?.tagName?.toLowerCase();
|
|
96
|
+
if (tag === 'input' || tag === 'textarea')
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
if (!element)
|
|
100
|
+
return false;
|
|
101
|
+
if (options.allowMove)
|
|
102
|
+
return options.allowMove(e, element);
|
|
103
|
+
return true;
|
|
104
|
+
};
|
|
105
|
+
const calcOffset = (point) => {
|
|
106
|
+
if (!element)
|
|
107
|
+
return;
|
|
108
|
+
startOffsetX = point.clientX - element.offsetLeft;
|
|
109
|
+
startOffsetY = point.clientY - element.offsetTop;
|
|
110
|
+
};
|
|
111
|
+
const applyPosition = (point, e) => {
|
|
112
|
+
if (!element)
|
|
113
|
+
return;
|
|
114
|
+
const { top, left } = computeNextPosition(point.clientX, point.clientY, startOffsetX, startOffsetY, range);
|
|
115
|
+
if (options.customMove) {
|
|
116
|
+
options.customMove(element, top, left);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
element.style.top = `${top}px`;
|
|
120
|
+
element.style.left = `${left}px`;
|
|
121
|
+
}
|
|
122
|
+
options.onMove?.(top, left, e, element);
|
|
123
|
+
};
|
|
124
|
+
const onMouseMove = (e) => {
|
|
125
|
+
if (!dragging)
|
|
126
|
+
return;
|
|
127
|
+
options.onMouseMove?.(e);
|
|
128
|
+
applyPosition(e, e);
|
|
129
|
+
};
|
|
130
|
+
const onTouchMove = (e) => {
|
|
131
|
+
if (!dragging)
|
|
132
|
+
return;
|
|
133
|
+
options.onTouchMove?.(e);
|
|
134
|
+
const touch = e.targetTouches[0];
|
|
135
|
+
if (touch)
|
|
136
|
+
applyPosition(touch, e);
|
|
137
|
+
};
|
|
138
|
+
const detachMouse = () => {
|
|
139
|
+
doc?.removeEventListener('mousemove', onMouseMove);
|
|
140
|
+
doc?.removeEventListener('mouseup', onMouseUp);
|
|
141
|
+
};
|
|
142
|
+
const detachTouch = () => {
|
|
143
|
+
doc?.removeEventListener('touchmove', onTouchMove);
|
|
144
|
+
doc?.removeEventListener('touchend', onTouchEnd);
|
|
145
|
+
doc?.removeEventListener('touchcancel', onTouchCancel);
|
|
146
|
+
};
|
|
147
|
+
function onMouseUp(e) {
|
|
148
|
+
dragging = false;
|
|
149
|
+
options.onMouseUp?.(e);
|
|
150
|
+
detachMouse();
|
|
151
|
+
if (element)
|
|
152
|
+
options.onEnd?.(e, element);
|
|
153
|
+
}
|
|
154
|
+
function onTouchEnd(e) {
|
|
155
|
+
dragging = false;
|
|
156
|
+
options.onTouchEnd?.(e);
|
|
157
|
+
detachTouch();
|
|
158
|
+
if (element)
|
|
159
|
+
options.onEnd?.(e, element);
|
|
160
|
+
}
|
|
161
|
+
function onTouchCancel(e) {
|
|
162
|
+
dragging = false;
|
|
163
|
+
options.onTouchCancel?.(e);
|
|
164
|
+
detachTouch();
|
|
165
|
+
if (element)
|
|
166
|
+
options.onEnd?.(e, element);
|
|
167
|
+
}
|
|
168
|
+
const onMouseDown = (e) => {
|
|
169
|
+
if (!element)
|
|
170
|
+
return;
|
|
171
|
+
range = calcMoveRange(element, options.constrainer?.() ?? null);
|
|
172
|
+
options.onMouseDown?.(e);
|
|
173
|
+
if (!allow(e))
|
|
174
|
+
return;
|
|
175
|
+
dragging = true;
|
|
176
|
+
calcOffset(e);
|
|
177
|
+
options.onStart?.(e, element);
|
|
178
|
+
if (doc) {
|
|
179
|
+
doc.addEventListener('mousemove', onMouseMove);
|
|
180
|
+
doc.addEventListener('mouseup', onMouseUp);
|
|
181
|
+
}
|
|
182
|
+
// prevent default so other elements (img/text) are not selected
|
|
183
|
+
e.preventDefault();
|
|
184
|
+
};
|
|
185
|
+
const onTouchStart = (e) => {
|
|
186
|
+
if (!element)
|
|
187
|
+
return;
|
|
188
|
+
range = calcMoveRange(element, options.constrainer?.() ?? null);
|
|
189
|
+
options.onTouchStart?.(e);
|
|
190
|
+
if (!allow(e))
|
|
191
|
+
return;
|
|
192
|
+
const touch = e.targetTouches[0];
|
|
193
|
+
if (!touch)
|
|
194
|
+
return;
|
|
195
|
+
dragging = true;
|
|
196
|
+
calcOffset(touch);
|
|
197
|
+
options.onStart?.(e, element);
|
|
198
|
+
if (doc) {
|
|
199
|
+
doc.addEventListener('touchmove', onTouchMove);
|
|
200
|
+
doc.addEventListener('touchend', onTouchEnd);
|
|
201
|
+
doc.addEventListener('touchcancel', onTouchCancel);
|
|
202
|
+
}
|
|
203
|
+
e.preventDefault();
|
|
204
|
+
};
|
|
205
|
+
const unregisterStart = () => {
|
|
206
|
+
handlerEl?.removeEventListener('mousedown', onMouseDown);
|
|
207
|
+
handlerEl?.removeEventListener('touchstart', onTouchStart);
|
|
208
|
+
};
|
|
209
|
+
return {
|
|
210
|
+
init() {
|
|
211
|
+
if (initialized)
|
|
212
|
+
return;
|
|
213
|
+
element = options.getElement();
|
|
214
|
+
if (!element) {
|
|
215
|
+
throw new Error('DragMove: drag element must be a valid element');
|
|
216
|
+
}
|
|
217
|
+
handlerEl = resolveHandler() ?? element;
|
|
218
|
+
// 对齐 Semi foundation init:element 强制 absolute(top/left 生效),handler 命令式写 cursor:move。
|
|
219
|
+
element.style.position = 'absolute';
|
|
220
|
+
handlerEl.style.cursor = 'move';
|
|
221
|
+
handlerEl.addEventListener('mousedown', onMouseDown);
|
|
222
|
+
handlerEl.addEventListener('touchstart', onTouchStart);
|
|
223
|
+
initialized = true;
|
|
224
|
+
},
|
|
225
|
+
isDragging() {
|
|
226
|
+
return dragging;
|
|
227
|
+
},
|
|
228
|
+
destroy() {
|
|
229
|
+
dragging = false;
|
|
230
|
+
unregisterStart();
|
|
231
|
+
detachMouse();
|
|
232
|
+
detachTouch();
|
|
233
|
+
initialized = false;
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=drag-move.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drag-move.js","sourceRoot":"","sources":["../src/drag-move.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drag-move.test.d.ts","sourceRoot":"","sources":["../src/drag-move.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { createDragMove, calcMoveRange, computeNextPosition, clampValueInRange, } from './drag-move.js';
|
|
3
|
+
// ---- fake document so we can drive pointer events without a real DOM ----
|
|
4
|
+
function makeFakeDoc() {
|
|
5
|
+
const listeners = new Map();
|
|
6
|
+
return {
|
|
7
|
+
addEventListener(type, fn) {
|
|
8
|
+
if (!listeners.has(type))
|
|
9
|
+
listeners.set(type, new Set());
|
|
10
|
+
listeners.get(type).add(fn);
|
|
11
|
+
},
|
|
12
|
+
removeEventListener(type, fn) {
|
|
13
|
+
listeners.get(type)?.delete(fn);
|
|
14
|
+
},
|
|
15
|
+
fire(type, e) {
|
|
16
|
+
for (const fn of [...(listeners.get(type) ?? [])])
|
|
17
|
+
fn(e);
|
|
18
|
+
},
|
|
19
|
+
count(type) {
|
|
20
|
+
return listeners.get(type)?.size ?? 0;
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
// ---- fake handler/element that records its own listeners ----
|
|
25
|
+
function makeFakeEl(overrides = {}) {
|
|
26
|
+
const l = new Map();
|
|
27
|
+
const style = {};
|
|
28
|
+
return {
|
|
29
|
+
style,
|
|
30
|
+
offsetLeft: overrides.offsetLeft ?? 0,
|
|
31
|
+
offsetTop: overrides.offsetTop ?? 0,
|
|
32
|
+
offsetWidth: overrides.offsetWidth ?? 50,
|
|
33
|
+
offsetHeight: overrides.offsetHeight ?? 50,
|
|
34
|
+
offsetParent: overrides.offsetParent ?? null,
|
|
35
|
+
addEventListener(t, fn) {
|
|
36
|
+
if (!l.has(t))
|
|
37
|
+
l.set(t, new Set());
|
|
38
|
+
l.get(t).add(fn);
|
|
39
|
+
},
|
|
40
|
+
removeEventListener(t, fn) {
|
|
41
|
+
l.get(t)?.delete(fn);
|
|
42
|
+
},
|
|
43
|
+
fire(t, e) {
|
|
44
|
+
for (const fn of [...(l.get(t) ?? [])])
|
|
45
|
+
fn(e);
|
|
46
|
+
},
|
|
47
|
+
count(t) {
|
|
48
|
+
return l.get(t)?.size ?? 0;
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const me = (x, y, target) => ({
|
|
53
|
+
clientX: x,
|
|
54
|
+
clientY: y,
|
|
55
|
+
target,
|
|
56
|
+
preventDefault: () => { },
|
|
57
|
+
});
|
|
58
|
+
const te = (x, y, target) => ({
|
|
59
|
+
targetTouches: [{ clientX: x, clientY: y }],
|
|
60
|
+
target,
|
|
61
|
+
preventDefault: () => { },
|
|
62
|
+
});
|
|
63
|
+
describe('clampValueInRange', () => {
|
|
64
|
+
it('clamps into [min, max]', () => {
|
|
65
|
+
expect(clampValueInRange(5, 0, 10)).toBe(5);
|
|
66
|
+
expect(clampValueInRange(-3, 0, 10)).toBe(0);
|
|
67
|
+
expect(clampValueInRange(99, 0, 10)).toBe(10);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('computeNextPosition', () => {
|
|
71
|
+
it('unconstrained: top/left = client − start offset', () => {
|
|
72
|
+
expect(computeNextPosition(120, 80, 20, 10, null)).toEqual({
|
|
73
|
+
left: 100,
|
|
74
|
+
top: 70,
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
it('clamps to move range on both axes', () => {
|
|
78
|
+
const range = { xMin: 0, xMax: 100, yMin: 0, yMax: 60 };
|
|
79
|
+
// would be left=-50 (→0), top=200 (→60)
|
|
80
|
+
expect(computeNextPosition(-30, 210, 20, 10, range)).toEqual({
|
|
81
|
+
left: 0,
|
|
82
|
+
top: 60,
|
|
83
|
+
});
|
|
84
|
+
// in-range passes through
|
|
85
|
+
expect(computeNextPosition(70, 50, 20, 10, range)).toEqual({
|
|
86
|
+
left: 50,
|
|
87
|
+
top: 40,
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('calcMoveRange', () => {
|
|
92
|
+
it('returns null when no constrainer', () => {
|
|
93
|
+
const el = makeFakeEl();
|
|
94
|
+
expect(calcMoveRange(el, null)).toBeNull();
|
|
95
|
+
});
|
|
96
|
+
it('derives range from constrainer box minus element box (direct child)', () => {
|
|
97
|
+
const constrainer = makeFakeEl({ offsetWidth: 400, offsetHeight: 300 });
|
|
98
|
+
const el = makeFakeEl({
|
|
99
|
+
offsetWidth: 100,
|
|
100
|
+
offsetHeight: 80,
|
|
101
|
+
// offsetParent === constrainer → loop does not run, start = 0
|
|
102
|
+
offsetParent: constrainer,
|
|
103
|
+
});
|
|
104
|
+
const range = calcMoveRange(el, constrainer);
|
|
105
|
+
expect(range).toEqual({ xMin: 0, xMax: 300, yMin: 0, yMax: 220 });
|
|
106
|
+
});
|
|
107
|
+
it('accumulates intermediate offsetParent offsets', () => {
|
|
108
|
+
const constrainer = makeFakeEl({ offsetWidth: 400, offsetHeight: 300 });
|
|
109
|
+
const mid = makeFakeEl({
|
|
110
|
+
offsetLeft: 30,
|
|
111
|
+
offsetTop: 20,
|
|
112
|
+
offsetParent: constrainer,
|
|
113
|
+
});
|
|
114
|
+
const el = makeFakeEl({
|
|
115
|
+
offsetWidth: 100,
|
|
116
|
+
offsetHeight: 80,
|
|
117
|
+
offsetParent: mid,
|
|
118
|
+
});
|
|
119
|
+
const range = calcMoveRange(el, constrainer);
|
|
120
|
+
// start accumulates -mid.offsetLeft/-mid.offsetTop
|
|
121
|
+
expect(range).toEqual({ xMin: -30, xMax: 270, yMin: -20, yMax: 200 });
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('createDragMove — lifecycle + position write', () => {
|
|
125
|
+
it('init binds start listeners on handler and forces absolute position', () => {
|
|
126
|
+
const el = makeFakeEl();
|
|
127
|
+
const handler = makeFakeEl();
|
|
128
|
+
const doc = makeFakeDoc();
|
|
129
|
+
const ctrl = createDragMove({
|
|
130
|
+
getElement: () => el,
|
|
131
|
+
handler: () => handler,
|
|
132
|
+
ownerDocument: doc,
|
|
133
|
+
});
|
|
134
|
+
ctrl.init();
|
|
135
|
+
expect(el.style.position).toBe('absolute');
|
|
136
|
+
expect(handler.count('mousedown')).toBe(1);
|
|
137
|
+
expect(handler.count('touchstart')).toBe(1);
|
|
138
|
+
// element itself gets no start listener when a handler is provided
|
|
139
|
+
expect(el.count('mousedown')).toBe(0);
|
|
140
|
+
});
|
|
141
|
+
it('handler defaults to the drag element', () => {
|
|
142
|
+
const el = makeFakeEl();
|
|
143
|
+
const doc = makeFakeDoc();
|
|
144
|
+
const ctrl = createDragMove({
|
|
145
|
+
getElement: () => el,
|
|
146
|
+
ownerDocument: doc,
|
|
147
|
+
});
|
|
148
|
+
ctrl.init();
|
|
149
|
+
expect(el.count('mousedown')).toBe(1);
|
|
150
|
+
});
|
|
151
|
+
it('mousedown → move writes clamped style.top/left → up detaches', () => {
|
|
152
|
+
const el = makeFakeEl({ offsetLeft: 10, offsetTop: 10 });
|
|
153
|
+
const doc = makeFakeDoc();
|
|
154
|
+
const ctrl = createDragMove({
|
|
155
|
+
getElement: () => el,
|
|
156
|
+
ownerDocument: doc,
|
|
157
|
+
});
|
|
158
|
+
ctrl.init();
|
|
159
|
+
// pointer at (30,30); element at (10,10) → offset (20,20)
|
|
160
|
+
el.fire('mousedown', me(30, 30));
|
|
161
|
+
expect(ctrl.isDragging()).toBe(true);
|
|
162
|
+
expect(doc.count('mousemove')).toBe(1);
|
|
163
|
+
// move to (100, 80) → left=80, top=60
|
|
164
|
+
doc.fire('mousemove', me(100, 80));
|
|
165
|
+
expect(el.style.left).toBe('80px');
|
|
166
|
+
expect(el.style.top).toBe('60px');
|
|
167
|
+
doc.fire('mouseup', me(100, 80));
|
|
168
|
+
expect(ctrl.isDragging()).toBe(false);
|
|
169
|
+
expect(doc.count('mousemove')).toBe(0);
|
|
170
|
+
expect(doc.count('mouseup')).toBe(0);
|
|
171
|
+
});
|
|
172
|
+
it('constrainer clamps the written position', () => {
|
|
173
|
+
const constrainer = makeFakeEl({ offsetWidth: 200, offsetHeight: 200 });
|
|
174
|
+
const el = makeFakeEl({
|
|
175
|
+
offsetLeft: 0,
|
|
176
|
+
offsetTop: 0,
|
|
177
|
+
offsetWidth: 50,
|
|
178
|
+
offsetHeight: 50,
|
|
179
|
+
offsetParent: constrainer,
|
|
180
|
+
});
|
|
181
|
+
const doc = makeFakeDoc();
|
|
182
|
+
const ctrl = createDragMove({
|
|
183
|
+
getElement: () => el,
|
|
184
|
+
constrainer: () => constrainer,
|
|
185
|
+
ownerDocument: doc,
|
|
186
|
+
});
|
|
187
|
+
ctrl.init();
|
|
188
|
+
el.fire('mousedown', me(0, 0)); // offset (0,0)
|
|
189
|
+
// drag far beyond → clamps to xMax=150, yMax=150
|
|
190
|
+
doc.fire('mousemove', me(999, 999));
|
|
191
|
+
expect(el.style.left).toBe('150px');
|
|
192
|
+
expect(el.style.top).toBe('150px');
|
|
193
|
+
});
|
|
194
|
+
it('allowMove=false cancels the drag (no doc listeners, no move)', () => {
|
|
195
|
+
const el = makeFakeEl();
|
|
196
|
+
const doc = makeFakeDoc();
|
|
197
|
+
const ctrl = createDragMove({
|
|
198
|
+
getElement: () => el,
|
|
199
|
+
allowMove: () => false,
|
|
200
|
+
ownerDocument: doc,
|
|
201
|
+
});
|
|
202
|
+
ctrl.init();
|
|
203
|
+
el.fire('mousedown', me(10, 10));
|
|
204
|
+
expect(ctrl.isDragging()).toBe(false);
|
|
205
|
+
expect(doc.count('mousemove')).toBe(0);
|
|
206
|
+
});
|
|
207
|
+
it('customMove is called instead of writing style', () => {
|
|
208
|
+
const el = makeFakeEl({ offsetLeft: 0, offsetTop: 0 });
|
|
209
|
+
const doc = makeFakeDoc();
|
|
210
|
+
const custom = vi.fn();
|
|
211
|
+
const ctrl = createDragMove({
|
|
212
|
+
getElement: () => el,
|
|
213
|
+
customMove: custom,
|
|
214
|
+
ownerDocument: doc,
|
|
215
|
+
});
|
|
216
|
+
ctrl.init();
|
|
217
|
+
el.fire('mousedown', me(0, 0));
|
|
218
|
+
doc.fire('mousemove', me(40, 25));
|
|
219
|
+
expect(custom).toHaveBeenCalledWith(el, 25, 40); // (element, top, left)
|
|
220
|
+
expect(el.style.left).toBeUndefined();
|
|
221
|
+
});
|
|
222
|
+
it('allowInputDrag=false ignores drags from input/textarea targets', () => {
|
|
223
|
+
const el = makeFakeEl();
|
|
224
|
+
const doc = makeFakeDoc();
|
|
225
|
+
const ctrl = createDragMove({
|
|
226
|
+
getElement: () => el,
|
|
227
|
+
ownerDocument: doc,
|
|
228
|
+
});
|
|
229
|
+
ctrl.init();
|
|
230
|
+
el.fire('mousedown', me(10, 10, { tagName: 'INPUT' }));
|
|
231
|
+
expect(ctrl.isDragging()).toBe(false);
|
|
232
|
+
expect(doc.count('mousemove')).toBe(0);
|
|
233
|
+
});
|
|
234
|
+
it('allowInputDrag=true permits drags from input targets', () => {
|
|
235
|
+
const el = makeFakeEl();
|
|
236
|
+
const doc = makeFakeDoc();
|
|
237
|
+
const ctrl = createDragMove({
|
|
238
|
+
getElement: () => el,
|
|
239
|
+
allowInputDrag: true,
|
|
240
|
+
ownerDocument: doc,
|
|
241
|
+
});
|
|
242
|
+
ctrl.init();
|
|
243
|
+
el.fire('mousedown', me(10, 10, { tagName: 'INPUT' }));
|
|
244
|
+
expect(ctrl.isDragging()).toBe(true);
|
|
245
|
+
});
|
|
246
|
+
it('onStart/onMove/onEnd fire with clamped payload', () => {
|
|
247
|
+
const el = makeFakeEl({ offsetLeft: 0, offsetTop: 0 });
|
|
248
|
+
const doc = makeFakeDoc();
|
|
249
|
+
const onStart = vi.fn();
|
|
250
|
+
const onMove = vi.fn();
|
|
251
|
+
const onEnd = vi.fn();
|
|
252
|
+
const ctrl = createDragMove({
|
|
253
|
+
getElement: () => el,
|
|
254
|
+
onStart,
|
|
255
|
+
onMove,
|
|
256
|
+
onEnd,
|
|
257
|
+
ownerDocument: doc,
|
|
258
|
+
});
|
|
259
|
+
ctrl.init();
|
|
260
|
+
el.fire('mousedown', me(0, 0));
|
|
261
|
+
expect(onStart).toHaveBeenCalledOnce();
|
|
262
|
+
doc.fire('mousemove', me(15, 25));
|
|
263
|
+
expect(onMove).toHaveBeenCalledWith(25, 15, expect.anything(), el);
|
|
264
|
+
doc.fire('mouseup', me(15, 25));
|
|
265
|
+
expect(onEnd).toHaveBeenCalledOnce();
|
|
266
|
+
});
|
|
267
|
+
it('touch drag: touchstart → touchmove writes position → touchend detaches', () => {
|
|
268
|
+
const el = makeFakeEl({ offsetLeft: 5, offsetTop: 5 });
|
|
269
|
+
const doc = makeFakeDoc();
|
|
270
|
+
const ctrl = createDragMove({
|
|
271
|
+
getElement: () => el,
|
|
272
|
+
ownerDocument: doc,
|
|
273
|
+
});
|
|
274
|
+
ctrl.init();
|
|
275
|
+
el.fire('touchstart', te(25, 25)); // offset (20,20)
|
|
276
|
+
expect(doc.count('touchmove')).toBe(1);
|
|
277
|
+
doc.fire('touchmove', te(60, 50));
|
|
278
|
+
expect(el.style.left).toBe('40px');
|
|
279
|
+
expect(el.style.top).toBe('30px');
|
|
280
|
+
doc.fire('touchend', te(60, 50));
|
|
281
|
+
expect(doc.count('touchmove')).toBe(0);
|
|
282
|
+
expect(doc.count('touchend')).toBe(0);
|
|
283
|
+
});
|
|
284
|
+
it('destroy detaches start + live document listeners (unmount safety net)', () => {
|
|
285
|
+
const el = makeFakeEl();
|
|
286
|
+
const doc = makeFakeDoc();
|
|
287
|
+
const ctrl = createDragMove({
|
|
288
|
+
getElement: () => el,
|
|
289
|
+
ownerDocument: doc,
|
|
290
|
+
});
|
|
291
|
+
ctrl.init();
|
|
292
|
+
el.fire('mousedown', me(10, 10));
|
|
293
|
+
expect(doc.count('mousemove')).toBe(1);
|
|
294
|
+
ctrl.destroy();
|
|
295
|
+
expect(el.count('mousedown')).toBe(0);
|
|
296
|
+
expect(doc.count('mousemove')).toBe(0);
|
|
297
|
+
expect(ctrl.isDragging()).toBe(false);
|
|
298
|
+
});
|
|
299
|
+
it('init throws when the drag element is missing', () => {
|
|
300
|
+
const ctrl = createDragMove({ getElement: () => null });
|
|
301
|
+
expect(() => ctrl.init()).toThrow(/drag element/);
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
//# sourceMappingURL=drag-move.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drag-move.test.js","sourceRoot":"","sources":["../src/drag-move.test.ts"],"names":[],"mappings":"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"}
|
package/dist/editable.d.ts
CHANGED
|
@@ -12,7 +12,16 @@
|
|
|
12
12
|
*/
|
|
13
13
|
/** clamp a draft to maxLength (in code units); undefined/0-or-less = no limit. */
|
|
14
14
|
export declare function clampLength(value: string, maxLength?: number): string;
|
|
15
|
-
|
|
15
|
+
/**
|
|
16
|
+
* over-limit predicate: true when `value` exceeds `maxLength` (in code units).
|
|
17
|
+
* undefined/0-or-less maxLength = no limit → never over.
|
|
18
|
+
*
|
|
19
|
+
* Aligns with Ant Design: the draft is allowed to exceed maxLength (turns red +
|
|
20
|
+
* blocks commit) instead of being hard-truncated. The render layer uses this to
|
|
21
|
+
* paint the textarea red; core uses it to refuse commit while over-limit.
|
|
22
|
+
*/
|
|
23
|
+
export declare function isOverLimit(value: string, maxLength?: number): boolean;
|
|
24
|
+
export type EditableTrigger = 'click' | 'dblclick' | 'icon' | 'text' | 'both';
|
|
16
25
|
export interface EditableKeyEvent {
|
|
17
26
|
key: string;
|
|
18
27
|
shiftKey?: boolean;
|
|
@@ -30,7 +39,7 @@ export interface EditableOptions {
|
|
|
30
39
|
trigger?: EditableTrigger;
|
|
31
40
|
/** re-render hook fired whenever editing/draft changes */
|
|
32
41
|
onChange?: (state: EditableSnapshot) => void;
|
|
33
|
-
/** fired on commit with the final
|
|
42
|
+
/** fired on commit with the final draft value (only when within maxLength) */
|
|
34
43
|
onCommit?: (value: string) => void;
|
|
35
44
|
/** fired when entering edit mode */
|
|
36
45
|
onStart?: () => void;
|
|
@@ -44,11 +53,22 @@ export interface EditableSnapshot {
|
|
|
44
53
|
export interface EditableApi {
|
|
45
54
|
readonly editing: boolean;
|
|
46
55
|
readonly draft: string;
|
|
56
|
+
/**
|
|
57
|
+
* true when the current draft exceeds maxLength (Ant-style over-limit).
|
|
58
|
+
* The render layer paints the textarea red; confirm() is a no-op while over.
|
|
59
|
+
*/
|
|
60
|
+
readonly overLimit: boolean;
|
|
47
61
|
/** enter edit mode, seeding the draft from `source` (or the configured value) */
|
|
48
62
|
start(source?: string): void;
|
|
49
|
-
/**
|
|
63
|
+
/**
|
|
64
|
+
* update the draft. NOT clamped to maxLength (red line: Ant allows over-input,
|
|
65
|
+
* then blocks commit + turns red — see `overLimit`).
|
|
66
|
+
*/
|
|
50
67
|
setDraft(next: string): void;
|
|
51
|
-
/**
|
|
68
|
+
/**
|
|
69
|
+
* commit the current draft: leave edit mode + fire onCommit when changed.
|
|
70
|
+
* No-op while `overLimit` is true (stays in edit mode, aligning with Ant).
|
|
71
|
+
*/
|
|
52
72
|
confirm(): void;
|
|
53
73
|
/** discard the draft, leave edit mode, fire onCancel */
|
|
54
74
|
cancel(): void;
|
package/dist/editable.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editable.d.ts","sourceRoot":"","sources":["../src/editable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"editable.d.ts","sourceRoot":"","sources":["../src/editable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAGtE;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9E,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,8CAA8C;AAC9C,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAE1E,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,gBAAgB,GAAG,iBAAiB,CAIzE;AAED,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC7C,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,iFAAiF;IACjF,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;OAGG;IACH,OAAO,IAAI,IAAI,CAAC;IAChB,wDAAwD;IACxD,MAAM,IAAI,IAAI,CAAC;IACf,+DAA+D;IAC/D,SAAS,CAAC,CAAC,EAAE,gBAAgB,GAAG,iBAAiB,CAAC;CACnD;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,WAAW,CA0DzE"}
|