@chenzy-design/core 0.3.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.
Files changed (283) hide show
  1. package/dist/ai-chat-dialogue.d.ts +300 -0
  2. package/dist/ai-chat-dialogue.d.ts.map +1 -0
  3. package/dist/ai-chat-dialogue.js +699 -0
  4. package/dist/ai-chat-dialogue.js.map +1 -0
  5. package/dist/ai-chat-dialogue.test.d.ts +2 -0
  6. package/dist/ai-chat-dialogue.test.d.ts.map +1 -0
  7. package/dist/ai-chat-dialogue.test.js +338 -0
  8. package/dist/ai-chat-dialogue.test.js.map +1 -0
  9. package/dist/ai-chat-input.d.ts +191 -0
  10. package/dist/ai-chat-input.d.ts.map +1 -0
  11. package/dist/ai-chat-input.js +274 -0
  12. package/dist/ai-chat-input.js.map +1 -0
  13. package/dist/ai-chat-input.test.d.ts +2 -0
  14. package/dist/ai-chat-input.test.d.ts.map +1 -0
  15. package/dist/ai-chat-input.test.js +339 -0
  16. package/dist/ai-chat-input.test.js.map +1 -0
  17. package/dist/audio-player.d.ts +154 -0
  18. package/dist/audio-player.d.ts.map +1 -0
  19. package/dist/audio-player.js +254 -0
  20. package/dist/audio-player.js.map +1 -0
  21. package/dist/audio-player.test.d.ts +2 -0
  22. package/dist/audio-player.test.d.ts.map +1 -0
  23. package/dist/audio-player.test.js +275 -0
  24. package/dist/audio-player.test.js.map +1 -0
  25. package/dist/back-top.d.ts +4 -1
  26. package/dist/back-top.d.ts.map +1 -1
  27. package/dist/back-top.js +5 -2
  28. package/dist/back-top.js.map +1 -1
  29. package/dist/back-top.test.js +3 -2
  30. package/dist/back-top.test.js.map +1 -1
  31. package/dist/calendar.d.ts +132 -44
  32. package/dist/calendar.d.ts.map +1 -1
  33. package/dist/calendar.js +413 -70
  34. package/dist/calendar.js.map +1 -1
  35. package/dist/calendar.test.js +160 -76
  36. package/dist/calendar.test.js.map +1 -1
  37. package/dist/chat.d.ts +172 -0
  38. package/dist/chat.d.ts.map +1 -0
  39. package/dist/chat.js +210 -0
  40. package/dist/chat.js.map +1 -0
  41. package/dist/chat.test.d.ts +2 -0
  42. package/dist/chat.test.d.ts.map +1 -0
  43. package/dist/chat.test.js +181 -0
  44. package/dist/chat.test.js.map +1 -0
  45. package/dist/code-highlight.d.ts +30 -0
  46. package/dist/code-highlight.d.ts.map +1 -0
  47. package/dist/code-highlight.js +37 -0
  48. package/dist/code-highlight.js.map +1 -0
  49. package/dist/code-highlight.test.d.ts +2 -0
  50. package/dist/code-highlight.test.d.ts.map +1 -0
  51. package/dist/code-highlight.test.js +36 -0
  52. package/dist/code-highlight.test.js.map +1 -0
  53. package/dist/collapsible.d.ts +41 -0
  54. package/dist/collapsible.d.ts.map +1 -0
  55. package/dist/collapsible.js +33 -0
  56. package/dist/collapsible.js.map +1 -0
  57. package/dist/collapsible.test.d.ts +2 -0
  58. package/dist/collapsible.test.d.ts.map +1 -0
  59. package/dist/collapsible.test.js +57 -0
  60. package/dist/collapsible.test.js.map +1 -0
  61. package/dist/color-value.d.ts +60 -0
  62. package/dist/color-value.d.ts.map +1 -0
  63. package/dist/color-value.js +165 -0
  64. package/dist/color-value.js.map +1 -0
  65. package/dist/color-value.test.d.ts +2 -0
  66. package/dist/color-value.test.d.ts.map +1 -0
  67. package/dist/color-value.test.js +104 -0
  68. package/dist/color-value.test.js.map +1 -0
  69. package/dist/config-provider.d.ts +76 -37
  70. package/dist/config-provider.d.ts.map +1 -1
  71. package/dist/config-provider.js +107 -32
  72. package/dist/config-provider.js.map +1 -1
  73. package/dist/config-provider.test.js +123 -60
  74. package/dist/config-provider.test.js.map +1 -1
  75. package/dist/cropper.d.ts +164 -0
  76. package/dist/cropper.d.ts.map +1 -0
  77. package/dist/cropper.js +841 -0
  78. package/dist/cropper.js.map +1 -0
  79. package/dist/cropper.test.d.ts +2 -0
  80. package/dist/cropper.test.d.ts.map +1 -0
  81. package/dist/cropper.test.js +259 -0
  82. package/dist/cropper.test.js.map +1 -0
  83. package/dist/drag-move.d.ts +119 -0
  84. package/dist/drag-move.d.ts.map +1 -0
  85. package/dist/drag-move.js +237 -0
  86. package/dist/drag-move.js.map +1 -0
  87. package/dist/drag-move.test.d.ts +2 -0
  88. package/dist/drag-move.test.d.ts.map +1 -0
  89. package/dist/drag-move.test.js +304 -0
  90. package/dist/drag-move.test.js.map +1 -0
  91. package/dist/editable.d.ts +24 -4
  92. package/dist/editable.d.ts.map +1 -1
  93. package/dist/editable.js +18 -0
  94. package/dist/editable.js.map +1 -1
  95. package/dist/editable.test.js +55 -2
  96. package/dist/editable.test.js.map +1 -1
  97. package/dist/ellipsis.d.ts +13 -0
  98. package/dist/ellipsis.d.ts.map +1 -1
  99. package/dist/ellipsis.js +36 -0
  100. package/dist/ellipsis.js.map +1 -1
  101. package/dist/ellipsis.test.js +37 -1
  102. package/dist/ellipsis.test.js.map +1 -1
  103. package/dist/form-path.d.ts +19 -0
  104. package/dist/form-path.d.ts.map +1 -0
  105. package/dist/form-path.js +97 -0
  106. package/dist/form-path.js.map +1 -0
  107. package/dist/form-path.test.d.ts +2 -0
  108. package/dist/form-path.test.d.ts.map +1 -0
  109. package/dist/form-path.test.js +57 -0
  110. package/dist/form-path.test.js.map +1 -0
  111. package/dist/form-validate.d.ts +13 -0
  112. package/dist/form-validate.d.ts.map +1 -0
  113. package/dist/form-validate.js +204 -0
  114. package/dist/form-validate.js.map +1 -0
  115. package/dist/form.d.ts +91 -18
  116. package/dist/form.d.ts.map +1 -1
  117. package/dist/form.js +170 -115
  118. package/dist/form.js.map +1 -1
  119. package/dist/form.test.js +349 -76
  120. package/dist/form.test.js.map +1 -1
  121. package/dist/highlight.d.ts +42 -32
  122. package/dist/highlight.d.ts.map +1 -1
  123. package/dist/highlight.js +67 -41
  124. package/dist/highlight.js.map +1 -1
  125. package/dist/highlight.test.js +73 -32
  126. package/dist/highlight.test.js.map +1 -1
  127. package/dist/hotkeys.d.ts +151 -0
  128. package/dist/hotkeys.d.ts.map +1 -0
  129. package/dist/hotkeys.js +188 -0
  130. package/dist/hotkeys.js.map +1 -0
  131. package/dist/hotkeys.test.d.ts +2 -0
  132. package/dist/hotkeys.test.d.ts.map +1 -0
  133. package/dist/hotkeys.test.js +170 -0
  134. package/dist/hotkeys.test.js.map +1 -0
  135. package/dist/index.d.ts +33 -17
  136. package/dist/index.d.ts.map +1 -1
  137. package/dist/index.js +32 -13
  138. package/dist/index.js.map +1 -1
  139. package/dist/input.d.ts +34 -0
  140. package/dist/input.d.ts.map +1 -0
  141. package/dist/input.js +54 -0
  142. package/dist/input.js.map +1 -0
  143. package/dist/input.test.d.ts +2 -0
  144. package/dist/input.test.d.ts.map +1 -0
  145. package/dist/input.test.js +56 -0
  146. package/dist/input.test.js.map +1 -0
  147. package/dist/markdown-render.d.ts +49 -0
  148. package/dist/markdown-render.d.ts.map +1 -0
  149. package/dist/markdown-render.js +61 -0
  150. package/dist/markdown-render.js.map +1 -0
  151. package/dist/markdown-render.test.d.ts +2 -0
  152. package/dist/markdown-render.test.d.ts.map +1 -0
  153. package/dist/markdown-render.test.js +106 -0
  154. package/dist/markdown-render.test.js.map +1 -0
  155. package/dist/notification.d.ts +40 -31
  156. package/dist/notification.d.ts.map +1 -1
  157. package/dist/notification.js +86 -70
  158. package/dist/notification.js.map +1 -1
  159. package/dist/notification.test.js +62 -39
  160. package/dist/notification.test.js.map +1 -1
  161. package/dist/numeral.d.ts +32 -0
  162. package/dist/numeral.d.ts.map +1 -0
  163. package/dist/numeral.js +67 -0
  164. package/dist/numeral.js.map +1 -0
  165. package/dist/numeral.test.d.ts +2 -0
  166. package/dist/numeral.test.d.ts.map +1 -0
  167. package/dist/numeral.test.js +59 -0
  168. package/dist/numeral.test.js.map +1 -0
  169. package/dist/overflow-list.d.ts +9 -40
  170. package/dist/overflow-list.d.ts.map +1 -1
  171. package/dist/overflow-list.js +9 -70
  172. package/dist/overflow-list.js.map +1 -1
  173. package/dist/overflow-list.test.js +1 -122
  174. package/dist/overflow-list.test.js.map +1 -1
  175. package/dist/pagination.d.ts +17 -0
  176. package/dist/pagination.d.ts.map +1 -1
  177. package/dist/pagination.js +48 -0
  178. package/dist/pagination.js.map +1 -1
  179. package/dist/pagination.test.js +40 -1
  180. package/dist/pagination.test.js.map +1 -1
  181. package/dist/pincode.d.ts +79 -0
  182. package/dist/pincode.d.ts.map +1 -0
  183. package/dist/pincode.js +119 -0
  184. package/dist/pincode.js.map +1 -0
  185. package/dist/pincode.test.d.ts +2 -0
  186. package/dist/pincode.test.d.ts.map +1 -0
  187. package/dist/pincode.test.js +151 -0
  188. package/dist/pincode.test.js.map +1 -0
  189. package/dist/progress.d.ts +32 -30
  190. package/dist/progress.d.ts.map +1 -1
  191. package/dist/progress.js +257 -64
  192. package/dist/progress.js.map +1 -1
  193. package/dist/progress.test.js +50 -47
  194. package/dist/progress.test.js.map +1 -1
  195. package/dist/resizable.d.ts +200 -0
  196. package/dist/resizable.d.ts.map +1 -0
  197. package/dist/resizable.js +329 -0
  198. package/dist/resizable.js.map +1 -0
  199. package/dist/resizable.test.d.ts +2 -0
  200. package/dist/resizable.test.d.ts.map +1 -0
  201. package/dist/resizable.test.js +302 -0
  202. package/dist/resizable.test.js.map +1 -0
  203. package/dist/scroll-list.d.ts +69 -62
  204. package/dist/scroll-list.d.ts.map +1 -1
  205. package/dist/scroll-list.js +103 -144
  206. package/dist/scroll-list.js.map +1 -1
  207. package/dist/scroll-list.test.js +100 -110
  208. package/dist/scroll-list.test.js.map +1 -1
  209. package/dist/sidebar.d.ts +46 -0
  210. package/dist/sidebar.d.ts.map +1 -0
  211. package/dist/sidebar.js +65 -0
  212. package/dist/sidebar.js.map +1 -0
  213. package/dist/sidebar.test.d.ts +2 -0
  214. package/dist/sidebar.test.d.ts.map +1 -0
  215. package/dist/sidebar.test.js +88 -0
  216. package/dist/sidebar.test.js.map +1 -0
  217. package/dist/spin.d.ts +5 -5
  218. package/dist/spin.d.ts.map +1 -1
  219. package/dist/spin.js +13 -39
  220. package/dist/spin.js.map +1 -1
  221. package/dist/spin.test.js +2 -26
  222. package/dist/spin.test.js.map +1 -1
  223. package/dist/toast.d.ts +33 -30
  224. package/dist/toast.d.ts.map +1 -1
  225. package/dist/toast.js +77 -72
  226. package/dist/toast.js.map +1 -1
  227. package/dist/toast.test.js +63 -37
  228. package/dist/toast.test.js.map +1 -1
  229. package/dist/tree.d.ts +22 -5
  230. package/dist/tree.d.ts.map +1 -1
  231. package/dist/tree.js +61 -9
  232. package/dist/tree.js.map +1 -1
  233. package/dist/tree.test.js +72 -1
  234. package/dist/tree.test.js.map +1 -1
  235. package/dist/user-guide.d.ts +73 -0
  236. package/dist/user-guide.d.ts.map +1 -0
  237. package/dist/user-guide.js +95 -0
  238. package/dist/user-guide.js.map +1 -0
  239. package/dist/user-guide.test.d.ts +2 -0
  240. package/dist/user-guide.test.d.ts.map +1 -0
  241. package/dist/user-guide.test.js +109 -0
  242. package/dist/user-guide.test.js.map +1 -0
  243. package/dist/video-player.d.ts +196 -0
  244. package/dist/video-player.d.ts.map +1 -0
  245. package/dist/video-player.js +461 -0
  246. package/dist/video-player.js.map +1 -0
  247. package/dist/video-player.test.d.ts +2 -0
  248. package/dist/video-player.test.d.ts.map +1 -0
  249. package/dist/video-player.test.js +435 -0
  250. package/dist/video-player.test.js.map +1 -0
  251. package/package.json +17 -1
  252. package/dist/banner.d.ts +0 -19
  253. package/dist/banner.d.ts.map +0 -1
  254. package/dist/banner.js +0 -20
  255. package/dist/banner.js.map +0 -1
  256. package/dist/banner.test.d.ts +0 -2
  257. package/dist/banner.test.d.ts.map +0 -1
  258. package/dist/banner.test.js +0 -29
  259. package/dist/banner.test.js.map +0 -1
  260. package/dist/breakpoints.d.ts +0 -30
  261. package/dist/breakpoints.d.ts.map +0 -1
  262. package/dist/breakpoints.js +0 -45
  263. package/dist/breakpoints.js.map +0 -1
  264. package/dist/breakpoints.test.d.ts +0 -2
  265. package/dist/breakpoints.test.d.ts.map +0 -1
  266. package/dist/breakpoints.test.js +0 -46
  267. package/dist/breakpoints.test.js.map +0 -1
  268. package/dist/lottie-icon.d.ts +0 -88
  269. package/dist/lottie-icon.d.ts.map +0 -1
  270. package/dist/lottie-icon.js +0 -84
  271. package/dist/lottie-icon.js.map +0 -1
  272. package/dist/lottie-icon.test.d.ts +0 -2
  273. package/dist/lottie-icon.test.d.ts.map +0 -1
  274. package/dist/lottie-icon.test.js +0 -88
  275. package/dist/lottie-icon.test.js.map +0 -1
  276. package/dist/sider.d.ts +0 -26
  277. package/dist/sider.d.ts.map +0 -1
  278. package/dist/sider.js +0 -55
  279. package/dist/sider.js.map +0 -1
  280. package/dist/sider.test.d.ts +0 -2
  281. package/dist/sider.test.d.ts.map +0 -1
  282. package/dist/sider.test.js +0 -29
  283. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=drag-move.test.d.ts.map
@@ -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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"}
@@ -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
- export type EditableTrigger = 'click' | 'dblclick' | 'icon';
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 (clamped) draft value */
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
- /** update the draft (auto-clamped to maxLength) */
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
- /** commit the current draft: leave edit mode + fire onCommit when changed */
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;
@@ -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;AAE5D,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,2DAA2D;IAC3D,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,iFAAiF;IACjF,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,6EAA6E;IAC7E,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,CAqDzE"}
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"}