@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.
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,302 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { createResizeDrag, computeGroupResize, clamp as clampResize, snapToGrid, snapToPoints, hasDirection, getPixelSize, judgeConstraint, adjustNewSize, } from './resizable.js';
3
+ // ---- fake document so we can drive pointer events without a real DOM ----
4
+ function makeFakeDoc() {
5
+ const listeners = new Map();
6
+ const doc = {
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
+ return doc;
24
+ }
25
+ const pe = (x, y) => ({ clientX: x, clientY: y });
26
+ describe('numeric helpers', () => {
27
+ it('clamp', () => {
28
+ expect(clampResize(5, 0, 10)).toBe(5);
29
+ expect(clampResize(-1, 0, 10)).toBe(0);
30
+ expect(clampResize(99, 0, 10)).toBe(10);
31
+ });
32
+ it('snapToGrid', () => {
33
+ expect(snapToGrid(23, 10)).toBe(20);
34
+ expect(snapToGrid(26, 10)).toBe(30);
35
+ expect(snapToGrid(26, 0)).toBe(26); // no snap
36
+ });
37
+ it('snapToPoints', () => {
38
+ expect(snapToPoints(105, [100, 200], 20)).toBe(100); // within gap
39
+ expect(snapToPoints(160, [100, 200], 20)).toBe(160); // outside gap -> unchanged
40
+ expect(snapToPoints(160, [100, 200], 0)).toBe(200); // gap 0 -> always nearest
41
+ expect(snapToPoints(50, undefined, 10)).toBe(50); // no targets
42
+ expect(snapToPoints(50, [], 10)).toBe(50); // empty targets
43
+ });
44
+ it('hasDirection', () => {
45
+ expect(hasDirection('topRight', 'top')).toBe(true);
46
+ expect(hasDirection('topRight', 'right')).toBe(true);
47
+ expect(hasDirection('topRight', 'left')).toBe(false);
48
+ });
49
+ it('getPixelSize parses px/%/number', () => {
50
+ expect(getPixelSize('120px', 500)).toBe(120);
51
+ expect(getPixelSize('50%', 500)).toBe(250);
52
+ expect(getPixelSize(80, 500)).toBe(80);
53
+ });
54
+ });
55
+ describe('createResizeDrag — single axis x (Table column case)', () => {
56
+ it('clamps to min and writes size on move; min covers Table MIN_COL_WIDTH', () => {
57
+ const doc = makeFakeDoc();
58
+ const sizes = [];
59
+ const drag = createResizeDrag({
60
+ axis: 'x',
61
+ direction: 'right',
62
+ getStart: () => ({ width: 100 }),
63
+ min: 40,
64
+ onMove: (s) => sizes.push(s.width),
65
+ ownerDocument: doc,
66
+ });
67
+ drag.start(pe(0, 0), 'right');
68
+ expect(doc.count('pointermove')).toBe(1);
69
+ doc.fire('pointermove', pe(50, 0)); // +50 => 150
70
+ doc.fire('pointermove', pe(-100, 0)); // -100 => clamp 40
71
+ expect(sizes).toEqual([150, 40]);
72
+ doc.fire('pointerup', pe(-100, 0));
73
+ expect(doc.count('pointermove')).toBe(0); // detached
74
+ expect(drag.isDragging()).toBe(false);
75
+ });
76
+ it('left direction grows toward negative delta', () => {
77
+ const doc = makeFakeDoc();
78
+ const sizes = [];
79
+ const drag = createResizeDrag({
80
+ axis: 'x',
81
+ direction: 'left',
82
+ getStart: () => ({ width: 100 }),
83
+ onMove: (s) => sizes.push(s.width),
84
+ ownerDocument: doc,
85
+ });
86
+ drag.start(pe(0, 0), 'left');
87
+ doc.fire('pointermove', pe(-30, 0)); // left: 100 - (-30) = 130
88
+ expect(sizes).toEqual([130]);
89
+ });
90
+ it('respects max bound', () => {
91
+ const doc = makeFakeDoc();
92
+ const sizes = [];
93
+ const drag = createResizeDrag({
94
+ axis: 'x',
95
+ getStart: () => ({ width: 100 }),
96
+ max: 120,
97
+ onMove: (s) => sizes.push(s.width),
98
+ ownerDocument: doc,
99
+ });
100
+ drag.start(pe(0, 0), 'right');
101
+ doc.fire('pointermove', pe(500, 0));
102
+ expect(sizes).toEqual([120]);
103
+ });
104
+ it('grid snaps the moving size', () => {
105
+ const doc = makeFakeDoc();
106
+ const sizes = [];
107
+ const drag = createResizeDrag({
108
+ axis: 'x',
109
+ getStart: () => ({ width: 100 }),
110
+ grid: [25, 25],
111
+ onMove: (s) => sizes.push(s.width),
112
+ ownerDocument: doc,
113
+ });
114
+ drag.start(pe(0, 0), 'right');
115
+ doc.fire('pointermove', pe(11, 0)); // 111 -> snap 25 -> 100
116
+ doc.fire('pointermove', pe(20, 0)); // 120 -> snap 25 -> 125
117
+ expect(sizes).toEqual([100, 125]);
118
+ });
119
+ it('scale divides the delta', () => {
120
+ const doc = makeFakeDoc();
121
+ const sizes = [];
122
+ const drag = createResizeDrag({
123
+ axis: 'x',
124
+ getStart: () => ({ width: 100 }),
125
+ scale: 2,
126
+ onMove: (s) => sizes.push(s.width),
127
+ ownerDocument: doc,
128
+ });
129
+ drag.start(pe(0, 0), 'right');
130
+ doc.fire('pointermove', pe(100, 0)); // 100/2 = 50 -> 150
131
+ expect(sizes).toEqual([150]);
132
+ });
133
+ it('snap sticks to the nearest target within snapGap', () => {
134
+ const doc = makeFakeDoc();
135
+ const sizes = [];
136
+ const drag = createResizeDrag({
137
+ axis: 'x',
138
+ getStart: () => ({ width: 100 }),
139
+ snap: { x: [100, 200, 300] },
140
+ snapGap: 20,
141
+ onMove: (s) => sizes.push(s.width),
142
+ ownerDocument: doc,
143
+ });
144
+ drag.start(pe(0, 0), 'right');
145
+ doc.fire('pointermove', pe(90, 0)); // 190 within 20 of 200 -> 200
146
+ doc.fire('pointermove', pe(60, 0)); // 160 not within 20 of any -> 160
147
+ doc.fire('pointermove', pe(105, 0)); // 205 within 20 of 200 -> 200
148
+ expect(sizes).toEqual([200, 160, 200]);
149
+ });
150
+ it('getBoundMax caps the size at the bound element', () => {
151
+ const doc = makeFakeDoc();
152
+ const sizes = [];
153
+ const drag = createResizeDrag({
154
+ axis: 'x',
155
+ getStart: () => ({ width: 100 }),
156
+ getBoundMax: () => ({ maxWidth: 250 }),
157
+ onMove: (s) => sizes.push(s.width),
158
+ ownerDocument: doc,
159
+ });
160
+ drag.start(pe(0, 0), 'right');
161
+ doc.fire('pointermove', pe(100, 0)); // 200 < 250 -> 200
162
+ doc.fire('pointermove', pe(300, 0)); // 400 capped at 250
163
+ expect(sizes).toEqual([200, 250]);
164
+ });
165
+ });
166
+ describe('createResizeDrag — lifecycle', () => {
167
+ it('fires onStart / onEnd and detaches on up', () => {
168
+ const doc = makeFakeDoc();
169
+ const onStart = vi.fn();
170
+ const onEnd = vi.fn();
171
+ const drag = createResizeDrag({
172
+ axis: 'y',
173
+ getStart: () => ({ height: 200 }),
174
+ onStart,
175
+ onEnd,
176
+ ownerDocument: doc,
177
+ });
178
+ drag.start(pe(0, 0), 'bottom');
179
+ expect(onStart).toHaveBeenCalledWith('bottom', expect.anything());
180
+ doc.fire('pointerup', pe(0, 30));
181
+ expect(onEnd).toHaveBeenCalledWith({ width: 0, height: 230 }, 'bottom', expect.anything());
182
+ expect(doc.count('pointerup')).toBe(0);
183
+ });
184
+ it('destroy() detaches leftover listeners (unmount safety net)', () => {
185
+ const doc = makeFakeDoc();
186
+ const drag = createResizeDrag({
187
+ axis: 'x',
188
+ getStart: () => ({ width: 100 }),
189
+ ownerDocument: doc,
190
+ });
191
+ drag.start(pe(0, 0), 'right');
192
+ expect(doc.count('pointermove')).toBe(1);
193
+ drag.destroy();
194
+ expect(doc.count('pointermove')).toBe(0);
195
+ expect(doc.count('pointerup')).toBe(0);
196
+ });
197
+ it('lockAspectRatio drives height from width on corner drag', () => {
198
+ const doc = makeFakeDoc();
199
+ const sizes = [];
200
+ const drag = createResizeDrag({
201
+ axis: 'xy',
202
+ getStart: () => ({ width: 100, height: 50 }), // ratio 2
203
+ lockAspectRatio: true,
204
+ onMove: (s) => sizes.push({ width: s.width, height: s.height }),
205
+ ownerDocument: doc,
206
+ });
207
+ drag.start(pe(0, 0), 'bottomRight');
208
+ doc.fire('pointermove', pe(100, 0)); // width 200 -> height 100 (ratio 2)
209
+ expect(sizes[0]).toEqual({ width: 200, height: 100 });
210
+ });
211
+ it('lockAspectRatioExtra offsets the driven axis (Semi lockAspectRatioExtra*)', () => {
212
+ const doc = makeFakeDoc();
213
+ const sizes = [];
214
+ const drag = createResizeDrag({
215
+ axis: 'xy',
216
+ getStart: () => ({ width: 100, height: 50 }),
217
+ lockAspectRatio: 2, // explicit ratio 2
218
+ lockAspectRatioExtraHeight: 10,
219
+ lockAspectRatioExtraWidth: 4,
220
+ onMove: (s) => sizes.push({ width: s.width, height: s.height }),
221
+ ownerDocument: doc,
222
+ });
223
+ drag.start(pe(0, 0), 'bottomRight'); // horizontal edge -> height driven from width
224
+ doc.fire('pointermove', pe(100, 0)); // width 200 -> height = (200-4)/2 + 10 = 108
225
+ expect(sizes[0]).toEqual({ width: 200, height: 108 });
226
+ });
227
+ it('boundsByDirection only caps the dragged edge axis (Semi boundsByDirection)', () => {
228
+ const doc = makeFakeDoc();
229
+ const sizes = [];
230
+ const drag = createResizeDrag({
231
+ axis: 'xy',
232
+ getStart: () => ({ width: 100, height: 100 }),
233
+ getBoundMax: () => ({ maxWidth: 150, maxHeight: 150 }),
234
+ boundsByDirection: true,
235
+ onMove: (s) => sizes.push({ width: s.width, height: s.height }),
236
+ ownerDocument: doc,
237
+ });
238
+ // right edge: only width is capped; height is uncapped (no top/bottom in dir)
239
+ drag.start(pe(0, 0), 'right');
240
+ doc.fire('pointermove', pe(300, 300)); // width 400 -> capped 150; height stays 100
241
+ expect(sizes[0]).toEqual({ width: 150, height: 100 });
242
+ });
243
+ });
244
+ describe('computeGroupResize — coupling + conservation', () => {
245
+ const base = {
246
+ direction: 'horizontal',
247
+ parentSize: 400,
248
+ lastItemSize: 200,
249
+ nextItemSize: 200,
250
+ lastItemPercent: 50,
251
+ nextItemPercent: 50,
252
+ last: {},
253
+ next: {},
254
+ };
255
+ it('one grows, one shrinks; sum conserved', () => {
256
+ const r = computeGroupResize({ ...base, delta: 40 });
257
+ expect(r.lastNewSize).toBe(240);
258
+ expect(r.nextNewSize).toBe(160);
259
+ expect(r.lastNewPercent + r.nextNewPercent).toBeCloseTo(100);
260
+ });
261
+ it('clamps last to min and gives the remainder to next', () => {
262
+ const r = computeGroupResize({
263
+ ...base,
264
+ delta: -180, // last would be 20, below min 100px
265
+ last: { min: '100px' },
266
+ });
267
+ expect(r.lastNewSize).toBe(100);
268
+ expect(r.nextNewSize).toBe(300); // 200+200-100
269
+ expect(r.lastNewPercent + r.nextNewPercent).toBeCloseTo(100);
270
+ });
271
+ it('clamps next to min when it would underflow', () => {
272
+ const r = computeGroupResize({
273
+ ...base,
274
+ delta: 180, // next would be 20, below min 100px
275
+ next: { min: '100px' },
276
+ });
277
+ expect(r.nextNewSize).toBe(100);
278
+ expect(r.lastNewSize).toBe(300);
279
+ });
280
+ it('honors percent min/max against parentSize', () => {
281
+ const r = computeGroupResize({
282
+ ...base,
283
+ delta: 400, // last would blow past max
284
+ last: { max: '75%' }, // 300px
285
+ });
286
+ expect(r.lastNewSize).toBe(300);
287
+ expect(r.nextNewSize).toBe(100);
288
+ });
289
+ });
290
+ describe('constraint helpers', () => {
291
+ it('judgeConstraint flags out-of-range', () => {
292
+ expect(judgeConstraint(30, '40px', '200px', 400)).toBe(true);
293
+ expect(judgeConstraint(300, '40px', '200px', 400)).toBe(true);
294
+ expect(judgeConstraint(100, '40px', '200px', 400)).toBe(false);
295
+ });
296
+ it('adjustNewSize clamps with offset', () => {
297
+ expect(adjustNewSize(10, '40px', '200px', 400, 5)).toBe(45);
298
+ expect(adjustNewSize(999, '40px', '200px', 400)).toBe(200);
299
+ expect(adjustNewSize(100, '40px', '200px', 400)).toBe(100);
300
+ });
301
+ });
302
+ //# sourceMappingURL=resizable.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resizable.test.js","sourceRoot":"","sources":["../src/resizable.test.ts"],"names":[],"mappings":"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"}
@@ -1,81 +1,88 @@
1
1
  /**
2
- * createScrollList helpers — framework-agnostic single-column picker math.
3
- * Pure functions only: scroll offset ↔ selected index mapping, disabled-item
4
- * skipping, and keyboard target resolution. No DOM, no framework deps, no
5
- * internal mutable state the render layer (svelte) owns scroll state and the
6
- * actual CSS scroll-snap. See specs/components/show/ScrollList.spec.md §3
7
- * (single-column subset; momentum/cyclic/multi-column deferred).
2
+ * ScrollList / ScrollItem helpers — framework-agnostic picker math.
3
+ *
4
+ * 严格对齐 Semi Design(semi-foundation/scrollList)。Semi itemFoundation 是有
5
+ * 状态、直接操作真实 DOM 的类;本层遵循 chenzy-design headless 哲学,只抽出**纯函数**
6
+ * 几何 / 文案 / 缓动数学,DOM 读写(节点搬移、getBoundingClientRect)由 svelte 渲染层
7
+ * 用这些函数实现,无 DOM、无框架依赖、无内部可变状态。
8
+ *
9
+ * 对齐来源:
10
+ * - scrollItem.tsx `scrollToNode` / `scrollToCenter` → {@link centerOffset}
11
+ * - itemFoundation `getNearestNodeInfo`(选区中线找最近非禁用节点) → {@link nearestIndex}
12
+ * - scrollTo.ts(semi-animation 驱动 scrollTop) → {@link scrollFrame}
13
+ * (已核 semi-animation 源码:scrollTo 传 `{duration}` 不传 easing → wrapValue 走 bezier 分支 →
14
+ * getEasing(undefined)='linear'=cubic-bezier(.25,.25,.75,.75),数学上即线性。故本层用**线性**缓动,
15
+ * 非弹簧、非 ease-out。)
16
+ * - renderItemList `transform`(选中项文案变换) → {@link resolveItemText}
17
+ * - constants.ts `DEFAULT_ITEM_HEIGHT=36` / `DEFAULT_SCROLL_DURATION=120`
8
18
  */
9
- export type ScrollListValue = string | number;
10
- export interface ScrollListItem {
11
- value: ScrollListValue;
12
- label: string;
19
+ /** ScrollItem.mode:wheel(滚轮,居中吸附)| normal(普通列表,点击选中)。对齐 Semi strings.MODE。 */
20
+ export type ScrollItemMode = 'wheel' | 'normal';
21
+ /** Semi scrollList numbers 常量。 */
22
+ export declare const SCROLL_LIST_DEFAULT_ITEM_HEIGHT = 36;
23
+ export declare const SCROLL_LIST_DEFAULT_SCROLL_DURATION = 120;
24
+ /**
25
+ * 单项数据(对齐 Semi itemFoundation `Item`)。
26
+ * value 任意;text 缺省时用 value 展示;transform 选中态文案变换(优先于 ScrollItem.transform)。
27
+ */
28
+ export interface ScrollItemData {
29
+ value: unknown;
30
+ text?: string;
13
31
  disabled?: boolean;
32
+ transform?: (value: unknown, text: string) => string;
33
+ [x: string]: unknown;
34
+ }
35
+ /** onSelect 回调载荷(对齐 Semi notifySelectItem:展开 item + value + type + index)。 */
36
+ export interface ScrollItemSelectPayload {
37
+ value: unknown;
38
+ /** 选中项在 list 中的原始索引(cycled 下已取模回 [0,len))。 */
39
+ index: number;
40
+ /** ScrollItem.type,用于外层区分是哪一列。 */
41
+ type?: string | number;
42
+ [x: string]: unknown;
14
43
  }
15
- /** Map a scrollTop offset to the centered item index (clamped to range). */
16
- export declare function offsetToIndex(scrollTop: number, itemHeight: number, count: number): number;
17
- /** The scrollTop that centers a given index. */
18
- export declare function indexToOffset(index: number, itemHeight: number): number;
19
- /** Index of an item by value, or -1. */
20
- export declare function indexOfValue(items: readonly ScrollListItem[], value: ScrollListValue | undefined): number;
21
44
  /**
22
- * Resolve the nearest enabled index at or after `from` in `dir` (+1/-1).
23
- * If none exists in that direction, returns the original `from` unchanged.
45
+ * 解析一项应展示的文案(对齐 Semi renderItemList)。
46
+ * selected 时优先用 transform(item.transform > 公共 transform)变换,否则 text ?? String(value)。
24
47
  */
25
- export declare function nextEnabledIndex(items: readonly ScrollListItem[], from: number, dir: 1 | -1): number;
26
- /** First enabled index (for Home / value resolution), or -1 if all disabled. */
27
- export declare function firstEnabledIndex(items: readonly ScrollListItem[]): number;
28
- /** Last enabled index (for End), or -1 if all disabled. */
29
- export declare function lastEnabledIndex(items: readonly ScrollListItem[]): number;
30
- export type ScrollListKey = 'ArrowUp' | 'ArrowDown' | 'PageUp' | 'PageDown' | 'Home' | 'End';
48
+ export declare function resolveItemText(item: ScrollItemData, selected: boolean, commonTransform?: (value: unknown, text: string) => string): string;
31
49
  /**
32
- * Resolve the target index for a keyboard action from the current index.
33
- * Returns the current index when the action can't move (boundary / all
34
- * neighbors disabled). `page` is how many rows PageUp/PageDown move.
50
+ * 把某 index 的项**居中**到视窗中线所需的 scrollTop(对齐 Semi scrollToNode):
51
+ * targetTop = node.offsetTop - (wrapperHeight - itemHeight) / 2。
52
+ * offsetTop = index * itemHeight(含 ul 顶部 `:before` 空白,见样式)。
35
53
  */
36
- export declare function keyboardTarget(items: readonly ScrollListItem[], current: number, key: ScrollListKey, page?: number): number;
37
- /** 正取模(结果恒非负),把任意整数索引折回 [0, count)。 */
38
- export declare function wrapIndex(index: number, count: number): number;
54
+ export declare function centerOffset(index: number, itemHeight: number, wrapperHeight: number, topPadding?: number): number;
39
55
  /**
40
- * cyclic 列的「虚拟总行数」。把真实 count 重复 repeat 份,
41
- * repeat 必须为奇数且 >= 3,使「中段」居中。count<=0 返回 0
56
+ * 给定当前 scrollTop 与视窗高度,求中线最近的**非禁用**项索引(对齐 getNearestNodeInfo)。
57
+ * 中线在视窗几何正中;每项中心 = topPadding + (i + 0.5) * itemHeight - scrollTop
58
+ * 返回 -1 表示无可选项(全禁用 / 空)。
42
59
  */
43
- export declare function cyclicVirtualCount(count: number, repeat: number): number;
60
+ export declare function nearestIndex(scrollTop: number, itemHeight: number, wrapperHeight: number, count: number, isDisabled: (index: number) => boolean, topPadding?: number): number;
61
+ /** 正取模:把任意整数索引折回 [0, count)(cycled 用)。对齐 Semi `index % list.length` 语义(负值也回正)。 */
62
+ export declare function wrapIndex(index: number, count: number): number;
44
63
  /**
45
- * cyclic 列的「中段基准虚拟索引」:把真实索引 logical 映射到位于正中那一份的虚拟索引。
46
- * 例如 count=24、repeat=5 中段从 2*24=48 起,logical=9 → 57。
64
+ * cubic ease-out(先快后缓)。t [0,1]。通用缓动工具。
65
+ * 注意:ScrollList 落定**不**用它——Semi scrollTo 用的是线性(见 {@link scrollFrame})。
47
66
  */
48
- export declare function cyclicCenterIndex(logical: number, count: number, repeat: number): number;
67
+ export declare function easeOut(t: number): number;
49
68
  /**
50
- * cyclic 滚动落定后,判断是否需要把虚拟索引「重定位」回中段(避免滚出重复区边界)。
51
- * 返回新的虚拟索引(与传入逻辑值同余、但落在中段),渲染层据此命令式无动画跳转。
52
- * virtualIndex 已在安全中段(距首尾各至少 count 行)时返回原值(无需跳)。
69
+ * 缓动滚动的单帧 scrollTop(照搬 Semi scrollTo.ts:from→to over duration,**线性**)。
70
+ * Semi 的 scrollTo 只传 duration 不传 easing → semi-animation 落到 'linear' bezier
71
+ * (cubic-bezier(.25,.25,.75,.75),即匀速 y=x)。故此处用线性插值 `elapsed/duration`。
72
+ * elapsed>=duration 或 duration<=0 时返回 to(落定)。渲染层用 rAF 逐帧调用并写 el.scrollTop。
53
73
  */
54
- export declare function cyclicRecenter(virtualIndex: number, count: number, repeat: number): number;
55
- export interface MomentumStep {
56
- /** 本帧后的速度(px/ms)。 */
57
- velocity: number;
58
- /** 本帧位移增量(px,velocity*dt 的积分近似)。 */
59
- delta: number;
60
- /** 速度是否已低于阈值(应停止动画进入吸附)。 */
61
- done: boolean;
62
- }
74
+ export declare function scrollFrame(from: number, to: number, elapsed: number, duration: number): number;
63
75
  /**
64
- * 推进一帧惯性:指数衰减 v' = v * decay^(dt/16.67),位移取平均速度积分。
65
- * @param velocity 当前速度(px/ms,正=向下/scrollTop 增大)
66
- * @param dt 帧间隔(ms)
67
- * @param decay 每 ~16.67ms(60fps 一帧)的衰减系数,默认 0.95
68
- * @param minV 停止阈值(px/ms),默认 0.02
76
+ * cycled 头部要补多少「份」完整数据,才能让首节点越过上缓冲区顶(对齐 Semi shouldPrepend)。
77
+ * 照搬 Semi while 循环:`while (baseTop + itemHeight >= wrapperTop - wrapperHeight*ratio) { count++; baseTop -= listHeight }`,
78
+ * 参数化为相对坐标 `firstTop = firstNodeTop - wrapperTop`(首 li 顶相对视窗顶的偏移,可负),不读 DOM。
79
+ * ratio=缓冲区为视窗高度的倍数(init 2,滚动调整时 1,对齐 Semi)。
69
80
  */
70
- export declare function momentumStep(velocity: number, dt: number, decay?: number, minV?: number): MomentumStep;
81
+ export declare function shouldPrepend(firstTop: number, count: number, itemHeight: number, wrapperHeight: number, ratio?: number): number;
71
82
  /**
72
- * 根据当前 scrollTop 与剩余速度预测「最终吸附目标行」(含一点惯性前瞻),clamp 到 [0,count)。
73
- * 用于释放瞬间直接算出目标行,再 smooth 吸附(比逐帧更稳,避免抖动)。
74
- * @param scrollTop 当前偏移
75
- * @param velocity 当前速度(px/ms)
76
- * @param itemHeight 行高
77
- * @param count 行数
78
- * @param projection 速度前瞻系数(默认 80:v*80 px 的滑行预估)
83
+ * cycled 尾部要补多少「份」完整数据,才能让尾节点越过下缓冲区底(对齐 Semi shouldAppend)。
84
+ * 照搬 Semi while 循环:`while (baseTop <= wrapperTop + wrapperHeight*ratio) { count++; baseTop += listHeight }`,
85
+ * 参数化为相对坐标 `lastTop = lastNodeTop - wrapperTop`(尾 li 顶相对视窗顶的偏移),不读 DOM。
79
86
  */
80
- export declare function projectSettleIndex(scrollTop: number, velocity: number, itemHeight: number, count: number, projection?: number): number;
87
+ export declare function shouldAppend(lastTop: number, count: number, itemHeight: number, wrapperHeight: number, ratio?: number): number;
81
88
  //# sourceMappingURL=scroll-list.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scroll-list.d.ts","sourceRoot":"","sources":["../src/scroll-list.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAI1F;AAED,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,wCAAwC;AACxC,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,KAAK,EAAE,eAAe,GAAG,SAAS,GACjC,MAAM,CAGR;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GACV,MAAM,CAOR;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAK1E;AAED,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAKzE;AAED,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,WAAW,GACX,QAAQ,GACR,UAAU,GACV,MAAM,GACN,KAAK,CAAC;AAEV;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,aAAa,EAClB,IAAI,SAAI,GACP,MAAM,CAmCR;AAQD,uCAAuC;AACvC,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGxE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAKxF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ1F;AAQD,MAAM,WAAW,YAAY;IAC3B,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,KAAK,SAAO,EACZ,IAAI,SAAO,GACV,YAAY,CAMd;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,UAAU,SAAK,GACd,MAAM,CAKR"}
1
+ {"version":3,"file":"scroll-list.d.ts","sourceRoot":"","sources":["../src/scroll-list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhD,kCAAkC;AAClC,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAClD,eAAO,MAAM,mCAAmC,MAAM,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACrD,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,8EAA8E;AAC9E,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,OAAO,EACjB,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,GACzD,MAAM,CAMR;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,UAAU,SAAI,GACb,MAAM,CAGR;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,EACtC,UAAU,SAAI,GACb,MAAM,CAeR;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGzC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI/F;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,KAAK,SAAI,GACR,MAAM,CAYR;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,KAAK,SAAI,GACR,MAAM,CAYR"}