@chenzy-design/core 0.1.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 (310) hide show
  1. package/LICENSE +21 -0
  2. package/dist/back-top.d.ts +16 -0
  3. package/dist/back-top.d.ts.map +1 -0
  4. package/dist/back-top.js +29 -0
  5. package/dist/back-top.js.map +1 -0
  6. package/dist/back-top.test.d.ts +2 -0
  7. package/dist/back-top.test.d.ts.map +1 -0
  8. package/dist/back-top.test.js +44 -0
  9. package/dist/back-top.test.js.map +1 -0
  10. package/dist/banner.d.ts +19 -0
  11. package/dist/banner.d.ts.map +1 -0
  12. package/dist/banner.js +20 -0
  13. package/dist/banner.js.map +1 -0
  14. package/dist/banner.test.d.ts +2 -0
  15. package/dist/banner.test.d.ts.map +1 -0
  16. package/dist/banner.test.js +29 -0
  17. package/dist/banner.test.js.map +1 -0
  18. package/dist/breakpoints.d.ts +30 -0
  19. package/dist/breakpoints.d.ts.map +1 -0
  20. package/dist/breakpoints.js +45 -0
  21. package/dist/breakpoints.js.map +1 -0
  22. package/dist/breakpoints.test.d.ts +2 -0
  23. package/dist/breakpoints.test.d.ts.map +1 -0
  24. package/dist/breakpoints.test.js +46 -0
  25. package/dist/breakpoints.test.js.map +1 -0
  26. package/dist/calendar.d.ts +63 -0
  27. package/dist/calendar.d.ts.map +1 -0
  28. package/dist/calendar.js +94 -0
  29. package/dist/calendar.js.map +1 -0
  30. package/dist/calendar.test.d.ts +2 -0
  31. package/dist/calendar.test.d.ts.map +1 -0
  32. package/dist/calendar.test.js +88 -0
  33. package/dist/calendar.test.js.map +1 -0
  34. package/dist/cascader.d.ts +64 -0
  35. package/dist/cascader.d.ts.map +1 -0
  36. package/dist/cascader.js +79 -0
  37. package/dist/cascader.js.map +1 -0
  38. package/dist/cascader.test.d.ts +2 -0
  39. package/dist/cascader.test.d.ts.map +1 -0
  40. package/dist/cascader.test.js +107 -0
  41. package/dist/cascader.test.js.map +1 -0
  42. package/dist/color.d.ts +70 -0
  43. package/dist/color.d.ts.map +1 -0
  44. package/dist/color.js +217 -0
  45. package/dist/color.js.map +1 -0
  46. package/dist/color.test.d.ts +2 -0
  47. package/dist/color.test.d.ts.map +1 -0
  48. package/dist/color.test.js +161 -0
  49. package/dist/color.test.js.map +1 -0
  50. package/dist/config-provider.d.ts +57 -0
  51. package/dist/config-provider.d.ts.map +1 -0
  52. package/dist/config-provider.js +49 -0
  53. package/dist/config-provider.js.map +1 -0
  54. package/dist/config-provider.test.d.ts +2 -0
  55. package/dist/config-provider.test.d.ts.map +1 -0
  56. package/dist/config-provider.test.js +76 -0
  57. package/dist/config-provider.test.js.map +1 -0
  58. package/dist/copyable.d.ts +43 -0
  59. package/dist/copyable.d.ts.map +1 -0
  60. package/dist/copyable.js +102 -0
  61. package/dist/copyable.js.map +1 -0
  62. package/dist/copyable.test.d.ts +2 -0
  63. package/dist/copyable.test.d.ts.map +1 -0
  64. package/dist/copyable.test.js +97 -0
  65. package/dist/copyable.test.js.map +1 -0
  66. package/dist/date.d.ts +86 -0
  67. package/dist/date.d.ts.map +1 -0
  68. package/dist/date.js +226 -0
  69. package/dist/date.js.map +1 -0
  70. package/dist/date.test.d.ts +2 -0
  71. package/dist/date.test.d.ts.map +1 -0
  72. package/dist/date.test.js +171 -0
  73. package/dist/date.test.js.map +1 -0
  74. package/dist/dismiss.d.ts +28 -0
  75. package/dist/dismiss.d.ts.map +1 -0
  76. package/dist/dismiss.js +42 -0
  77. package/dist/dismiss.js.map +1 -0
  78. package/dist/editable.d.ts +59 -0
  79. package/dist/editable.d.ts.map +1 -0
  80. package/dist/editable.js +85 -0
  81. package/dist/editable.js.map +1 -0
  82. package/dist/editable.test.d.ts +2 -0
  83. package/dist/editable.test.d.ts.map +1 -0
  84. package/dist/editable.test.js +111 -0
  85. package/dist/editable.test.js.map +1 -0
  86. package/dist/ellipsis.d.ts +76 -0
  87. package/dist/ellipsis.d.ts.map +1 -0
  88. package/dist/ellipsis.js +99 -0
  89. package/dist/ellipsis.js.map +1 -0
  90. package/dist/ellipsis.test.d.ts +2 -0
  91. package/dist/ellipsis.test.d.ts.map +1 -0
  92. package/dist/ellipsis.test.js +94 -0
  93. package/dist/ellipsis.test.js.map +1 -0
  94. package/dist/floating.d.ts +78 -0
  95. package/dist/floating.d.ts.map +1 -0
  96. package/dist/floating.js +169 -0
  97. package/dist/floating.js.map +1 -0
  98. package/dist/floating.test.d.ts +2 -0
  99. package/dist/floating.test.d.ts.map +1 -0
  100. package/dist/floating.test.js +169 -0
  101. package/dist/floating.test.js.map +1 -0
  102. package/dist/focus-trap.d.ts +24 -0
  103. package/dist/focus-trap.d.ts.map +1 -0
  104. package/dist/focus-trap.js +64 -0
  105. package/dist/focus-trap.js.map +1 -0
  106. package/dist/form.d.ts +131 -0
  107. package/dist/form.d.ts.map +1 -0
  108. package/dist/form.js +257 -0
  109. package/dist/form.js.map +1 -0
  110. package/dist/form.test.d.ts +2 -0
  111. package/dist/form.test.d.ts.map +1 -0
  112. package/dist/form.test.js +323 -0
  113. package/dist/form.test.js.map +1 -0
  114. package/dist/highlight.d.ts +57 -0
  115. package/dist/highlight.d.ts.map +1 -0
  116. package/dist/highlight.js +124 -0
  117. package/dist/highlight.js.map +1 -0
  118. package/dist/highlight.test.d.ts +2 -0
  119. package/dist/highlight.test.d.ts.map +1 -0
  120. package/dist/highlight.test.js +155 -0
  121. package/dist/highlight.test.js.map +1 -0
  122. package/dist/id.d.ts +4 -0
  123. package/dist/id.d.ts.map +1 -0
  124. package/dist/id.js +14 -0
  125. package/dist/id.js.map +1 -0
  126. package/dist/id.test.d.ts +2 -0
  127. package/dist/id.test.d.ts.map +1 -0
  128. package/dist/id.test.js +13 -0
  129. package/dist/id.test.js.map +1 -0
  130. package/dist/index.d.ts +46 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +45 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/inert-background.d.ts +27 -0
  135. package/dist/inert-background.d.ts.map +1 -0
  136. package/dist/inert-background.js +92 -0
  137. package/dist/inert-background.js.map +1 -0
  138. package/dist/inert-background.test.d.ts +2 -0
  139. package/dist/inert-background.test.d.ts.map +1 -0
  140. package/dist/inert-background.test.js +62 -0
  141. package/dist/inert-background.test.js.map +1 -0
  142. package/dist/input-number.d.ts +34 -0
  143. package/dist/input-number.d.ts.map +1 -0
  144. package/dist/input-number.js +69 -0
  145. package/dist/input-number.js.map +1 -0
  146. package/dist/input-number.test.d.ts +2 -0
  147. package/dist/input-number.test.d.ts.map +1 -0
  148. package/dist/input-number.test.js +74 -0
  149. package/dist/input-number.test.js.map +1 -0
  150. package/dist/list-selection.d.ts +38 -0
  151. package/dist/list-selection.d.ts.map +1 -0
  152. package/dist/list-selection.js +61 -0
  153. package/dist/list-selection.js.map +1 -0
  154. package/dist/list-selection.test.d.ts +2 -0
  155. package/dist/list-selection.test.d.ts.map +1 -0
  156. package/dist/list-selection.test.js +61 -0
  157. package/dist/list-selection.test.js.map +1 -0
  158. package/dist/live-announcer.d.ts +38 -0
  159. package/dist/live-announcer.d.ts.map +1 -0
  160. package/dist/live-announcer.js +89 -0
  161. package/dist/live-announcer.js.map +1 -0
  162. package/dist/live-announcer.test.d.ts +2 -0
  163. package/dist/live-announcer.test.d.ts.map +1 -0
  164. package/dist/live-announcer.test.js +70 -0
  165. package/dist/live-announcer.test.js.map +1 -0
  166. package/dist/lottie-icon.d.ts +88 -0
  167. package/dist/lottie-icon.d.ts.map +1 -0
  168. package/dist/lottie-icon.js +84 -0
  169. package/dist/lottie-icon.js.map +1 -0
  170. package/dist/lottie-icon.test.d.ts +2 -0
  171. package/dist/lottie-icon.test.d.ts.map +1 -0
  172. package/dist/lottie-icon.test.js +88 -0
  173. package/dist/lottie-icon.test.js.map +1 -0
  174. package/dist/notification.d.ts +61 -0
  175. package/dist/notification.d.ts.map +1 -0
  176. package/dist/notification.js +133 -0
  177. package/dist/notification.js.map +1 -0
  178. package/dist/notification.test.d.ts +2 -0
  179. package/dist/notification.test.d.ts.map +1 -0
  180. package/dist/notification.test.js +103 -0
  181. package/dist/notification.test.js.map +1 -0
  182. package/dist/overflow-list.d.ts +102 -0
  183. package/dist/overflow-list.d.ts.map +1 -0
  184. package/dist/overflow-list.js +159 -0
  185. package/dist/overflow-list.js.map +1 -0
  186. package/dist/overflow-list.test.d.ts +2 -0
  187. package/dist/overflow-list.test.d.ts.map +1 -0
  188. package/dist/overflow-list.test.js +223 -0
  189. package/dist/overflow-list.test.js.map +1 -0
  190. package/dist/pagination.d.ts +51 -0
  191. package/dist/pagination.d.ts.map +1 -0
  192. package/dist/pagination.js +127 -0
  193. package/dist/pagination.js.map +1 -0
  194. package/dist/pagination.test.d.ts +2 -0
  195. package/dist/pagination.test.d.ts.map +1 -0
  196. package/dist/pagination.test.js +147 -0
  197. package/dist/pagination.test.js.map +1 -0
  198. package/dist/progress.d.ts +64 -0
  199. package/dist/progress.d.ts.map +1 -0
  200. package/dist/progress.js +92 -0
  201. package/dist/progress.js.map +1 -0
  202. package/dist/progress.test.d.ts +2 -0
  203. package/dist/progress.test.d.ts.map +1 -0
  204. package/dist/progress.test.js +79 -0
  205. package/dist/progress.test.js.map +1 -0
  206. package/dist/resize-observer.d.ts +133 -0
  207. package/dist/resize-observer.d.ts.map +1 -0
  208. package/dist/resize-observer.js +358 -0
  209. package/dist/resize-observer.js.map +1 -0
  210. package/dist/resize-observer.test.d.ts +2 -0
  211. package/dist/resize-observer.test.d.ts.map +1 -0
  212. package/dist/resize-observer.test.js +377 -0
  213. package/dist/resize-observer.test.js.map +1 -0
  214. package/dist/roving.d.ts +26 -0
  215. package/dist/roving.d.ts.map +1 -0
  216. package/dist/roving.js +61 -0
  217. package/dist/roving.js.map +1 -0
  218. package/dist/roving.test.d.ts +2 -0
  219. package/dist/roving.test.d.ts.map +1 -0
  220. package/dist/roving.test.js +48 -0
  221. package/dist/roving.test.js.map +1 -0
  222. package/dist/scroll-list.d.ts +81 -0
  223. package/dist/scroll-list.d.ts.map +1 -0
  224. package/dist/scroll-list.js +175 -0
  225. package/dist/scroll-list.js.map +1 -0
  226. package/dist/scroll-list.test.d.ts +2 -0
  227. package/dist/scroll-list.test.d.ts.map +1 -0
  228. package/dist/scroll-list.test.js +135 -0
  229. package/dist/scroll-list.test.js.map +1 -0
  230. package/dist/scroll-lock.d.ts +11 -0
  231. package/dist/scroll-lock.d.ts.map +1 -0
  232. package/dist/scroll-lock.js +45 -0
  233. package/dist/scroll-lock.js.map +1 -0
  234. package/dist/scroll-lock.test.d.ts +2 -0
  235. package/dist/scroll-lock.test.d.ts.map +1 -0
  236. package/dist/scroll-lock.test.js +55 -0
  237. package/dist/scroll-lock.test.js.map +1 -0
  238. package/dist/sider.d.ts +26 -0
  239. package/dist/sider.d.ts.map +1 -0
  240. package/dist/sider.js +55 -0
  241. package/dist/sider.js.map +1 -0
  242. package/dist/sider.test.d.ts +2 -0
  243. package/dist/sider.test.d.ts.map +1 -0
  244. package/dist/sider.test.js +29 -0
  245. package/dist/sider.test.js.map +1 -0
  246. package/dist/spin.d.ts +25 -0
  247. package/dist/spin.d.ts.map +1 -0
  248. package/dist/spin.js +96 -0
  249. package/dist/spin.js.map +1 -0
  250. package/dist/spin.test.d.ts +2 -0
  251. package/dist/spin.test.d.ts.map +1 -0
  252. package/dist/spin.test.js +80 -0
  253. package/dist/spin.test.js.map +1 -0
  254. package/dist/table.d.ts +101 -0
  255. package/dist/table.d.ts.map +1 -0
  256. package/dist/table.js +244 -0
  257. package/dist/table.js.map +1 -0
  258. package/dist/table.test.d.ts +2 -0
  259. package/dist/table.test.d.ts.map +1 -0
  260. package/dist/table.test.js +184 -0
  261. package/dist/table.test.js.map +1 -0
  262. package/dist/textarea.d.ts +48 -0
  263. package/dist/textarea.d.ts.map +1 -0
  264. package/dist/textarea.js +76 -0
  265. package/dist/textarea.js.map +1 -0
  266. package/dist/textarea.test.d.ts +2 -0
  267. package/dist/textarea.test.d.ts.map +1 -0
  268. package/dist/textarea.test.js +77 -0
  269. package/dist/textarea.test.js.map +1 -0
  270. package/dist/time.d.ts +93 -0
  271. package/dist/time.d.ts.map +1 -0
  272. package/dist/time.js +181 -0
  273. package/dist/time.js.map +1 -0
  274. package/dist/time.test.d.ts +2 -0
  275. package/dist/time.test.d.ts.map +1 -0
  276. package/dist/time.test.js +159 -0
  277. package/dist/time.test.js.map +1 -0
  278. package/dist/toast.d.ts +60 -0
  279. package/dist/toast.d.ts.map +1 -0
  280. package/dist/toast.js +135 -0
  281. package/dist/toast.js.map +1 -0
  282. package/dist/toast.test.d.ts +2 -0
  283. package/dist/toast.test.d.ts.map +1 -0
  284. package/dist/toast.test.js +127 -0
  285. package/dist/toast.test.js.map +1 -0
  286. package/dist/tree.d.ts +129 -0
  287. package/dist/tree.d.ts.map +1 -0
  288. package/dist/tree.js +351 -0
  289. package/dist/tree.js.map +1 -0
  290. package/dist/tree.test.d.ts +2 -0
  291. package/dist/tree.test.d.ts.map +1 -0
  292. package/dist/tree.test.js +291 -0
  293. package/dist/tree.test.js.map +1 -0
  294. package/dist/upload.d.ts +62 -0
  295. package/dist/upload.d.ts.map +1 -0
  296. package/dist/upload.js +85 -0
  297. package/dist/upload.js.map +1 -0
  298. package/dist/upload.test.d.ts +2 -0
  299. package/dist/upload.test.d.ts.map +1 -0
  300. package/dist/upload.test.js +169 -0
  301. package/dist/upload.test.js.map +1 -0
  302. package/dist/virtual-list.d.ts +83 -0
  303. package/dist/virtual-list.d.ts.map +1 -0
  304. package/dist/virtual-list.js +143 -0
  305. package/dist/virtual-list.js.map +1 -0
  306. package/dist/virtual-list.test.d.ts +2 -0
  307. package/dist/virtual-list.test.d.ts.map +1 -0
  308. package/dist/virtual-list.test.js +148 -0
  309. package/dist/virtual-list.test.js.map +1 -0
  310. package/package.json +22 -0
