dialkit 1.2.1 → 1.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/README.md +653 -6
- package/dist/dropdown-position.d.ts +15 -0
- package/dist/dropdown-position.js +22 -0
- package/dist/dropdown-position.js.map +1 -0
- package/dist/icons.d.ts +4 -1
- package/dist/icons.js +13 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +3796 -768
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +315 -10
- package/dist/index.d.ts +315 -10
- package/dist/index.js +3733 -711
- package/dist/index.js.map +1 -1
- package/dist/panel-drag.d.ts +19 -0
- package/dist/panel-drag.js +72 -0
- package/dist/panel-drag.js.map +1 -0
- package/dist/solid/index.d.ts +264 -5
- package/dist/solid/index.js +5277 -1632
- package/dist/solid/index.js.map +1 -1
- package/dist/store/index.cjs +329 -57
- package/dist/store/index.cjs.map +1 -1
- package/dist/store/index.d.cts +43 -4
- package/dist/store/index.d.ts +43 -4
- package/dist/store/index.js +321 -56
- package/dist/store/index.js.map +1 -1
- package/dist/styles.css +809 -7
- package/dist/svelte/components/ControlRenderer.svelte +5 -2
- package/dist/svelte/components/ControlRenderer.svelte.d.ts +2 -0
- package/dist/svelte/components/ControlRenderer.svelte.d.ts.map +1 -1
- package/dist/svelte/components/DialRoot.svelte +218 -16
- package/dist/svelte/components/DialRoot.svelte.d.ts +1 -0
- package/dist/svelte/components/DialRoot.svelte.d.ts.map +1 -1
- package/dist/svelte/components/Folder.svelte +24 -13
- package/dist/svelte/components/Folder.svelte.d.ts +1 -0
- package/dist/svelte/components/Folder.svelte.d.ts.map +1 -1
- package/dist/svelte/components/Panel.svelte +104 -71
- package/dist/svelte/components/Panel.svelte.d.ts +4 -0
- package/dist/svelte/components/Panel.svelte.d.ts.map +1 -1
- package/dist/svelte/components/PresetManager.svelte +5 -5
- package/dist/svelte/components/PresetManager.svelte.d.ts.map +1 -1
- package/dist/svelte/components/SelectControl.svelte +6 -14
- package/dist/svelte/components/SelectControl.svelte.d.ts.map +1 -1
- package/dist/svelte/components/Timeline/ClipPopover.svelte +206 -0
- package/dist/svelte/components/Timeline/ClipPopover.svelte.d.ts +26 -0
- package/dist/svelte/components/Timeline/ClipPopover.svelte.d.ts.map +1 -0
- package/dist/svelte/components/Timeline/DialTimeline.svelte +76 -0
- package/dist/svelte/components/Timeline/DialTimeline.svelte.d.ts +13 -0
- package/dist/svelte/components/Timeline/DialTimeline.svelte.d.ts.map +1 -0
- package/dist/svelte/components/Timeline/TimelineClip.svelte +233 -0
- package/dist/svelte/components/Timeline/TimelineClip.svelte.d.ts +24 -0
- package/dist/svelte/components/Timeline/TimelineClip.svelte.d.ts.map +1 -0
- package/dist/svelte/components/Timeline/TimelineSection.svelte +756 -0
- package/dist/svelte/components/Timeline/TimelineSection.svelte.d.ts +12 -0
- package/dist/svelte/components/Timeline/TimelineSection.svelte.d.ts.map +1 -0
- package/dist/svelte/components/Timeline/TimelineToggleButton.svelte +25 -0
- package/dist/svelte/components/Timeline/TimelineToggleButton.svelte.d.ts +4 -0
- package/dist/svelte/components/Timeline/TimelineToggleButton.svelte.d.ts.map +1 -0
- package/dist/svelte/components/TransitionControl.svelte +26 -11
- package/dist/svelte/components/TransitionControl.svelte.d.ts +9 -0
- package/dist/svelte/components/TransitionControl.svelte.d.ts.map +1 -1
- package/dist/svelte/createDialKit.svelte.d.ts +11 -1
- package/dist/svelte/createDialKit.svelte.d.ts.map +1 -1
- package/dist/svelte/createDialKit.svelte.js +61 -34
- package/dist/svelte/createDialTimeline.svelte.d.ts +4 -0
- package/dist/svelte/createDialTimeline.svelte.d.ts.map +1 -0
- package/dist/svelte/createDialTimeline.svelte.js +73 -0
- package/dist/svelte/index.d.ts +7 -3
- package/dist/svelte/index.d.ts.map +1 -1
- package/dist/svelte/index.js +4 -1
- package/dist/svelte/theme-css.d.ts +1 -1
- package/dist/svelte/theme-css.d.ts.map +1 -1
- package/dist/svelte/theme-css.js +809 -7
- package/dist/timeline/index.cjs +1288 -0
- package/dist/timeline/index.cjs.map +1 -0
- package/dist/timeline/index.d.cts +443 -0
- package/dist/timeline/index.d.ts +443 -0
- package/dist/timeline/index.js +1233 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/vue/index.d.ts +325 -12
- package/dist/vue/index.js +3226 -280
- package/dist/vue/index.js.map +1 -1
- package/package.json +23 -13
- package/dist/solid/index.cjs +0 -3079
- package/dist/solid/index.cjs.map +0 -1
- package/dist/solid/index.d.cts +0 -258
- package/dist/vue/index.cjs +0 -3056
- package/dist/vue/index.cjs.map +0 -1
- package/dist/vue/index.d.cts +0 -675
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
type PanelDragOffset = {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
};
|
|
5
|
+
type PanelDragStart = {
|
|
6
|
+
pointerX: number;
|
|
7
|
+
pointerY: number;
|
|
8
|
+
elX: number;
|
|
9
|
+
elY: number;
|
|
10
|
+
};
|
|
11
|
+
type PanelDragOriginX = 'left' | 'right';
|
|
12
|
+
declare function getPanelDragHandle(target: EventTarget | null, panel: HTMLElement | null): HTMLElement | null;
|
|
13
|
+
declare function getPanelDragStart(pointerX: number, pointerY: number, panel: HTMLElement): PanelDragStart;
|
|
14
|
+
declare function getPanelDragOffset(start: PanelDragStart, pointerX: number, pointerY: number): PanelDragOffset;
|
|
15
|
+
declare function hasPanelDragMoved(start: PanelDragStart, pointerX: number, pointerY: number): boolean;
|
|
16
|
+
declare function getPanelOriginX(position: string, offset: PanelDragOffset | null, viewportWidth?: number | undefined): PanelDragOriginX;
|
|
17
|
+
declare function blockPanelDragClick(handle: HTMLElement): void;
|
|
18
|
+
|
|
19
|
+
export { type PanelDragOffset, type PanelDragOriginX, type PanelDragStart, blockPanelDragClick, getPanelDragHandle, getPanelDragOffset, getPanelDragStart, getPanelOriginX, hasPanelDragMoved };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// src/panel-drag.ts
|
|
2
|
+
var PANEL_DRAG_THRESHOLD = 8;
|
|
3
|
+
var COLLAPSED_PANEL_SIZE = 42;
|
|
4
|
+
var DRAG_EXCLUSION_SELECTOR = [
|
|
5
|
+
".dialkit-panel-icon",
|
|
6
|
+
".dialkit-panel-toolbar",
|
|
7
|
+
"button",
|
|
8
|
+
"input",
|
|
9
|
+
"select",
|
|
10
|
+
"textarea",
|
|
11
|
+
"a",
|
|
12
|
+
'[role="button"]',
|
|
13
|
+
'[contenteditable="true"]'
|
|
14
|
+
].join(",");
|
|
15
|
+
function getPanelDragHandle(target, panel) {
|
|
16
|
+
if (!(target instanceof Element) || !panel) return null;
|
|
17
|
+
const inner = target.closest(".dialkit-panel-inner");
|
|
18
|
+
if (!inner || !panel.contains(inner)) return null;
|
|
19
|
+
if (inner.getAttribute("data-collapsed") === "true") {
|
|
20
|
+
return inner;
|
|
21
|
+
}
|
|
22
|
+
const header = target.closest(".dialkit-panel-header");
|
|
23
|
+
if (!header || !inner.contains(header)) return null;
|
|
24
|
+
if (target.closest(DRAG_EXCLUSION_SELECTOR)) return null;
|
|
25
|
+
return header;
|
|
26
|
+
}
|
|
27
|
+
function getPanelDragStart(pointerX, pointerY, panel) {
|
|
28
|
+
const rect = panel.getBoundingClientRect();
|
|
29
|
+
return {
|
|
30
|
+
pointerX,
|
|
31
|
+
pointerY,
|
|
32
|
+
elX: rect.left,
|
|
33
|
+
elY: rect.top
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function getPanelDragOffset(start, pointerX, pointerY) {
|
|
37
|
+
return {
|
|
38
|
+
x: start.elX + pointerX - start.pointerX,
|
|
39
|
+
y: start.elY + pointerY - start.pointerY
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function hasPanelDragMoved(start, pointerX, pointerY) {
|
|
43
|
+
const dx = pointerX - start.pointerX;
|
|
44
|
+
const dy = pointerY - start.pointerY;
|
|
45
|
+
return Math.hypot(dx, dy) >= PANEL_DRAG_THRESHOLD;
|
|
46
|
+
}
|
|
47
|
+
function getPanelOriginX(position, offset, viewportWidth = typeof window !== "undefined" ? window.innerWidth : void 0) {
|
|
48
|
+
if (offset && viewportWidth) {
|
|
49
|
+
return offset.x + COLLAPSED_PANEL_SIZE / 2 < viewportWidth / 2 ? "left" : "right";
|
|
50
|
+
}
|
|
51
|
+
return position.endsWith("left") ? "left" : "right";
|
|
52
|
+
}
|
|
53
|
+
function blockPanelDragClick(handle) {
|
|
54
|
+
const blocker = (event) => {
|
|
55
|
+
event.preventDefault();
|
|
56
|
+
event.stopImmediatePropagation();
|
|
57
|
+
event.stopPropagation();
|
|
58
|
+
};
|
|
59
|
+
handle.addEventListener("click", blocker, { capture: true, once: true });
|
|
60
|
+
window.setTimeout(() => {
|
|
61
|
+
handle.removeEventListener("click", blocker, true);
|
|
62
|
+
}, 0);
|
|
63
|
+
}
|
|
64
|
+
export {
|
|
65
|
+
blockPanelDragClick,
|
|
66
|
+
getPanelDragHandle,
|
|
67
|
+
getPanelDragOffset,
|
|
68
|
+
getPanelDragStart,
|
|
69
|
+
getPanelOriginX,
|
|
70
|
+
hasPanelDragMoved
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=panel-drag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/panel-drag.ts"],"sourcesContent":["export type PanelDragOffset = {\n x: number;\n y: number;\n};\n\nexport type PanelDragStart = {\n pointerX: number;\n pointerY: number;\n elX: number;\n elY: number;\n};\n\nexport type PanelDragOriginX = 'left' | 'right';\n\nconst PANEL_DRAG_THRESHOLD = 8;\nconst COLLAPSED_PANEL_SIZE = 42;\n\nconst DRAG_EXCLUSION_SELECTOR = [\n '.dialkit-panel-icon',\n '.dialkit-panel-toolbar',\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'a',\n '[role=\"button\"]',\n '[contenteditable=\"true\"]',\n].join(',');\n\nexport function getPanelDragHandle(target: EventTarget | null, panel: HTMLElement | null): HTMLElement | null {\n if (!(target instanceof Element) || !panel) return null;\n\n const inner = target.closest<HTMLElement>('.dialkit-panel-inner');\n if (!inner || !panel.contains(inner)) return null;\n\n if (inner.getAttribute('data-collapsed') === 'true') {\n return inner;\n }\n\n const header = target.closest<HTMLElement>('.dialkit-panel-header');\n if (!header || !inner.contains(header)) return null;\n\n if (target.closest(DRAG_EXCLUSION_SELECTOR)) return null;\n\n return header;\n}\n\nexport function getPanelDragStart(pointerX: number, pointerY: number, panel: HTMLElement): PanelDragStart {\n const rect = panel.getBoundingClientRect();\n return {\n pointerX,\n pointerY,\n elX: rect.left,\n elY: rect.top,\n };\n}\n\nexport function getPanelDragOffset(start: PanelDragStart, pointerX: number, pointerY: number): PanelDragOffset {\n return {\n x: start.elX + pointerX - start.pointerX,\n y: start.elY + pointerY - start.pointerY,\n };\n}\n\nexport function hasPanelDragMoved(start: PanelDragStart, pointerX: number, pointerY: number): boolean {\n const dx = pointerX - start.pointerX;\n const dy = pointerY - start.pointerY;\n return Math.hypot(dx, dy) >= PANEL_DRAG_THRESHOLD;\n}\n\nexport function getPanelOriginX(\n position: string,\n offset: PanelDragOffset | null,\n viewportWidth = typeof window !== 'undefined' ? window.innerWidth : undefined\n): PanelDragOriginX {\n if (offset && viewportWidth) {\n return offset.x + COLLAPSED_PANEL_SIZE / 2 < viewportWidth / 2 ? 'left' : 'right';\n }\n\n return position.endsWith('left') ? 'left' : 'right';\n}\n\nexport function blockPanelDragClick(handle: HTMLElement) {\n const blocker = (event: Event) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n event.stopPropagation();\n };\n\n handle.addEventListener('click', blocker, { capture: true, once: true });\n window.setTimeout(() => {\n handle.removeEventListener('click', blocker, true);\n }, 0);\n}\n"],"mappings":";AAcA,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAE7B,IAAM,0BAA0B;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG;AAEH,SAAS,mBAAmB,QAA4B,OAA+C;AAC5G,MAAI,EAAE,kBAAkB,YAAY,CAAC,MAAO,QAAO;AAEnD,QAAM,QAAQ,OAAO,QAAqB,sBAAsB;AAChE,MAAI,CAAC,SAAS,CAAC,MAAM,SAAS,KAAK,EAAG,QAAO;AAE7C,MAAI,MAAM,aAAa,gBAAgB,MAAM,QAAQ;AACnD,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,QAAqB,uBAAuB;AAClE,MAAI,CAAC,UAAU,CAAC,MAAM,SAAS,MAAM,EAAG,QAAO;AAE/C,MAAI,OAAO,QAAQ,uBAAuB,EAAG,QAAO;AAEpD,SAAO;AACT;AAEO,SAAS,kBAAkB,UAAkB,UAAkB,OAAoC;AACxG,QAAM,OAAO,MAAM,sBAAsB;AACzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,KAAK,KAAK;AAAA,IACV,KAAK,KAAK;AAAA,EACZ;AACF;AAEO,SAAS,mBAAmB,OAAuB,UAAkB,UAAmC;AAC7G,SAAO;AAAA,IACL,GAAG,MAAM,MAAM,WAAW,MAAM;AAAA,IAChC,GAAG,MAAM,MAAM,WAAW,MAAM;AAAA,EAClC;AACF;AAEO,SAAS,kBAAkB,OAAuB,UAAkB,UAA2B;AACpG,QAAM,KAAK,WAAW,MAAM;AAC5B,QAAM,KAAK,WAAW,MAAM;AAC5B,SAAO,KAAK,MAAM,IAAI,EAAE,KAAK;AAC/B;AAEO,SAAS,gBACd,UACA,QACA,gBAAgB,OAAO,WAAW,cAAc,OAAO,aAAa,QAClD;AAClB,MAAI,UAAU,eAAe;AAC3B,WAAO,OAAO,IAAI,uBAAuB,IAAI,gBAAgB,IAAI,SAAS;AAAA,EAC5E;AAEA,SAAO,SAAS,SAAS,MAAM,IAAI,SAAS;AAC9C;AAEO,SAAS,oBAAoB,QAAqB;AACvD,QAAM,UAAU,CAAC,UAAiB;AAChC,UAAM,eAAe;AACrB,UAAM,yBAAyB;AAC/B,UAAM,gBAAgB;AAAA,EACxB;AAEA,SAAO,iBAAiB,SAAS,SAAS,EAAE,SAAS,MAAM,MAAM,KAAK,CAAC;AACvE,SAAO,WAAW,MAAM;AACtB,WAAO,oBAAoB,SAAS,SAAS,IAAI;AAAA,EACnD,GAAG,CAAC;AACN;","names":[]}
|
package/dist/solid/index.d.ts
CHANGED
|
@@ -43,6 +43,9 @@ type DialConfig = {
|
|
|
43
43
|
type ResolvedValues<T extends DialConfig> = {
|
|
44
44
|
[K in keyof T]: T[K] extends [number, number, number, number?] ? number : T[K] extends SpringConfig ? TransitionConfig : T[K] extends EasingConfig ? TransitionConfig : T[K] extends SelectConfig ? string : T[K] extends ColorConfig ? string : T[K] extends TextConfig ? string : T[K] extends DialConfig ? ResolvedValues<T[K]> : T[K];
|
|
45
45
|
};
|
|
46
|
+
type DialKitValueUpdates<T extends DialConfig> = {
|
|
47
|
+
[K in keyof T as K extends '_collapsed' ? never : K]?: T[K] extends [number, number, number, number?] ? number : T[K] extends SpringConfig | EasingConfig ? TransitionConfig : T[K] extends ActionConfig ? never : T[K] extends SelectConfig | ColorConfig | TextConfig ? string : T[K] extends DialConfig ? DialKitValueUpdates<T[K]> : T[K];
|
|
48
|
+
};
|
|
46
49
|
type ShortcutMode = 'fine' | 'normal' | 'coarse';
|
|
47
50
|
type ShortcutInteraction = 'scroll' | 'drag' | 'move' | 'scroll-only';
|
|
48
51
|
type ShortcutConfig = {
|
|
@@ -73,6 +76,7 @@ type PanelConfig = {
|
|
|
73
76
|
controls: ControlMeta[];
|
|
74
77
|
values: Record<string, DialValue>;
|
|
75
78
|
shortcuts: Record<string, ShortcutConfig>;
|
|
79
|
+
kind?: 'timeline';
|
|
76
80
|
};
|
|
77
81
|
type Listener = () => void;
|
|
78
82
|
type ActionListener = (action: string) => void;
|
|
@@ -81,8 +85,21 @@ type Preset = {
|
|
|
81
85
|
name: string;
|
|
82
86
|
values: Record<string, DialValue>;
|
|
83
87
|
};
|
|
88
|
+
type DialKitPersistOptions = boolean | {
|
|
89
|
+
key?: string;
|
|
90
|
+
storage?: 'localStorage' | 'sessionStorage';
|
|
91
|
+
presets?: boolean;
|
|
92
|
+
};
|
|
93
|
+
type DialStorePanelOptions = {
|
|
94
|
+
retainOnUnmount?: boolean;
|
|
95
|
+
persist?: DialKitPersistOptions;
|
|
96
|
+
kind?: 'timeline';
|
|
97
|
+
};
|
|
84
98
|
declare class DialStoreClass {
|
|
85
99
|
private panels;
|
|
100
|
+
private panelsSnapshot;
|
|
101
|
+
private standardPanelsSnapshot;
|
|
102
|
+
private timelinePanelsSnapshot;
|
|
86
103
|
private listeners;
|
|
87
104
|
private globalListeners;
|
|
88
105
|
private snapshots;
|
|
@@ -90,17 +107,23 @@ declare class DialStoreClass {
|
|
|
90
107
|
private presets;
|
|
91
108
|
private activePreset;
|
|
92
109
|
private baseValues;
|
|
93
|
-
|
|
94
|
-
|
|
110
|
+
private defaultValues;
|
|
111
|
+
private registrationCounts;
|
|
112
|
+
private retainedPanels;
|
|
113
|
+
private persistConfigs;
|
|
114
|
+
registerPanel(id: string, name: string, config: DialConfig, shortcuts?: Record<string, ShortcutConfig>, options?: DialStorePanelOptions): void;
|
|
115
|
+
updatePanel(id: string, name: string, config: DialConfig, shortcuts?: Record<string, ShortcutConfig>, options?: DialStorePanelOptions): void;
|
|
95
116
|
unregisterPanel(id: string): void;
|
|
96
117
|
updateValue(panelId: string, path: string, value: DialValue): void;
|
|
118
|
+
updateValues(panelId: string, updates: Record<string, DialValue>): void;
|
|
119
|
+
resetValues(panelId: string): void;
|
|
97
120
|
updateSpringMode(panelId: string, path: string, mode: 'simple' | 'advanced'): void;
|
|
98
121
|
getSpringMode(panelId: string, path: string): 'simple' | 'advanced';
|
|
99
122
|
updateTransitionMode(panelId: string, path: string, mode: 'easing' | 'simple' | 'advanced'): void;
|
|
100
123
|
getTransitionMode(panelId: string, path: string): 'easing' | 'simple' | 'advanced';
|
|
101
124
|
getValue(panelId: string, path: string): DialValue | undefined;
|
|
102
125
|
getValues(panelId: string): Record<string, DialValue>;
|
|
103
|
-
getPanels(): PanelConfig[];
|
|
126
|
+
getPanels(kind?: 'panel' | 'timeline'): PanelConfig[];
|
|
104
127
|
getPanel(id: string): PanelConfig | undefined;
|
|
105
128
|
subscribe(panelId: string, listener: Listener): () => void;
|
|
106
129
|
subscribeGlobal(listener: Listener): () => void;
|
|
@@ -123,6 +146,13 @@ declare class DialStoreClass {
|
|
|
123
146
|
control: ControlMeta;
|
|
124
147
|
shortcut: ShortcutConfig;
|
|
125
148
|
}>;
|
|
149
|
+
private configurePanelRetention;
|
|
150
|
+
private reconcileValues;
|
|
151
|
+
private reconcilePresets;
|
|
152
|
+
private normalizePersistConfig;
|
|
153
|
+
private loadPersistedPanel;
|
|
154
|
+
private persistPanel;
|
|
155
|
+
private getStorage;
|
|
126
156
|
private findControlByPath;
|
|
127
157
|
private notify;
|
|
128
158
|
private notifyGlobal;
|
|
@@ -147,10 +177,176 @@ declare class DialStoreClass {
|
|
|
147
177
|
declare const DialStore: DialStoreClass;
|
|
148
178
|
|
|
149
179
|
interface CreateDialOptions {
|
|
180
|
+
id?: string;
|
|
181
|
+
persist?: DialKitPersistOptions;
|
|
150
182
|
onAction?: (action: string) => void;
|
|
151
183
|
shortcuts?: Record<string, ShortcutConfig>;
|
|
152
184
|
}
|
|
185
|
+
interface DialKitController<T extends DialConfig> {
|
|
186
|
+
values: Accessor<ResolvedValues<T>>;
|
|
187
|
+
setValue: (path: string, value: DialValue) => void;
|
|
188
|
+
setValues: (values: DialKitValueUpdates<T>) => void;
|
|
189
|
+
resetValues: () => void;
|
|
190
|
+
getValues: () => ResolvedValues<T>;
|
|
191
|
+
}
|
|
153
192
|
declare function createDialKit<T extends DialConfig>(name: string, config: T, options?: CreateDialOptions): Accessor<ResolvedValues<T>>;
|
|
193
|
+
declare function createDialKitController<T extends DialConfig>(name: string, config: T, options?: CreateDialOptions): DialKitController<T>;
|
|
194
|
+
|
|
195
|
+
type TimelineClipLoop = 'off' | 'repeat';
|
|
196
|
+
type TimelineStepValues = {
|
|
197
|
+
[key: string]: DialConfig[string] | undefined;
|
|
198
|
+
};
|
|
199
|
+
type TimelineStepConfig = {
|
|
200
|
+
duration?: number;
|
|
201
|
+
to?: TimelineStepValues;
|
|
202
|
+
transition?: TransitionConfig;
|
|
203
|
+
};
|
|
204
|
+
type TimelinePropStepConfig = {
|
|
205
|
+
duration?: number;
|
|
206
|
+
to?: number | string;
|
|
207
|
+
transition?: TransitionConfig;
|
|
208
|
+
};
|
|
209
|
+
type TimelinePropConfig = {
|
|
210
|
+
from?: number | string;
|
|
211
|
+
to?: number | string;
|
|
212
|
+
duration?: number;
|
|
213
|
+
/** Offset from the clip's `at` in seconds. */
|
|
214
|
+
delay?: number;
|
|
215
|
+
transition?: TransitionConfig;
|
|
216
|
+
steps?: TimelinePropStepConfig[];
|
|
217
|
+
};
|
|
218
|
+
type TimelineClipBase = {
|
|
219
|
+
at: number;
|
|
220
|
+
duration?: number;
|
|
221
|
+
transition?: TransitionConfig;
|
|
222
|
+
loop?: boolean | TimelineClipLoop;
|
|
223
|
+
};
|
|
224
|
+
type TimelineClipConfig = TimelineClipBase & ({
|
|
225
|
+
from?: DialConfig;
|
|
226
|
+
to?: DialConfig;
|
|
227
|
+
steps?: never;
|
|
228
|
+
props?: never;
|
|
229
|
+
} | {
|
|
230
|
+
from?: DialConfig;
|
|
231
|
+
to?: never;
|
|
232
|
+
/** Sequential legs on one row — a segmented bar; boundaries retime legs. */
|
|
233
|
+
steps: TimelineStepConfig[];
|
|
234
|
+
props?: never;
|
|
235
|
+
} | {
|
|
236
|
+
from?: never;
|
|
237
|
+
to?: never;
|
|
238
|
+
steps?: never;
|
|
239
|
+
/** Independent per-property tracks — mutually exclusive with from/to/steps. */
|
|
240
|
+
props: {
|
|
241
|
+
[prop: string]: TimelinePropConfig;
|
|
242
|
+
};
|
|
243
|
+
});
|
|
244
|
+
/** Nested keys group clips into a collapsible layer — purely presentational. */
|
|
245
|
+
type TimelineGroupConfig = {
|
|
246
|
+
[key: string]: TimelineClipConfig;
|
|
247
|
+
};
|
|
248
|
+
type TimelineConfig = {
|
|
249
|
+
/** Total timeline length in seconds. Inferred from the last clip when omitted. */
|
|
250
|
+
duration?: number;
|
|
251
|
+
} & {
|
|
252
|
+
[key: string]: TimelineClipConfig | TimelineGroupConfig | number | undefined;
|
|
253
|
+
};
|
|
254
|
+
/** CSS-friendly output for consumers not using Motion — spread into a style. */
|
|
255
|
+
type TimelineClipCss = {
|
|
256
|
+
transitionDuration: string;
|
|
257
|
+
transitionTimingFunction: string;
|
|
258
|
+
};
|
|
259
|
+
type TimelineClipValues<C extends TimelineClipConfig = TimelineClipConfig> = {
|
|
260
|
+
at: number;
|
|
261
|
+
duration: number;
|
|
262
|
+
/** Effective code-defined loop mode. */
|
|
263
|
+
loop: TimelineClipLoop;
|
|
264
|
+
/** Playhead is at or past the clip start. */
|
|
265
|
+
started: boolean;
|
|
266
|
+
/** Playhead is inside the clip — for looping clips, inside any cycle. */
|
|
267
|
+
active: boolean;
|
|
268
|
+
/** Playhead is past the clip end (for looping clips, past the timeline end). */
|
|
269
|
+
done: boolean;
|
|
270
|
+
/**
|
|
271
|
+
* 0–1 position of the playhead within the clip — cycle progress (a
|
|
272
|
+
* sawtooth) for looping clips, sequence progress for steps clips.
|
|
273
|
+
*/
|
|
274
|
+
progress: number;
|
|
275
|
+
/** Index of the leg under the playhead, for sequence clips. */
|
|
276
|
+
step: C['steps'] extends TimelineStepConfig[] ? number : undefined;
|
|
277
|
+
from: C['props'] extends Record<string, TimelinePropConfig> ? {
|
|
278
|
+
[K in keyof C['props']]: number | string;
|
|
279
|
+
} : C['from'] extends DialConfig ? ResolvedValues<C['from']> : undefined;
|
|
280
|
+
to: C['props'] extends Record<string, TimelinePropConfig> ? {
|
|
281
|
+
[K in keyof C['props']]: number | string;
|
|
282
|
+
} : C['steps'] extends TimelineStepConfig[] ? C['from'] extends DialConfig ? ResolvedValues<C['from']> : Record<string, number | string> : C['to'] extends DialConfig ? ResolvedValues<C['to']> : undefined;
|
|
283
|
+
/** `to` once the clip has started, `from` before — hand it to Motion's animate.
|
|
284
|
+
* For sequences this is the final merged state; for props clips, per-track
|
|
285
|
+
* endpoint records. */
|
|
286
|
+
animate: C['props'] extends Record<string, TimelinePropConfig> ? {
|
|
287
|
+
[K in keyof C['props']]: number | string;
|
|
288
|
+
} : C['steps'] extends TimelineStepConfig[] ? C['from'] extends DialConfig ? ResolvedValues<C['from']> : Record<string, number | string> | undefined : C['to'] extends DialConfig ? C['from'] extends DialConfig ? ResolvedValues<C['from']> | ResolvedValues<C['to']> : ResolvedValues<C['to']> | undefined : undefined;
|
|
289
|
+
/** The clip's editable curve — single-curve clips only. */
|
|
290
|
+
transition: C['props'] extends Record<string, TimelinePropConfig> ? undefined : C['steps'] extends TimelineStepConfig[] ? undefined : C extends {
|
|
291
|
+
transition: TransitionConfig;
|
|
292
|
+
} | {
|
|
293
|
+
from: DialConfig;
|
|
294
|
+
} | {
|
|
295
|
+
to: DialConfig;
|
|
296
|
+
} ? TransitionConfig : undefined;
|
|
297
|
+
/** Duration + timing-function for native CSS transitions — single-curve clips only. */
|
|
298
|
+
css: C['props'] extends Record<string, TimelinePropConfig> ? undefined : C['steps'] extends TimelineStepConfig[] ? undefined : C extends {
|
|
299
|
+
transition: TransitionConfig;
|
|
300
|
+
} | {
|
|
301
|
+
from: DialConfig;
|
|
302
|
+
} | {
|
|
303
|
+
to: DialConfig;
|
|
304
|
+
} ? TimelineClipCss : undefined;
|
|
305
|
+
/**
|
|
306
|
+
* Values interpolated through the clip's curves at the current playhead —
|
|
307
|
+
* bind to style for true scrubbing: the element is exactly at this point
|
|
308
|
+
* in time whether playing, paused, or scrubbing. Sequence clips report the
|
|
309
|
+
* merged state of all legs (declare every animated property in `from`);
|
|
310
|
+
* props clips report every track's value.
|
|
311
|
+
*/
|
|
312
|
+
current: C['props'] extends Record<string, TimelinePropConfig> ? {
|
|
313
|
+
[K in keyof C['props']]: number | string;
|
|
314
|
+
} : C['steps'] extends TimelineStepConfig[] ? C['from'] extends DialConfig ? ResolvedValues<C['from']> : Record<string, number | string> : C['to'] extends DialConfig ? C['from'] extends DialConfig ? ResolvedValues<C['from']> | ResolvedValues<C['to']> : undefined : undefined;
|
|
315
|
+
};
|
|
316
|
+
type TimelineGroupValues<G extends TimelineGroupConfig> = {
|
|
317
|
+
[K in keyof G as G[K] extends TimelineClipConfig ? K : never]: TimelineClipValues<Extract<G[K], TimelineClipConfig>>;
|
|
318
|
+
};
|
|
319
|
+
type DialTimelineValues<T extends TimelineConfig> = {
|
|
320
|
+
time: number;
|
|
321
|
+
playing: boolean;
|
|
322
|
+
duration: number;
|
|
323
|
+
play: () => void;
|
|
324
|
+
pause: () => void;
|
|
325
|
+
replay: () => void;
|
|
326
|
+
seek: (time: number) => void;
|
|
327
|
+
} & {
|
|
328
|
+
[K in keyof T as T[K] extends TimelineClipConfig ? K : never]: TimelineClipValues<Extract<T[K], TimelineClipConfig>>;
|
|
329
|
+
} & {
|
|
330
|
+
[K in keyof T as T[K] extends TimelineClipConfig ? never : T[K] extends TimelineGroupConfig ? K : never]: TimelineGroupValues<Extract<T[K], TimelineGroupConfig>>;
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
interface DialTimelineOptions {
|
|
334
|
+
id?: string;
|
|
335
|
+
persist?: DialKitPersistOptions;
|
|
336
|
+
/** Start playing on mount. Defaults to true. */
|
|
337
|
+
autoplay?: boolean;
|
|
338
|
+
/**
|
|
339
|
+
* Loop when the playhead reaches the end. `true` restarts the whole
|
|
340
|
+
* timeline; `{ from }` wraps back to that time instead, so clips before it
|
|
341
|
+
* play once and looping clips keep cycling forever. Defaults to false.
|
|
342
|
+
*/
|
|
343
|
+
loop?: boolean | {
|
|
344
|
+
from: number;
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
type CreateDialTimelineOptions = DialTimelineOptions;
|
|
349
|
+
declare function createDialTimeline<T extends TimelineConfig>(name: string, config: T, options?: CreateDialTimelineOptions): Accessor<DialTimelineValues<T>>;
|
|
154
350
|
|
|
155
351
|
type DialPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
|
|
156
352
|
type DialMode = 'popover' | 'inline';
|
|
@@ -161,9 +357,20 @@ interface DialRootProps {
|
|
|
161
357
|
mode?: DialMode;
|
|
162
358
|
theme?: DialTheme;
|
|
163
359
|
productionEnabled?: boolean;
|
|
360
|
+
onOpenChange?: (open: boolean) => void;
|
|
164
361
|
}
|
|
165
362
|
declare function DialRoot(props: DialRootProps): solid_js.JSX.Element;
|
|
166
363
|
|
|
364
|
+
interface DialTimelineProps {
|
|
365
|
+
theme?: DialTheme;
|
|
366
|
+
defaultVisible?: boolean;
|
|
367
|
+
visible?: boolean;
|
|
368
|
+
onVisibilityChange?: (visible: boolean) => void;
|
|
369
|
+
defaultOpen?: boolean;
|
|
370
|
+
productionEnabled?: boolean;
|
|
371
|
+
}
|
|
372
|
+
declare function DialTimeline(props: DialTimelineProps): JSX.Element;
|
|
373
|
+
|
|
167
374
|
interface SliderProps {
|
|
168
375
|
label: string;
|
|
169
376
|
value: number;
|
|
@@ -190,13 +397,35 @@ interface FolderProps {
|
|
|
190
397
|
title: string;
|
|
191
398
|
children: JSX.Element;
|
|
192
399
|
defaultOpen?: boolean;
|
|
400
|
+
onOpenChange?: (isOpen: boolean) => void;
|
|
401
|
+
/** @deprecated Use RootPanel instead; kept for backwards compatibility. */
|
|
193
402
|
isRoot?: boolean;
|
|
403
|
+
/** @deprecated Only meaningful with isRoot. */
|
|
194
404
|
inline?: boolean;
|
|
195
|
-
|
|
405
|
+
/** @deprecated Only meaningful with isRoot. */
|
|
196
406
|
toolbar?: JSX.Element;
|
|
407
|
+
/** @deprecated Only meaningful with isRoot. */
|
|
408
|
+
panelHeightOffset?: number;
|
|
197
409
|
}
|
|
410
|
+
/** Collapsible section with animated height/opacity and rotating chevron. */
|
|
198
411
|
declare function Folder(props: FolderProps): JSX.Element;
|
|
199
412
|
|
|
413
|
+
interface RootPanelProps {
|
|
414
|
+
title: string;
|
|
415
|
+
children: JSX.Element;
|
|
416
|
+
defaultOpen?: boolean;
|
|
417
|
+
inline?: boolean;
|
|
418
|
+
onOpenChange?: (isOpen: boolean) => void;
|
|
419
|
+
toolbar?: JSX.Element;
|
|
420
|
+
panelHeightOffset?: number;
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* The top-level panel shell: header with panel icon and toolbar, and (in
|
|
424
|
+
* popover mode) the bubble-to-panel morph animation with drag-friendly
|
|
425
|
+
* collapsed state. Section folding lives in Folder.
|
|
426
|
+
*/
|
|
427
|
+
declare function RootPanel(props: RootPanelProps): JSX.Element;
|
|
428
|
+
|
|
200
429
|
interface ButtonGroupProps {
|
|
201
430
|
buttons: Array<{
|
|
202
431
|
label: string;
|
|
@@ -220,6 +449,28 @@ interface SpringVisualizationProps {
|
|
|
220
449
|
}
|
|
221
450
|
declare function SpringVisualization(props: SpringVisualizationProps): solid_js.JSX.Element;
|
|
222
451
|
|
|
452
|
+
interface TransitionDurationControl {
|
|
453
|
+
value: number;
|
|
454
|
+
onChange: (value: number) => void;
|
|
455
|
+
min?: number;
|
|
456
|
+
max?: number;
|
|
457
|
+
step?: number;
|
|
458
|
+
}
|
|
459
|
+
interface TransitionControlProps {
|
|
460
|
+
panelId: string;
|
|
461
|
+
path: string;
|
|
462
|
+
label: string;
|
|
463
|
+
value: TransitionConfig;
|
|
464
|
+
onChange: (value: TransitionConfig) => void;
|
|
465
|
+
hideDuration?: boolean;
|
|
466
|
+
durationControl?: TransitionDurationControl;
|
|
467
|
+
}
|
|
468
|
+
declare function TransitionControl(props: TransitionControlProps): solid_js.JSX.Element;
|
|
469
|
+
|
|
470
|
+
declare function EasingVisualization(props: {
|
|
471
|
+
easing: EasingConfig;
|
|
472
|
+
}): solid_js.JSX.Element;
|
|
473
|
+
|
|
223
474
|
interface TextControlProps {
|
|
224
475
|
label: string;
|
|
225
476
|
value: string;
|
|
@@ -255,4 +506,12 @@ interface PresetManagerProps {
|
|
|
255
506
|
}
|
|
256
507
|
declare function PresetManager(props: PresetManagerProps): solid_js.JSX.Element;
|
|
257
508
|
|
|
258
|
-
|
|
509
|
+
interface ControlRendererProps {
|
|
510
|
+
panelId: string;
|
|
511
|
+
controls: ControlMeta[];
|
|
512
|
+
values: Record<string, DialValue>;
|
|
513
|
+
transitionDuration?: TransitionDurationControl;
|
|
514
|
+
}
|
|
515
|
+
declare function ControlRenderer(props: ControlRendererProps): solid_js.JSX.Element;
|
|
516
|
+
|
|
517
|
+
export { type ActionConfig, ButtonGroup, type ColorConfig, ColorControl, type ControlMeta, ControlRenderer, type CreateDialOptions, type CreateDialTimelineOptions, type DialConfig, type DialKitController, type DialKitPersistOptions, type DialKitValueUpdates, type DialMode, type DialPosition, DialRoot, DialStore, type DialTheme, DialTimeline, type DialTimelineProps, type DialTimelineValues, type DialValue, type EasingConfig, EasingVisualization, Folder, type PanelConfig, type Preset, PresetManager, type ResolvedValues, RootPanel, type SelectConfig, SelectControl, type ShortcutConfig, Slider, type SpringConfig, SpringControl, SpringVisualization, type TextConfig, TextControl, type TimelineClipConfig, type TimelineClipCss, type TimelineClipLoop, type TimelineClipValues, type TimelineConfig, type TimelineGroupConfig, type TimelineGroupValues, type TimelinePropConfig, type TimelinePropStepConfig, type TimelineStepConfig, type TimelineStepValues, Toggle, type TransitionConfig, TransitionControl, createDialKit, createDialKitController, createDialTimeline };
|