@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.
- package/LICENSE +21 -0
- package/dist/back-top.d.ts +16 -0
- package/dist/back-top.d.ts.map +1 -0
- package/dist/back-top.js +29 -0
- package/dist/back-top.js.map +1 -0
- package/dist/back-top.test.d.ts +2 -0
- package/dist/back-top.test.d.ts.map +1 -0
- package/dist/back-top.test.js +44 -0
- package/dist/back-top.test.js.map +1 -0
- package/dist/banner.d.ts +19 -0
- package/dist/banner.d.ts.map +1 -0
- package/dist/banner.js +20 -0
- package/dist/banner.js.map +1 -0
- package/dist/banner.test.d.ts +2 -0
- package/dist/banner.test.d.ts.map +1 -0
- package/dist/banner.test.js +29 -0
- package/dist/banner.test.js.map +1 -0
- package/dist/breakpoints.d.ts +30 -0
- package/dist/breakpoints.d.ts.map +1 -0
- package/dist/breakpoints.js +45 -0
- package/dist/breakpoints.js.map +1 -0
- package/dist/breakpoints.test.d.ts +2 -0
- package/dist/breakpoints.test.d.ts.map +1 -0
- package/dist/breakpoints.test.js +46 -0
- package/dist/breakpoints.test.js.map +1 -0
- package/dist/calendar.d.ts +63 -0
- package/dist/calendar.d.ts.map +1 -0
- package/dist/calendar.js +94 -0
- package/dist/calendar.js.map +1 -0
- package/dist/calendar.test.d.ts +2 -0
- package/dist/calendar.test.d.ts.map +1 -0
- package/dist/calendar.test.js +88 -0
- package/dist/calendar.test.js.map +1 -0
- package/dist/cascader.d.ts +64 -0
- package/dist/cascader.d.ts.map +1 -0
- package/dist/cascader.js +79 -0
- package/dist/cascader.js.map +1 -0
- package/dist/cascader.test.d.ts +2 -0
- package/dist/cascader.test.d.ts.map +1 -0
- package/dist/cascader.test.js +107 -0
- package/dist/cascader.test.js.map +1 -0
- package/dist/color.d.ts +70 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +217 -0
- package/dist/color.js.map +1 -0
- package/dist/color.test.d.ts +2 -0
- package/dist/color.test.d.ts.map +1 -0
- package/dist/color.test.js +161 -0
- package/dist/color.test.js.map +1 -0
- package/dist/config-provider.d.ts +57 -0
- package/dist/config-provider.d.ts.map +1 -0
- package/dist/config-provider.js +49 -0
- package/dist/config-provider.js.map +1 -0
- package/dist/config-provider.test.d.ts +2 -0
- package/dist/config-provider.test.d.ts.map +1 -0
- package/dist/config-provider.test.js +76 -0
- package/dist/config-provider.test.js.map +1 -0
- package/dist/copyable.d.ts +43 -0
- package/dist/copyable.d.ts.map +1 -0
- package/dist/copyable.js +102 -0
- package/dist/copyable.js.map +1 -0
- package/dist/copyable.test.d.ts +2 -0
- package/dist/copyable.test.d.ts.map +1 -0
- package/dist/copyable.test.js +97 -0
- package/dist/copyable.test.js.map +1 -0
- package/dist/date.d.ts +86 -0
- package/dist/date.d.ts.map +1 -0
- package/dist/date.js +226 -0
- package/dist/date.js.map +1 -0
- package/dist/date.test.d.ts +2 -0
- package/dist/date.test.d.ts.map +1 -0
- package/dist/date.test.js +171 -0
- package/dist/date.test.js.map +1 -0
- package/dist/dismiss.d.ts +28 -0
- package/dist/dismiss.d.ts.map +1 -0
- package/dist/dismiss.js +42 -0
- package/dist/dismiss.js.map +1 -0
- package/dist/editable.d.ts +59 -0
- package/dist/editable.d.ts.map +1 -0
- package/dist/editable.js +85 -0
- package/dist/editable.js.map +1 -0
- package/dist/editable.test.d.ts +2 -0
- package/dist/editable.test.d.ts.map +1 -0
- package/dist/editable.test.js +111 -0
- package/dist/editable.test.js.map +1 -0
- package/dist/ellipsis.d.ts +76 -0
- package/dist/ellipsis.d.ts.map +1 -0
- package/dist/ellipsis.js +99 -0
- package/dist/ellipsis.js.map +1 -0
- package/dist/ellipsis.test.d.ts +2 -0
- package/dist/ellipsis.test.d.ts.map +1 -0
- package/dist/ellipsis.test.js +94 -0
- package/dist/ellipsis.test.js.map +1 -0
- package/dist/floating.d.ts +78 -0
- package/dist/floating.d.ts.map +1 -0
- package/dist/floating.js +169 -0
- package/dist/floating.js.map +1 -0
- package/dist/floating.test.d.ts +2 -0
- package/dist/floating.test.d.ts.map +1 -0
- package/dist/floating.test.js +169 -0
- package/dist/floating.test.js.map +1 -0
- package/dist/focus-trap.d.ts +24 -0
- package/dist/focus-trap.d.ts.map +1 -0
- package/dist/focus-trap.js +64 -0
- package/dist/focus-trap.js.map +1 -0
- package/dist/form.d.ts +131 -0
- package/dist/form.d.ts.map +1 -0
- package/dist/form.js +257 -0
- package/dist/form.js.map +1 -0
- package/dist/form.test.d.ts +2 -0
- package/dist/form.test.d.ts.map +1 -0
- package/dist/form.test.js +323 -0
- package/dist/form.test.js.map +1 -0
- package/dist/highlight.d.ts +57 -0
- package/dist/highlight.d.ts.map +1 -0
- package/dist/highlight.js +124 -0
- package/dist/highlight.js.map +1 -0
- package/dist/highlight.test.d.ts +2 -0
- package/dist/highlight.test.d.ts.map +1 -0
- package/dist/highlight.test.js +155 -0
- package/dist/highlight.test.js.map +1 -0
- package/dist/id.d.ts +4 -0
- package/dist/id.d.ts.map +1 -0
- package/dist/id.js +14 -0
- package/dist/id.js.map +1 -0
- package/dist/id.test.d.ts +2 -0
- package/dist/id.test.d.ts.map +1 -0
- package/dist/id.test.js +13 -0
- package/dist/id.test.js.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/inert-background.d.ts +27 -0
- package/dist/inert-background.d.ts.map +1 -0
- package/dist/inert-background.js +92 -0
- package/dist/inert-background.js.map +1 -0
- package/dist/inert-background.test.d.ts +2 -0
- package/dist/inert-background.test.d.ts.map +1 -0
- package/dist/inert-background.test.js +62 -0
- package/dist/inert-background.test.js.map +1 -0
- package/dist/input-number.d.ts +34 -0
- package/dist/input-number.d.ts.map +1 -0
- package/dist/input-number.js +69 -0
- package/dist/input-number.js.map +1 -0
- package/dist/input-number.test.d.ts +2 -0
- package/dist/input-number.test.d.ts.map +1 -0
- package/dist/input-number.test.js +74 -0
- package/dist/input-number.test.js.map +1 -0
- package/dist/list-selection.d.ts +38 -0
- package/dist/list-selection.d.ts.map +1 -0
- package/dist/list-selection.js +61 -0
- package/dist/list-selection.js.map +1 -0
- package/dist/list-selection.test.d.ts +2 -0
- package/dist/list-selection.test.d.ts.map +1 -0
- package/dist/list-selection.test.js +61 -0
- package/dist/list-selection.test.js.map +1 -0
- package/dist/live-announcer.d.ts +38 -0
- package/dist/live-announcer.d.ts.map +1 -0
- package/dist/live-announcer.js +89 -0
- package/dist/live-announcer.js.map +1 -0
- package/dist/live-announcer.test.d.ts +2 -0
- package/dist/live-announcer.test.d.ts.map +1 -0
- package/dist/live-announcer.test.js +70 -0
- package/dist/live-announcer.test.js.map +1 -0
- package/dist/lottie-icon.d.ts +88 -0
- package/dist/lottie-icon.d.ts.map +1 -0
- package/dist/lottie-icon.js +84 -0
- package/dist/lottie-icon.js.map +1 -0
- package/dist/lottie-icon.test.d.ts +2 -0
- package/dist/lottie-icon.test.d.ts.map +1 -0
- package/dist/lottie-icon.test.js +88 -0
- package/dist/lottie-icon.test.js.map +1 -0
- package/dist/notification.d.ts +61 -0
- package/dist/notification.d.ts.map +1 -0
- package/dist/notification.js +133 -0
- package/dist/notification.js.map +1 -0
- package/dist/notification.test.d.ts +2 -0
- package/dist/notification.test.d.ts.map +1 -0
- package/dist/notification.test.js +103 -0
- package/dist/notification.test.js.map +1 -0
- package/dist/overflow-list.d.ts +102 -0
- package/dist/overflow-list.d.ts.map +1 -0
- package/dist/overflow-list.js +159 -0
- package/dist/overflow-list.js.map +1 -0
- package/dist/overflow-list.test.d.ts +2 -0
- package/dist/overflow-list.test.d.ts.map +1 -0
- package/dist/overflow-list.test.js +223 -0
- package/dist/overflow-list.test.js.map +1 -0
- package/dist/pagination.d.ts +51 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +127 -0
- package/dist/pagination.js.map +1 -0
- package/dist/pagination.test.d.ts +2 -0
- package/dist/pagination.test.d.ts.map +1 -0
- package/dist/pagination.test.js +147 -0
- package/dist/pagination.test.js.map +1 -0
- package/dist/progress.d.ts +64 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +92 -0
- package/dist/progress.js.map +1 -0
- package/dist/progress.test.d.ts +2 -0
- package/dist/progress.test.d.ts.map +1 -0
- package/dist/progress.test.js +79 -0
- package/dist/progress.test.js.map +1 -0
- package/dist/resize-observer.d.ts +133 -0
- package/dist/resize-observer.d.ts.map +1 -0
- package/dist/resize-observer.js +358 -0
- package/dist/resize-observer.js.map +1 -0
- package/dist/resize-observer.test.d.ts +2 -0
- package/dist/resize-observer.test.d.ts.map +1 -0
- package/dist/resize-observer.test.js +377 -0
- package/dist/resize-observer.test.js.map +1 -0
- package/dist/roving.d.ts +26 -0
- package/dist/roving.d.ts.map +1 -0
- package/dist/roving.js +61 -0
- package/dist/roving.js.map +1 -0
- package/dist/roving.test.d.ts +2 -0
- package/dist/roving.test.d.ts.map +1 -0
- package/dist/roving.test.js +48 -0
- package/dist/roving.test.js.map +1 -0
- package/dist/scroll-list.d.ts +81 -0
- package/dist/scroll-list.d.ts.map +1 -0
- package/dist/scroll-list.js +175 -0
- package/dist/scroll-list.js.map +1 -0
- package/dist/scroll-list.test.d.ts +2 -0
- package/dist/scroll-list.test.d.ts.map +1 -0
- package/dist/scroll-list.test.js +135 -0
- package/dist/scroll-list.test.js.map +1 -0
- package/dist/scroll-lock.d.ts +11 -0
- package/dist/scroll-lock.d.ts.map +1 -0
- package/dist/scroll-lock.js +45 -0
- package/dist/scroll-lock.js.map +1 -0
- package/dist/scroll-lock.test.d.ts +2 -0
- package/dist/scroll-lock.test.d.ts.map +1 -0
- package/dist/scroll-lock.test.js +55 -0
- package/dist/scroll-lock.test.js.map +1 -0
- package/dist/sider.d.ts +26 -0
- package/dist/sider.d.ts.map +1 -0
- package/dist/sider.js +55 -0
- package/dist/sider.js.map +1 -0
- package/dist/sider.test.d.ts +2 -0
- package/dist/sider.test.d.ts.map +1 -0
- package/dist/sider.test.js +29 -0
- package/dist/sider.test.js.map +1 -0
- package/dist/spin.d.ts +25 -0
- package/dist/spin.d.ts.map +1 -0
- package/dist/spin.js +96 -0
- package/dist/spin.js.map +1 -0
- package/dist/spin.test.d.ts +2 -0
- package/dist/spin.test.d.ts.map +1 -0
- package/dist/spin.test.js +80 -0
- package/dist/spin.test.js.map +1 -0
- package/dist/table.d.ts +101 -0
- package/dist/table.d.ts.map +1 -0
- package/dist/table.js +244 -0
- package/dist/table.js.map +1 -0
- package/dist/table.test.d.ts +2 -0
- package/dist/table.test.d.ts.map +1 -0
- package/dist/table.test.js +184 -0
- package/dist/table.test.js.map +1 -0
- package/dist/textarea.d.ts +48 -0
- package/dist/textarea.d.ts.map +1 -0
- package/dist/textarea.js +76 -0
- package/dist/textarea.js.map +1 -0
- package/dist/textarea.test.d.ts +2 -0
- package/dist/textarea.test.d.ts.map +1 -0
- package/dist/textarea.test.js +77 -0
- package/dist/textarea.test.js.map +1 -0
- package/dist/time.d.ts +93 -0
- package/dist/time.d.ts.map +1 -0
- package/dist/time.js +181 -0
- package/dist/time.js.map +1 -0
- package/dist/time.test.d.ts +2 -0
- package/dist/time.test.d.ts.map +1 -0
- package/dist/time.test.js +159 -0
- package/dist/time.test.js.map +1 -0
- package/dist/toast.d.ts +60 -0
- package/dist/toast.d.ts.map +1 -0
- package/dist/toast.js +135 -0
- package/dist/toast.js.map +1 -0
- package/dist/toast.test.d.ts +2 -0
- package/dist/toast.test.d.ts.map +1 -0
- package/dist/toast.test.js +127 -0
- package/dist/toast.test.js.map +1 -0
- package/dist/tree.d.ts +129 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +351 -0
- package/dist/tree.js.map +1 -0
- package/dist/tree.test.d.ts +2 -0
- package/dist/tree.test.d.ts.map +1 -0
- package/dist/tree.test.js +291 -0
- package/dist/tree.test.js.map +1 -0
- package/dist/upload.d.ts +62 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +85 -0
- package/dist/upload.js.map +1 -0
- package/dist/upload.test.d.ts +2 -0
- package/dist/upload.test.d.ts.map +1 -0
- package/dist/upload.test.js +169 -0
- package/dist/upload.test.js.map +1 -0
- package/dist/virtual-list.d.ts +83 -0
- package/dist/virtual-list.d.ts.map +1 -0
- package/dist/virtual-list.js +143 -0
- package/dist/virtual-list.js.map +1 -0
- package/dist/virtual-list.test.d.ts +2 -0
- package/dist/virtual-list.test.d.ts.map +1 -0
- package/dist/virtual-list.test.js +148 -0
- package/dist/virtual-list.test.js.map +1 -0
- package/package.json +22 -0
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import { describe, expect, it, vi, afterEach, beforeEach } from 'vitest';
|
|
2
|
+
import { normalizeEntry, isResizeObserverSupported, createResizeObserver, resolveSchedule, createScheduler, advanceResizePhase, endResizePhase, getGlobalResizeObserver, } from './resize-observer.js';
|
|
3
|
+
function makeEntry(over) {
|
|
4
|
+
return {
|
|
5
|
+
target: {},
|
|
6
|
+
contentRect: { width: 0, height: 0 },
|
|
7
|
+
borderBoxSize: [],
|
|
8
|
+
contentBoxSize: [],
|
|
9
|
+
devicePixelContentBoxSize: [],
|
|
10
|
+
...over,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
describe('normalizeEntry', () => {
|
|
14
|
+
it('reads contentBoxSize for content-box', () => {
|
|
15
|
+
const e = makeEntry({
|
|
16
|
+
contentBoxSize: [{ inlineSize: 320, blockSize: 200 }],
|
|
17
|
+
});
|
|
18
|
+
const r = normalizeEntry(e, 'content-box');
|
|
19
|
+
expect(r).toMatchObject({ width: 320, height: 200, box: 'content-box' });
|
|
20
|
+
});
|
|
21
|
+
it('reads borderBoxSize for border-box', () => {
|
|
22
|
+
const e = makeEntry({
|
|
23
|
+
borderBoxSize: [{ inlineSize: 340, blockSize: 220 }],
|
|
24
|
+
});
|
|
25
|
+
const r = normalizeEntry(e, 'border-box');
|
|
26
|
+
expect(r).toMatchObject({ width: 340, height: 220, box: 'border-box' });
|
|
27
|
+
});
|
|
28
|
+
it('falls back to contentRect when box sizes are empty', () => {
|
|
29
|
+
const e = makeEntry({ contentRect: { width: 100, height: 50 } });
|
|
30
|
+
const r = normalizeEntry(e, 'content-box');
|
|
31
|
+
expect(r).toMatchObject({ width: 100, height: 50 });
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe('isResizeObserverSupported', () => {
|
|
35
|
+
afterEach(() => vi.unstubAllGlobals());
|
|
36
|
+
it('false when ResizeObserver absent', () => {
|
|
37
|
+
vi.stubGlobal('ResizeObserver', undefined);
|
|
38
|
+
expect(isResizeObserverSupported()).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
it('true when ResizeObserver present', () => {
|
|
41
|
+
vi.stubGlobal('ResizeObserver', class {
|
|
42
|
+
});
|
|
43
|
+
expect(isResizeObserverSupported()).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('createResizeObserver (unsupported degrade)', () => {
|
|
47
|
+
afterEach(() => vi.unstubAllGlobals());
|
|
48
|
+
it('returns a no-op api with supported=false when native is absent', () => {
|
|
49
|
+
vi.stubGlobal('ResizeObserver', undefined);
|
|
50
|
+
const api = createResizeObserver({ onResize: () => { } });
|
|
51
|
+
expect(api.supported).toBe(false);
|
|
52
|
+
// no-ops do not throw
|
|
53
|
+
expect(() => {
|
|
54
|
+
api.observe({});
|
|
55
|
+
api.unobserve({});
|
|
56
|
+
api.disconnect();
|
|
57
|
+
}).not.toThrow();
|
|
58
|
+
});
|
|
59
|
+
it('observe/disconnect route through the native observer when supported', () => {
|
|
60
|
+
const observe = vi.fn();
|
|
61
|
+
const disconnect = vi.fn();
|
|
62
|
+
vi.stubGlobal('ResizeObserver', class {
|
|
63
|
+
observe = observe;
|
|
64
|
+
unobserve = vi.fn();
|
|
65
|
+
disconnect = disconnect;
|
|
66
|
+
});
|
|
67
|
+
const api = createResizeObserver({ onResize: () => { } });
|
|
68
|
+
expect(api.supported).toBe(true);
|
|
69
|
+
const el = {};
|
|
70
|
+
api.observe(el);
|
|
71
|
+
expect(observe).toHaveBeenCalledWith(el, { box: 'content-box' });
|
|
72
|
+
api.disconnect();
|
|
73
|
+
expect(disconnect).toHaveBeenCalled();
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe('resolveSchedule', () => {
|
|
77
|
+
it('defaults to none when neither set', () => {
|
|
78
|
+
expect(resolveSchedule({})).toEqual({ strategy: 'none' });
|
|
79
|
+
expect(resolveSchedule({ throttle: 0, debounce: 0 })).toEqual({ strategy: 'none' });
|
|
80
|
+
});
|
|
81
|
+
it('maps throttle when only throttle > 0', () => {
|
|
82
|
+
expect(resolveSchedule({ throttle: 16 })).toEqual({ strategy: 'throttle', wait: 16 });
|
|
83
|
+
});
|
|
84
|
+
it('maps debounce when only debounce > 0', () => {
|
|
85
|
+
expect(resolveSchedule({ debounce: 100 })).toEqual({ strategy: 'debounce', wait: 100 });
|
|
86
|
+
});
|
|
87
|
+
it('debounce wins when both set (mutually exclusive)', () => {
|
|
88
|
+
expect(resolveSchedule({ throttle: 16, debounce: 100 })).toEqual({
|
|
89
|
+
strategy: 'debounce',
|
|
90
|
+
wait: 100,
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe('createScheduler', () => {
|
|
95
|
+
beforeEach(() => vi.useFakeTimers());
|
|
96
|
+
afterEach(() => vi.useRealTimers());
|
|
97
|
+
it('none: invokes synchronously every time', () => {
|
|
98
|
+
const fn = vi.fn();
|
|
99
|
+
const s = createScheduler({ strategy: 'none' });
|
|
100
|
+
s.run(fn);
|
|
101
|
+
s.run(fn);
|
|
102
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
103
|
+
});
|
|
104
|
+
it('throttle: leading fire then trailing, drops middle frames', () => {
|
|
105
|
+
const fn = vi.fn();
|
|
106
|
+
const s = createScheduler({ strategy: 'throttle', wait: 100 });
|
|
107
|
+
s.run(() => fn(1)); // leading — fires now
|
|
108
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
109
|
+
s.run(() => fn(2)); // within window — scheduled trailing
|
|
110
|
+
s.run(() => fn(3)); // within window — replaces pending
|
|
111
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
112
|
+
vi.advanceTimersByTime(100);
|
|
113
|
+
// trailing fires with the latest (3)
|
|
114
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
115
|
+
expect(fn).toHaveBeenLastCalledWith(3);
|
|
116
|
+
});
|
|
117
|
+
it('throttle: respects wait between leading fires', () => {
|
|
118
|
+
const fn = vi.fn();
|
|
119
|
+
const s = createScheduler({ strategy: 'throttle', wait: 100 });
|
|
120
|
+
s.run(fn);
|
|
121
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
122
|
+
vi.advanceTimersByTime(100); // trailing window passes (no extra pending after fire? pending was same)
|
|
123
|
+
// advance real-ish clock so next run is a fresh leading
|
|
124
|
+
vi.advanceTimersByTime(200);
|
|
125
|
+
s.run(fn);
|
|
126
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
127
|
+
});
|
|
128
|
+
it('debounce: only trailing fires after silence', () => {
|
|
129
|
+
const fn = vi.fn();
|
|
130
|
+
const s = createScheduler({ strategy: 'debounce', wait: 100 });
|
|
131
|
+
s.run(() => fn(1));
|
|
132
|
+
s.run(() => fn(2));
|
|
133
|
+
s.run(() => fn(3));
|
|
134
|
+
expect(fn).not.toHaveBeenCalled();
|
|
135
|
+
vi.advanceTimersByTime(99);
|
|
136
|
+
expect(fn).not.toHaveBeenCalled();
|
|
137
|
+
vi.advanceTimersByTime(1);
|
|
138
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
139
|
+
expect(fn).toHaveBeenLastCalledWith(3);
|
|
140
|
+
});
|
|
141
|
+
it('cancel clears the pending timer (no fire)', () => {
|
|
142
|
+
const fn = vi.fn();
|
|
143
|
+
const s = createScheduler({ strategy: 'debounce', wait: 100 });
|
|
144
|
+
s.run(fn);
|
|
145
|
+
s.cancel();
|
|
146
|
+
vi.advanceTimersByTime(200);
|
|
147
|
+
expect(fn).not.toHaveBeenCalled();
|
|
148
|
+
});
|
|
149
|
+
it('flush fires the pending commit immediately', () => {
|
|
150
|
+
const fn = vi.fn();
|
|
151
|
+
const s = createScheduler({ strategy: 'debounce', wait: 100 });
|
|
152
|
+
s.run(fn);
|
|
153
|
+
s.flush();
|
|
154
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
155
|
+
vi.advanceTimersByTime(200);
|
|
156
|
+
expect(fn).toHaveBeenCalledTimes(1); // not fired twice
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
describe('createResizeObserver (scheduling)', () => {
|
|
160
|
+
afterEach(() => {
|
|
161
|
+
vi.unstubAllGlobals();
|
|
162
|
+
vi.useRealTimers();
|
|
163
|
+
});
|
|
164
|
+
it('debounces native callbacks', () => {
|
|
165
|
+
vi.useFakeTimers();
|
|
166
|
+
let trigger;
|
|
167
|
+
vi.stubGlobal('ResizeObserver', class {
|
|
168
|
+
constructor(cb) {
|
|
169
|
+
trigger = cb;
|
|
170
|
+
}
|
|
171
|
+
observe() { }
|
|
172
|
+
unobserve() { }
|
|
173
|
+
disconnect() { }
|
|
174
|
+
});
|
|
175
|
+
const onResize = vi.fn();
|
|
176
|
+
createResizeObserver({ onResize, debounce: 100 });
|
|
177
|
+
const e = makeEntry({ contentRect: { width: 10, height: 10 } });
|
|
178
|
+
trigger([e]);
|
|
179
|
+
trigger([e]);
|
|
180
|
+
expect(onResize).not.toHaveBeenCalled();
|
|
181
|
+
vi.advanceTimersByTime(100);
|
|
182
|
+
expect(onResize).toHaveBeenCalledTimes(1);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('advanceResizePhase / endResizePhase (start/end 纯状态机)', () => {
|
|
186
|
+
it('first resize while idle → emitStart and enters resizing', () => {
|
|
187
|
+
expect(advanceResizePhase(false)).toEqual({ resizing: true, emitStart: true });
|
|
188
|
+
});
|
|
189
|
+
it('subsequent resize while resizing → no start, stays resizing', () => {
|
|
190
|
+
expect(advanceResizePhase(true)).toEqual({ resizing: true, emitStart: false });
|
|
191
|
+
});
|
|
192
|
+
it('silence while resizing → emitEnd and leaves resizing', () => {
|
|
193
|
+
expect(endResizePhase(true)).toEqual({ resizing: false, emitEnd: true });
|
|
194
|
+
});
|
|
195
|
+
it('silence while idle → no end (idempotent)', () => {
|
|
196
|
+
expect(endResizePhase(false)).toEqual({ resizing: false, emitEnd: false });
|
|
197
|
+
});
|
|
198
|
+
it('full cycle: start once, end once across a burst', () => {
|
|
199
|
+
let state = false;
|
|
200
|
+
let starts = 0;
|
|
201
|
+
let ends = 0;
|
|
202
|
+
// burst of three resizes
|
|
203
|
+
for (let i = 0; i < 3; i++) {
|
|
204
|
+
const a = advanceResizePhase(state);
|
|
205
|
+
state = a.resizing;
|
|
206
|
+
if (a.emitStart)
|
|
207
|
+
starts += 1;
|
|
208
|
+
}
|
|
209
|
+
const e = endResizePhase(state);
|
|
210
|
+
state = e.resizing;
|
|
211
|
+
if (e.emitEnd)
|
|
212
|
+
ends += 1;
|
|
213
|
+
expect(starts).toBe(1);
|
|
214
|
+
expect(ends).toBe(1);
|
|
215
|
+
expect(state).toBe(false);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
describe('createResizeObserver (start/end events)', () => {
|
|
219
|
+
afterEach(() => {
|
|
220
|
+
vi.unstubAllGlobals();
|
|
221
|
+
vi.useRealTimers();
|
|
222
|
+
});
|
|
223
|
+
it('fires onResizeStart once on first frame, onResizeEnd after silence', () => {
|
|
224
|
+
vi.useFakeTimers();
|
|
225
|
+
let trigger;
|
|
226
|
+
vi.stubGlobal('ResizeObserver', class {
|
|
227
|
+
constructor(cb) {
|
|
228
|
+
trigger = cb;
|
|
229
|
+
}
|
|
230
|
+
observe() { }
|
|
231
|
+
unobserve() { }
|
|
232
|
+
disconnect() { }
|
|
233
|
+
});
|
|
234
|
+
const onResizeStart = vi.fn();
|
|
235
|
+
const onResizeEnd = vi.fn();
|
|
236
|
+
createResizeObserver({
|
|
237
|
+
onResize: () => { },
|
|
238
|
+
onResizeStart,
|
|
239
|
+
onResizeEnd,
|
|
240
|
+
resizeEndDelay: 100,
|
|
241
|
+
});
|
|
242
|
+
const e = makeEntry({ contentRect: { width: 10, height: 10 } });
|
|
243
|
+
trigger([e]);
|
|
244
|
+
trigger([e]);
|
|
245
|
+
trigger([e]);
|
|
246
|
+
expect(onResizeStart).toHaveBeenCalledTimes(1);
|
|
247
|
+
expect(onResizeEnd).not.toHaveBeenCalled();
|
|
248
|
+
vi.advanceTimersByTime(100);
|
|
249
|
+
expect(onResizeEnd).toHaveBeenCalledTimes(1);
|
|
250
|
+
// a fresh burst → start again
|
|
251
|
+
trigger([e]);
|
|
252
|
+
expect(onResizeStart).toHaveBeenCalledTimes(2);
|
|
253
|
+
});
|
|
254
|
+
it('does not arm timers when no start/end handlers given (backward compat)', () => {
|
|
255
|
+
vi.useFakeTimers();
|
|
256
|
+
let trigger;
|
|
257
|
+
vi.stubGlobal('ResizeObserver', class {
|
|
258
|
+
constructor(cb) {
|
|
259
|
+
trigger = cb;
|
|
260
|
+
}
|
|
261
|
+
observe() { }
|
|
262
|
+
unobserve() { }
|
|
263
|
+
disconnect() { }
|
|
264
|
+
});
|
|
265
|
+
const onResize = vi.fn();
|
|
266
|
+
createResizeObserver({ onResize });
|
|
267
|
+
const e = makeEntry({ contentRect: { width: 1, height: 1 } });
|
|
268
|
+
trigger([e]);
|
|
269
|
+
expect(onResize).toHaveBeenCalledTimes(1);
|
|
270
|
+
// no pending timers expected
|
|
271
|
+
expect(vi.getTimerCount()).toBe(0);
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
describe('createResizeObserver (fallbackToWindow)', () => {
|
|
275
|
+
beforeEach(() => vi.useFakeTimers());
|
|
276
|
+
afterEach(() => {
|
|
277
|
+
vi.useRealTimers();
|
|
278
|
+
vi.unstubAllGlobals();
|
|
279
|
+
});
|
|
280
|
+
it('uses window.resize when native is absent', () => {
|
|
281
|
+
vi.stubGlobal('ResizeObserver', undefined);
|
|
282
|
+
const addEventListener = vi.fn();
|
|
283
|
+
const removeEventListener = vi.fn();
|
|
284
|
+
vi.stubGlobal('addEventListener', addEventListener);
|
|
285
|
+
vi.stubGlobal('removeEventListener', removeEventListener);
|
|
286
|
+
const onResize = vi.fn();
|
|
287
|
+
const api = createResizeObserver({ onResize, fallbackToWindow: true });
|
|
288
|
+
expect(api.supported).toBe(false);
|
|
289
|
+
const el = {
|
|
290
|
+
getBoundingClientRect: () => ({ width: 42, height: 24 }),
|
|
291
|
+
};
|
|
292
|
+
api.observe(el);
|
|
293
|
+
// 红线 #2:observe() 不同步回调(与原生 RO 一致,避免在挂载 effect 内同步写 state
|
|
294
|
+
// 形成 effect_update_depth_exceeded);首测延后到下一宏任务。
|
|
295
|
+
expect(onResize).not.toHaveBeenCalled();
|
|
296
|
+
expect(addEventListener).toHaveBeenCalledWith('resize', expect.any(Function));
|
|
297
|
+
// 推进宏任务 → 初始测量到达
|
|
298
|
+
vi.runAllTimers();
|
|
299
|
+
expect(onResize).toHaveBeenCalledTimes(1);
|
|
300
|
+
expect(onResize).toHaveBeenLastCalledWith(expect.objectContaining({ width: 42, height: 24 }));
|
|
301
|
+
// simulate a window resize → re-measure
|
|
302
|
+
const handler = addEventListener.mock.calls[0][1];
|
|
303
|
+
handler();
|
|
304
|
+
expect(onResize).toHaveBeenCalledTimes(2);
|
|
305
|
+
api.disconnect();
|
|
306
|
+
expect(removeEventListener).toHaveBeenCalledWith('resize', expect.any(Function));
|
|
307
|
+
});
|
|
308
|
+
it('explicit fallbackToWindow=true wins even if native exists', () => {
|
|
309
|
+
const observe = vi.fn();
|
|
310
|
+
vi.stubGlobal('ResizeObserver', class {
|
|
311
|
+
observe = observe;
|
|
312
|
+
unobserve = vi.fn();
|
|
313
|
+
disconnect = vi.fn();
|
|
314
|
+
});
|
|
315
|
+
vi.stubGlobal('addEventListener', vi.fn());
|
|
316
|
+
vi.stubGlobal('removeEventListener', vi.fn());
|
|
317
|
+
const api = createResizeObserver({ onResize: () => { }, fallbackToWindow: true });
|
|
318
|
+
const el = {
|
|
319
|
+
getBoundingClientRect: () => ({ width: 1, height: 1 }),
|
|
320
|
+
};
|
|
321
|
+
api.observe(el);
|
|
322
|
+
// native observer not used in fallback mode
|
|
323
|
+
expect(observe).not.toHaveBeenCalled();
|
|
324
|
+
});
|
|
325
|
+
it('stays no-op when unsupported and fallbackToWindow is off', () => {
|
|
326
|
+
vi.stubGlobal('ResizeObserver', undefined);
|
|
327
|
+
vi.stubGlobal('addEventListener', undefined);
|
|
328
|
+
const onResize = vi.fn();
|
|
329
|
+
const api = createResizeObserver({ onResize });
|
|
330
|
+
expect(api.supported).toBe(false);
|
|
331
|
+
expect(() => api.observe({})).not.toThrow();
|
|
332
|
+
expect(onResize).not.toHaveBeenCalled();
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
describe('getGlobalResizeObserver (singleton pool)', () => {
|
|
336
|
+
afterEach(() => vi.unstubAllGlobals());
|
|
337
|
+
it('degrades to no-op when unsupported', () => {
|
|
338
|
+
vi.stubGlobal('ResizeObserver', undefined);
|
|
339
|
+
const pool = getGlobalResizeObserver('content-box');
|
|
340
|
+
expect(pool.supported).toBe(false);
|
|
341
|
+
const off = pool.subscribe({}, () => { });
|
|
342
|
+
expect(() => off()).not.toThrow();
|
|
343
|
+
});
|
|
344
|
+
it('reuses one native observer for N targets and routes by target', () => {
|
|
345
|
+
const observe = vi.fn();
|
|
346
|
+
const unobserve = vi.fn();
|
|
347
|
+
let instances = 0;
|
|
348
|
+
let trigger;
|
|
349
|
+
vi.stubGlobal('ResizeObserver', class {
|
|
350
|
+
constructor(cb) {
|
|
351
|
+
instances += 1;
|
|
352
|
+
trigger = cb;
|
|
353
|
+
}
|
|
354
|
+
observe = observe;
|
|
355
|
+
unobserve = unobserve;
|
|
356
|
+
disconnect = vi.fn();
|
|
357
|
+
});
|
|
358
|
+
// fresh box bucket to avoid cross-test cache (border-box unused elsewhere)
|
|
359
|
+
const pool = getGlobalResizeObserver('border-box');
|
|
360
|
+
const a = { id: 'a' };
|
|
361
|
+
const b = { id: 'b' };
|
|
362
|
+
const onA = vi.fn();
|
|
363
|
+
const onB = vi.fn();
|
|
364
|
+
const offA = pool.subscribe(a, onA);
|
|
365
|
+
pool.subscribe(b, onB);
|
|
366
|
+
expect(observe).toHaveBeenCalledTimes(2);
|
|
367
|
+
expect(instances).toBe(1);
|
|
368
|
+
trigger([
|
|
369
|
+
makeEntry({ target: a, borderBoxSize: [{ inlineSize: 1, blockSize: 2 }] }),
|
|
370
|
+
]);
|
|
371
|
+
expect(onA).toHaveBeenCalledTimes(1);
|
|
372
|
+
expect(onB).not.toHaveBeenCalled();
|
|
373
|
+
offA();
|
|
374
|
+
expect(unobserve).toHaveBeenCalledWith(a);
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
//# sourceMappingURL=resize-observer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resize-observer.test.js","sourceRoot":"","sources":["../src/resize-observer.test.ts"],"names":[],"mappings":"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"}
|
package/dist/roving.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Roving tabindex helpers — framework-agnostic, pure functions only.
|
|
3
|
+
*
|
|
4
|
+
* The render layer owns the focused index ($state) and the actual DOM focus()
|
|
5
|
+
* call; these helpers only compute the *next* focused index from a key press.
|
|
6
|
+
* See the WAI-ARIA roving tabindex pattern.
|
|
7
|
+
*/
|
|
8
|
+
export type RovingKey = 'prev' | 'next' | 'first' | 'last';
|
|
9
|
+
/**
|
|
10
|
+
* Map a keyboard event key to a roving navigation intent, or null when the key
|
|
11
|
+
* is not a navigation key. Both orientations are accepted so a single mapping
|
|
12
|
+
* works for vertical (↑/↓) and horizontal (←/→) timelines.
|
|
13
|
+
*/
|
|
14
|
+
export declare function rovingKeyFromEvent(key: string): RovingKey | null;
|
|
15
|
+
/**
|
|
16
|
+
* Compute the next focused index for a roving-tabindex list.
|
|
17
|
+
*
|
|
18
|
+
* @param current current focused index (may be -1 when nothing focused yet)
|
|
19
|
+
* @param count total focusable item count
|
|
20
|
+
* @param intent navigation intent
|
|
21
|
+
* @param wrap when true, prev/next wrap around the ends (default false:
|
|
22
|
+
* clamp at the ends)
|
|
23
|
+
* @returns the next index clamped to [0, count - 1], or -1 when count <= 0.
|
|
24
|
+
*/
|
|
25
|
+
export declare function nextRovingIndex(current: number, count: number, intent: RovingKey, wrap?: boolean): number;
|
|
26
|
+
//# sourceMappingURL=roving.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roving.d.ts","sourceRoot":"","sources":["../src/roving.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAehE;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,EACjB,IAAI,UAAQ,GACX,MAAM,CAkBR"}
|
package/dist/roving.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Roving tabindex helpers — framework-agnostic, pure functions only.
|
|
3
|
+
*
|
|
4
|
+
* The render layer owns the focused index ($state) and the actual DOM focus()
|
|
5
|
+
* call; these helpers only compute the *next* focused index from a key press.
|
|
6
|
+
* See the WAI-ARIA roving tabindex pattern.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Map a keyboard event key to a roving navigation intent, or null when the key
|
|
10
|
+
* is not a navigation key. Both orientations are accepted so a single mapping
|
|
11
|
+
* works for vertical (↑/↓) and horizontal (←/→) timelines.
|
|
12
|
+
*/
|
|
13
|
+
export function rovingKeyFromEvent(key) {
|
|
14
|
+
switch (key) {
|
|
15
|
+
case 'ArrowUp':
|
|
16
|
+
case 'ArrowLeft':
|
|
17
|
+
return 'prev';
|
|
18
|
+
case 'ArrowDown':
|
|
19
|
+
case 'ArrowRight':
|
|
20
|
+
return 'next';
|
|
21
|
+
case 'Home':
|
|
22
|
+
return 'first';
|
|
23
|
+
case 'End':
|
|
24
|
+
return 'last';
|
|
25
|
+
default:
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Compute the next focused index for a roving-tabindex list.
|
|
31
|
+
*
|
|
32
|
+
* @param current current focused index (may be -1 when nothing focused yet)
|
|
33
|
+
* @param count total focusable item count
|
|
34
|
+
* @param intent navigation intent
|
|
35
|
+
* @param wrap when true, prev/next wrap around the ends (default false:
|
|
36
|
+
* clamp at the ends)
|
|
37
|
+
* @returns the next index clamped to [0, count - 1], or -1 when count <= 0.
|
|
38
|
+
*/
|
|
39
|
+
export function nextRovingIndex(current, count, intent, wrap = false) {
|
|
40
|
+
if (count <= 0)
|
|
41
|
+
return -1;
|
|
42
|
+
const last = count - 1;
|
|
43
|
+
const cur = current < 0 ? 0 : Math.min(current, last);
|
|
44
|
+
switch (intent) {
|
|
45
|
+
case 'first':
|
|
46
|
+
return 0;
|
|
47
|
+
case 'last':
|
|
48
|
+
return last;
|
|
49
|
+
case 'prev':
|
|
50
|
+
if (cur <= 0)
|
|
51
|
+
return wrap ? last : 0;
|
|
52
|
+
return cur - 1;
|
|
53
|
+
case 'next':
|
|
54
|
+
if (cur >= last)
|
|
55
|
+
return wrap ? 0 : last;
|
|
56
|
+
return cur + 1;
|
|
57
|
+
default:
|
|
58
|
+
return cur;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=roving.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roving.js","sourceRoot":"","sources":["../src/roving.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,SAAS,CAAC;QACf,KAAK,WAAW;YACd,OAAO,MAAM,CAAC;QAChB,KAAK,WAAW,CAAC;QACjB,KAAK,YAAY;YACf,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC;QACjB,KAAK,KAAK;YACR,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,KAAa,EACb,MAAiB,EACjB,IAAI,GAAG,KAAK;IAEZ,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;IACvB,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACtD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd,KAAK,MAAM;YACT,IAAI,GAAG,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,GAAG,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM;YACT,IAAI,GAAG,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACxC,OAAO,GAAG,GAAG,CAAC,CAAC;QACjB;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roving.test.d.ts","sourceRoot":"","sources":["../src/roving.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { rovingKeyFromEvent, nextRovingIndex } from './roving.js';
|
|
3
|
+
describe('rovingKeyFromEvent', () => {
|
|
4
|
+
it('maps vertical and horizontal arrows', () => {
|
|
5
|
+
expect(rovingKeyFromEvent('ArrowUp')).toBe('prev');
|
|
6
|
+
expect(rovingKeyFromEvent('ArrowLeft')).toBe('prev');
|
|
7
|
+
expect(rovingKeyFromEvent('ArrowDown')).toBe('next');
|
|
8
|
+
expect(rovingKeyFromEvent('ArrowRight')).toBe('next');
|
|
9
|
+
});
|
|
10
|
+
it('maps Home/End', () => {
|
|
11
|
+
expect(rovingKeyFromEvent('Home')).toBe('first');
|
|
12
|
+
expect(rovingKeyFromEvent('End')).toBe('last');
|
|
13
|
+
});
|
|
14
|
+
it('returns null for non-navigation keys', () => {
|
|
15
|
+
expect(rovingKeyFromEvent('Enter')).toBeNull();
|
|
16
|
+
expect(rovingKeyFromEvent(' ')).toBeNull();
|
|
17
|
+
expect(rovingKeyFromEvent('a')).toBeNull();
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe('nextRovingIndex', () => {
|
|
21
|
+
it('moves next/prev within bounds', () => {
|
|
22
|
+
expect(nextRovingIndex(0, 5, 'next')).toBe(1);
|
|
23
|
+
expect(nextRovingIndex(3, 5, 'prev')).toBe(2);
|
|
24
|
+
});
|
|
25
|
+
it('clamps at ends without wrap', () => {
|
|
26
|
+
expect(nextRovingIndex(4, 5, 'next')).toBe(4);
|
|
27
|
+
expect(nextRovingIndex(0, 5, 'prev')).toBe(0);
|
|
28
|
+
});
|
|
29
|
+
it('wraps at ends when wrap=true', () => {
|
|
30
|
+
expect(nextRovingIndex(4, 5, 'next', true)).toBe(0);
|
|
31
|
+
expect(nextRovingIndex(0, 5, 'prev', true)).toBe(4);
|
|
32
|
+
});
|
|
33
|
+
it('first/last jump to ends', () => {
|
|
34
|
+
expect(nextRovingIndex(2, 5, 'first')).toBe(0);
|
|
35
|
+
expect(nextRovingIndex(2, 5, 'last')).toBe(4);
|
|
36
|
+
});
|
|
37
|
+
it('treats negative current as 0', () => {
|
|
38
|
+
expect(nextRovingIndex(-1, 5, 'next')).toBe(1);
|
|
39
|
+
expect(nextRovingIndex(-1, 5, 'prev')).toBe(0);
|
|
40
|
+
});
|
|
41
|
+
it('returns -1 when empty', () => {
|
|
42
|
+
expect(nextRovingIndex(0, 0, 'next')).toBe(-1);
|
|
43
|
+
});
|
|
44
|
+
it('clamps out-of-range current', () => {
|
|
45
|
+
expect(nextRovingIndex(99, 5, 'prev')).toBe(3);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=roving.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roving.test.js","sourceRoot":"","sources":["../src/roving.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* createScrollList helpers — framework-agnostic single-column picker math.
|
|
3
|
+
* Pure functions only: scroll offset ↔ selected index mapping, disabled-item
|
|
4
|
+
* skipping, and keyboard target resolution. No DOM, no framework deps, no
|
|
5
|
+
* internal mutable state — the render layer (svelte) owns scroll state and the
|
|
6
|
+
* actual CSS scroll-snap. See specs/components/show/ScrollList.spec.md §3
|
|
7
|
+
* (single-column subset; momentum/cyclic/multi-column deferred).
|
|
8
|
+
*/
|
|
9
|
+
export type ScrollListValue = string | number;
|
|
10
|
+
export interface ScrollListItem {
|
|
11
|
+
value: ScrollListValue;
|
|
12
|
+
label: string;
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Map a scrollTop offset to the centered item index (clamped to range). */
|
|
16
|
+
export declare function offsetToIndex(scrollTop: number, itemHeight: number, count: number): number;
|
|
17
|
+
/** The scrollTop that centers a given index. */
|
|
18
|
+
export declare function indexToOffset(index: number, itemHeight: number): number;
|
|
19
|
+
/** Index of an item by value, or -1. */
|
|
20
|
+
export declare function indexOfValue(items: readonly ScrollListItem[], value: ScrollListValue | undefined): number;
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the nearest enabled index at or after `from` in `dir` (+1/-1).
|
|
23
|
+
* If none exists in that direction, returns the original `from` unchanged.
|
|
24
|
+
*/
|
|
25
|
+
export declare function nextEnabledIndex(items: readonly ScrollListItem[], from: number, dir: 1 | -1): number;
|
|
26
|
+
/** First enabled index (for Home / value resolution), or -1 if all disabled. */
|
|
27
|
+
export declare function firstEnabledIndex(items: readonly ScrollListItem[]): number;
|
|
28
|
+
/** Last enabled index (for End), or -1 if all disabled. */
|
|
29
|
+
export declare function lastEnabledIndex(items: readonly ScrollListItem[]): number;
|
|
30
|
+
export type ScrollListKey = 'ArrowUp' | 'ArrowDown' | 'PageUp' | 'PageDown' | 'Home' | 'End';
|
|
31
|
+
/**
|
|
32
|
+
* Resolve the target index for a keyboard action from the current index.
|
|
33
|
+
* Returns the current index when the action can't move (boundary / all
|
|
34
|
+
* neighbors disabled). `page` is how many rows PageUp/PageDown move.
|
|
35
|
+
*/
|
|
36
|
+
export declare function keyboardTarget(items: readonly ScrollListItem[], current: number, key: ScrollListKey, page?: number): number;
|
|
37
|
+
/** 正取模(结果恒非负),把任意整数索引折回 [0, count)。 */
|
|
38
|
+
export declare function wrapIndex(index: number, count: number): number;
|
|
39
|
+
/**
|
|
40
|
+
* cyclic 列的「虚拟总行数」。把真实 count 重复 repeat 份,
|
|
41
|
+
* repeat 必须为奇数且 >= 3,使「中段」居中。count<=0 返回 0。
|
|
42
|
+
*/
|
|
43
|
+
export declare function cyclicVirtualCount(count: number, repeat: number): number;
|
|
44
|
+
/**
|
|
45
|
+
* cyclic 列的「中段基准虚拟索引」:把真实索引 logical 映射到位于正中那一份的虚拟索引。
|
|
46
|
+
* 例如 count=24、repeat=5 → 中段从 2*24=48 起,logical=9 → 57。
|
|
47
|
+
*/
|
|
48
|
+
export declare function cyclicCenterIndex(logical: number, count: number, repeat: number): number;
|
|
49
|
+
/**
|
|
50
|
+
* cyclic 滚动落定后,判断是否需要把虚拟索引「重定位」回中段(避免滚出重复区边界)。
|
|
51
|
+
* 返回新的虚拟索引(与传入逻辑值同余、但落在中段),渲染层据此命令式无动画跳转。
|
|
52
|
+
* 当 virtualIndex 已在安全中段(距首尾各至少 count 行)时返回原值(无需跳)。
|
|
53
|
+
*/
|
|
54
|
+
export declare function cyclicRecenter(virtualIndex: number, count: number, repeat: number): number;
|
|
55
|
+
export interface MomentumStep {
|
|
56
|
+
/** 本帧后的速度(px/ms)。 */
|
|
57
|
+
velocity: number;
|
|
58
|
+
/** 本帧位移增量(px,velocity*dt 的积分近似)。 */
|
|
59
|
+
delta: number;
|
|
60
|
+
/** 速度是否已低于阈值(应停止动画进入吸附)。 */
|
|
61
|
+
done: boolean;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 推进一帧惯性:指数衰减 v' = v * decay^(dt/16.67),位移取平均速度积分。
|
|
65
|
+
* @param velocity 当前速度(px/ms,正=向下/scrollTop 增大)
|
|
66
|
+
* @param dt 帧间隔(ms)
|
|
67
|
+
* @param decay 每 ~16.67ms(60fps 一帧)的衰减系数,默认 0.95
|
|
68
|
+
* @param minV 停止阈值(px/ms),默认 0.02
|
|
69
|
+
*/
|
|
70
|
+
export declare function momentumStep(velocity: number, dt: number, decay?: number, minV?: number): MomentumStep;
|
|
71
|
+
/**
|
|
72
|
+
* 根据当前 scrollTop 与剩余速度预测「最终吸附目标行」(含一点惯性前瞻),clamp 到 [0,count)。
|
|
73
|
+
* 用于释放瞬间直接算出目标行,再 smooth 吸附(比逐帧更稳,避免抖动)。
|
|
74
|
+
* @param scrollTop 当前偏移
|
|
75
|
+
* @param velocity 当前速度(px/ms)
|
|
76
|
+
* @param itemHeight 行高
|
|
77
|
+
* @param count 行数
|
|
78
|
+
* @param projection 速度前瞻系数(默认 80:v*80 px 的滑行预估)
|
|
79
|
+
*/
|
|
80
|
+
export declare function projectSettleIndex(scrollTop: number, velocity: number, itemHeight: number, count: number, projection?: number): number;
|
|
81
|
+
//# sourceMappingURL=scroll-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-list.d.ts","sourceRoot":"","sources":["../src/scroll-list.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAI1F;AAED,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,wCAAwC;AACxC,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,KAAK,EAAE,eAAe,GAAG,SAAS,GACjC,MAAM,CAGR;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GACV,MAAM,CAOR;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAK1E;AAED,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAKzE;AAED,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,WAAW,GACX,QAAQ,GACR,UAAU,GACV,MAAM,GACN,KAAK,CAAC;AAEV;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,aAAa,EAClB,IAAI,SAAI,GACP,MAAM,CAmCR;AAQD,uCAAuC;AACvC,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGxE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAKxF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ1F;AAQD,MAAM,WAAW,YAAY;IAC3B,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,KAAK,SAAO,EACZ,IAAI,SAAO,GACV,YAAY,CAMd;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,UAAU,SAAK,GACd,MAAM,CAKR"}
|