@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,275 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { createAudioPlayer, normalizeAudioUrl, clampVolume, clampTime, } from './audio-player.js';
3
+ /** 一个可断言的假 <audio> 适配器:记录调用并维护一份内部媒体状态。 */
4
+ function makeAdapter(overrides = {}) {
5
+ const media = { currentTime: 0, duration: 120, volume: 1, playbackRate: 1 };
6
+ const play = vi.fn(() => { });
7
+ const pause = vi.fn(() => { });
8
+ const adapter = {
9
+ play,
10
+ pause,
11
+ getCurrentTime: () => media.currentTime,
12
+ setCurrentTime: (s) => {
13
+ media.currentTime = s;
14
+ },
15
+ getDuration: () => media.duration,
16
+ getVolume: () => media.volume,
17
+ setVolume: (v) => {
18
+ media.volume = v;
19
+ },
20
+ getPlaybackRate: () => media.playbackRate,
21
+ setPlaybackRate: (v) => {
22
+ media.playbackRate = v;
23
+ },
24
+ ...overrides,
25
+ };
26
+ return { adapter, media, play, pause };
27
+ }
28
+ describe('normalizeAudioUrl — audioUrl 四形态归一(对齐 Semi)', () => {
29
+ it('string → 单曲', () => {
30
+ expect(normalizeAudioUrl('a.mp3')).toEqual([{ src: 'a.mp3' }]);
31
+ });
32
+ it('AudioInfo → 单曲带 title/cover', () => {
33
+ expect(normalizeAudioUrl({ src: 'a.mp3', title: 'A', cover: 'a.png' })).toEqual([
34
+ { src: 'a.mp3', title: 'A', cover: 'a.png' },
35
+ ]);
36
+ });
37
+ it('string[] → 多曲,丢弃空串', () => {
38
+ expect(normalizeAudioUrl(['a.mp3', '', 'b.mp3'])).toEqual([
39
+ { src: 'a.mp3' },
40
+ { src: 'b.mp3' },
41
+ ]);
42
+ });
43
+ it('AudioInfo[] → 多曲,丢弃无 src 项', () => {
44
+ const input = [
45
+ { src: 'a.mp3', title: 'A' },
46
+ { title: 'no-src' },
47
+ { src: 'b.mp3', cover: 'b.png' },
48
+ ];
49
+ expect(normalizeAudioUrl(input)).toEqual([
50
+ { src: 'a.mp3', title: 'A' },
51
+ { src: 'b.mp3', cover: 'b.png' },
52
+ ]);
53
+ });
54
+ it('空/无效输入 → []', () => {
55
+ expect(normalizeAudioUrl(undefined)).toEqual([]);
56
+ expect(normalizeAudioUrl(null)).toEqual([]);
57
+ expect(normalizeAudioUrl('')).toEqual([]);
58
+ expect(normalizeAudioUrl([])).toEqual([]);
59
+ });
60
+ });
61
+ describe('clamp helpers', () => {
62
+ it('clampVolume 钳制 [0,100]', () => {
63
+ expect(clampVolume(-5)).toBe(0);
64
+ expect(clampVolume(50)).toBe(50);
65
+ expect(clampVolume(150)).toBe(100);
66
+ expect(clampVolume(NaN)).toBe(0);
67
+ });
68
+ it('clampTime 钳制 [0,total]', () => {
69
+ expect(clampTime(-1, 100)).toBe(0);
70
+ expect(clampTime(50, 100)).toBe(50);
71
+ expect(clampTime(200, 100)).toBe(100);
72
+ });
73
+ });
74
+ describe('createAudioPlayer — statusClick 播放/暂停', () => {
75
+ it('切换 isPlaying 并调用 play/pause', () => {
76
+ const { adapter, play, pause } = makeAdapter();
77
+ const p = createAudioPlayer(adapter, { audioUrl: 'a.mp3' });
78
+ expect(p.getState().isPlaying).toBe(false);
79
+ p.handleStatusClick();
80
+ expect(p.getState().isPlaying).toBe(true);
81
+ expect(play).toHaveBeenCalledTimes(1);
82
+ p.handleStatusClick();
83
+ expect(p.getState().isPlaying).toBe(false);
84
+ expect(pause).toHaveBeenCalledTimes(1);
85
+ });
86
+ });
87
+ describe('createAudioPlayer — trackChange 上下曲边界', () => {
88
+ it('多曲 next/prev 取模循环(对齐 Semi:末曲 next 绕回首曲、首曲 prev 绕到末曲)', () => {
89
+ const { adapter } = makeAdapter();
90
+ const p = createAudioPlayer(adapter, { audioUrl: ['a.mp3', 'b.mp3', 'c.mp3'] });
91
+ expect(p.isMultiTrack()).toBe(true);
92
+ expect(p.getState().currentTrackIndex).toBe(0);
93
+ // 首曲 prev 绕到末曲((0-1+3)%3=2,对齐 Semi)
94
+ p.handleTrackChange('prev');
95
+ expect(p.getState().currentTrackIndex).toBe(2);
96
+ p.handleTrackChange('next'); // (2+1)%3=0 绕回首曲
97
+ expect(p.getState().currentTrackIndex).toBe(0);
98
+ p.handleTrackChange('next');
99
+ expect(p.getState().currentTrackIndex).toBe(1);
100
+ p.handleTrackChange('next');
101
+ expect(p.getState().currentTrackIndex).toBe(2);
102
+ // 末曲 next 绕回首曲((2+1)%3=0)
103
+ p.handleTrackChange('next');
104
+ expect(p.getState().currentTrackIndex).toBe(0);
105
+ });
106
+ it('切曲重置进度', () => {
107
+ const { adapter } = makeAdapter();
108
+ const p = createAudioPlayer(adapter, { audioUrl: ['a.mp3', 'b.mp3'] });
109
+ p.handleTimeChange(30);
110
+ expect(p.getState().currentTime).toBe(30);
111
+ p.handleTrackChange('next');
112
+ expect(p.getState().currentTime).toBe(0);
113
+ expect(p.getState().totalTime).toBe(0);
114
+ });
115
+ it('单曲 trackChange no-op', () => {
116
+ const { adapter } = makeAdapter();
117
+ const p = createAudioPlayer(adapter, { audioUrl: 'a.mp3' });
118
+ expect(p.isMultiTrack()).toBe(false);
119
+ p.handleTrackChange('next');
120
+ expect(p.getState().currentTrackIndex).toBe(0);
121
+ });
122
+ });
123
+ describe('createAudioPlayer — timeChange / seek 钳制', () => {
124
+ it('timeChange 钳到 [0,totalTime] 并写 audio', () => {
125
+ const { adapter, media } = makeAdapter();
126
+ const p = createAudioPlayer(adapter, { audioUrl: 'a.mp3' });
127
+ p.initAudioState(); // totalTime=120
128
+ expect(p.getState().totalTime).toBe(120);
129
+ p.handleTimeChange(50);
130
+ expect(p.getState().currentTime).toBe(50);
131
+ expect(media.currentTime).toBe(50);
132
+ p.handleTimeChange(999);
133
+ expect(p.getState().currentTime).toBe(120);
134
+ p.handleTimeChange(-10);
135
+ expect(p.getState().currentTime).toBe(0);
136
+ });
137
+ it('seek 按 skipDuration 相对跳,并钳制', () => {
138
+ const { adapter } = makeAdapter();
139
+ const p = createAudioPlayer(adapter, { audioUrl: 'a.mp3', skipDuration: 15 });
140
+ p.initAudioState(); // totalTime=120
141
+ p.handleTimeChange(30);
142
+ p.handleSeek(1); // +15 → 45
143
+ expect(p.getState().currentTime).toBe(45);
144
+ p.handleSeek(-1); // -15 → 30
145
+ expect(p.getState().currentTime).toBe(30);
146
+ p.handleTimeChange(10);
147
+ p.handleSeek(-1); // 10-15 → 钳到 0
148
+ expect(p.getState().currentTime).toBe(0);
149
+ });
150
+ it('skipDuration 默认 10', () => {
151
+ const { adapter } = makeAdapter();
152
+ const p = createAudioPlayer(adapter, { audioUrl: 'a.mp3' });
153
+ p.initAudioState();
154
+ p.handleTimeChange(20);
155
+ p.handleSeek(1);
156
+ expect(p.getState().currentTime).toBe(30);
157
+ });
158
+ });
159
+ describe('createAudioPlayer — speedChange', () => {
160
+ it('写倍速到 audio 并存 state', () => {
161
+ const { adapter, media } = makeAdapter();
162
+ const p = createAudioPlayer(adapter, { audioUrl: 'a.mp3' });
163
+ p.handleSpeedChange({ label: '2.0x', value: 2 });
164
+ expect(media.playbackRate).toBe(2);
165
+ expect(p.getState().playbackRate).toEqual({ label: '2.0x', value: 2 });
166
+ });
167
+ });
168
+ describe('createAudioPlayer — refresh 重播', () => {
169
+ it('无错误:仅 currentTime 归零,不自动播放、不改 isPlaying(对齐 Semi handleRefresh)', () => {
170
+ const { adapter, media, play } = makeAdapter();
171
+ const p = createAudioPlayer(adapter, { audioUrl: 'a.mp3' });
172
+ p.handleTimeChange(60);
173
+ p.handleRefresh();
174
+ expect(media.currentTime).toBe(0);
175
+ expect(p.getState().currentTime).toBe(0);
176
+ // 对齐 Semi:不播放、不改 isPlaying(初始 false)。
177
+ expect(p.getState().isPlaying).toBe(false);
178
+ expect(play).not.toHaveBeenCalled();
179
+ });
180
+ it('错误态:调 adapter.reload() 重载并清 isError(对齐 Semi handleRefresh error 分支)', () => {
181
+ const { adapter, media } = makeAdapter();
182
+ const reload = vi.fn();
183
+ // 补齐 reload(makeAdapter 可能未提供)。
184
+ const withReload = { ...adapter, reload };
185
+ const p = createAudioPlayer(withReload, { audioUrl: 'a.mp3' });
186
+ p.errorHandler();
187
+ expect(p.getState().isError).toBe(true);
188
+ p.handleRefresh();
189
+ expect(reload).toHaveBeenCalledTimes(1);
190
+ expect(p.getState().isError).toBe(false);
191
+ void media;
192
+ });
193
+ });
194
+ describe('createAudioPlayer — volumeChange 钳制', () => {
195
+ it('钳到 [0,100] 并写 audio(0–1)', () => {
196
+ const { adapter, media } = makeAdapter();
197
+ const p = createAudioPlayer(adapter, { audioUrl: 'a.mp3' });
198
+ p.handleVolumeChange(50);
199
+ expect(p.getState().volume).toBe(50);
200
+ expect(media.volume).toBe(0.5);
201
+ p.handleVolumeChange(150);
202
+ expect(p.getState().volume).toBe(100);
203
+ expect(media.volume).toBe(1);
204
+ p.handleVolumeChange(-20);
205
+ expect(p.getState().volume).toBe(0);
206
+ expect(media.volume).toBe(0);
207
+ });
208
+ });
209
+ describe('createAudioPlayer — endHandler(对齐 Semi)', () => {
210
+ it('多曲未到末曲:切下一曲', () => {
211
+ const { adapter } = makeAdapter();
212
+ const p = createAudioPlayer(adapter, { audioUrl: ['a.mp3', 'b.mp3'] });
213
+ p.endHandler();
214
+ expect(p.getState().currentTrackIndex).toBe(1);
215
+ });
216
+ it('单曲:停止播放', () => {
217
+ const { adapter } = makeAdapter();
218
+ const p = createAudioPlayer(adapter, { audioUrl: 'a.mp3' });
219
+ p.handleStatusClick();
220
+ p.endHandler();
221
+ expect(p.getState().isPlaying).toBe(false);
222
+ });
223
+ it('多曲末曲:ended 绕回首曲并续播(对齐 Semi 循环连播)', () => {
224
+ const { adapter } = makeAdapter();
225
+ const p = createAudioPlayer(adapter, { audioUrl: ['a.mp3', 'b.mp3'] });
226
+ p.handleTrackChange('next'); // → 末曲 index=1
227
+ expect(p.getState().currentTrackIndex).toBe(1);
228
+ p.endHandler(); // 末曲 ended → (1+1)%2=0 绕回首曲
229
+ expect(p.getState().currentTrackIndex).toBe(0);
230
+ // handleTrackChange 设 isPlaying=true(切曲自动播放,对齐 Semi resetAudioState)。
231
+ expect(p.getState().isPlaying).toBe(true);
232
+ });
233
+ });
234
+ describe('createAudioPlayer — errorHandler / initAudioState / subscribe', () => {
235
+ it('errorHandler 置 isError 并停播', () => {
236
+ const { adapter } = makeAdapter();
237
+ const p = createAudioPlayer(adapter, { audioUrl: 'a.mp3' });
238
+ p.errorHandler();
239
+ expect(p.getState().isError).toBe(true);
240
+ expect(p.getState().isPlaying).toBe(false);
241
+ });
242
+ it('initAudioState 从 audio 回读时长/音量/倍速', () => {
243
+ const { adapter } = makeAdapter({ getDuration: () => 200, getVolume: () => 0.8 });
244
+ const p = createAudioPlayer(adapter, { audioUrl: 'a.mp3', autoPlay: true });
245
+ p.initAudioState();
246
+ const s = p.getState();
247
+ expect(s.totalTime).toBe(200);
248
+ expect(s.volume).toBe(80);
249
+ expect(s.isPlaying).toBe(true);
250
+ });
251
+ it('subscribe 收到状态更新,取消后不再收到', () => {
252
+ const { adapter } = makeAdapter();
253
+ const p = createAudioPlayer(adapter, { audioUrl: 'a.mp3' });
254
+ const seen = [];
255
+ const unsub = p.subscribe((s) => seen.push(s.isPlaying));
256
+ p.handleStatusClick();
257
+ expect(seen).toEqual([true]);
258
+ unsub();
259
+ p.handleStatusClick();
260
+ expect(seen).toEqual([true]);
261
+ });
262
+ });
263
+ describe('createAudioPlayer — setAudioUrl 重置与 index 钳制', () => {
264
+ it('换更短列表时 index 钳到末尾', () => {
265
+ const { adapter } = makeAdapter();
266
+ const p = createAudioPlayer(adapter, { audioUrl: ['a.mp3', 'b.mp3', 'c.mp3'] });
267
+ p.handleTrackChange('next');
268
+ p.handleTrackChange('next'); // index=2
269
+ p.setAudioUrl(['x.mp3']);
270
+ expect(p.getState().currentTrackIndex).toBe(0);
271
+ expect(p.isMultiTrack()).toBe(false);
272
+ expect(p.getCurrentTrack()).toEqual({ src: 'x.mp3' });
273
+ });
274
+ });
275
+ //# sourceMappingURL=audio-player.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-player.test.js","sourceRoot":"","sources":["../src/audio-player.test.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,10 @@
6
6
  */
