@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,88 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { eventCoversDay, eventsForDay, groupEventsByDays, timelineForDay, dayKey, isPastDay, } from './calendar.js';
3
+ const d = (y, m, day, h = 0) => new Date(y, m, day, h);
4
+ const events = [
5
+ { key: 'a', start: d(2026, 5, 10, 9), title: '会议 A' },
6
+ { key: 'b', start: d(2026, 5, 10, 14), title: '会议 B' },
7
+ { key: 'c', start: d(2026, 5, 10, 8), title: '全天 C', allDay: true },
8
+ { key: 'd', start: d(2026, 5, 10), end: d(2026, 5, 12), title: '跨天 D' },
9
+ { key: 'e', start: d(2026, 5, 20), title: '会议 E' },
10
+ ];
11
+ describe('eventCoversDay', () => {
12
+ it('matches a same-day event', () => {
13
+ expect(eventCoversDay(events[0], d(2026, 5, 10))).toBe(true);
14
+ expect(eventCoversDay(events[0], d(2026, 5, 11))).toBe(false);
15
+ });
16
+ it('matches every day a multi-day event spans (inclusive)', () => {
17
+ const md = events[3];
18
+ expect(eventCoversDay(md, d(2026, 5, 10))).toBe(true);
19
+ expect(eventCoversDay(md, d(2026, 5, 11))).toBe(true);
20
+ expect(eventCoversDay(md, d(2026, 5, 12))).toBe(true);
21
+ expect(eventCoversDay(md, d(2026, 5, 13))).toBe(false);
22
+ });
23
+ });
24
+ describe('eventsForDay', () => {
25
+ it('collects all events on a day, all-day first then by start time', () => {
26
+ const day = eventsForDay(events, d(2026, 5, 10));
27
+ expect(day.total.map((e) => e.key)).toEqual(['c', 'd', 'a', 'b']);
28
+ // c is allDay → first; d has start 00:00 → before a(09:00); a before b(14:00)
29
+ expect(day.overflow).toBe(0);
30
+ });
31
+ it('caps to maxPerDay and reports overflow', () => {
32
+ const day = eventsForDay(events, d(2026, 5, 10), 2);
33
+ expect(day.visible.map((e) => e.key)).toEqual(['c', 'd']);
34
+ expect(day.overflow).toBe(2);
35
+ });
36
+ it('returns empty for a day with no events', () => {
37
+ const day = eventsForDay(events, d(2026, 5, 1));
38
+ expect(day.total).toEqual([]);
39
+ expect(day.overflow).toBe(0);
40
+ });
41
+ });
42
+ describe('groupEventsByDays', () => {
43
+ it('builds an O(1) lookup map keyed by day', () => {
44
+ const days = [d(2026, 5, 10), d(2026, 5, 11), d(2026, 5, 20)];
45
+ const map = groupEventsByDays(events, days, 3);
46
+ expect(map.get(dayKey(d(2026, 5, 10)))?.total.length).toBe(4);
47
+ expect(map.get(dayKey(d(2026, 5, 11)))?.total.map((e) => e.key)).toEqual(['d']);
48
+ expect(map.get(dayKey(d(2026, 5, 20)))?.total.map((e) => e.key)).toEqual(['e']);
49
+ });
50
+ });
51
+ describe('timelineForDay', () => {
52
+ it('buckets timed events by their start hour, sorted by start time', () => {
53
+ const tl = timelineForDay(events, d(2026, 5, 10));
54
+ // a@09 and b@14 are timed; c is allDay; d is multi-day starting same day 00:00
55
+ expect(tl.byHour.get(9)?.map((e) => e.key)).toEqual(['a']);
56
+ expect(tl.byHour.get(14)?.map((e) => e.key)).toEqual(['b']);
57
+ expect(tl.byHour.get(0)?.map((e) => e.key)).toEqual(['d']); // 00:00 start
58
+ });
59
+ it('puts all-day events into the allDay bucket', () => {
60
+ const tl = timelineForDay(events, d(2026, 5, 10));
61
+ expect(tl.allDay.map((e) => e.key)).toEqual(['c']);
62
+ });
63
+ it('routes multi-day events to allDay on continuation days (start on another day)', () => {
64
+ const tl = timelineForDay(events, d(2026, 5, 11));
65
+ // event d covers the 11th but starts on the 10th → all-day on the 11th
66
+ expect(tl.allDay.map((e) => e.key)).toEqual(['d']);
67
+ expect([...tl.byHour.keys()]).toEqual([]);
68
+ });
69
+ it('clamps event hours into the visible from/to range', () => {
70
+ const late = [{ key: 'z', start: d(2026, 5, 10, 22), title: '深夜' }];
71
+ const tl = timelineForDay(late, d(2026, 5, 10), 8, 18);
72
+ expect(tl.byHour.get(18)?.map((e) => e.key)).toEqual(['z']);
73
+ });
74
+ it('returns empty buckets for a day with no events', () => {
75
+ const tl = timelineForDay(events, d(2026, 5, 1));
76
+ expect(tl.allDay).toEqual([]);
77
+ expect(tl.byHour.size).toBe(0);
78
+ });
79
+ });
80
+ describe('isPastDay', () => {
81
+ it('compares at day granularity', () => {
82
+ const today = d(2026, 5, 15, 12);
83
+ expect(isPastDay(d(2026, 5, 14), today)).toBe(true);
84
+ expect(isPastDay(d(2026, 5, 15, 23), today)).toBe(false); // same day
85
+ expect(isPastDay(d(2026, 5, 16), today)).toBe(false);
86
+ });
87
+ });
88
+ //# sourceMappingURL=calendar.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.test.js","sourceRoot":"","sources":["../src/calendar.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * cascader — framework-agnostic pure helpers for the Cascader render layer.
3
+ * ZERO framework deps. Only pure data → data transforms (red line #2):
4
+ * - flattenCascaderPaths: tree → flat selectable paths (leaf, or all levels)
5
+ * - filterCascaderPaths: query + predicate → matched flat paths
6
+ * - resolveColumnWidth: columnWidth prop (number | number[]) → per-column px
7
+ * See specs/components/input/Cascader.spec.md §4.
8
+ */
9
+ export type CascaderKey = string | number;
10
+ /** Minimal node shape consumed by the pure helpers (label/value/children). */
11
+ export interface CascaderPathNode {
12
+ label: string;
13
+ value: CascaderKey;
14
+ disabled?: boolean;
15
+ children?: CascaderPathNode[];
16
+ }
17
+ /** A fully-resolved selectable path through the tree. */
18
+ export interface CascaderFlatPath<N extends CascaderPathNode = CascaderPathNode> {
19
+ /** value keys from root → this node */
20
+ values: CascaderKey[];
21
+ /** labels from root → this node */
22
+ labels: string[];
23
+ /** node chain from root → this node */
24
+ nodes: N[];
25
+ /** whether this path ends on a leaf (no children) */
26
+ isLeaf: boolean;
27
+ /** disabled if any node along the path is disabled */
28
+ disabled: boolean;
29
+ }
30
+ /** Predicate for custom search matching: (query, flat path) → matched. */
31
+ export type CascaderFilterFn<N extends CascaderPathNode = CascaderPathNode> = (query: string, path: CascaderFlatPath<N>) => boolean;
32
+ /**
33
+ * Flatten a tree into selectable paths.
34
+ * - `includeNonLeaf=false` (default): only leaf paths.
35
+ * - `includeNonLeaf=true`: every level's path (for changeOnSelect).
36
+ * `childrenOf` lets the caller fold in async-loaded children without mutating
37
+ * the source tree. Disabled flags propagate down the chain.
38
+ */
39
+ export declare function flattenCascaderPaths<N extends CascaderPathNode>(data: N[], options?: {
40
+ includeNonLeaf?: boolean;
41
+ childrenOf?: (node: N) => N[] | undefined;
42
+ }): CascaderFlatPath<N>[];
43
+ /**
44
+ * Filter flat paths by a query.
45
+ * - `filter === false`: no matches ([]).
46
+ * - `filter === true`: default substring match on the joined label chain
47
+ * (case-insensitive), honoring `separator`.
48
+ * - `filter` is a function: custom predicate per path.
49
+ * `leafOnly` (default true) restricts the default-match result to leaf paths.
50
+ * An empty/blank query yields [] (caller decides to show columns instead).
51
+ */
52
+ export declare function filterCascaderPaths<N extends CascaderPathNode>(paths: CascaderFlatPath<N>[], query: string, filter: boolean | CascaderFilterFn<N>, options?: {
53
+ separator?: string;
54
+ leafOnly?: boolean;
55
+ }): CascaderFlatPath<N>[];
56
+ /**
57
+ * Resolve per-column widths from the `columnWidth` prop.
58
+ * - `number`: uniform width for all columns.
59
+ * - `number[]`: per-column; columns past the array length fall back to the last
60
+ * entry (or `fallback` if the array is empty).
61
+ * Returns the width (px) for column `index`.
62
+ */
63
+ export declare function resolveColumnWidth(columnWidth: number | number[] | undefined, index: number, fallback?: number): number;
64
+ //# sourceMappingURL=cascader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascader.d.ts","sourceRoot":"","sources":["../src/cascader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1C,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,yDAAyD;AACzD,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB;IAC7E,uCAAuC;IACvC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,mCAAmC;IACnC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,uCAAuC;IACvC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,qDAAqD;IACrD,MAAM,EAAE,OAAO,CAAC;IAChB,sDAAsD;IACtD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,0EAA0E;AAC1E,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,IAAI,CAC5E,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,KACtB,OAAO,CAAC;AAEb;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,gBAAgB,EAC7D,IAAI,EAAE,CAAC,EAAE,EACT,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC;CACtC,GACL,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAyBvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,gBAAgB,EAC5D,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAC5B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,EACrC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACvD,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAavB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,EAC1C,KAAK,EAAE,MAAM,EACb,QAAQ,SAAM,GACb,MAAM,CAKR"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * cascader — framework-agnostic pure helpers for the Cascader render layer.
3
+ * ZERO framework deps. Only pure data → data transforms (red line #2):
4
+ * - flattenCascaderPaths: tree → flat selectable paths (leaf, or all levels)
5
+ * - filterCascaderPaths: query + predicate → matched flat paths
6
+ * - resolveColumnWidth: columnWidth prop (number | number[]) → per-column px
7
+ * See specs/components/input/Cascader.spec.md §4.
8
+ */
9
+ /**
10
+ * Flatten a tree into selectable paths.
11
+ * - `includeNonLeaf=false` (default): only leaf paths.
12
+ * - `includeNonLeaf=true`: every level's path (for changeOnSelect).
13
+ * `childrenOf` lets the caller fold in async-loaded children without mutating
14
+ * the source tree. Disabled flags propagate down the chain.
15
+ */
16
+ export function flattenCascaderPaths(data, options = {}) {
17
+ const { includeNonLeaf = false, childrenOf } = options;
18
+ const out = [];
19
+ const walk = (nodes, values, labels, chain, parentDisabled) => {
20
+ for (const n of nodes) {
21
+ const kids = (childrenOf ? childrenOf(n) : n.children) ?? undefined;
22
+ const isLeaf = !kids || kids.length === 0;
23
+ const nv = [...values, n.value];
24
+ const nl = [...labels, n.label];
25
+ const nc = [...chain, n];
26
+ const dis = parentDisabled || !!n.disabled;
27
+ if (isLeaf || includeNonLeaf) {
28
+ out.push({ values: nv, labels: nl, nodes: nc, isLeaf, disabled: dis });
29
+ }
30
+ if (!isLeaf)
31
+ walk(kids, nv, nl, nc, dis);
32
+ }
33
+ };
34
+ walk(data, [], [], [], false);
35
+ return out;
36
+ }
37
+ /**
38
+ * Filter flat paths by a query.
39
+ * - `filter === false`: no matches ([]).
40
+ * - `filter === true`: default substring match on the joined label chain
41
+ * (case-insensitive), honoring `separator`.
42
+ * - `filter` is a function: custom predicate per path.
43
+ * `leafOnly` (default true) restricts the default-match result to leaf paths.
44
+ * An empty/blank query yields [] (caller decides to show columns instead).
45
+ */
46
+ export function filterCascaderPaths(paths, query, filter, options = {}) {
47
+ if (filter === false)
48
+ return [];
49
+ const q = query.trim();
50
+ if (q.length === 0)
51
+ return [];
52
+ const { separator = ' / ', leafOnly = true } = options;
53
+ if (typeof filter === 'function') {
54
+ return paths.filter((p) => filter(q, p));
55
+ }
56
+ const lower = q.toLowerCase();
57
+ return paths.filter((p) => {
58
+ if (leafOnly && !p.isLeaf)
59
+ return false;
60
+ return p.labels.join(separator).toLowerCase().includes(lower);
61
+ });
62
+ }
63
+ /**
64
+ * Resolve per-column widths from the `columnWidth` prop.
65
+ * - `number`: uniform width for all columns.
66
+ * - `number[]`: per-column; columns past the array length fall back to the last
67
+ * entry (or `fallback` if the array is empty).
68
+ * Returns the width (px) for column `index`.
69
+ */
70
+ export function resolveColumnWidth(columnWidth, index, fallback = 180) {
71
+ if (columnWidth === undefined)
72
+ return fallback;
73
+ if (typeof columnWidth === 'number')
74
+ return columnWidth;
75
+ if (columnWidth.length === 0)
76
+ return fallback;
77
+ return columnWidth[index] ?? columnWidth[columnWidth.length - 1];
78
+ }
79
+ //# sourceMappingURL=cascader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascader.js","sourceRoot":"","sources":["../src/cascader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cascader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascader.test.d.ts","sourceRoot":"","sources":["../src/cascader.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,107 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { flattenCascaderPaths, filterCascaderPaths, resolveColumnWidth, } from './cascader.js';
3
+ const tree = [
4
+ {
5
+ label: '浙江',
6
+ value: 'zj',
7
+ children: [
8
+ {
9
+ label: '杭州',
10
+ value: 'hz',
11
+ children: [
12
+ { label: '西湖', value: 'xh' },
13
+ { label: '余杭', value: 'yh', disabled: true },
14
+ ],
15
+ },
16
+ ],
17
+ },
18
+ {
19
+ label: '江苏',
20
+ value: 'js',
21
+ disabled: true,
22
+ children: [{ label: '南京', value: 'nj', children: [{ label: '玄武', value: 'xw' }] }],
23
+ },
24
+ ];
25
+ describe('flattenCascaderPaths', () => {
26
+ it('collects only leaf paths by default', () => {
27
+ const paths = flattenCascaderPaths(tree);
28
+ expect(paths.map((p) => p.values.join('/'))).toEqual([
29
+ 'zj/hz/xh',
30
+ 'zj/hz/yh',
31
+ 'js/nj/xw',
32
+ ]);
33
+ expect(paths.every((p) => p.isLeaf)).toBe(true);
34
+ });
35
+ it('includes non-leaf paths when requested (changeOnSelect)', () => {
36
+ const paths = flattenCascaderPaths(tree, { includeNonLeaf: true });
37
+ expect(paths.map((p) => p.values.join('/'))).toContain('zj');
38
+ expect(paths.map((p) => p.values.join('/'))).toContain('zj/hz');
39
+ });
40
+ it('propagates disabled down the chain', () => {
41
+ const paths = flattenCascaderPaths(tree);
42
+ const yh = paths.find((p) => p.values.at(-1) === 'yh');
43
+ const xw = paths.find((p) => p.values.at(-1) === 'xw');
44
+ expect(yh?.disabled).toBe(true); // own disabled
45
+ expect(xw?.disabled).toBe(true); // inherited from 江苏
46
+ });
47
+ it('folds in async children via childrenOf without mutating source', () => {
48
+ const lazy = [{ label: 'A', value: 'a' }];
49
+ const extra = new Map([
50
+ ['a', [{ label: 'B', value: 'b' }]],
51
+ ]);
52
+ const paths = flattenCascaderPaths(lazy, {
53
+ childrenOf: (n) => n.children ?? extra.get(n.value),
54
+ });
55
+ expect(paths.map((p) => p.values.join('/'))).toEqual(['a/b']);
56
+ expect(lazy[0].children).toBeUndefined();
57
+ });
58
+ });
59
+ describe('filterCascaderPaths', () => {
60
+ const flat = flattenCascaderPaths(tree, { includeNonLeaf: true });
61
+ it('returns [] when filter disabled', () => {
62
+ expect(filterCascaderPaths(flat, '杭', false)).toEqual([]);
63
+ });
64
+ it('returns [] for blank query', () => {
65
+ expect(filterCascaderPaths(flat, ' ', true)).toEqual([]);
66
+ });
67
+ it('default match is case-insensitive substring over the label chain', () => {
68
+ const r = filterCascaderPaths(flat, 'xh'.toUpperCase(), true);
69
+ // default leafOnly=true → only leaf paths
70
+ expect(r.length).toBe(0); // 'XH' not in labels (labels are chinese); sanity
71
+ const r2 = filterCascaderPaths(flat, '西湖', true);
72
+ expect(r2.map((p) => p.values.join('/'))).toEqual(['zj/hz/xh']);
73
+ });
74
+ it('respects custom separator in default match', () => {
75
+ const r = filterCascaderPaths(flat, '浙江>杭州', true, { separator: '>' });
76
+ expect(r.length).toBeGreaterThan(0);
77
+ const none = filterCascaderPaths(flat, '浙江 / 杭州', true, { separator: '>' });
78
+ expect(none.length).toBe(0);
79
+ });
80
+ it('leafOnly=false includes non-leaf matches', () => {
81
+ const r = filterCascaderPaths(flat, '杭州', true, { leafOnly: false });
82
+ expect(r.map((p) => p.values.join('/'))).toContain('zj/hz');
83
+ });
84
+ it('accepts a custom predicate', () => {
85
+ const r = filterCascaderPaths(flat, 'q', (_q, p) => p.values.at(-1) === 'nj');
86
+ expect(r.map((p) => p.values.join('/'))).toEqual(['js/nj']);
87
+ });
88
+ });
89
+ describe('resolveColumnWidth', () => {
90
+ it('returns fallback when undefined', () => {
91
+ expect(resolveColumnWidth(undefined, 0)).toBe(180);
92
+ expect(resolveColumnWidth(undefined, 2, 200)).toBe(200);
93
+ });
94
+ it('returns uniform width for a number', () => {
95
+ expect(resolveColumnWidth(220, 0)).toBe(220);
96
+ expect(resolveColumnWidth(220, 5)).toBe(220);
97
+ });
98
+ it('returns per-column width from an array, last entry past the end', () => {
99
+ expect(resolveColumnWidth([100, 200, 300], 0)).toBe(100);
100
+ expect(resolveColumnWidth([100, 200, 300], 1)).toBe(200);
101
+ expect(resolveColumnWidth([100, 200, 300], 9)).toBe(300);
102
+ });
103
+ it('falls back when the array is empty', () => {
104
+ expect(resolveColumnWidth([], 0, 150)).toBe(150);
105
+ });
106
+ });
107
+ //# sourceMappingURL=cascader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascader.test.js","sourceRoot":"","sources":["../src/cascader.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GAEnB,MAAM,eAAe,CAAC;AAEvB,MAAM,IAAI,GAAuB;IAC/B;QACE,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE;oBACR,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;oBAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;iBAC7C;aACF;SACF;KACF;IACD;QACE,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;KACnF;CACF,CAAC;AAEF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACnD,UAAU;YACV,UAAU;YACV,UAAU;SACX,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QACvD,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe;QAChD,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,IAAI,GAAuB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAsC;YACzD,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;SACpC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,EAAE;YACvC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;SACpD,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IAElE,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9D,0CAA0C;QAC1C,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,kDAAkD;QAC5E,MAAM,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC9E,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,kBAAkB,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * 颜色空间转换纯函数(framework-agnostic)。
3
+ * 红线 #2:转换为纯函数,渲染层只做格式化派生。
4
+ * 角度 h: 0-360;s/v/l/a: 0-1;r/g/b: 0-255。
5
+ */
6
+ export interface Rgb {
7
+ r: number;
8
+ g: number;
9
+ b: number;
10
+ a: number;
11
+ }
12
+ export interface Hsv {
13
+ h: number;
14
+ s: number;
15
+ v: number;
16
+ a: number;
17
+ }
18
+ export interface Hsl {
19
+ h: number;
20
+ s: number;
21
+ l: number;
22
+ a: number;
23
+ }
24
+ export type ColorFormat = 'hex' | 'rgb' | 'hsv' | 'hsl';
25
+ export declare function clamp01(n: number): number;
26
+ /** 解析 hex 字符串(#rgb / #rgba / #rrggbb / #rrggbbaa,带不带 # 均可)。失败返回 null。 */
27
+ export declare function parseHex(input: string): Rgb | null;
28
+ export interface RgbToHexOptions {
29
+ /** 输出是否包含 alpha 段(仅在 a<1 时)。默认 true。 */
30
+ alpha?: boolean;
31
+ /** 输出大写。默认 true。 */
32
+ uppercase?: boolean;
33
+ }
34
+ /** RGB → hex 字符串。 */
35
+ export declare function rgbToHex(rgb: Rgb, options?: RgbToHexOptions): string;
36
+ /** RGB → HSV。 */
37
+ export declare function rgbToHsv(rgb: Rgb): Hsv;
38
+ /** HSV → RGB。 */
39
+ export declare function hsvToRgb({ h, s, v, a }: Hsv): Rgb;
40
+ /** HSV → HSL(同一色相,转换 s/l)。 */
41
+ export declare function hsvToHsl({ h, s, v, a }: Hsv): Hsl;
42
+ /** HSL → HSV。 */
43
+ export declare function hslToHsv({ h, s, l, a }: Hsl): Hsv;
44
+ /** RGB → HSL(经 HSV 桥接)。 */
45
+ export declare function rgbToHsl(rgb: Rgb): Hsl;
46
+ /** HSL → RGB(经 HSV 桥接)。 */
47
+ export declare function hslToRgb(hsl: Hsl): Rgb;
48
+ /** hex → HSV。失败返回黑色不透明。 */
49
+ export declare function hexToHsv(hex: string): Hsv;
50
+ /** HSV → hex。 */
51
+ export declare function hsvToHex(hsv: Hsv, options?: RgbToHexOptions): string;
52
+ export interface FormatOptions {
53
+ /** 是否输出 alpha 段(hex 末尾 / rgba / hsva / hsla)。默认按 a<1 自动。 */
54
+ alpha?: boolean;
55
+ /** hex 输出大写。默认 true。 */
56
+ uppercase?: boolean;
57
+ }
58
+ /**
59
+ * 把 HSV 状态格式化为指定 format 的可读字符串(用于输入框显示)。
60
+ * rgb: rgb(r, g, b) / rgba(r, g, b, a)
61
+ * hsv: hsv(h, s%, v%) / hsva(h, s%, v%, a)
62
+ * hsl: hsl(h, s%, l%) / hsla(h, s%, l%, a)
63
+ */
64
+ export declare function formatColor(hsv: Hsv, format: ColorFormat, options?: FormatOptions): string;
65
+ /**
66
+ * 解析任意 format 的输入字符串为 HSV。失败返回 null(不改值)。
67
+ * 兼容 hex / rgb()/rgba() / hsv()/hsva() / hsl()/hsla(),逗号或空格分隔均可。
68
+ */
69
+ export declare function parseColor(input: string, format: ColorFormat): Hsv | null;
70
+ //# sourceMappingURL=color.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,GAAG;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,GAAG;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,GAAG;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAExD,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzC;AAMD,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAyBlD;AAMD,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oBAAoB;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAqB;AACrB,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CAKxE;AAED,iBAAiB;AACjB,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAkBtC;AAED,iBAAiB;AACjB,wBAAgB,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,CAmBjD;AAED,8BAA8B;AAC9B,wBAAgB,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,CAIjD;AAED,iBAAiB;AACjB,wBAAgB,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,CAIjD;AAED,2BAA2B;AAC3B,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAEtC;AAED,2BAA2B;AAC3B,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAEtC;AAED,2BAA2B;AAC3B,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAIzC;AAED,iBAAiB;AACjB,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CAEpE;AAED,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wBAAwB;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAiCR;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,GAAG,GAAG,IAAI,CAwCzE"}