@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.
Files changed (102) hide show
  1. package/dist/react/index.d.ts.map +1 -1
  2. package/dist/react/index.js +1 -0
  3. package/dist/spec/host/OverlayHost.d.ts +68 -0
  4. package/dist/spec/host/OverlayHost.d.ts.map +1 -0
  5. package/dist/spec/host/OverlayHost.js +143 -0
  6. package/dist/spec/host/index.d.ts +7 -0
  7. package/dist/spec/host/index.d.ts.map +1 -0
  8. package/dist/spec/host/index.js +6 -0
  9. package/dist/spec/index.d.ts +29 -0
  10. package/dist/spec/index.d.ts.map +1 -0
  11. package/dist/spec/index.js +81 -0
  12. package/dist/spec/registry/ComponentRegistry.d.ts +208 -0
  13. package/dist/spec/registry/ComponentRegistry.d.ts.map +1 -0
  14. package/dist/spec/registry/ComponentRegistry.js +227 -0
  15. package/dist/spec/registry/composites/BottomSheet.d.ts +33 -0
  16. package/dist/spec/registry/composites/BottomSheet.d.ts.map +1 -0
  17. package/dist/spec/registry/composites/BottomSheet.js +98 -0
  18. package/dist/spec/registry/composites/CountdownCTA.d.ts +35 -0
  19. package/dist/spec/registry/composites/CountdownCTA.d.ts.map +1 -0
  20. package/dist/spec/registry/composites/CountdownCTA.js +91 -0
  21. package/dist/spec/registry/composites/Poll.d.ts +39 -0
  22. package/dist/spec/registry/composites/Poll.d.ts.map +1 -0
  23. package/dist/spec/registry/composites/Poll.js +76 -0
  24. package/dist/spec/registry/composites/Prediction.d.ts +37 -0
  25. package/dist/spec/registry/composites/Prediction.d.ts.map +1 -0
  26. package/dist/spec/registry/composites/Prediction.js +116 -0
  27. package/dist/spec/registry/composites/index.d.ts +33 -0
  28. package/dist/spec/registry/composites/index.d.ts.map +1 -0
  29. package/dist/spec/registry/composites/index.js +36 -0
  30. package/dist/spec/registry/index.d.ts +15 -0
  31. package/dist/spec/registry/index.d.ts.map +1 -0
  32. package/dist/spec/registry/index.js +24 -0
  33. package/dist/spec/registry/primitives/Button.d.ts +30 -0
  34. package/dist/spec/registry/primitives/Button.d.ts.map +1 -0
  35. package/dist/spec/registry/primitives/Button.js +62 -0
  36. package/dist/spec/registry/primitives/Divider.d.ts +22 -0
  37. package/dist/spec/registry/primitives/Divider.d.ts.map +1 -0
  38. package/dist/spec/registry/primitives/Divider.js +56 -0
  39. package/dist/spec/registry/primitives/Image.d.ts +27 -0
  40. package/dist/spec/registry/primitives/Image.d.ts.map +1 -0
  41. package/dist/spec/registry/primitives/Image.js +36 -0
  42. package/dist/spec/registry/primitives/ProgressBar.d.ts +28 -0
  43. package/dist/spec/registry/primitives/ProgressBar.d.ts.map +1 -0
  44. package/dist/spec/registry/primitives/ProgressBar.js +50 -0
  45. package/dist/spec/registry/primitives/Row.d.ts +26 -0
  46. package/dist/spec/registry/primitives/Row.d.ts.map +1 -0
  47. package/dist/spec/registry/primitives/Row.js +50 -0
  48. package/dist/spec/registry/primitives/Spacer.d.ts +18 -0
  49. package/dist/spec/registry/primitives/Spacer.d.ts.map +1 -0
  50. package/dist/spec/registry/primitives/Spacer.js +25 -0
  51. package/dist/spec/registry/primitives/Stack.d.ts +22 -0
  52. package/dist/spec/registry/primitives/Stack.d.ts.map +1 -0
  53. package/dist/spec/registry/primitives/Stack.js +41 -0
  54. package/dist/spec/registry/primitives/Text.d.ts +26 -0
  55. package/dist/spec/registry/primitives/Text.d.ts.map +1 -0
  56. package/dist/spec/registry/primitives/Text.js +33 -0
  57. package/dist/spec/registry/primitives/index.d.ts +45 -0
  58. package/dist/spec/registry/primitives/index.d.ts.map +1 -0
  59. package/dist/spec/registry/primitives/index.js +55 -0
  60. package/dist/spec/renderer/BindingResolver.d.ts +35 -0
  61. package/dist/spec/renderer/BindingResolver.d.ts.map +1 -0
  62. package/dist/spec/renderer/BindingResolver.js +131 -0
  63. package/dist/spec/renderer/CaptionTrack.d.ts +22 -0
  64. package/dist/spec/renderer/CaptionTrack.d.ts.map +1 -0
  65. package/dist/spec/renderer/CaptionTrack.js +83 -0
  66. package/dist/spec/renderer/LayoutRenderer.d.ts +24 -0
  67. package/dist/spec/renderer/LayoutRenderer.d.ts.map +1 -0
  68. package/dist/spec/renderer/LayoutRenderer.js +66 -0
  69. package/dist/spec/renderer/OverlayCue.d.ts +20 -0
  70. package/dist/spec/renderer/OverlayCue.d.ts.map +1 -0
  71. package/dist/spec/renderer/OverlayCue.js +161 -0
  72. package/dist/spec/renderer/index.d.ts +10 -0
  73. package/dist/spec/renderer/index.d.ts.map +1 -0
  74. package/dist/spec/renderer/index.js +13 -0
  75. package/dist/spec/runtime/ActionRouter.d.ts +33 -0
  76. package/dist/spec/runtime/ActionRouter.d.ts.map +1 -0
  77. package/dist/spec/runtime/ActionRouter.js +84 -0
  78. package/dist/spec/runtime/OverlayRuntime.d.ts +84 -0
  79. package/dist/spec/runtime/OverlayRuntime.d.ts.map +1 -0
  80. package/dist/spec/runtime/OverlayRuntime.js +216 -0
  81. package/dist/spec/runtime/StateManager.d.ts +31 -0
  82. package/dist/spec/runtime/StateManager.d.ts.map +1 -0
  83. package/dist/spec/runtime/StateManager.js +60 -0
  84. package/dist/spec/runtime/TimeSync.d.ts +47 -0
  85. package/dist/spec/runtime/TimeSync.d.ts.map +1 -0
  86. package/dist/spec/runtime/TimeSync.js +140 -0
  87. package/dist/spec/runtime/index.d.ts +10 -0
  88. package/dist/spec/runtime/index.d.ts.map +1 -0
  89. package/dist/spec/runtime/index.js +13 -0
  90. package/dist/spec/schema.d.ts +889 -0
  91. package/dist/spec/schema.d.ts.map +1 -0
  92. package/dist/spec/schema.js +284 -0
  93. package/dist/spec/theme/ThemeProvider.d.ts +151 -0
  94. package/dist/spec/theme/ThemeProvider.d.ts.map +1 -0
  95. package/dist/spec/theme/ThemeProvider.js +227 -0
  96. package/dist/spec/theme/index.d.ts +7 -0
  97. package/dist/spec/theme/index.d.ts.map +1 -0
  98. package/dist/spec/theme/index.js +12 -0
  99. package/dist/spec/types.d.ts +322 -0
  100. package/dist/spec/types.d.ts.map +1 -0
  101. package/dist/spec/types.js +36 -0
  102. 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';