7
7
  /** easeInOutCubic — smooth acceleration then deceleration, t in [0,1] → [0,1]. */
8
8
  export declare function easeInOutCubic(t: number): number;
9
- /** true if the button should be visible given the current scroll position. */
9
+ /**
10
+ * true if the button should be visible given the current scroll position.
11
+ * 对齐 Semi foundation:`scrollTop > visibilityHeight`(严格大于,边界处不显)。
12
+ */
10
13
  export declare function isAboveThreshold(scrollTop: number, visibilityHeight: number): boolean;
11
14
  /**
12
15
  * Interpolate the scroll position at elapsed `elapsed` ms of a `duration` ms
@@ -1 +1 @@
1
- {"version":3,"file":"back-top.d.ts","sourceRoot":"","sources":["../src/back-top.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAErF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIxF"}
1
+ {"version":3,"file":"back-top.d.ts","sourceRoot":"","sources":["../src/back-top.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAErF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIxF"}
package/dist/back-top.js CHANGED
@@ -12,9 +12,12 @@ export function easeInOutCubic(t) {
12
12
  return 1;
13
13
  return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;
14
14
  }
15
- /** true if the button should be visible given the current scroll position. */
15
+ /**
16
+ * true if the button should be visible given the current scroll position.
17
+ * 对齐 Semi foundation:`scrollTop > visibilityHeight`(严格大于,边界处不显)。
18
+ */
16
19
  export function isAboveThreshold(scrollTop, visibilityHeight) {
17
- return scrollTop >= visibilityHeight;
20
+ return scrollTop > visibilityHeight;
18
21
  }
