@thewhateverapp/tile-sdk 0.13.31 → 0.13.33
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/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -0
- package/dist/spec/host/OverlayHost.d.ts +68 -0
- package/dist/spec/host/OverlayHost.d.ts.map +1 -0
- package/dist/spec/host/OverlayHost.js +143 -0
- package/dist/spec/host/index.d.ts +7 -0
- package/dist/spec/host/index.d.ts.map +1 -0
- package/dist/spec/host/index.js +6 -0
- package/dist/spec/index.d.ts +29 -0
- package/dist/spec/index.d.ts.map +1 -0
- package/dist/spec/index.js +81 -0
- package/dist/spec/registry/ComponentRegistry.d.ts +208 -0
- package/dist/spec/registry/ComponentRegistry.d.ts.map +1 -0
- package/dist/spec/registry/ComponentRegistry.js +227 -0
- package/dist/spec/registry/composites/BottomSheet.d.ts +33 -0
- package/dist/spec/registry/composites/BottomSheet.d.ts.map +1 -0
- package/dist/spec/registry/composites/BottomSheet.js +98 -0
- package/dist/spec/registry/composites/CountdownCTA.d.ts +35 -0
- package/dist/spec/registry/composites/CountdownCTA.d.ts.map +1 -0
- package/dist/spec/registry/composites/CountdownCTA.js +91 -0
- package/dist/spec/registry/composites/Poll.d.ts +39 -0
- package/dist/spec/registry/composites/Poll.d.ts.map +1 -0
- package/dist/spec/registry/composites/Poll.js +76 -0
- package/dist/spec/registry/composites/Prediction.d.ts +37 -0
- package/dist/spec/registry/composites/Prediction.d.ts.map +1 -0
- package/dist/spec/registry/composites/Prediction.js +116 -0
- package/dist/spec/registry/composites/index.d.ts +33 -0
- package/dist/spec/registry/composites/index.d.ts.map +1 -0
- package/dist/spec/registry/composites/index.js +36 -0
- package/dist/spec/registry/index.d.ts +15 -0
- package/dist/spec/registry/index.d.ts.map +1 -0
- package/dist/spec/registry/index.js +24 -0
- package/dist/spec/registry/primitives/Button.d.ts +30 -0
- package/dist/spec/registry/primitives/Button.d.ts.map +1 -0
- package/dist/spec/registry/primitives/Button.js +62 -0
- package/dist/spec/registry/primitives/Divider.d.ts +22 -0
- package/dist/spec/registry/primitives/Divider.d.ts.map +1 -0
- package/dist/spec/registry/primitives/Divider.js +56 -0
- package/dist/spec/registry/primitives/Image.d.ts +27 -0
- package/dist/spec/registry/primitives/Image.d.ts.map +1 -0
- package/dist/spec/registry/primitives/Image.js +36 -0
- package/dist/spec/registry/primitives/ProgressBar.d.ts +28 -0
- package/dist/spec/registry/primitives/ProgressBar.d.ts.map +1 -0
- package/dist/spec/registry/primitives/ProgressBar.js +50 -0
- package/dist/spec/registry/primitives/Row.d.ts +26 -0
- package/dist/spec/registry/primitives/Row.d.ts.map +1 -0
- package/dist/spec/registry/primitives/Row.js +50 -0
- package/dist/spec/registry/primitives/Spacer.d.ts +18 -0
- package/dist/spec/registry/primitives/Spacer.d.ts.map +1 -0
- package/dist/spec/registry/primitives/Spacer.js +25 -0
- package/dist/spec/registry/primitives/Stack.d.ts +22 -0
- package/dist/spec/registry/primitives/Stack.d.ts.map +1 -0
- package/dist/spec/registry/primitives/Stack.js +41 -0
- package/dist/spec/registry/primitives/Text.d.ts +26 -0
- package/dist/spec/registry/primitives/Text.d.ts.map +1 -0
- package/dist/spec/registry/primitives/Text.js +33 -0
- package/dist/spec/registry/primitives/index.d.ts +45 -0
- package/dist/spec/registry/primitives/index.d.ts.map +1 -0
- package/dist/spec/registry/primitives/index.js +55 -0
- package/dist/spec/renderer/BindingResolver.d.ts +35 -0
- package/dist/spec/renderer/BindingResolver.d.ts.map +1 -0
- package/dist/spec/renderer/BindingResolver.js +131 -0
- package/dist/spec/renderer/CaptionTrack.d.ts +22 -0
- package/dist/spec/renderer/CaptionTrack.d.ts.map +1 -0
- package/dist/spec/renderer/CaptionTrack.js +83 -0
- package/dist/spec/renderer/LayoutRenderer.d.ts +24 -0
- package/dist/spec/renderer/LayoutRenderer.d.ts.map +1 -0
- package/dist/spec/renderer/LayoutRenderer.js +66 -0
- package/dist/spec/renderer/OverlayCue.d.ts +20 -0
- package/dist/spec/renderer/OverlayCue.d.ts.map +1 -0
- package/dist/spec/renderer/OverlayCue.js +161 -0
- package/dist/spec/renderer/index.d.ts +10 -0
- package/dist/spec/renderer/index.d.ts.map +1 -0
- package/dist/spec/renderer/index.js +13 -0
- package/dist/spec/runtime/ActionRouter.d.ts +33 -0
- package/dist/spec/runtime/ActionRouter.d.ts.map +1 -0
- package/dist/spec/runtime/ActionRouter.js +84 -0
- package/dist/spec/runtime/OverlayRuntime.d.ts +84 -0
- package/dist/spec/runtime/OverlayRuntime.d.ts.map +1 -0
- package/dist/spec/runtime/OverlayRuntime.js +216 -0
- package/dist/spec/runtime/StateManager.d.ts +31 -0
- package/dist/spec/runtime/StateManager.d.ts.map +1 -0
- package/dist/spec/runtime/StateManager.js +60 -0
- package/dist/spec/runtime/TimeSync.d.ts +47 -0
- package/dist/spec/runtime/TimeSync.d.ts.map +1 -0
- package/dist/spec/runtime/TimeSync.js +140 -0
- package/dist/spec/runtime/index.d.ts +10 -0
- package/dist/spec/runtime/index.d.ts.map +1 -0
- package/dist/spec/runtime/index.js +13 -0
- package/dist/spec/schema.d.ts +889 -0
- package/dist/spec/schema.d.ts.map +1 -0
- package/dist/spec/schema.js +284 -0
- package/dist/spec/theme/ThemeProvider.d.ts +151 -0
- package/dist/spec/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/spec/theme/ThemeProvider.js +227 -0
- package/dist/spec/theme/index.d.ts +7 -0
- package/dist/spec/theme/index.d.ts.map +1 -0
- package/dist/spec/theme/index.js +12 -0
- package/dist/spec/types.d.ts +322 -0
- package/dist/spec/types.d.ts.map +1 -0
- package/dist/spec/types.js +36 -0
- package/package.json +8 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StateManager
|
|
3
|
+
*
|
|
4
|
+
* Manages local spec state with React integration.
|
|
5
|
+
*/
|
|
6
|
+
import { useCallback, useSyncExternalStore } from 'react';
|
|
7
|
+
/**
|
|
8
|
+
* Creates a state manager for spec local state.
|
|
9
|
+
*/
|
|
10
|
+
export function createStateManager(initial = {}) {
|
|
11
|
+
let state = { ...initial };
|
|
12
|
+
const listeners = new Set();
|
|
13
|
+
const notify = () => {
|
|
14
|
+
listeners.forEach((listener) => listener());
|
|
15
|
+
};
|
|
16
|
+
return {
|
|
17
|
+
getSnapshot() {
|
|
18
|
+
return state;
|
|
19
|
+
},
|
|
20
|
+
subscribe(listener) {
|
|
21
|
+
listeners.add(listener);
|
|
22
|
+
return () => listeners.delete(listener);
|
|
23
|
+
},
|
|
24
|
+
setState(key, value) {
|
|
25
|
+
if (state[key] !== value) {
|
|
26
|
+
state = { ...state, [key]: value };
|
|
27
|
+
notify();
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
getState(key) {
|
|
31
|
+
return state[key];
|
|
32
|
+
},
|
|
33
|
+
reset() {
|
|
34
|
+
state = { ...initial };
|
|
35
|
+
notify();
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Hook to use spec state in components.
|
|
41
|
+
*/
|
|
42
|
+
export function useSpecState(manager) {
|
|
43
|
+
return useSyncExternalStore(manager.subscribe, manager.getSnapshot, manager.getSnapshot // Same for server
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Hook to get a specific state value.
|
|
48
|
+
*/
|
|
49
|
+
export function useSpecStateValue(manager, key) {
|
|
50
|
+
const state = useSpecState(manager);
|
|
51
|
+
return state[key];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Hook to get a state setter.
|
|
55
|
+
*/
|
|
56
|
+
export function useSpecStateSetter(manager) {
|
|
57
|
+
return useCallback((key, value) => {
|
|
58
|
+
manager.setState(key, value);
|
|
59
|
+
}, [manager]);
|
|
60
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TimeSync
|
|
3
|
+
*
|
|
4
|
+
* Time synchronization with video player.
|
|
5
|
+
*/
|
|
6
|
+
import type { SyncConfig } from '../types';
|
|
7
|
+
export interface TimeState {
|
|
8
|
+
/** Current time in milliseconds */
|
|
9
|
+
timeMs: number;
|
|
10
|
+
/** Total duration in milliseconds */
|
|
11
|
+
durationMs: number;
|
|
12
|
+
/** Whether the video is playing */
|
|
13
|
+
isPlaying: boolean;
|
|
14
|
+
/** Whether the video has ended */
|
|
15
|
+
hasEnded: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface VideoTimeSource {
|
|
18
|
+
/** Get current time in seconds */
|
|
19
|
+
getCurrentTime(): number;
|
|
20
|
+
/** Get duration in seconds */
|
|
21
|
+
getDuration(): number;
|
|
22
|
+
/** Check if playing */
|
|
23
|
+
isPlaying(): boolean;
|
|
24
|
+
/** Check if ended */
|
|
25
|
+
hasEnded(): boolean;
|
|
26
|
+
/** Subscribe to time updates */
|
|
27
|
+
onTimeUpdate(callback: () => void): () => void;
|
|
28
|
+
/** Subscribe to seek events */
|
|
29
|
+
onSeek?(callback: () => void): () => void;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Hook for time synchronization with video player.
|
|
33
|
+
*/
|
|
34
|
+
export declare function useTimeSync(source: VideoTimeSource | null, config?: SyncConfig): TimeState;
|
|
35
|
+
/**
|
|
36
|
+
* Hook for wall clock time (not synced to video).
|
|
37
|
+
*/
|
|
38
|
+
export declare function useWallClockTime(intervalMs?: number): TimeState;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a video time source from an HTML video element.
|
|
41
|
+
*/
|
|
42
|
+
export declare function createVideoTimeSource(video: HTMLVideoElement): VideoTimeSource;
|
|
43
|
+
/**
|
|
44
|
+
* Checks if a time is within a window (with tolerance).
|
|
45
|
+
*/
|
|
46
|
+
export declare function isTimeInWindow(timeMs: number, startMs?: number, endMs?: number, toleranceMs?: number): boolean;
|
|
47
|
+
//# sourceMappingURL=TimeSync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimeSync.d.ts","sourceRoot":"","sources":["../../../src/spec/runtime/TimeSync.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,UAAU,CAAC;AAE1D,MAAM,WAAW,SAAS;IACxB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IAEf,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IAEnB,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAC;IAEnB,kCAAkC;IAClC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,cAAc,IAAI,MAAM,CAAC;IAEzB,8BAA8B;IAC9B,WAAW,IAAI,MAAM,CAAC;IAEtB,uBAAuB;IACvB,SAAS,IAAI,OAAO,CAAC;IAErB,qBAAqB;IACrB,QAAQ,IAAI,OAAO,CAAC;IAEpB,gCAAgC;IAChC,YAAY,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAE/C,+BAA+B;IAC/B,MAAM,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC3C;AA8BD;;GAEG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,eAAe,GAAG,IAAI,EAC9B,MAAM,GAAE,UAAgC,GACvC,SAAS,CAiEX;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,GAAE,MAAa,GAAG,SAAS,CAoBrE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,eAAe,CAiB9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,WAAW,GAAE,MAAU,GACtB,OAAO,CAQT"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TimeSync
|
|
3
|
+
*
|
|
4
|
+
* Time synchronization with video player.
|
|
5
|
+
*/
|
|
6
|
+
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
7
|
+
const DEFAULT_SYNC_CONFIG = {
|
|
8
|
+
timebase: 'player',
|
|
9
|
+
tick: 'timeupdate',
|
|
10
|
+
toleranceMs: 100,
|
|
11
|
+
onSeek: 'recompute',
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Applies a time transform to the current time.
|
|
15
|
+
*/
|
|
16
|
+
function applyTransform(timeMs, transform) {
|
|
17
|
+
if (!transform)
|
|
18
|
+
return timeMs;
|
|
19
|
+
let result = timeMs;
|
|
20
|
+
// Apply offset
|
|
21
|
+
if (transform.offsetMs) {
|
|
22
|
+
result += transform.offsetMs;
|
|
23
|
+
}
|
|
24
|
+
// Apply scale
|
|
25
|
+
if (transform.scale && transform.scale !== 1) {
|
|
26
|
+
result *= transform.scale;
|
|
27
|
+
}
|
|
28
|
+
return Math.max(0, result);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Hook for time synchronization with video player.
|
|
32
|
+
*/
|
|
33
|
+
export function useTimeSync(source, config = DEFAULT_SYNC_CONFIG) {
|
|
34
|
+
const [state, setState] = useState({
|
|
35
|
+
timeMs: 0,
|
|
36
|
+
durationMs: 0,
|
|
37
|
+
isPlaying: false,
|
|
38
|
+
hasEnded: false,
|
|
39
|
+
});
|
|
40
|
+
const rafRef = useRef();
|
|
41
|
+
const lastUpdateRef = useRef(0);
|
|
42
|
+
const updateTime = useCallback(() => {
|
|
43
|
+
if (!source)
|
|
44
|
+
return;
|
|
45
|
+
const now = performance.now();
|
|
46
|
+
const rawTimeMs = source.getCurrentTime() * 1000;
|
|
47
|
+
const transformedTime = applyTransform(rawTimeMs, config.transform);
|
|
48
|
+
setState({
|
|
49
|
+
timeMs: transformedTime,
|
|
50
|
+
durationMs: source.getDuration() * 1000,
|
|
51
|
+
isPlaying: source.isPlaying(),
|
|
52
|
+
hasEnded: source.hasEnded(),
|
|
53
|
+
});
|
|
54
|
+
lastUpdateRef.current = now;
|
|
55
|
+
}, [source, config.transform]);
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
if (!source)
|
|
58
|
+
return;
|
|
59
|
+
// Initial update
|
|
60
|
+
updateTime();
|
|
61
|
+
// Subscribe based on tick mode
|
|
62
|
+
if (config.tick === 'raf') {
|
|
63
|
+
const loop = () => {
|
|
64
|
+
updateTime();
|
|
65
|
+
rafRef.current = requestAnimationFrame(loop);
|
|
66
|
+
};
|
|
67
|
+
rafRef.current = requestAnimationFrame(loop);
|
|
68
|
+
return () => {
|
|
69
|
+
if (rafRef.current) {
|
|
70
|
+
cancelAnimationFrame(rafRef.current);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// timeupdate mode
|
|
76
|
+
return source.onTimeUpdate(updateTime);
|
|
77
|
+
}
|
|
78
|
+
}, [source, config.tick, updateTime]);
|
|
79
|
+
// Handle seek events
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
if (!source?.onSeek)
|
|
82
|
+
return;
|
|
83
|
+
return source.onSeek(() => {
|
|
84
|
+
if (config.onSeek === 'recompute') {
|
|
85
|
+
updateTime();
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}, [source, config.onSeek, updateTime]);
|
|
89
|
+
return state;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Hook for wall clock time (not synced to video).
|
|
93
|
+
*/
|
|
94
|
+
export function useWallClockTime(intervalMs = 1000) {
|
|
95
|
+
const [state, setState] = useState({
|
|
96
|
+
timeMs: Date.now(),
|
|
97
|
+
durationMs: Infinity,
|
|
98
|
+
isPlaying: true,
|
|
99
|
+
hasEnded: false,
|
|
100
|
+
});
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
const interval = setInterval(() => {
|
|
103
|
+
setState((prev) => ({
|
|
104
|
+
...prev,
|
|
105
|
+
timeMs: Date.now(),
|
|
106
|
+
}));
|
|
107
|
+
}, intervalMs);
|
|
108
|
+
return () => clearInterval(interval);
|
|
109
|
+
}, [intervalMs]);
|
|
110
|
+
return state;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Creates a video time source from an HTML video element.
|
|
114
|
+
*/
|
|
115
|
+
export function createVideoTimeSource(video) {
|
|
116
|
+
return {
|
|
117
|
+
getCurrentTime: () => video.currentTime,
|
|
118
|
+
getDuration: () => video.duration || 0,
|
|
119
|
+
isPlaying: () => !video.paused && !video.ended,
|
|
120
|
+
hasEnded: () => video.ended,
|
|
121
|
+
onTimeUpdate(callback) {
|
|
122
|
+
video.addEventListener('timeupdate', callback);
|
|
123
|
+
return () => video.removeEventListener('timeupdate', callback);
|
|
124
|
+
},
|
|
125
|
+
onSeek(callback) {
|
|
126
|
+
video.addEventListener('seeked', callback);
|
|
127
|
+
return () => video.removeEventListener('seeked', callback);
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Checks if a time is within a window (with tolerance).
|
|
133
|
+
*/
|
|
134
|
+
export function isTimeInWindow(timeMs, startMs, endMs, toleranceMs = 0) {
|
|
135
|
+
const adjustedStart = startMs !== undefined ? startMs - toleranceMs : undefined;
|
|
136
|
+
const adjustedEnd = endMs !== undefined ? endMs + toleranceMs : undefined;
|
|
137
|
+
const afterStart = adjustedStart === undefined || timeMs >= adjustedStart;
|
|
138
|
+
const beforeEnd = adjustedEnd === undefined || timeMs < adjustedEnd;
|
|
139
|
+
return afterStart && beforeEnd;
|
|
140
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Module Index
|
|
3
|
+
*
|
|
4
|
+
* Exports all runtime components and utilities.
|
|
5
|
+
*/
|
|
6
|
+
export { OverlayRuntime, useOverlayRuntime, useRuntimeTime, useRuntimeState, useRuntimeData, useRuntimeAction, evaluateCondition, resolveBinding, getNestedValue, type OverlayRuntimeProps, type OverlayRuntimeContextValue, type EvaluationContext, } from './OverlayRuntime';
|
|
7
|
+
export { createStateManager, useSpecState, useSpecStateValue, useSpecStateSetter, type StateManager, type StateSnapshot, } from './StateManager';
|
|
8
|
+
export { createActionRouter, isActionValue, type ActionRouter, type ActionContext, } from './ActionRouter';
|
|
9
|
+
export { useTimeSync, useWallClockTime, createVideoTimeSource, isTimeInWindow, type TimeState, type VideoTimeSource, } from './TimeSync';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/spec/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Module Index
|
|
3
|
+
*
|
|
4
|
+
* Exports all runtime components and utilities.
|
|
5
|
+
*/
|
|
6
|
+
// Main runtime provider
|
|
7
|
+
export { OverlayRuntime, useOverlayRuntime, useRuntimeTime, useRuntimeState, useRuntimeData, useRuntimeAction, evaluateCondition, resolveBinding, getNestedValue, } from './OverlayRuntime';
|
|
8
|
+
// State management
|
|
9
|
+
export { createStateManager, useSpecState, useSpecStateValue, useSpecStateSetter, } from './StateManager';
|
|
10
|
+
// Action routing
|
|
11
|
+
export { createActionRouter, isActionValue, } from './ActionRouter';
|
|
12
|
+
// Time synchronization
|
|
13
|
+
export { useTimeSync, useWallClockTime, createVideoTimeSource, isTimeInWindow, } from './TimeSync';
|