@@ -0,0 +1,127 @@
1
+ import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest';
2
+ import { createToastStore } from './toast.js';
3
+ describe('createToastStore', () => {
4
+ beforeEach(() => vi.useFakeTimers());
5
+ afterEach(() => vi.useRealTimers());
6
+ it('adds a toast and returns its id', () => {
7
+ const s = createToastStore();
8
+ const id = s.add({ content: 'hi' });
9
+ expect(typeof id).toBe('string');
10
+ expect(s.getToasts().map((t) => t.content)).toEqual(['hi']);
11
+ s.destroy();
12
+ });
13
+ it('auto-dismisses after duration', () => {
14
+ const s = createToastStore();
15
+ s.add({ content: 'bye', duration: 2 });
16
+ expect(s.getToasts().length).toBe(1);
17
+ vi.advanceTimersByTime(1999);
18
+ expect(s.getToasts().length).toBe(1);
19
+ vi.advanceTimersByTime(1);
20
+ expect(s.getToasts().length).toBe(0);
21
+ s.destroy();
22
+ });
23
+ it('duration 0 persists (no auto-dismiss)', () => {
24
+ const s = createToastStore();
25
+ s.add({ content: 'stay', duration: 0 });
26
+ vi.advanceTimersByTime(100000);
27
+ expect(s.getToasts().length).toBe(1);
28
+ s.destroy();
29
+ });
30
+ it('loading defaults to persist', () => {
31
+ const s = createToastStore();
32
+ s.add({ content: 'loading…', type: 'loading' });
33
+ vi.advanceTimersByTime(100000);
34
+ expect(s.getToasts().length).toBe(1);
35
+ s.destroy();
36
+ });
37
+ it('id dedup updates in place and restarts timer', () => {
38
+ const s = createToastStore();
39
+ const id = s.add({ content: 'v1', duration: 3 });
40
+ vi.advanceTimersByTime(2000);
41
+ s.add({ id, content: 'v2', duration: 3 }); // update, restart 3s
42
+ expect(s.getToasts().map((t) => t.content)).toEqual(['v2']);
43
+ expect(s.getToasts().length).toBe(1);
44
+ vi.advanceTimersByTime(2000); // only 2s since update
45
+ expect(s.getToasts().length).toBe(1);
46
+ vi.advanceTimersByTime(1000);
47
+ expect(s.getToasts().length).toBe(0);
48
+ s.destroy();
49
+ });
50
+ it('maxCount evicts the oldest (FIFO)', () => {
51
+ const s = createToastStore({ maxCount: 2 });
52
+ s.add({ content: 'a', duration: 0 });
53
+ s.add({ content: 'b', duration: 0 });
54
+ s.add({ content: 'c', duration: 0 });
55
+ expect(s.getToasts().map((t) => t.content)).toEqual(['b', 'c']);
56
+ s.destroy();
57
+ });
58
+ it('manual remove and removeAll', () => {
59
+ const s = createToastStore();
60
+ const a = s.add({ content: 'a', duration: 0 });
61
+ s.add({ content: 'b', duration: 0 });
62
+ s.remove(a);
63
+ expect(s.getToasts().map((t) => t.content)).toEqual(['b']);
64
+ s.removeAll();
65
+ expect(s.getToasts().length).toBe(0);
66
+ s.destroy();
67
+ });
68
+ it('pause/resume preserves remaining time', () => {
69
+ const s = createToastStore();
70
+ const id = s.add({ content: 'x', duration: 4 });
71
+ vi.advanceTimersByTime(1000); // 3s left
72
+ s.pause(id);
73
+ vi.advanceTimersByTime(10000); // paused, no dismiss
74
+ expect(s.getToasts().length).toBe(1);
75
+ s.resume(id);
76
+ vi.advanceTimersByTime(2999);
77
+ expect(s.getToasts().length).toBe(1);
78
+ vi.advanceTimersByTime(1);
79
+ expect(s.getToasts().length).toBe(0);
80
+ s.destroy();
81
+ });
82
+ it('onClose fires with the right reason', () => {
83
+ const s = createToastStore();
84
+ const reasons = [];
85
+ const id = s.add({ content: 'x', duration: 0, onClose: (_i, r) => reasons.push(r) });
86
+ s.remove(id);
87
+ expect(reasons).toEqual(['manual']);
88
+ s.destroy();
89
+ });
90
+ it('subscribers are notified on changes', () => {
91
+ const s = createToastStore();
92
+ const counts = [];
93
+ s.subscribe((t) => counts.push(t.length));
94
+ const id = s.add({ content: 'a', duration: 0 });
95
+ s.remove(id);
96
+ expect(counts).toEqual([1, 0]);
97
+ s.destroy();
98
+ });
99
+ it('defaults position to top and theme to light', () => {
100
+ const s = createToastStore();
101
+ s.add({ content: 'x', duration: 0 });
102
+ const [t] = s.getToasts();
103
+ expect(t.position).toBe('top');
104
+ expect(t.theme).toBe('light');
105
+ s.destroy();
106
+ });
107
+ it('supports 6 positions and carries theme through', () => {
108
+ const s = createToastStore();
109
+ s.add({ content: 'a', duration: 0, position: 'bottomRight', theme: 'dark' });
110
+ const [t] = s.getToasts();
111
+ expect(t.position).toBe('bottomRight');
112
+ expect(t.theme).toBe('dark');
113
+ s.destroy();
114
+ });
115
+ it('maxCount evicts FIFO per position independently', () => {
116
+ const s = createToastStore({ maxCount: 1 });
117
+ s.add({ content: 'top1', duration: 0, position: 'top' });
118
+ s.add({ content: 'bottom1', duration: 0, position: 'bottom' });
119
+ // different positions: neither evicts the other
120
+ expect(s.getToasts().map((t) => t.content)).toEqual(['top1', 'bottom1']);
121
+ // adding a second top evicts only the older top
122
+ s.add({ content: 'top2', duration: 0, position: 'top' });
123
+ expect(s.getToasts().map((t) => t.content)).toEqual(['bottom1', 'top2']);
124
+ s.destroy();
125
+ });
126
+ });
127
+ //# sourceMappingURL=toast.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.test.js","sourceRoot":"","sources":["../src/toast.test.ts"],"names":[],"mappings":"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"}
package/dist/tree.d.ts ADDED
@@ -0,0 +1,129 @@
1
+ /**
2
+ * createTree — framework-agnostic tree algorithms for Tree.svelte.
3
+ * Pure functions only: flatten visible nodes, check-conduction (父子联动),
4
+ * search filtering with ancestor expansion. No DOM, no framework deps,
5
+ * no internal mutable state — the render layer owns selection/expansion state
6
+ * (runes in svelte) and calls these helpers. See specs/components/show/Tree.spec.md §3.
7
+ */
8
+ export type TreeKey = string | number;
9
+ export interface TreeNodeData {
10
+ key: TreeKey;
11
+ label: string;
12
+ disabled?: boolean;
13
+ checkable?: boolean;
14
+ selectable?: boolean;
15
+ isLeaf?: boolean;
16
+ children?: TreeNodeData[];
17
+ }
18
+ /** A node flattened into the visible, ordered list (only expanded subtrees). */
19
+ export interface FlatNode {
20
+ node: TreeNodeData;
21
+ /** depth from root, starting at 0 */
22
+ level: number;
23
+ /** parent key, or null for roots */
24
+ parentKey: TreeKey | null;
25
+ /** has at least one child */
26
+ hasChildren: boolean;
27
+ /** 1-based index among siblings (aria-posinset) */
28
+ posInSet: number;
29
+ /** sibling count (aria-setsize) */
30
+ setSize: number;
31
+ /** is this node the last among its siblings (for tree guide lines) */
32
+ isLast: boolean;
33
+ /** per-ancestor-level: was that ancestor the last of its siblings?
34
+ * length === level; index 0 is the root-level ancestor. Used to decide
35
+ * whether a vertical guide line continues through each indent column. */
36
+ ancestorIsLast: boolean[];
37
+ }
38
+ export type CheckState = 'checked' | 'half' | 'unchecked';
39
+ /**
40
+ * Flatten the tree into an ordered list of visible nodes.
41
+ * A node's children are included only when its key is in `expandedKeys`.
42
+ */
43
+ export declare function flattenVisible(data: TreeNodeData[], expandedKeys: ReadonlySet<TreeKey>): FlatNode[];
44
+ /** Recursively find a node by key. */
45
+ export declare function findNode(data: TreeNodeData[], key: TreeKey): TreeNodeData | undefined;
46
+ /** Collect keys of every node that has children (for defaultExpandAll). */
47
+ export declare function collectExpandable(data: TreeNodeData[]): TreeKey[];
48
+ /** Collect keys of nodes up to (and including) the given depth that have children. */
49
+ export declare function collectExpandableToDepth(data: TreeNodeData[], depth: number): TreeKey[];
50
+ /**
51
+ * Conduction (related mode): given a base set of explicitly-checked keys,
52
+ * derive the full checked set + half-checked (indeterminate) set with
53
+ * bottom-up + top-down parent/child propagation.
54
+ * Disabled nodes are excluded from auto-check.
55
+ */
56
+ export declare function conduct(data: TreeNodeData[], checkedInput: ReadonlySet<TreeKey>): {
57
+ checked: Set<TreeKey>;
58
+ half: Set<TreeKey>;
59
+ };
60
+ /**
61
+ * Normalize a checked set to leaf-level: any non-leaf (parent) key is expanded
62
+ * to its leaf descendants. This makes a base set resilient to being fed the
63
+ * output of `conduct` (which contains parent keys) — feeding a polluted base
64
+ * back through `toggleCheck` would otherwise re-check children on every toggle.
65
+ */
66
+ export declare function normalizeToLeaves(data: TreeNodeData[], checked: ReadonlySet<TreeKey>): Set<TreeKey>;
67
+ /**
68
+ * Toggle a node's check in related mode: returns the next *base* checked set
69
+ * (leaf-level) after toggling `key`. The input base is normalized to leaves
70
+ * first, so passing `conduct`-output (with parent keys) round-trips correctly.
71
+ * Feed the result through `conduct` to render.
72
+ */
73
+ export declare function toggleCheck(data: TreeNodeData[], currentChecked: ReadonlySet<TreeKey>, key: TreeKey): Set<TreeKey>;
74
+ /**
75
+ * Search filtering: returns the set of node keys to expand so that every node
76
+ * matching `match` is visible (its ancestor chain). The matched keys themselves
77
+ * are returned separately for highlighting.
78
+ */
79
+ export declare function computeFilteredKeys(data: TreeNodeData[], match: (node: TreeNodeData) => boolean): {
80
+ matched: Set<TreeKey>;
81
+ expand: Set<TreeKey>;
82
+ };
83
+ /**
84
+ * Return the keys of `key`'s siblings (nodes sharing the same direct parent),
85
+ * excluding `key` itself. Roots are siblings of each other. Returns an empty
86
+ * array if the key is not found. Pure function — used by accordion mode to
87
+ * collapse same-level siblings when a node expands.
88
+ */
89
+ export declare function siblingKeys(data: TreeNodeData[], key: TreeKey): TreeKey[];
90
+ /**
91
+ * Accordion expand: compute the next expanded set when `key` is expanded under
92
+ * accordion mode — at most one node per level stays expanded, so all of `key`'s
93
+ * siblings are collapsed. Returns a new Set containing the current expanded keys
94
+ * plus `key`, minus `key`'s siblings. Pure function (no DOM, no mutation of
95
+ * inputs); the render layer derives the resulting expansion from it.
96
+ */
97
+ export declare function accordionExpand(data: TreeNodeData[], expandedKeys: ReadonlySet<TreeKey>, key: TreeKey): Set<TreeKey>;
98
+ export type DropPosition = 'before' | 'inside' | 'after';
99
+ /**
100
+ * Drag & drop: given the pointer's vertical offset within a target row, decide
101
+ * the drop position. The row is split into three zones — top → `before`,
102
+ * middle → `inside` (become a child), bottom → `after`. When `allowInside` is
103
+ * false (e.g. a leaf target that should not gain children) the middle zone is
104
+ * folded into the nearer edge, yielding only `before`/`after`.
105
+ * Pure function (no DOM) so it is unit-testable; the render layer passes the
106
+ * measured offsetY/rowHeight.
107
+ */
108
+ export declare function computeDropPosition(offsetY: number, rowHeight: number, allowInside?: boolean): DropPosition;
109
+ /**
110
+ * Whether `maybeAncestorKey` is the same as, or an ancestor of, `key`.
111
+ * Used to reject dropping a dragged node onto itself or into its own subtree.
112
+ */
113
+ export declare function isAncestorOrSelf(data: TreeNodeData[], maybeAncestorKey: TreeKey, key: TreeKey): boolean;
114
+ /** Strategy for converging a fully-checked set into a回填/Tag value set. */
115
+ export type CheckedStrategy = 'all' | 'parent' | 'child';
116
+ /**
117
+ * Collapse a fully-checked set (the `checked` output of {@link conduct}, which
118
+ * contains every node — parents and children — that is completely checked) into
119
+ * the value set to surface as回填 value / Tags, per `showCheckedStrategy`:
120
+ *
121
+ * - `'all'` → every checked node (input unchanged, in document order).
122
+ * - `'parent'` → only the top-most fully-checked nodes; a checked node whose
123
+ * parent is also checked is dropped (parent represents subtree).
124
+ * - `'child'` → only checked leaf nodes (no parents).
125
+ *
126
+ * Pure: derives solely from `data` + `checked`, document-ordered, no mutation.
127
+ */
128
+ export declare function collectCheckedByStrategy(data: TreeNodeData[], checked: ReadonlySet<TreeKey>, strategy: CheckedStrategy): TreeKey[];
129
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"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"}
package/dist/tree.js ADDED
@@ -0,0 +1,351 @@
1
+ /**
2
+ * createTree — framework-agnostic tree algorithms for Tree.svelte.
3
+ * Pure functions only: flatten visible nodes, check-conduction (父子联动),
4
+ * search filtering with ancestor expansion. No DOM, no framework deps,
5
+ * no internal mutable state — the render layer owns selection/expansion state
6
+ * (runes in svelte) and calls these helpers. See specs/components/show/Tree.spec.md §3.
7
+ */
8
+ function hasKids(node) {
9
+ return !!node.children && node.children.length > 0;
10
+ }
11
+ /**
12
+ * Flatten the tree into an ordered list of visible nodes.
13
+ * A node's children are included only when its key is in `expandedKeys`.
14
+ */
15
+ export function flattenVisible(data, expandedKeys) {
16
+ const out = [];
17
+ function walk(nodes, level, parentKey, ancestorIsLast) {
18
+ const setSize = nodes.length;
19
+ nodes.forEach((node, i) => {
20
+ const kids = hasKids(node);
21
+ const isLast = i === setSize - 1;
22
+ out.push({
23
+ node,
24
+ level,
25
+ parentKey,
26
+ hasChildren: kids,
27
+ posInSet: i + 1,
28
+ setSize,
29
+ isLast,
30
+ ancestorIsLast,
31
+ });
32
+ if (kids && expandedKeys.has(node.key)) {
33
+ walk(node.children, level + 1, node.key, [...ancestorIsLast, isLast]);
34
+ }
35
+ });
36
+ }
37
+ walk(data, 0, null, []);
38
+ return out;
39
+ }
40
+ /** Recursively find a node by key. */
41
+ export function findNode(data, key) {
42
+ for (const node of data) {
43
+ if (node.key === key)
44
+ return node;
45
+ if (node.children) {
46
+ const found = findNode(node.children, key);
47
+ if (found)
48
+ return found;
49
+ }
50
+ }
51
+ return undefined;
52
+ }
53
+ /** Collect keys of every node that has children (for defaultExpandAll). */
54
+ export function collectExpandable(data) {
55
+ const acc = [];
56
+ function walk(nodes) {
57
+ for (const node of nodes) {
58
+ if (hasKids(node)) {
59
+ acc.push(node.key);
60
+ walk(node.children);
61
+ }
62
+ }
63
+ }
64
+ walk(data);
65
+ return acc;
66
+ }
67
+ /** Collect keys of nodes up to (and including) the given depth that have children. */
68
+ export function collectExpandableToDepth(data, depth) {
69
+ const acc = [];
70
+ function walk(nodes, level) {
71
+ if (level >= depth)
72
+ return;
73
+ for (const node of nodes) {
74
+ if (hasKids(node)) {
75
+ acc.push(node.key);
76
+ walk(node.children, level + 1);
77
+ }
78
+ }
79
+ }
80
+ walk(data, 0);
81
+ return acc;
82
+ }
83
+ function buildMeta(data) {
84
+ const parent = new Map();
85
+ const leaves = new Map();
86
+ const childrenOf = new Map();
87
+ const allKeys = [];
88
+ function walk(node, parentKey) {
89
+ parent.set(node.key, parentKey);
90
+ allKeys.push(node.key);
91
+ if (!hasKids(node)) {
92
+ leaves.set(node.key, [node.key]);
93
+ childrenOf.set(node.key, []);
94
+ return [node.key];
95
+ }
96
+ const kids = node.children;
97
+ childrenOf.set(node.key, kids.map((k) => k.key));
98
+ const collected = [];
99
+ for (const child of kids)
100
+ collected.push(...walk(child, node.key));
101
+ leaves.set(node.key, collected);
102
+ return collected;
103
+ }
104
+ for (const root of data)
105
+ walk(root, null);
106
+ return { parent, leaves, childrenOf, allKeys };
107
+ }
108
+ /**
109
+ * Conduction (related mode): given a base set of explicitly-checked keys,
110
+ * derive the full checked set + half-checked (indeterminate) set with
111
+ * bottom-up + top-down parent/child propagation.
112
+ * Disabled nodes are excluded from auto-check.
113
+ */
114
+ export function conduct(data, checkedInput) {
115
+ const meta = buildMeta(data);
116
+ const disabled = new Set();
117
+ (function markDisabled(nodes, parentDisabled) {
118
+ for (const node of nodes) {
119
+ const d = parentDisabled || !!node.disabled;
120
+ if (d)
121
+ disabled.add(node.key);
122
+ if (node.children)
123
+ markDisabled(node.children, d);
124
+ }
125
+ })(data, false);
126
+ // Top-down: a checked parent checks all enabled leaf descendants.
127
+ const leafChecked = new Set();
128
+ for (const key of checkedInput) {
129
+ const ls = meta.leaves.get(key);
130
+ if (!ls)
131
+ continue;
132
+ for (const leaf of ls) {
133
+ if (!disabled.has(leaf))
134
+ leafChecked.add(leaf);
135
+ }
136
+ }
137
+ const checked = new Set();
138
+ const half = new Set();
139
+ // Bottom-up: derive each node's state from its leaf descendants.
140
+ // Process in reverse document order so children resolve before parents.
141
+ for (let i = meta.allKeys.length - 1; i >= 0; i--) {
142
+ const key = meta.allKeys[i];
143
+ const leaves = meta.leaves.get(key);
144
+ const enabledLeaves = leaves.filter((l) => !disabled.has(l));
145
+ if (enabledLeaves.length === 0)
146
+ continue;
147
+ const checkedCount = enabledLeaves.filter((l) => leafChecked.has(l)).length;
148
+ if (checkedCount === 0)
149
+ continue;
150
+ if (checkedCount === enabledLeaves.length)
151
+ checked.add(key);
152
+ else
153
+ half.add(key);
154
+ }
155
+ return { checked, half };
156
+ }
157
+ /**
158
+ * Normalize a checked set to leaf-level: any non-leaf (parent) key is expanded
159
+ * to its leaf descendants. This makes a base set resilient to being fed the
160
+ * output of `conduct` (which contains parent keys) — feeding a polluted base
161
+ * back through `toggleCheck` would otherwise re-check children on every toggle.
162
+ */
163
+ export function normalizeToLeaves(data, checked) {
164
+ const meta = buildMeta(data);
165
+ const out = new Set();
166
+ for (const key of checked) {
167
+ const leaves = meta.leaves.get(key);
168
+ if (!leaves)
169
+ continue; // unknown key — drop it
170
+ if (leaves.length === 1 && leaves[0] === key)
171
+ out.add(key); // it's a leaf
172
+ else
173
+ for (const l of leaves)
174
+ out.add(l); // parent → its leaves
175
+ }
176
+ return out;
177
+ }
178
+ /**
179
+ * Toggle a node's check in related mode: returns the next *base* checked set
180
+ * (leaf-level) after toggling `key`. The input base is normalized to leaves
181
+ * first, so passing `conduct`-output (with parent keys) round-trips correctly.
182
+ * Feed the result through `conduct` to render.
183
+ */
184
+ export function toggleCheck(data, currentChecked, key) {
185
+ const meta = buildMeta(data);
186
+ const disabled = new Set();
187
+ (function mark(nodes, pd) {
188
+ for (const node of nodes) {
189
+ const d = pd || !!node.disabled;
190
+ if (d)
191
+ disabled.add(node.key);
192
+ if (node.children)
193
+ mark(node.children, d);
194
+ }
195
+ })(data, false);
196
+ const base = normalizeToLeaves(data, currentChecked);
197
+ const leaves = (meta.leaves.get(key) ?? []).filter((l) => !disabled.has(l));
198
+ const allChecked = leaves.every((l) => base.has(l));
199
+ const next = new Set(base);
200
+ if (allChecked)
201
+ for (const l of leaves)
202
+ next.delete(l);
203
+ else
204
+ for (const l of leaves)
205
+ next.add(l);
206
+ return next;
207
+ }
208
+ /**
209
+ * Search filtering: returns the set of node keys to expand so that every node
210
+ * matching `match` is visible (its ancestor chain). The matched keys themselves
211
+ * are returned separately for highlighting.
212
+ */
213
+ export function computeFilteredKeys(data, match) {
214
+ const matched = new Set();
215
+ const expand = new Set();
216
+ function walk(node, ancestors) {
217
+ let childHit = false;
218
+ if (node.children) {
219
+ for (const child of node.children) {
220
+ if (walk(child, [...ancestors, node.key]))
221
+ childHit = true;
222
+ }
223
+ }
224
+ const selfHit = match(node);
225
+ if (selfHit)
226
+ matched.add(node.key);
227
+ if (selfHit || childHit) {
228
+ // expand all ancestors so this node is reachable
229
+ for (const a of ancestors)
230
+ expand.add(a);
231
+ if (childHit)
232
+ expand.add(node.key);
233
+ return true;
234
+ }
235
+ return false;
236
+ }
237
+ for (const root of data)
238
+ walk(root, []);
239
+ return { matched, expand };
240
+ }
241
+ /**
242
+ * Return the keys of `key`'s siblings (nodes sharing the same direct parent),
243
+ * excluding `key` itself. Roots are siblings of each other. Returns an empty
244
+ * array if the key is not found. Pure function — used by accordion mode to
245
+ * collapse same-level siblings when a node expands.
246
+ */
247
+ export function siblingKeys(data, key) {
248
+ function findSiblings(nodes) {
249
+ if (nodes.some((n) => n.key === key)) {
250
+ return nodes.filter((n) => n.key !== key).map((n) => n.key);
251
+ }
252
+ for (const n of nodes) {
253
+ if (n.children) {
254
+ const found = findSiblings(n.children);
255
+ if (found)
256
+ return found;
257
+ }
258
+ }
259
+ return null;
260
+ }
261
+ return findSiblings(data) ?? [];
262
+ }
263
+ /**
264
+ * Accordion expand: compute the next expanded set when `key` is expanded under
265
+ * accordion mode — at most one node per level stays expanded, so all of `key`'s
266
+ * siblings are collapsed. Returns a new Set containing the current expanded keys
267
+ * plus `key`, minus `key`'s siblings. Pure function (no DOM, no mutation of
268
+ * inputs); the render layer derives the resulting expansion from it.
269
+ */
270
+ export function accordionExpand(data, expandedKeys, key) {
271
+ const next = new Set(expandedKeys);
272
+ next.add(key);
273
+ for (const s of siblingKeys(data, key))
274
+ next.delete(s);
275
+ return next;
276
+ }
277
+ /**
278
+ * Drag & drop: given the pointer's vertical offset within a target row, decide
279
+ * the drop position. The row is split into three zones — top → `before`,
280
+ * middle → `inside` (become a child), bottom → `after`. When `allowInside` is
281
+ * false (e.g. a leaf target that should not gain children) the middle zone is
282
+ * folded into the nearer edge, yielding only `before`/`after`.
283
+ * Pure function (no DOM) so it is unit-testable; the render layer passes the
284
+ * measured offsetY/rowHeight.
285
+ */
286
+ export function computeDropPosition(offsetY, rowHeight, allowInside = true) {
287
+ if (rowHeight <= 0)
288
+ return 'after';
289
+ const y = offsetY < 0 ? 0 : offsetY > rowHeight ? rowHeight : offsetY;
290
+ if (!allowInside) {
291
+ return y < rowHeight / 2 ? 'before' : 'after';
292
+ }
293
+ // 三分区:上 1/4 before、中段 inside、下 1/4 after。
294
+ if (y < rowHeight / 4)
295
+ return 'before';
296
+ if (y > (rowHeight * 3) / 4)
297
+ return 'after';
298
+ return 'inside';
299
+ }
300
+ /**
301
+ * Whether `maybeAncestorKey` is the same as, or an ancestor of, `key`.
302
+ * Used to reject dropping a dragged node onto itself or into its own subtree.
303
+ */
304
+ export function isAncestorOrSelf(data, maybeAncestorKey, key) {
305
+ if (maybeAncestorKey === key)
306
+ return true;
307
+ const ancestor = findNode(data, maybeAncestorKey);
308
+ if (!ancestor || !ancestor.children)
309
+ return false;
310
+ return !!findNode(ancestor.children, key);
311
+ }
312
+ /**
313
+ * Collapse a fully-checked set (the `checked` output of {@link conduct}, which
314
+ * contains every node — parents and children — that is completely checked) into
315
+ * the value set to surface as回填 value / Tags, per `showCheckedStrategy`:
316
+ *
317
+ * - `'all'` → every checked node (input unchanged, in document order).
318
+ * - `'parent'` → only the top-most fully-checked nodes; a checked node whose
319
+ * parent is also checked is dropped (parent represents subtree).
320
+ * - `'child'` → only checked leaf nodes (no parents).
321
+ *
322
+ * Pure: derives solely from `data` + `checked`, document-ordered, no mutation.
323
+ */
324
+ export function collectCheckedByStrategy(data, checked, strategy) {
325
+ const out = [];
326
+ const walk = (nodes, parentChecked) => {
327
+ for (const node of nodes) {
328
+ const isChecked = checked.has(node.key);
329
+ const kids = node.children;
330
+ const isLeaf = !kids || kids.length === 0;
331
+ if (isChecked) {
332
+ if (strategy === 'all')
333
+ out.push(node.key);
334
+ else if (strategy === 'parent' && !parentChecked)
335
+ out.push(node.key);
336
+ else if (strategy === 'child' && isLeaf)
337
+ out.push(node.key);
338
+ }
339
+ if (kids && kids.length > 0) {
340
+ // For 'parent', once a checked ancestor is emitted we stop descending
341
+ // (its subtree is fully represented); otherwise keep walking.
342
+ if (strategy === 'parent' && isChecked)
343
+ continue;
344
+ walk(kids, isChecked);
345
+ }
346
+ }
347
+ };
348
+ walk(data, false);
349
+ return out;
350
+ }
351
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tree.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.test.d.ts","sourceRoot":"","sources":["../src/tree.test.ts"],"names":[],"mappings":""}