19
22
  /**
20
23
  * Interpolate the scroll position at elapsed `elapsed` ms of a `duration` ms
@@ -1 +1 @@
1
- {"version":3,"file":"back-top.js","sourceRoot":"","sources":["../src/back-top.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAAC,CAAS;IACtC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AACnE,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,gBAAwB;IAC1E,OAAO,SAAS,IAAI,gBAAgB,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAe,EAAE,QAAgB;IAC9E,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"back-top.js","sourceRoot":"","sources":["../src/back-top.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAAC,CAAS;IACtC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,gBAAwB;IAC1E,OAAO,SAAS,GAAG,gBAAgB,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAe,EAAE,QAAgB;IAC9E,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -18,9 +18,10 @@ describe('easeInOutCubic', () => {
18
18
  });
19
19
  });
20
20
  describe('isAboveThreshold', () => {
21
- it('flips exactly at the threshold', () => {
21
+ // 对齐 Semi foundation:`scrollTop > visibilityHeight`(严格大于,边界处不显)。
22
+ it('flips just past the threshold (strict >, matches Semi)', () => {
22
23
  expect(isAboveThreshold(399, 400)).toBe(false);
23
- expect(isAboveThreshold(400, 400)).toBe(true);
24
+ expect(isAboveThreshold(400, 400)).toBe(false);
24
25
  expect(isAboveThreshold(401, 400)).toBe(true);
25
26
  });
26
27
  });
@@ -1 +1 @@
1
- {"version":3,"file":"back-top.test.js","sourceRoot":"","sources":["../src/back-top.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"back-top.test.js","sourceRoot":"","sources":["../src/back-top.test.ts"],"names":[],"mappings":"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"}
@@ -1,63 +1,151 @@
1
1
  /**
2
- * createCalendar helpersframework-agnostic month-view event grouping.
3
- * Pure functions only; reuses date.ts grid math. No DOM, no framework deps.
4
- * See specs/components/show/Calendar.spec.md §3 (month-view subset).
2
+ * Framework-agnostic Calendar event algorithms aligned to Semi Design's
3
+ * `@douyinfe/semi-foundation/calendar/eventUtil` + `foundation`.
4
+ *
5
+ * Four view modes: day / week / month / range. Pure functions only; no DOM,
6
+ * no framework deps. The render layer (Calendar.svelte) supplies `children`
7
+ * for each event and turns the numeric positions here into inline styles.
8
+ *
9
+ * Semi event model: an EventObject carries a `key` (required, unique) and an
10
+ * optional `start` / `end` / `allDay`. Content is the render layer's business
11
+ * (Semi: `children`); this module never touches it beyond passing it through.
5
12
  */
