@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.
- package/dist/ai-chat-dialogue.d.ts +300 -0
- package/dist/ai-chat-dialogue.d.ts.map +1 -0
- package/dist/ai-chat-dialogue.js +699 -0
- package/dist/ai-chat-dialogue.js.map +1 -0
- package/dist/ai-chat-dialogue.test.d.ts +2 -0
- package/dist/ai-chat-dialogue.test.d.ts.map +1 -0
- package/dist/ai-chat-dialogue.test.js +338 -0
- package/dist/ai-chat-dialogue.test.js.map +1 -0
- package/dist/ai-chat-input.d.ts +191 -0
- package/dist/ai-chat-input.d.ts.map +1 -0
- package/dist/ai-chat-input.js +274 -0
- package/dist/ai-chat-input.js.map +1 -0
- package/dist/ai-chat-input.test.d.ts +2 -0
- package/dist/ai-chat-input.test.d.ts.map +1 -0
- package/dist/ai-chat-input.test.js +339 -0
- package/dist/ai-chat-input.test.js.map +1 -0
- package/dist/audio-player.d.ts +154 -0
- package/dist/audio-player.d.ts.map +1 -0
- package/dist/audio-player.js +254 -0
- package/dist/audio-player.js.map +1 -0
- package/dist/audio-player.test.d.ts +2 -0
- package/dist/audio-player.test.d.ts.map +1 -0
- package/dist/audio-player.test.js +275 -0
- package/dist/audio-player.test.js.map +1 -0
- package/dist/back-top.d.ts +4 -1
- package/dist/back-top.d.ts.map +1 -1
- package/dist/back-top.js +5 -2
- package/dist/back-top.js.map +1 -1
- package/dist/back-top.test.js +3 -2
- package/dist/back-top.test.js.map +1 -1
- package/dist/calendar.d.ts +132 -44
- package/dist/calendar.d.ts.map +1 -1
- package/dist/calendar.js +413 -70
- package/dist/calendar.js.map +1 -1
- package/dist/calendar.test.js +160 -76
- package/dist/calendar.test.js.map +1 -1
- package/dist/chat.d.ts +172 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +210 -0
- package/dist/chat.js.map +1 -0
- package/dist/chat.test.d.ts +2 -0
- package/dist/chat.test.d.ts.map +1 -0
- package/dist/chat.test.js +181 -0
- package/dist/chat.test.js.map +1 -0
- package/dist/code-highlight.d.ts +30 -0
- package/dist/code-highlight.d.ts.map +1 -0
- package/dist/code-highlight.js +37 -0
- package/dist/code-highlight.js.map +1 -0
- package/dist/code-highlight.test.d.ts +2 -0
- package/dist/code-highlight.test.d.ts.map +1 -0
- package/dist/code-highlight.test.js +36 -0
- package/dist/code-highlight.test.js.map +1 -0
- package/dist/collapsible.d.ts +41 -0
- package/dist/collapsible.d.ts.map +1 -0
- package/dist/collapsible.js +33 -0
- package/dist/collapsible.js.map +1 -0
- package/dist/collapsible.test.d.ts +2 -0
- package/dist/collapsible.test.d.ts.map +1 -0
- package/dist/collapsible.test.js +57 -0
- package/dist/collapsible.test.js.map +1 -0
- package/dist/color-value.d.ts +60 -0
- package/dist/color-value.d.ts.map +1 -0
- package/dist/color-value.js +165 -0
- package/dist/color-value.js.map +1 -0
- package/dist/color-value.test.d.ts +2 -0
- package/dist/color-value.test.d.ts.map +1 -0
- package/dist/color-value.test.js +104 -0
- package/dist/color-value.test.js.map +1 -0
- package/dist/config-provider.d.ts +76 -37
- package/dist/config-provider.d.ts.map +1 -1
- package/dist/config-provider.js +107 -32
- package/dist/config-provider.js.map +1 -1
- package/dist/config-provider.test.js +123 -60
- package/dist/config-provider.test.js.map +1 -1
- package/dist/cropper.d.ts +164 -0
- package/dist/cropper.d.ts.map +1 -0
- package/dist/cropper.js +841 -0
- package/dist/cropper.js.map +1 -0
- package/dist/cropper.test.d.ts +2 -0
- package/dist/cropper.test.d.ts.map +1 -0
- package/dist/cropper.test.js +259 -0
- package/dist/cropper.test.js.map +1 -0
- package/dist/drag-move.d.ts +119 -0
- package/dist/drag-move.d.ts.map +1 -0
- package/dist/drag-move.js +237 -0
- package/dist/drag-move.js.map +1 -0
- package/dist/drag-move.test.d.ts +2 -0
- package/dist/drag-move.test.d.ts.map +1 -0
- package/dist/drag-move.test.js +304 -0
- package/dist/drag-move.test.js.map +1 -0
- package/dist/editable.d.ts +24 -4
- package/dist/editable.d.ts.map +1 -1
- package/dist/editable.js +18 -0
- package/dist/editable.js.map +1 -1
- package/dist/editable.test.js +55 -2
- package/dist/editable.test.js.map +1 -1
- package/dist/ellipsis.d.ts +13 -0
- package/dist/ellipsis.d.ts.map +1 -1
- package/dist/ellipsis.js +36 -0
- package/dist/ellipsis.js.map +1 -1
- package/dist/ellipsis.test.js +37 -1
- package/dist/ellipsis.test.js.map +1 -1
- package/dist/form-path.d.ts +19 -0
- package/dist/form-path.d.ts.map +1 -0
- package/dist/form-path.js +97 -0
- package/dist/form-path.js.map +1 -0
- package/dist/form-path.test.d.ts +2 -0
- package/dist/form-path.test.d.ts.map +1 -0
- package/dist/form-path.test.js +57 -0
- package/dist/form-path.test.js.map +1 -0
- package/dist/form-validate.d.ts +13 -0
- package/dist/form-validate.d.ts.map +1 -0
- package/dist/form-validate.js +204 -0
- package/dist/form-validate.js.map +1 -0
- package/dist/form.d.ts +91 -18
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +170 -115
- package/dist/form.js.map +1 -1
- package/dist/form.test.js +349 -76
- package/dist/form.test.js.map +1 -1
- package/dist/highlight.d.ts +42 -32
- package/dist/highlight.d.ts.map +1 -1
- package/dist/highlight.js +67 -41
- package/dist/highlight.js.map +1 -1
- package/dist/highlight.test.js +73 -32
- package/dist/highlight.test.js.map +1 -1
- package/dist/hotkeys.d.ts +151 -0
- package/dist/hotkeys.d.ts.map +1 -0
- package/dist/hotkeys.js +188 -0
- package/dist/hotkeys.js.map +1 -0
- package/dist/hotkeys.test.d.ts +2 -0
- package/dist/hotkeys.test.d.ts.map +1 -0
- package/dist/hotkeys.test.js +170 -0
- package/dist/hotkeys.test.js.map +1 -0
- package/dist/index.d.ts +33 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -13
- package/dist/index.js.map +1 -1
- package/dist/input.d.ts +34 -0
- package/dist/input.d.ts.map +1 -0
- package/dist/input.js +54 -0
- package/dist/input.js.map +1 -0
- package/dist/input.test.d.ts +2 -0
- package/dist/input.test.d.ts.map +1 -0
- package/dist/input.test.js +56 -0
- package/dist/input.test.js.map +1 -0
- package/dist/markdown-render.d.ts +49 -0
- package/dist/markdown-render.d.ts.map +1 -0
- package/dist/markdown-render.js +61 -0
- package/dist/markdown-render.js.map +1 -0
- package/dist/markdown-render.test.d.ts +2 -0
- package/dist/markdown-render.test.d.ts.map +1 -0
- package/dist/markdown-render.test.js +106 -0
- package/dist/markdown-render.test.js.map +1 -0
- package/dist/notification.d.ts +40 -31
- package/dist/notification.d.ts.map +1 -1
- package/dist/notification.js +86 -70
- package/dist/notification.js.map +1 -1
- package/dist/notification.test.js +62 -39
- package/dist/notification.test.js.map +1 -1
- package/dist/numeral.d.ts +32 -0
- package/dist/numeral.d.ts.map +1 -0
- package/dist/numeral.js +67 -0
- package/dist/numeral.js.map +1 -0
- package/dist/numeral.test.d.ts +2 -0
- package/dist/numeral.test.d.ts.map +1 -0
- package/dist/numeral.test.js +59 -0
- package/dist/numeral.test.js.map +1 -0
- package/dist/overflow-list.d.ts +9 -40
- package/dist/overflow-list.d.ts.map +1 -1
- package/dist/overflow-list.js +9 -70
- package/dist/overflow-list.js.map +1 -1
- package/dist/overflow-list.test.js +1 -122
- package/dist/overflow-list.test.js.map +1 -1
- package/dist/pagination.d.ts +17 -0
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +48 -0
- package/dist/pagination.js.map +1 -1
- package/dist/pagination.test.js +40 -1
- package/dist/pagination.test.js.map +1 -1
- package/dist/pincode.d.ts +79 -0
- package/dist/pincode.d.ts.map +1 -0
- package/dist/pincode.js +119 -0
- package/dist/pincode.js.map +1 -0
- package/dist/pincode.test.d.ts +2 -0
- package/dist/pincode.test.d.ts.map +1 -0
- package/dist/pincode.test.js +151 -0
- package/dist/pincode.test.js.map +1 -0
- package/dist/progress.d.ts +32 -30
- package/dist/progress.d.ts.map +1 -1
- package/dist/progress.js +257 -64
- package/dist/progress.js.map +1 -1
- package/dist/progress.test.js +50 -47
- package/dist/progress.test.js.map +1 -1
- package/dist/resizable.d.ts +200 -0
- package/dist/resizable.d.ts.map +1 -0
- package/dist/resizable.js +329 -0
- package/dist/resizable.js.map +1 -0
- package/dist/resizable.test.d.ts +2 -0
- package/dist/resizable.test.d.ts.map +1 -0
- package/dist/resizable.test.js +302 -0
- package/dist/resizable.test.js.map +1 -0
- package/dist/scroll-list.d.ts +69 -62
- package/dist/scroll-list.d.ts.map +1 -1
- package/dist/scroll-list.js +103 -144
- package/dist/scroll-list.js.map +1 -1
- package/dist/scroll-list.test.js +100 -110
- package/dist/scroll-list.test.js.map +1 -1
- package/dist/sidebar.d.ts +46 -0
- package/dist/sidebar.d.ts.map +1 -0
- package/dist/sidebar.js +65 -0
- package/dist/sidebar.js.map +1 -0
- package/dist/sidebar.test.d.ts +2 -0
- package/dist/sidebar.test.d.ts.map +1 -0
- package/dist/sidebar.test.js +88 -0
- package/dist/sidebar.test.js.map +1 -0
- package/dist/spin.d.ts +5 -5
- package/dist/spin.d.ts.map +1 -1
- package/dist/spin.js +13 -39
- package/dist/spin.js.map +1 -1
- package/dist/spin.test.js +2 -26
- package/dist/spin.test.js.map +1 -1
- package/dist/toast.d.ts +33 -30
- package/dist/toast.d.ts.map +1 -1
- package/dist/toast.js +77 -72
- package/dist/toast.js.map +1 -1
- package/dist/toast.test.js +63 -37
- package/dist/toast.test.js.map +1 -1
- package/dist/tree.d.ts +22 -5
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +61 -9
- package/dist/tree.js.map +1 -1
- package/dist/tree.test.js +72 -1
- package/dist/tree.test.js.map +1 -1
- package/dist/user-guide.d.ts +73 -0
- package/dist/user-guide.d.ts.map +1 -0
- package/dist/user-guide.js +95 -0
- package/dist/user-guide.js.map +1 -0
- package/dist/user-guide.test.d.ts +2 -0
- package/dist/user-guide.test.d.ts.map +1 -0
- package/dist/user-guide.test.js +109 -0
- package/dist/user-guide.test.js.map +1 -0
- package/dist/video-player.d.ts +196 -0
- package/dist/video-player.d.ts.map +1 -0
- package/dist/video-player.js +461 -0
- package/dist/video-player.js.map +1 -0
- package/dist/video-player.test.d.ts +2 -0
- package/dist/video-player.test.d.ts.map +1 -0
- package/dist/video-player.test.js +435 -0
- package/dist/video-player.test.js.map +1 -0
- package/package.json +17 -1
- package/dist/banner.d.ts +0 -19
- package/dist/banner.d.ts.map +0 -1
- package/dist/banner.js +0 -20
- package/dist/banner.js.map +0 -1
- package/dist/banner.test.d.ts +0 -2
- package/dist/banner.test.d.ts.map +0 -1
- package/dist/banner.test.js +0 -29
- package/dist/banner.test.js.map +0 -1
- package/dist/breakpoints.d.ts +0 -30
- package/dist/breakpoints.d.ts.map +0 -1
- package/dist/breakpoints.js +0 -45
- package/dist/breakpoints.js.map +0 -1
- package/dist/breakpoints.test.d.ts +0 -2
- package/dist/breakpoints.test.d.ts.map +0 -1
- package/dist/breakpoints.test.js +0 -46
- package/dist/breakpoints.test.js.map +0 -1
- package/dist/lottie-icon.d.ts +0 -88
- package/dist/lottie-icon.d.ts.map +0 -1
- package/dist/lottie-icon.js +0 -84
- package/dist/lottie-icon.js.map +0 -1
- package/dist/lottie-icon.test.d.ts +0 -2
- package/dist/lottie-icon.test.d.ts.map +0 -1
- package/dist/lottie-icon.test.js +0 -88
- package/dist/lottie-icon.test.js.map +0 -1
- package/dist/sider.d.ts +0 -26
- package/dist/sider.d.ts.map +0 -1
- package/dist/sider.js +0 -55
- package/dist/sider.js.map +0 -1
- package/dist/sider.test.d.ts +0 -2
- package/dist/sider.test.d.ts.map +0 -1
- package/dist/sider.test.js +0 -29
- package/dist/sider.test.js.map +0 -1
package/dist/calendar.test.js
CHANGED
|
@@ -1,88 +1,172 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import {
|
|
3
|
-
const d = (y, m, day, h = 0) => new Date(y, m, day, h);
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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);
|
|
2
|
+
import { getPos, round, amendEvent, parseEvent, parseEvents, renderDailyEvent, getDailyEvents, parseSpanEvents, parseWeekSpanEvents, allDayEventMap, calcRowHeight, getMonthEvents, differenceInCalendarDays, startOfWeek, endOfWeek, getWeekOfMonth, getWeeksInMonth, } from './calendar.js';
|
|
3
|
+
const d = (y, m, day, h = 0, min = 0) => new Date(y, m, day, h, min);
|
|
4
|
+
describe('getPos', () => {
|
|
5
|
+
it('maps clock time to a [0,1) day fraction', () => {
|
|
6
|
+
expect(getPos(d(2026, 5, 10, 0, 0))).toBe(0);
|
|
7
|
+
expect(getPos(d(2026, 5, 10, 12, 0))).toBe(0.5);
|
|
8
|
+
expect(round(getPos(d(2026, 5, 10, 6, 0)))).toBe(0.25);
|
|
22
9
|
});
|
|
23
10
|
});
|
|
24
|
-
describe('
|
|
25
|
-
it('
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
11
|
+
describe('date algebra', () => {
|
|
12
|
+
it('differenceInCalendarDays ignores time-of-day', () => {
|
|
13
|
+
expect(differenceInCalendarDays(d(2026, 5, 12, 1), d(2026, 5, 10, 23))).toBe(2);
|
|
14
|
+
});
|
|
15
|
+
it('startOfWeek / endOfWeek respect weekStartsOn', () => {
|
|
16
|
+
// 2026-06-10 is a Wednesday
|
|
17
|
+
expect(startOfWeek(d(2026, 5, 10), 0).getDay()).toBe(0); // Sunday
|
|
18
|
+
expect(startOfWeek(d(2026, 5, 10), 1).getDay()).toBe(1); // Monday
|
|
19
|
+
expect(endOfWeek(d(2026, 5, 10), 0).getDay()).toBe(6); // Saturday
|
|
20
|
+
});
|
|
21
|
+
it('getWeekOfMonth / getWeeksInMonth', () => {
|
|
22
|
+
expect(getWeekOfMonth(d(2026, 5, 1), 0)).toBe(1);
|
|
23
|
+
expect(getWeeksInMonth(d(2026, 5, 1), 0)).toBeGreaterThanOrEqual(4);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('amendEvent', () => {
|
|
27
|
+
it('fills a missing end as start + 1h when same day', () => {
|
|
28
|
+
const e = amendEvent({ key: 'a', start: d(2026, 5, 10, 9) });
|
|
29
|
+
expect(e.end).toEqual(d(2026, 5, 10, 10));
|
|
30
|
+
});
|
|
31
|
+
it('fills a missing start as end - 1h when same day', () => {
|
|
32
|
+
const e = amendEvent({ key: 'a', end: d(2026, 5, 10, 9) });
|
|
33
|
+
expect(e.start).toEqual(d(2026, 5, 10, 8));
|
|
34
|
+
});
|
|
35
|
+
it('returns undefined when neither start nor end given', () => {
|
|
36
|
+
expect(amendEvent({ key: 'a' })).toBeUndefined();
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe('parseEvent', () => {
|
|
40
|
+
it('keeps a same-day timed event whole, keyed to its day', () => {
|
|
41
|
+
const res = parseEvent({ key: 'a', start: d(2026, 5, 10, 9), end: d(2026, 5, 10, 10) });
|
|
42
|
+
expect(res).toHaveLength(1);
|
|
43
|
+
expect(res[0].date).toEqual(d(2026, 5, 10));
|
|
44
|
+
});
|
|
45
|
+
it('splits a <24h cross-midnight event into a head and tail day', () => {
|
|
46
|
+
const res = parseEvent({ key: 'a', start: d(2026, 5, 10, 20), end: d(2026, 5, 11, 6) });
|
|
47
|
+
expect(res).toHaveLength(2);
|
|
48
|
+
expect(res.map((r) => r.date.getDate())).toEqual([10, 11]);
|
|
49
|
+
});
|
|
50
|
+
it('splits a long span into one all-day copy per covered day', () => {
|
|
51
|
+
const res = parseEvent({ key: 'a', start: d(2026, 5, 10), end: d(2026, 5, 12) });
|
|
52
|
+
expect(res.map((r) => r.date.getDate())).toEqual([10, 11, 12]);
|
|
53
|
+
expect(res.every((r) => r.allDay)).toBe(true);
|
|
54
|
+
});
|
|
55
|
+
it('routes allDay events through parseAllDayEvent', () => {
|
|
56
|
+
const res = parseEvent({ key: 'a', start: d(2026, 5, 10), allDay: true });
|
|
57
|
+
expect(res).toHaveLength(1);
|
|
58
|
+
expect(res[0].allDay).toBe(true);
|
|
40
59
|
});
|
|
41
60
|
});
|
|
42
|
-
describe('
|
|
43
|
-
it('
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
61
|
+
describe('parseEvents', () => {
|
|
62
|
+
it('separates all-day from timed', () => {
|
|
63
|
+
const events = [
|
|
64
|
+
{ key: 'a', start: d(2026, 5, 10, 9), end: d(2026, 5, 10, 10) },
|
|
65
|
+
{ key: 'b', start: d(2026, 5, 10), allDay: true },
|
|
66
|
+
];
|
|
67
|
+
const { allDay, day } = parseEvents(events);
|
|
68
|
+
expect(allDay.map((e) => e.key)).toEqual(['b']);
|
|
69
|
+
expect(day.map((e) => e.key)).toEqual(['a']);
|
|
49
70
|
});
|
|
50
71
|
});
|
|
51
|
-
describe('
|
|
52
|
-
it('
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
expect(
|
|
56
|
-
expect(
|
|
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);
|
|
72
|
+
describe('renderDailyEvent', () => {
|
|
73
|
+
it('computes startPos/endPos from clock times', () => {
|
|
74
|
+
const dated = parseEvent({ key: 'a', start: d(2026, 5, 10, 6), end: d(2026, 5, 10, 12) })[0];
|
|
75
|
+
const r = renderDailyEvent(dated);
|
|
76
|
+
expect(r.startPos).toBe(0.25);
|
|
77
|
+
expect(r.endPos).toBe(0.5);
|
|
78
78
|
});
|
|
79
79
|
});
|
|
80
|
-
describe('
|
|
81
|
-
it('
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
80
|
+
describe('getDailyEvents', () => {
|
|
81
|
+
it('positions timed events and offsets identical spans side-by-side', () => {
|
|
82
|
+
const events = [
|
|
83
|
+
{ key: 'a', start: d(2026, 5, 10, 9), end: d(2026, 5, 10, 10) },
|
|
84
|
+
{ key: 'b', start: d(2026, 5, 10, 9), end: d(2026, 5, 10, 10) },
|
|
85
|
+
{ key: 'c', start: d(2026, 5, 10, 14), end: d(2026, 5, 10, 15) },
|
|
86
|
+
];
|
|
87
|
+
const { day } = getDailyEvents(parseEvents(events).day, d(2026, 5, 10));
|
|
88
|
+
const a = day.find((e) => e.key === 'a');
|
|
89
|
+
const b = day.find((e) => e.key === 'b');
|
|
90
|
+
expect(a.left).toBe(0); // first in its span group
|
|
91
|
+
expect(b.left).toBe('50%'); // second of two → offset 50%
|
|
92
|
+
});
|
|
93
|
+
it('surfaces all-day events for the day in its allDay bucket', () => {
|
|
94
|
+
const events = [{ key: 'c', start: d(2026, 5, 10), allDay: true }];
|
|
95
|
+
const { allDay } = getDailyEvents(parseEvents(events).allDay, d(2026, 5, 10));
|
|
96
|
+
expect(allDay.map((e) => e.key)).toEqual(['c']);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
describe('parseSpanEvents', () => {
|
|
100
|
+
it('lays spanned all-day events across a range with leftPos/width/topInd', () => {
|
|
101
|
+
const events = [
|
|
102
|
+
{ key: 'a', start: d(2026, 5, 10), end: d(2026, 5, 12), allDay: true },
|
|
103
|
+
];
|
|
104
|
+
const spans = parseSpanEvents(allDayEventMap(events), d(2026, 5, 10), d(2026, 5, 17));
|
|
105
|
+
expect(spans).toHaveLength(1);
|
|
106
|
+
expect(spans[0].leftPos).toBe(0);
|
|
107
|
+
expect(spans[0].topInd).toBe(0);
|
|
108
|
+
expect(spans[0].width).toBeGreaterThan(0);
|
|
109
|
+
});
|
|
110
|
+
it('stacks overlapping spans on separate rows', () => {
|
|
111
|
+
const events = [
|
|
112
|
+
{ key: 'a', start: d(2026, 5, 10), end: d(2026, 5, 13), allDay: true },
|
|
113
|
+
{ key: 'b', start: d(2026, 5, 11), end: d(2026, 5, 14), allDay: true },
|
|
114
|
+
];
|
|
115
|
+
const spans = parseSpanEvents(allDayEventMap(events), d(2026, 5, 10), d(2026, 5, 17));
|
|
116
|
+
const tops = spans.map((s) => s.topInd).sort();
|
|
117
|
+
expect(tops).toEqual([0, 1]);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe('parseWeekSpanEvents', () => {
|
|
121
|
+
it('clips a span to the week window', () => {
|
|
122
|
+
const events = [
|
|
123
|
+
{ key: 'a', start: d(2026, 5, 8), end: d(2026, 5, 20), allDay: true },
|
|
124
|
+
];
|
|
125
|
+
const weekStart = startOfWeek(d(2026, 5, 10), 0);
|
|
126
|
+
const spans = parseWeekSpanEvents(allDayEventMap(events), weekStart, 0);
|
|
127
|
+
expect(spans.length).toBeGreaterThan(0);
|
|
128
|
+
expect(spans[0].width).toBeLessThanOrEqual(1);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
describe('calcRowHeight', () => {
|
|
132
|
+
it('returns 1 for empty and max(topInd)+1 otherwise', () => {
|
|
133
|
+
expect(calcRowHeight([])).toBe(1);
|
|
134
|
+
expect(calcRowHeight([
|
|
135
|
+
{ key: 'a', children: null, leftPos: 0, width: 0.5, topInd: 0 },
|
|
136
|
+
{ key: 'b', children: null, leftPos: 0, width: 0.5, topInd: 2 },
|
|
137
|
+
])).toBe(3);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
describe('getMonthEvents', () => {
|
|
141
|
+
it('buckets events by week row of the month', () => {
|
|
142
|
+
const events = [
|
|
143
|
+
{ key: 'a', start: d(2026, 5, 3), end: d(2026, 5, 3) },
|
|
144
|
+
{ key: 'b', start: d(2026, 5, 20), end: d(2026, 5, 20) },
|
|
145
|
+
];
|
|
146
|
+
const byWeek = getMonthEvents(events, d(2026, 5, 15), 0);
|
|
147
|
+
const weeks = Object.keys(byWeek).map(Number);
|
|
148
|
+
expect(weeks.length).toBeGreaterThanOrEqual(2);
|
|
149
|
+
// every week has both display + day matrices
|
|
150
|
+
for (const w of weeks) {
|
|
151
|
+
expect(byWeek[w].display).toBeDefined();
|
|
152
|
+
expect(byWeek[w].day).toBeDefined();
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
it('a cross-month long span appears in every week it covers (filterWeeklyEvents remap)', () => {
|
|
156
|
+
// 6/25 → 7/26 covers all of July; must show on each July week row, not just the first.
|
|
157
|
+
const events = [
|
|
158
|
+
{ key: 'long', start: d(2019, 5, 25, 14, 45), end: d(2019, 6, 26, 6, 18) },
|
|
159
|
+
];
|
|
160
|
+
const byWeek = getMonthEvents(events, d(2019, 6, 23), 0);
|
|
161
|
+
const weeksWithLong = Object.values(byWeek).filter((w) => w.display.some((s) => s.key === 'long'));
|
|
162
|
+
// July 2019 spans 5 week rows; the long span covers the first 4 (up to 7/26).
|
|
163
|
+
expect(weeksWithLong.length).toBeGreaterThanOrEqual(4);
|
|
164
|
+
// in each covered week it occupies topInd 0 and starts at the week's left edge.
|
|
165
|
+
for (const w of weeksWithLong) {
|
|
166
|
+
const bar = w.display.find((s) => s.key === 'long');
|
|
167
|
+
expect(bar.topInd).toBe(0);
|
|
168
|
+
expect(bar.leftPos).toBe(0);
|
|
169
|
+
}
|
|
86
170
|
});
|
|
87
171
|
});
|
|
88
172
|
//# sourceMappingURL=calendar.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar.test.js","sourceRoot":"","sources":["../src/calendar.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"calendar.test.js","sourceRoot":"","sources":["../src/calendar.test.ts"],"names":[],"mappings":"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"}
|
package/dist/chat.d.ts
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat headless — framework-agnostic logic ported from Semi Design `ChatFoundation`
|
|
3
|
+
* (semi-foundation/chat). Pure helpers + a small adapter-driven controller; the
|
|
4
|
+
* svelte layer owns DOM (scroll container, wheel/resize listeners, upload widget).
|
|
5
|
+
*
|
|
6
|
+
* 严格对齐 Semi:
|
|
7
|
+
* - 常量 ROLE / CHAT_ALIGN / MESSAGE_STATUS / MODE / SEND_HOT_KEY / SHOW_SCROLL_GAP=100 / SCROLL_ANIMATION_TIME=300。
|
|
8
|
+
* - back-bottom 显隐阈值:scrollHeight - scrollTop - clientHeight <= SHOW_SCROLL_GAP → 隐藏。
|
|
9
|
+
* - enableUpload 三态判定 getUploadProps(boolean → 三态同值;对象 → 缺省各 true;其它 → 全 true)。
|
|
10
|
+
* - sendHotKey 判定 shouldSendOnEnter(enter:无 shift 才发;shift+enter:有 shift 才发)。
|
|
11
|
+
* - onMessageSend 组装 content(无附件 → 纯文本 string;有附件 → Content[] 图片/文件分流)。
|
|
12
|
+
* - clearContext 追加 divider(末尾已是 divider 则跳过)。
|
|
13
|
+
* - delete/like/dislike/reset 的 chats 变换。
|
|
14
|
+
*
|
|
15
|
+
* See specs/components/show/Chat.spec.md §3 + semi-foundation/lib/es/chat/foundation.js。
|
|
16
|
+
*/
|
|
17
|
+
/** 消息角色。 */
|
|
18
|
+
export declare const CHAT_ROLE: {
|
|
19
|
+
readonly USER: "user";
|
|
20
|
+
readonly ASSISTANT: "assistant";
|
|
21
|
+
readonly SYSTEM: "system";
|
|
22
|
+
readonly DIVIDER: "divider";
|
|
23
|
+
};
|
|
24
|
+
export type ChatRole = (typeof CHAT_ROLE)[keyof typeof CHAT_ROLE];
|
|
25
|
+
/** 布局对齐。 */
|
|
26
|
+
export declare const CHAT_ALIGN: {
|
|
27
|
+
readonly LEFT_RIGHT: "leftRight";
|
|
28
|
+
readonly LEFT_ALIGN: "leftAlign";
|
|
29
|
+
};
|
|
30
|
+
export type ChatAlign = (typeof CHAT_ALIGN)[keyof typeof CHAT_ALIGN];
|
|
31
|
+
/** 气泡模式。 */
|
|
32
|
+
export declare const CHAT_MODE: {
|
|
33
|
+
readonly BUBBLE: "bubble";
|
|
34
|
+
readonly NO_BUBBLE: "noBubble";
|
|
35
|
+
readonly USER_BUBBLE: "userBubble";
|
|
36
|
+
};
|
|
37
|
+
export type ChatMode = (typeof CHAT_MODE)[keyof typeof CHAT_MODE];
|
|
38
|
+
/** 消息状态。 */
|
|
39
|
+
export declare const MESSAGE_STATUS: {
|
|
40
|
+
readonly LOADING: "loading";
|
|
41
|
+
readonly INCOMPLETE: "incomplete";
|
|
42
|
+
readonly COMPLETE: "complete";
|
|
43
|
+
readonly ERROR: "error";
|
|
44
|
+
};
|
|
45
|
+
export type MessageStatus = (typeof MESSAGE_STATUS)[keyof typeof MESSAGE_STATUS];
|
|
46
|
+
/** 发送快捷键。 */
|
|
47
|
+
export declare const SEND_HOT_KEY: {
|
|
48
|
+
readonly ENTER: "enter";
|
|
49
|
+
readonly SHIFT_PLUS_ENTER: "shift+enter";
|
|
50
|
+
};
|
|
51
|
+
export type SendHotKey = (typeof SEND_HOT_KEY)[keyof typeof SEND_HOT_KEY];
|
|
52
|
+
/** 图片后缀与前缀(用于 onMessageSend 附件图片/文件分流)。 */
|
|
53
|
+
export declare const PIC_SUFFIX_ARRAY: readonly ["png", "jpg", "jpeg", "gif", "bmp", "webp"];
|
|
54
|
+
export declare const PIC_PREFIX = "image/";
|
|
55
|
+
/** 返回底部按钮显隐阈值(px)。 */
|
|
56
|
+
export declare const SHOW_SCROLL_GAP = 100;
|
|
57
|
+
/** 滚动到底动画时长(ms)。 */
|
|
58
|
+
export declare const SCROLL_ANIMATION_TIME = 300;
|
|
59
|
+
/** 富内容片段。 */
|
|
60
|
+
export interface Content {
|
|
61
|
+
type: 'text' | 'image_url' | 'file_url';
|
|
62
|
+
text?: string;
|
|
63
|
+
image_url?: {
|
|
64
|
+
url: string;
|
|
65
|
+
[x: string]: unknown;
|
|
66
|
+
};
|
|
67
|
+
file_url?: {
|
|
68
|
+
url: string;
|
|
69
|
+
name: string;
|
|
70
|
+
size?: string | number;
|
|
71
|
+
type?: string;
|
|
72
|
+
[x: string]: unknown;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** 单条消息。 */
|
|
76
|
+
export interface Message {
|
|
77
|
+
role?: string;
|
|
78
|
+
name?: string;
|
|
79
|
+
id?: string;
|
|
80
|
+
content?: string | Content[];
|
|
81
|
+
parentId?: string;
|
|
82
|
+
createAt?: number;
|
|
83
|
+
status?: MessageStatus;
|
|
84
|
+
/** 用户反馈:赞。 */
|
|
85
|
+
like?: boolean;
|
|
86
|
+
/** 用户反馈:踩。 */
|
|
87
|
+
dislike?: boolean;
|
|
88
|
+
[x: string]: unknown;
|
|
89
|
+
}
|
|
90
|
+
/** 角色元数据。 */
|
|
91
|
+
export interface Metadata {
|
|
92
|
+
name?: string;
|
|
93
|
+
avatar?: unknown;
|
|
94
|
+
color?: string;
|
|
95
|
+
[x: string]: unknown;
|
|
96
|
+
}
|
|
97
|
+
/** 角色配置。 */
|
|
98
|
+
export interface RoleConfig {
|
|
99
|
+
user?: Metadata;
|
|
100
|
+
assistant?: Metadata;
|
|
101
|
+
system?: Metadata;
|
|
102
|
+
[x: string]: Metadata | undefined;
|
|
103
|
+
}
|
|
104
|
+
/** enableUpload 三态。 */
|
|
105
|
+
export interface EnableUploadProps {
|
|
106
|
+
pasteUpload?: boolean;
|
|
107
|
+
dragUpload?: boolean;
|
|
108
|
+
clickUpload?: boolean;
|
|
109
|
+
}
|
|
110
|
+
/** 上传附件项(对齐 svelte/upload 的 UploadFileItem 的子集)。 */
|
|
111
|
+
export interface ChatAttachment {
|
|
112
|
+
uid?: string;
|
|
113
|
+
name?: string;
|
|
114
|
+
size?: number | string;
|
|
115
|
+
url?: string;
|
|
116
|
+
status?: string;
|
|
117
|
+
/** 原生 File 实例(用于 MIME 判定)。 */
|
|
118
|
+
fileInstance?: {
|
|
119
|
+
type?: string;
|
|
120
|
+
} | File;
|
|
121
|
+
[x: string]: unknown;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* back-bottom 按钮是否应可见。
|
|
125
|
+
* 对齐 Semi getScroll:距底部(scrollHeight - scrollTop - clientHeight)> SHOW_SCROLL_GAP → 显示。
|
|
126
|
+
*/
|
|
127
|
+
export declare function shouldShowBackBottom(scrollHeight: number, scrollTop: number, clientHeight: number, gap?: number): boolean;
|
|
128
|
+
/**
|
|
129
|
+
* enableUpload 三态归一(对齐 Semi getUploadProps)。
|
|
130
|
+
* - boolean → 三态同值。
|
|
131
|
+
* - 对象 → 缺省字段各默认 true。
|
|
132
|
+
* - 其它(undefined 等)→ 全 true。
|
|
133
|
+
*/
|
|
134
|
+
export declare function resolveEnableUpload(enableUpload?: boolean | EnableUploadProps): Required<EnableUploadProps>;
|
|
135
|
+
/**
|
|
136
|
+
* 按 sendHotKey 判定一次 Enter 是否应触发发送(对齐 Semi onEnterPress)。
|
|
137
|
+
* - `'enter'`:按下 Shift 时不发送(换行)。
|
|
138
|
+
* - `'shift+enter'`:未按 Shift 时不发送(换行)。
|
|
139
|
+
*/
|
|
140
|
+
export declare function shouldSendOnEnter(sendHotKey: SendHotKey, shiftKey: boolean): boolean;
|
|
141
|
+
/** 附件是否为图片(对齐 Semi:MIME 前缀 image/ 或后缀命中图片集)。 */
|
|
142
|
+
export declare function isImageAttachment(item: ChatAttachment): boolean;
|
|
143
|
+
/**
|
|
144
|
+
* 组装一条发送消息的 content(对齐 Semi onMessageSend)。
|
|
145
|
+
* - 无附件(attachment 为空数组)→ 返回纯文本 string。
|
|
146
|
+
* - 有附件 → 返回 Content[]:先文本(若有),再各附件按图片/文件分流。
|
|
147
|
+
*/
|
|
148
|
+
export declare function buildSendContent(input: string, attachment?: ChatAttachment[]): string | Content[];
|
|
149
|
+
/**
|
|
150
|
+
* clearContext:末尾追加一条 divider 消息(对齐 Semi clearContext)。
|
|
151
|
+
* 若末尾已是 divider,则原样返回(不重复追加)。
|
|
152
|
+
* id / createAt 由调用方注入(保持核心纯净、可测)。
|
|
153
|
+
*/
|
|
154
|
+
export declare function appendDivider(chats: Message[], makeId: () => string, now?: () => number): Message[];
|
|
155
|
+
/** 构造一条 user 消息(对齐 Semi onMessageSend / onHintClick 的 newMessage)。 */
|
|
156
|
+
export declare function makeUserMessage(content: string | Content[], makeId: () => string, now?: () => number): Message;
|
|
157
|
+
/** 删除指定 id 的消息(对齐 Semi deleteMessage)。 */
|
|
158
|
+
export declare function deleteMessageFrom(chats: Message[], target: Message): Message[];
|
|
159
|
+
/**
|
|
160
|
+
* 切换 like(对齐 Semi likeMessage):目标消息 like 取反、dislike 置 false,其余不变。
|
|
161
|
+
*/
|
|
162
|
+
export declare function toggleLike(chats: Message[], target: Message): Message[];
|
|
163
|
+
/**
|
|
164
|
+
* 切换 dislike(对齐 Semi dislikeMessage):目标消息 dislike 取反、like 置 false,其余不变。
|
|
165
|
+
*/
|
|
166
|
+
export declare function toggleDislike(chats: Message[], target: Message): Message[];
|
|
167
|
+
/**
|
|
168
|
+
* 重置最后一条消息为 loading(对齐 Semi resetMessage):
|
|
169
|
+
* 复制末条并置 status=loading / content='' / 新 id / 新 createAt,替换末条。
|
|
170
|
+
*/
|
|
171
|
+
export declare function resetLastMessage(chats: Message[], makeId: () => string, now?: () => number): Message[];
|
|
172
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"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"}
|