6
13
  import { isSameDay } from './date.js';
7
14
  export type CalendarEventKey = string | number;
15
+ /** Semi EventObject. `children` is opaque render content (any). */
8
16
  export interface CalendarEvent {
9
17
  key: CalendarEventKey;
10
- /** event start (inclusive) */
11
- start: Date;
12
- /** event end (inclusive day for multi-day; same day as start if omitted) */
18
+ start?: Date;
13
19
  end?: Date;
14
- title: string;
15
- /** category accent color (any CSS color); render layer falls back to a token */
16
- color?: string;
17
20
  allDay?: boolean;
18
- disabled?: boolean;
21
+ /** opaque render content (Semi: children); render layer owns it */
22
+ children?: unknown;
23
+ [x: string]: unknown;
19
24
  }
20
- /** Events visible on one day plus an overflow count after capping. */
21
- export interface DayEvents {
22
- /** events shown (already capped to `maxPerDay`) */
23
- visible: CalendarEvent[];
24
- /** total events on the day (including hidden) */
25
- total: CalendarEvent[];
26
- /** how many events are hidden beyond the cap (total - visible) */
27
- overflow: number;
25
+ export declare function addDaysLocal(d: Date, n: number): Date;
26
+ export declare function addHoursLocal(d: Date, n: number): Date;
27
+ export declare function endOfDay(d: Date): Date;
28
+ export declare function startOfMonth(d: Date): Date;
29
+ export declare function endOfMonth(d: Date): Date;
30
+ export declare function startOfWeek(d: Date, weekStartsOn?: WeekStartsOn): Date;
31
+ export declare function endOfWeek(d: Date, weekStartsOn?: WeekStartsOn): Date;
32
+ export declare function isSameMonth(a: Date, b: Date): boolean;
33
+ export declare function isSameWeek(a: Date, b: Date, weekStartsOn?: WeekStartsOn): boolean;
34
+ /** whole calendar days b - a (positive when b is later) */
35
+ export declare function differenceInCalendarDays(b: Date, a: Date): number;
36
+ export declare function isBefore(a: Date, b: Date): boolean;
37
+ export declare function isAfter(a: Date, b: Date): boolean;
38
+ export declare function isWeekend(d: Date): boolean;
39
+ /** ISO-ish week-of-month index (1-based) for a date, given weekStartsOn */
40
+ export declare function getWeekOfMonth(date: Date, weekStartsOn?: WeekStartsOn): number;
41
+ /** number of week rows the month spans, given weekStartsOn */
42
+ export declare function getWeeksInMonth(date: Date, weekStartsOn?: WeekStartsOn): number;
43
+ export type WeekStartsOn = 0 | 1 | 2 | 3 | 4 | 5 | 6;
44
+ export declare const round: (value: number) => number;
45
+ /** fraction of the day [0,1) at which `value`'s clock time falls (Semi getPos) */
46
+ export declare function getPos(value: Date): number;
47
+ interface DatedEvent extends CalendarEvent {
48
+ /** the calendar day this (possibly split) copy belongs to */
49
+ date: Date;
28
50
  }
29
- /** true if `date` falls within [start, end] (inclusive, day granularity). */
30
- export declare function eventCoversDay(event: CalendarEvent, date: Date): boolean;
31
51
  /**
32
- * Group events onto a specific day, sorted by start time, capped at `maxPerDay`.
33
- * Multi-day events appear on every day they cover.
52
+ * Normalize a single event: if it has no start, default start = end - 1h (or
53
+ * start-of-day if that would cross a day boundary); symmetric for missing end.
54
+ * (Semi amendEvent)
34
55
  */
35
- export declare function eventsForDay(events: readonly CalendarEvent[], date: Date, maxPerDay?: number): DayEvents;
56
+ export declare function amendEvent(event: CalendarEvent): CalendarEvent | undefined;
57
+ /** split a spanned all-day event into one copy per covered day (Semi parseAllDayEvent) */
58
+ export declare function parseAllDayEvent(event: CalendarEvent, allDay?: boolean, currDate?: Date): DatedEvent[];
36
59
  /**
37
- * Build a map (keyed by `YYYY-M-D`) of events-per-day for a set of cells,
38
- * so the render layer can look up each grid cell in O(1).
60
+ * Split an event into per-day copies (Semi parseEvent). Same-day timed events
61
+ * stay whole; timed events spanning < 24h split into a head (to end-of-day) and
62
+ * a tail (start-of-next-day); longer/all-day span into daily all-day copies.
39
63
  */
40
- export declare function groupEventsByDays(events: readonly CalendarEvent[], days: readonly Date[], maxPerDay?: number): Map<string, DayEvents>;
41
- /** stable per-day map key (local time) */
42
- export declare function dayKey(date: Date): string;
43
- /** true if `date` is strictly before today (day granularity) */
44
- export declare function isPastDay(date: Date, today: Date): boolean;
45
- /** Events laid out on a single day's hour timeline. */
46
- export interface DayTimeline {
47
- /** all-day events + events that cover the day without a concrete hour (e.g. multi-day) */
48
- allDay: CalendarEvent[];
49
- /** map of hour (0..23) → timed events starting in that hour, sorted by start time */
50
- byHour: Map<number, CalendarEvent[]>;
64
+ export declare function parseEvent(event: CalendarEvent): DatedEvent[];
65
+ /** split all events into all-day vs timed buckets (Semi _parseEvents) */
66
+ export declare function parseEvents(events: readonly CalendarEvent[]): {
67
+ allDay: DatedEvent[];
68
+ day: DatedEvent[];
69
+ };
70
+ /** group dated events into a Map keyed by start-of-day string (Semi convertEventsArrToMap) */
71
+ export declare function convertEventsArrToMap(arr: readonly DatedEvent[], key: 'start' | 'date', normalize: ((v: Date) => Date) | null): Map<string, DatedEvent[]>;
72
+ /** a timed event positioned on a single day's [0,1] vertical axis */
73
+ export interface PositionedDayEvent {
74
+ key: CalendarEventKey;
75
+ children: unknown;
76
+ /** fraction [0,1] where the event starts on the day */
77
+ startPos: number;
78
+ /** fraction [0,1] where the event ends on the day */
79
+ endPos: number;
80
+ /** horizontal offset for side-by-side overlaps, e.g. "50%" or 0 */
81
+ left: string | number;
82
+ allDay: boolean;
83
+ }
84
+ /** compute a timed event's startPos/endPos on its day (Semi renderDailyEvent) */
85
+ export declare function renderDailyEvent(event: DatedEvent): {
86
+ startPos: number;
87
+ endPos: number;
88
+ children: unknown;
89
+ allDay: boolean;
90
+ key: CalendarEventKey;
91
+ };
92
+ /**
93
+ * Timed events for one calendar day, positioned and offset for overlaps
94
+ * (Semi getParseDailyEvents). Events sharing an identical [startPos,endPos]
95
+ * are laid out side-by-side via the `left` percentage.
96
+ */
97
+ export declare function getDailyEvents(events: readonly DatedEvent[], date: Date): {
98
+ day: PositionedDayEvent[];
99
+ allDay: DatedEvent[];
100
+ };
101
+ /** a spanned all-day event positioned across the week/range top row */
102
+ export interface PositionedSpanEvent {
103
+ key: CalendarEventKey;
104
+ children: unknown;
105
+ /** fraction [0,1] of the row width where the bar starts */
106
+ leftPos: number;
107
+ /** fraction (0,1] of the row width the bar occupies */
108
+ width: number;
109
+ /** vertical stacking row index (0-based) */
110
+ topInd: number;
111
+ }
112
+ /**
113
+ * Lay out all-day/spanned events across a date range (week or multi-day view).
114
+ * `rangeStart` inclusive, `rangeEnd` exclusive (Semi's left-closed-right-open).
115
+ */
116
+ export declare function parseSpanEvents(allDayEvents: readonly DatedEvent[], rangeStart: Date, rangeEnd: Date): PositionedSpanEvent[];
117
+ /** week-scoped span layout (Semi parseWeeklyAllDayEvents) */
118
+ export declare function parseWeekSpanEvents(allDayEvents: readonly DatedEvent[], weekStart: Date, weekStartsOn?: WeekStartsOn): PositionedSpanEvent[];
119
+ /** the all-day bucket (start-of-day keyed) for a set of events, for span layout */
120
+ export declare function allDayEventMap(events: readonly CalendarEvent[]): DatedEvent[];
121
+ /** number of stacking rows a span layout needs (Semi calcRowHeight) */
122
+ export declare function calcRowHeight(events: readonly PositionedSpanEvent[]): number;
123
+ /** one date cell descriptor for month/week header rendering */
124
+ export interface DateObj {
125
+ ind: number;
126
+ date: Date;
127
+ dayString: string;
128
+ weekday: string;
129
+ isToday: boolean;
130
+ isWeekend: boolean;
131
+ isSameMonth?: boolean;
132
+ }
133
+ /**
134
+ * Month event layout: for each week row (0-based), the events laid out as a
135
+ * grid (day[]) plus a flat display list of positioned span bars, so the render
136
+ * layer can cap to N per cell and show "+remaining". (Semi getParseMonthlyEvents)
137
+ */
138
+ export interface MonthWeekEvents {
139
+ /** display[col] → span events stacked in this week, by topInd */
140
+ display: PositionedSpanEvent[];
141
+ /** day[col][topInd] → event occupying that cell/row (for +N counting) */
142
+ day: (PositionedSpanEvent | DatedEvent | undefined)[][];
51
143
  }
52
144
  /**
53
- * Split a day's events into an all-day bucket and per-hour buckets for the
54
- * day timeline (`mode='day'`). An event is "timed" on `date` only when it
55
- * actually starts on that calendar day and is not flagged `allDay`; its hour
56
- * is clamped into [fromHour, toHour]. Everything else covering the day (all-day
57
- * flagged, or multi-day events whose start falls on another day) goes to
58
- * `allDay`. Pure: no DOM, no mutation of inputs.
145
+ * Lay out a month's events by week row (Semi getParseMonthlyEvents). Returns a
146
+ * map week-index → { day, display }. The render layer counts how many events a
147
+ * given day cell holds beyond `itemLimit` for the "+N" affordance.
59
148
  */
60
- export declare function timelineForDay(events: readonly CalendarEvent[], date: Date, fromHour?: number, toHour?: number): DayTimeline;
61
- /** re-export for convenience so the render layer imports calendar bits from one place */
149
+ export declare function getMonthEvents(events: readonly CalendarEvent[], displayValue: Date, weekStartsOn?: WeekStartsOn): Record<number, MonthWeekEvents>;
62
150
  export { isSameDay };
63
151
  //# sourceMappingURL=calendar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,SAAS,EAAc,MAAM,WAAW,CAAC;AAElD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,gBAAgB,CAAC;IACtB,8BAA8B;IAC9B,KAAK,EAAE,IAAI,CAAC;IACZ,4EAA4E;IAC5E,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,sEAAsE;AACtE,MAAM,WAAW,SAAS;IACxB,mDAAmD;IACnD,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,iDAAiD;IACjD,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAKxE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,IAAI,EAAE,IAAI,EACV,SAAS,SAAW,GACnB,SAAS,CAcX;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,IAAI,EAAE,SAAS,IAAI,EAAE,EACrB,SAAS,SAAW,GACnB,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAMxB;AAED,0CAA0C;AAC1C,wBAAgB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAEzC;AAED,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAE1D;AAED,uDAAuD;AACvD,MAAM,WAAW,WAAW;IAC1B,0FAA0F;IAC1F,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,qFAAqF;IACrF,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;CACtC;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,IAAI,EAAE,IAAI,EACV,QAAQ,SAAI,EACZ,MAAM,SAAK,GACV,WAAW,CA0Bb;AAED,yFAAyF;AACzF,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"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"}