@momoyu-ink/kit 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.
Files changed (234) hide show
  1. package/LICENSE.txt +21 -0
  2. package/dist/bindings/AnimationFormat.d.ts +1 -0
  3. package/dist/bindings/AnimationFormat.js +4 -0
  4. package/dist/bindings/AnimationFormat.js.map +1 -0
  5. package/dist/bindings/AnimationFrameCallbackEvent.d.ts +3 -0
  6. package/dist/bindings/AnimationFrameCallbackEvent.js +4 -0
  7. package/dist/bindings/AnimationFrameCallbackEvent.js.map +1 -0
  8. package/dist/bindings/AnimationProps.d.ts +6 -0
  9. package/dist/bindings/AnimationProps.js +3 -0
  10. package/dist/bindings/AnimationProps.js.map +1 -0
  11. package/dist/bindings/AudioCommand.d.ts +52 -0
  12. package/dist/bindings/AudioCommand.js +3 -0
  13. package/dist/bindings/AudioCommand.js.map +1 -0
  14. package/dist/bindings/AudioSettings.d.ts +42 -0
  15. package/dist/bindings/AudioSettings.js +4 -0
  16. package/dist/bindings/AudioSettings.js.map +1 -0
  17. package/dist/bindings/BackdropProps.d.ts +6 -0
  18. package/dist/bindings/BackdropProps.js +3 -0
  19. package/dist/bindings/BackdropProps.js.map +1 -0
  20. package/dist/bindings/BeforeUnloadEvent.d.ts +1 -0
  21. package/dist/bindings/BeforeUnloadEvent.js +4 -0
  22. package/dist/bindings/BeforeUnloadEvent.js.map +1 -0
  23. package/dist/bindings/ClipProps.d.ts +4 -0
  24. package/dist/bindings/ClipProps.js +4 -0
  25. package/dist/bindings/ClipProps.js.map +1 -0
  26. package/dist/bindings/CustomEvent.d.ts +18 -0
  27. package/dist/bindings/CustomEvent.js +4 -0
  28. package/dist/bindings/CustomEvent.js.map +1 -0
  29. package/dist/bindings/EffectParams.d.ts +6 -0
  30. package/dist/bindings/EffectParams.js +4 -0
  31. package/dist/bindings/EffectParams.js.map +1 -0
  32. package/dist/bindings/FilterKind.d.ts +34 -0
  33. package/dist/bindings/FilterKind.js +4 -0
  34. package/dist/bindings/FilterKind.js.map +1 -0
  35. package/dist/bindings/FilterProps.d.ts +4 -0
  36. package/dist/bindings/FilterProps.js +3 -0
  37. package/dist/bindings/FilterProps.js.map +1 -0
  38. package/dist/bindings/FocusEvent.d.ts +5 -0
  39. package/dist/bindings/FocusEvent.js +3 -0
  40. package/dist/bindings/FocusEvent.js.map +1 -0
  41. package/dist/bindings/FocusEventKind.d.ts +1 -0
  42. package/dist/bindings/FocusEventKind.js +4 -0
  43. package/dist/bindings/FocusEventKind.js.map +1 -0
  44. package/dist/bindings/FullScreenEvent.d.ts +4 -0
  45. package/dist/bindings/FullScreenEvent.js +3 -0
  46. package/dist/bindings/FullScreenEvent.js.map +1 -0
  47. package/dist/bindings/FullscreenEventKind.d.ts +1 -0
  48. package/dist/bindings/FullscreenEventKind.js +4 -0
  49. package/dist/bindings/FullscreenEventKind.js.map +1 -0
  50. package/dist/bindings/GameEvent.d.ts +1 -0
  51. package/dist/bindings/GameEvent.js +4 -0
  52. package/dist/bindings/GameEvent.js.map +1 -0
  53. package/dist/bindings/Gamepad.d.ts +44 -0
  54. package/dist/bindings/Gamepad.js +3 -0
  55. package/dist/bindings/Gamepad.js.map +1 -0
  56. package/dist/bindings/GamepadButton.d.ts +20 -0
  57. package/dist/bindings/GamepadButton.js +4 -0
  58. package/dist/bindings/GamepadButton.js.map +1 -0
  59. package/dist/bindings/GamepadCommand.d.ts +9 -0
  60. package/dist/bindings/GamepadCommand.js +3 -0
  61. package/dist/bindings/GamepadCommand.js.map +1 -0
  62. package/dist/bindings/GamepadEvent.d.ts +12 -0
  63. package/dist/bindings/GamepadEvent.js +3 -0
  64. package/dist/bindings/GamepadEvent.js.map +1 -0
  65. package/dist/bindings/GamepadHapticActuator.d.ts +11 -0
  66. package/dist/bindings/GamepadHapticActuator.js +4 -0
  67. package/dist/bindings/GamepadHapticActuator.js.map +1 -0
  68. package/dist/bindings/KeyboardEventKind.d.ts +1 -0
  69. package/dist/bindings/KeyboardEventKind.js +4 -0
  70. package/dist/bindings/KeyboardEventKind.js.map +1 -0
  71. package/dist/bindings/KeyboardLocation.d.ts +1 -0
  72. package/dist/bindings/KeyboardLocation.js +4 -0
  73. package/dist/bindings/KeyboardLocation.js.map +1 -0
  74. package/dist/bindings/Literal.d.ts +3 -0
  75. package/dist/bindings/Literal.js +4 -0
  76. package/dist/bindings/Literal.js.map +1 -0
  77. package/dist/bindings/MouseEventKind.d.ts +1 -0
  78. package/dist/bindings/MouseEventKind.js +4 -0
  79. package/dist/bindings/MouseEventKind.js.map +1 -0
  80. package/dist/bindings/MoyuCursor.d.ts +1 -0
  81. package/dist/bindings/MoyuCursor.js +4 -0
  82. package/dist/bindings/MoyuCursor.js.map +1 -0
  83. package/dist/bindings/NineSliceMode.d.ts +1 -0
  84. package/dist/bindings/NineSliceMode.js +4 -0
  85. package/dist/bindings/NineSliceMode.js.map +1 -0
  86. package/dist/bindings/NodeEvent.d.ts +4 -0
  87. package/dist/bindings/NodeEvent.js +4 -0
  88. package/dist/bindings/NodeEvent.js.map +1 -0
  89. package/dist/bindings/NodeProps.d.ts +20 -0
  90. package/dist/bindings/NodeProps.js +3 -0
  91. package/dist/bindings/NodeProps.js.map +1 -0
  92. package/dist/bindings/RawKeyboardEvent.d.ts +16 -0
  93. package/dist/bindings/RawKeyboardEvent.js +3 -0
  94. package/dist/bindings/RawKeyboardEvent.js.map +1 -0
  95. package/dist/bindings/RawMouseEvent.d.ts +12 -0
  96. package/dist/bindings/RawMouseEvent.js +3 -0
  97. package/dist/bindings/RawMouseEvent.js.map +1 -0
  98. package/dist/bindings/RawTouchEvent.d.ts +13 -0
  99. package/dist/bindings/RawTouchEvent.js +3 -0
  100. package/dist/bindings/RawTouchEvent.js.map +1 -0
  101. package/dist/bindings/RawWheelEvent.d.ts +9 -0
  102. package/dist/bindings/RawWheelEvent.js +3 -0
  103. package/dist/bindings/RawWheelEvent.js.map +1 -0
  104. package/dist/bindings/ResizeEvent.d.ts +4 -0
  105. package/dist/bindings/ResizeEvent.js +4 -0
  106. package/dist/bindings/ResizeEvent.js.map +1 -0
  107. package/dist/bindings/ResolvedArgument.d.ts +5 -0
  108. package/dist/bindings/ResolvedArgument.js +3 -0
  109. package/dist/bindings/ResolvedArgument.js.map +1 -0
  110. package/dist/bindings/ResolvedCommandLine.d.ts +5 -0
  111. package/dist/bindings/ResolvedCommandLine.js +3 -0
  112. package/dist/bindings/ResolvedCommandLine.js.map +1 -0
  113. package/dist/bindings/ResolvedSystemCallLine.d.ts +5 -0
  114. package/dist/bindings/ResolvedSystemCallLine.js +3 -0
  115. package/dist/bindings/ResolvedSystemCallLine.js.map +1 -0
  116. package/dist/bindings/ScenarioCommand.d.ts +90 -0
  117. package/dist/bindings/ScenarioCommand.js +3 -0
  118. package/dist/bindings/ScenarioCommand.js.map +1 -0
  119. package/dist/bindings/ScenarioEvent.d.ts +4 -0
  120. package/dist/bindings/ScenarioEvent.js +3 -0
  121. package/dist/bindings/ScenarioEvent.js.map +1 -0
  122. package/dist/bindings/SpriteMode.d.ts +1 -0
  123. package/dist/bindings/SpriteMode.js +4 -0
  124. package/dist/bindings/SpriteMode.js.map +1 -0
  125. package/dist/bindings/SpriteProps.d.ts +11 -0
  126. package/dist/bindings/SpriteProps.js +3 -0
  127. package/dist/bindings/SpriteProps.js.map +1 -0
  128. package/dist/bindings/SystemCommand.d.ts +28 -0
  129. package/dist/bindings/SystemCommand.js +3 -0
  130. package/dist/bindings/SystemCommand.js.map +1 -0
  131. package/dist/bindings/TextCommand.d.ts +9 -0
  132. package/dist/bindings/TextCommand.js +4 -0
  133. package/dist/bindings/TextCommand.js.map +1 -0
  134. package/dist/bindings/TextEvent.d.ts +1 -0
  135. package/dist/bindings/TextEvent.js +4 -0
  136. package/dist/bindings/TextEvent.js.map +1 -0
  137. package/dist/bindings/TextLine.d.ts +5 -0
  138. package/dist/bindings/TextLine.js +4 -0
  139. package/dist/bindings/TextLine.js.map +1 -0
  140. package/dist/bindings/TextPrintMode.d.ts +4 -0
  141. package/dist/bindings/TextPrintMode.js +4 -0
  142. package/dist/bindings/TextPrintMode.js.map +1 -0
  143. package/dist/bindings/TextProps.d.ts +41 -0
  144. package/dist/bindings/TextProps.js +3 -0
  145. package/dist/bindings/TextProps.js.map +1 -0
  146. package/dist/bindings/TouchEventKind.d.ts +1 -0
  147. package/dist/bindings/TouchEventKind.js +4 -0
  148. package/dist/bindings/TouchEventKind.js.map +1 -0
  149. package/dist/bindings/WheelEventDeltaMode.d.ts +1 -0
  150. package/dist/bindings/WheelEventDeltaMode.js +4 -0
  151. package/dist/bindings/WheelEventDeltaMode.js.map +1 -0
  152. package/dist/bindings/WindowState.d.ts +1 -0
  153. package/dist/bindings/WindowState.js +4 -0
  154. package/dist/bindings/WindowState.js.map +1 -0
  155. package/dist/bindings/serde_json/JsonValue.d.ts +3 -0
  156. package/dist/bindings/serde_json/JsonValue.js +4 -0
  157. package/dist/bindings/serde_json/JsonValue.js.map +1 -0
  158. package/dist/commands.d.ts +17 -0
  159. package/dist/commands.js +25 -0
  160. package/dist/commands.js.map +1 -0
  161. package/dist/components/navigation.d.ts +154 -0
  162. package/dist/components/navigation.js +253 -0
  163. package/dist/components/navigation.js.map +1 -0
  164. package/dist/declaration.d.ts +74 -0
  165. package/dist/declaration.js +3 -0
  166. package/dist/declaration.js.map +1 -0
  167. package/dist/events/base.d.ts +16 -0
  168. package/dist/events/base.js +20 -0
  169. package/dist/events/base.js.map +1 -0
  170. package/dist/events/globals.d.ts +2 -0
  171. package/dist/events/globals.js +123 -0
  172. package/dist/events/globals.js.map +1 -0
  173. package/dist/events/keyboard.d.ts +37 -0
  174. package/dist/events/keyboard.js +3 -0
  175. package/dist/events/keyboard.js.map +1 -0
  176. package/dist/events/listener.d.ts +1 -0
  177. package/dist/events/listener.js +14 -0
  178. package/dist/events/listener.js.map +1 -0
  179. package/dist/events/mouse.d.ts +15 -0
  180. package/dist/events/mouse.js +3 -0
  181. package/dist/events/mouse.js.map +1 -0
  182. package/dist/events/touch.d.ts +16 -0
  183. package/dist/events/touch.js +3 -0
  184. package/dist/events/touch.js.map +1 -0
  185. package/dist/events.d.ts +32 -0
  186. package/dist/events.js +49 -0
  187. package/dist/events.js.map +1 -0
  188. package/dist/hooks/useFadeInOut.d.ts +16 -0
  189. package/dist/hooks/useFadeInOut.js +63 -0
  190. package/dist/hooks/useFadeInOut.js.map +1 -0
  191. package/dist/hooks/useScenario.d.ts +13 -0
  192. package/dist/hooks/useScenario.js +65 -0
  193. package/dist/hooks/useScenario.js.map +1 -0
  194. package/dist/hooks/useSoundEffect.d.ts +4 -0
  195. package/dist/hooks/useSoundEffect.js +64 -0
  196. package/dist/hooks/useSoundEffect.js.map +1 -0
  197. package/dist/hooks/useStage.d.ts +85 -0
  198. package/dist/hooks/useStage.js +409 -0
  199. package/dist/hooks/useStage.js.map +1 -0
  200. package/dist/hooks.d.ts +4 -0
  201. package/dist/hooks.js +21 -0
  202. package/dist/hooks.js.map +1 -0
  203. package/dist/lib.d.ts +13 -0
  204. package/dist/lib.js +53 -0
  205. package/dist/lib.js.map +1 -0
  206. package/dist/moyu.d.ts +18 -0
  207. package/dist/moyu.js +50 -0
  208. package/dist/moyu.js.map +1 -0
  209. package/dist/node.d.ts +16 -0
  210. package/dist/node.js +106 -0
  211. package/dist/node.js.map +1 -0
  212. package/dist/react.d.ts +20 -0
  213. package/dist/react.js +223 -0
  214. package/dist/react.js.map +1 -0
  215. package/dist/runtime-globals.d.ts +63 -0
  216. package/dist/runtime-globals.js +3 -0
  217. package/dist/runtime-globals.js.map +1 -0
  218. package/dist/spring/animated.d.ts +27 -0
  219. package/dist/spring/animated.js +3 -0
  220. package/dist/spring/animated.js.map +1 -0
  221. package/dist/spring/index.d.ts +5 -0
  222. package/dist/spring/index.js +39 -0
  223. package/dist/spring/index.js.map +1 -0
  224. package/dist/spring/primitives.d.ts +3 -0
  225. package/dist/spring/primitives.js +5 -0
  226. package/dist/spring/primitives.js.map +1 -0
  227. package/dist/state.d.ts +6 -0
  228. package/dist/state.js +9 -0
  229. package/dist/state.js.map +1 -0
  230. package/dist/utils.d.ts +10 -0
  231. package/dist/utils.js +11 -0
  232. package/dist/utils.js.map +1 -0
  233. package/jsx-runtime.d.ts +1 -0
  234. package/package.json +46 -0
@@ -0,0 +1,154 @@
1
+ import React from 'react';
2
+ /**
3
+ * Context for page parameters
4
+ * Used to provide params to page components via React tree
5
+ */
6
+ export declare const PageParamsContext: React.Context<Record<string, any> | undefined>;
7
+ /**
8
+ * Context for overlay parameters
9
+ * Used to provide params to overlay components via React tree
10
+ */
11
+ export declare const OverlayParamsContext: React.Context<Record<string, any> | undefined>;
12
+ /**
13
+ * Placeholder for global navigation types.
14
+ * Projects can augment this interface to provide type safety for the global navigator.
15
+ * @example
16
+ * declare module './utils/navigation' {
17
+ * interface RootNavigatorList {
18
+ * pages: typeof myPages;
19
+ * overlays: typeof myOverlays;
20
+ * }
21
+ * }
22
+ */
23
+ export interface RootNavigatorList {
24
+ }
25
+ /**
26
+ * Type helper to register a navigator instance's types globally.
27
+ * Use this in a declare module block to get automatic type safety.
28
+ */
29
+ export type RegisterNavigator<T extends Navigator<any, any>> = {
30
+ pages: T extends Navigator<infer P, any> ? Record<P, any> : never;
31
+ overlays: T extends Navigator<any, infer O> ? Record<O, any> : never;
32
+ };
33
+ type GetPages<T> = T extends {
34
+ pages: infer P;
35
+ } ? (P extends Record<string, any> ? keyof P & string : string) : string;
36
+ type GetOverlays<T> = T extends {
37
+ overlays: infer O;
38
+ } ? O extends Record<string, any> ? keyof O & string : string : string;
39
+ export type DefaultPageName = GetPages<RootNavigatorList>;
40
+ export type DefaultOverlayName = GetOverlays<RootNavigatorList>;
41
+ export interface PageDescriptor {
42
+ component: React.ComponentType<any>;
43
+ options?: Record<string, any>;
44
+ requiredParams?: string[];
45
+ }
46
+ export interface OverlayDescriptor {
47
+ component: React.ComponentType<any>;
48
+ options?: Record<string, any>;
49
+ requiredParams?: string[];
50
+ }
51
+ export type PageConfig = PageDescriptor['component'] | PageDescriptor;
52
+ export type OverlayConfig = OverlayDescriptor['component'] | OverlayDescriptor;
53
+ export interface StackNavigatorOptions<Pages extends Record<string, PageConfig>, Overlays extends Record<string, OverlayConfig>> {
54
+ initialPage: keyof Pages & string;
55
+ pages: Pages;
56
+ overlays?: Overlays;
57
+ }
58
+ export interface Navigator<PageName extends string = DefaultPageName, OverlayName extends string = DefaultOverlayName> {
59
+ /**
60
+ * Navigate to a page
61
+ * @param page Page name
62
+ * @param params Parameters to pass to the page (optional)
63
+ */
64
+ navigate: (page: PageName, params?: Record<string, any>) => void;
65
+ /**
66
+ * Go back to the previous page (not implemented yet)
67
+ */
68
+ goBack: () => void;
69
+ /**
70
+ * Push an overlay to the overlay stack
71
+ * @param overlay Overlay name
72
+ * @param params Parameters to pass to the overlay (optional)
73
+ */
74
+ pushOverlay: (overlay: OverlayName, params?: Record<string, any>) => void;
75
+ /**
76
+ * Pop the top overlay from the stack
77
+ */
78
+ popOverlay: () => void;
79
+ /**
80
+ * Clear all overlays
81
+ */
82
+ clearOverlays: () => void;
83
+ /**
84
+ * Get current page name
85
+ */
86
+ getCurrentPage: () => PageName;
87
+ /**
88
+ * Get current page parameters
89
+ */
90
+ getParams: () => Record<string, any> | undefined;
91
+ /**
92
+ * Get overlay stack
93
+ */
94
+ getOverlayStack: () => OverlayInfo[];
95
+ /**
96
+ * Check if an overlay is active
97
+ * @param type Overlay type/name
98
+ */
99
+ isOverlayActive: (type: OverlayName) => boolean;
100
+ /** @internal */
101
+ _descriptors: {
102
+ pages: Record<string, PageDescriptor>;
103
+ overlays: Record<string, OverlayDescriptor>;
104
+ };
105
+ /** @internal */
106
+ _state: NavigationState;
107
+ }
108
+ export interface OverlayInfo {
109
+ type: string;
110
+ id: string;
111
+ }
112
+ interface NavigationState {
113
+ currentPage: string;
114
+ pageParams: Record<string, Record<string, any>>;
115
+ overlayStack: OverlayInfo[];
116
+ overlayParams: Record<string, Record<string, any>>;
117
+ }
118
+ /**
119
+ * Create a stack navigator
120
+ * @param options Navigator configuration
121
+ * @returns Navigator instance
122
+ */
123
+ export declare function createStackNavigator<Pages extends Record<string, PageConfig>, Overlays extends Record<string, OverlayConfig>>(options: StackNavigatorOptions<Pages, Overlays>): Navigator<keyof Pages & string, keyof Overlays & string>;
124
+ /**
125
+ * Create a navigation component for a navigator
126
+ * @param navigator The navigator instance
127
+ * @returns A React component that renders the navigation state
128
+ */
129
+ export declare function createStaticNavigation(navigator: Navigator<any, any>): React.FC;
130
+ /**
131
+ * Get the navigator instance (stable reference)
132
+ * Can be used in both components and state logic
133
+ * @returns Navigator object
134
+ */
135
+ export declare function getNavigator<PageName extends string = DefaultPageName, OverlayName extends string = DefaultOverlayName>(): Navigator<PageName, OverlayName>;
136
+ /**
137
+ * Hook to get the navigator instance in components
138
+ */
139
+ export declare const useNavigation: typeof getNavigator;
140
+ /**
141
+ * Get navigation parameters for current component
142
+ * @returns Parameters object (cast as T)
143
+ *
144
+ * This hook reads params from React Context, which is provided by the router.
145
+ * - If called from within an overlay context, returns overlay params
146
+ * - If called from within a page context, returns page params
147
+ * - Supports multiple nested overlays (each gets its own params)
148
+ *
149
+ * Note: We cast the result to T and provide an empty object as fallback.
150
+ * Since required parameters are validated at navigation entry points, we can
151
+ * safely assume the runtime object matches T.
152
+ */
153
+ export declare function useNavigationParams<T = Record<string, any>>(): T;
154
+ export {};
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.useNavigation = exports.OverlayParamsContext = exports.PageParamsContext = void 0;
37
+ exports.createStackNavigator = createStackNavigator;
38
+ exports.createStaticNavigation = createStaticNavigation;
39
+ exports.getNavigator = getNavigator;
40
+ exports.useNavigationParams = useNavigationParams;
41
+ const react_1 = __importStar(require("react"));
42
+ const valtio_1 = require("valtio");
43
+ // ============================================================================
44
+ // React Contexts for Parameters
45
+ // ============================================================================
46
+ /**
47
+ * Context for page parameters
48
+ * Used to provide params to page components via React tree
49
+ */
50
+ exports.PageParamsContext = (0, react_1.createContext)(undefined);
51
+ /**
52
+ * Context for overlay parameters
53
+ * Used to provide params to overlay components via React tree
54
+ */
55
+ exports.OverlayParamsContext = (0, react_1.createContext)(undefined);
56
+ // ============================================================================
57
+ // Helper Functions
58
+ // ============================================================================
59
+ let overlayIdCounter = 0;
60
+ const generateOverlayId = () => {
61
+ return `overlay-${++overlayIdCounter}-${Date.now()}`;
62
+ };
63
+ /**
64
+ * Validate navigation parameters against descriptor schema
65
+ */
66
+ function validateParams(type, name, descriptor, params) {
67
+ if (!descriptor?.requiredParams)
68
+ return;
69
+ const actualParams = params ?? {};
70
+ for (const key of descriptor.requiredParams) {
71
+ if (actualParams[key] === undefined) {
72
+ throw new Error(`Navigation Error: Missing required parameter "${key}" for ${type} "${name}". ` +
73
+ `Expected: { ${descriptor.requiredParams.join(', ')} }`);
74
+ }
75
+ }
76
+ }
77
+ // ============================================================================
78
+ // Global Navigation State and Navigator
79
+ // ============================================================================
80
+ let globalNavigator = null;
81
+ /**
82
+ * Normalize page/overlay config to descriptor format
83
+ * Allows shorthand syntax: Component or { component: Component, options?: {} }
84
+ */
85
+ function normalizeDescriptor(config) {
86
+ if (typeof config === 'function' || config.$$typeof) {
87
+ // It's a component (function or React element)
88
+ return { component: config };
89
+ }
90
+ // It's already a descriptor
91
+ return config;
92
+ }
93
+ /**
94
+ * Create a stack navigator
95
+ * @param options Navigator configuration
96
+ * @returns Navigator instance
97
+ */
98
+ function createStackNavigator(options) {
99
+ // Normalize pages and overlays
100
+ const normalizedPages = {};
101
+ for (const [key, config] of Object.entries(options.pages)) {
102
+ normalizedPages[key] = normalizeDescriptor(config);
103
+ }
104
+ const normalizedOverlays = {};
105
+ if (options.overlays) {
106
+ for (const [key, config] of Object.entries(options.overlays)) {
107
+ normalizedOverlays[key] = normalizeDescriptor(config);
108
+ }
109
+ }
110
+ // Initialize navigation state
111
+ const navigationState = (0, valtio_1.proxy)({
112
+ currentPage: options.initialPage,
113
+ pageParams: {},
114
+ overlayStack: [],
115
+ overlayParams: {},
116
+ });
117
+ // Create navigator API
118
+ const navigator = {
119
+ navigate: (page, params) => {
120
+ // Check if page exists
121
+ if (!normalizedPages[page]) {
122
+ console.error(`Navigation Error: Page "${page}" not found in navigator configuration.`);
123
+ return;
124
+ }
125
+ // Validate parameters
126
+ validateParams('page', page, normalizedPages[page], params);
127
+ navigationState.currentPage = page;
128
+ if (params !== undefined) {
129
+ navigationState.pageParams[page] = params;
130
+ }
131
+ else {
132
+ // Clear params if no params provided
133
+ delete navigationState.pageParams[page];
134
+ }
135
+ },
136
+ goBack: () => {
137
+ // TODO: Implement history stack
138
+ console.warn('goBack() not implemented yet');
139
+ },
140
+ pushOverlay: (overlay, params) => {
141
+ // Check if overlay exists
142
+ if (!normalizedOverlays[overlay]) {
143
+ console.error(`Navigation Error: Overlay "${overlay}" not found in navigator configuration.`);
144
+ return;
145
+ }
146
+ // Validate parameters
147
+ validateParams('overlay', overlay, normalizedOverlays[overlay], params);
148
+ const id = generateOverlayId();
149
+ const overlayInfo = { type: overlay, id };
150
+ navigationState.overlayStack.push(overlayInfo);
151
+ if (params !== undefined) {
152
+ navigationState.overlayParams[id] = params;
153
+ }
154
+ },
155
+ popOverlay: () => {
156
+ const overlay = navigationState.overlayStack.pop();
157
+ if (overlay) {
158
+ delete navigationState.overlayParams[overlay.id];
159
+ }
160
+ },
161
+ clearOverlays: () => {
162
+ // Clear all overlay params
163
+ for (const overlay of navigationState.overlayStack) {
164
+ delete navigationState.overlayParams[overlay.id];
165
+ }
166
+ // Clear stack
167
+ navigationState.overlayStack = [];
168
+ },
169
+ getCurrentPage: () => {
170
+ return navigationState.currentPage;
171
+ },
172
+ getParams: () => {
173
+ return navigationState.pageParams[navigationState.currentPage];
174
+ },
175
+ getOverlayStack: () => {
176
+ return [...navigationState.overlayStack];
177
+ },
178
+ isOverlayActive: (type) => {
179
+ return navigationState.overlayStack.some((overlay) => overlay.type === type);
180
+ },
181
+ _descriptors: {
182
+ pages: normalizedPages,
183
+ overlays: normalizedOverlays,
184
+ },
185
+ _state: navigationState,
186
+ };
187
+ // Store as global navigator
188
+ globalNavigator = navigator;
189
+ return navigator;
190
+ }
191
+ /**
192
+ * Create a navigation component for a navigator
193
+ * @param navigator The navigator instance
194
+ * @returns A React component that renders the navigation state
195
+ */
196
+ function createStaticNavigation(navigator) {
197
+ return () => {
198
+ // navigator._state is a Valtio proxy, useSnapshot makes it reactive
199
+ const navState = (0, valtio_1.useSnapshot)(navigator._state);
200
+ const { pages, overlays } = navigator._descriptors;
201
+ // Get current page component
202
+ const pageDescriptor = pages[navState.currentPage];
203
+ const Page = pageDescriptor?.component || (() => null);
204
+ return (react_1.default.createElement(react_1.default.Fragment, null,
205
+ react_1.default.createElement(exports.PageParamsContext.Provider, { value: navState.pageParams[navState.currentPage] },
206
+ react_1.default.createElement(Page, null)),
207
+ navState.overlayStack.map((overlay) => {
208
+ const overlayDescriptor = overlays[overlay.type];
209
+ const OverlayComponent = overlayDescriptor?.component || (() => null);
210
+ return (react_1.default.createElement(exports.OverlayParamsContext.Provider, { key: overlay.id, value: navState.overlayParams[overlay.id] },
211
+ react_1.default.createElement(OverlayComponent, null)));
212
+ })));
213
+ };
214
+ }
215
+ // ============================================================================
216
+ // React Hooks
217
+ // ============================================================================
218
+ /**
219
+ * Get the navigator instance (stable reference)
220
+ * Can be used in both components and state logic
221
+ * @returns Navigator object
222
+ */
223
+ function getNavigator() {
224
+ if (!globalNavigator) {
225
+ throw new Error('Navigator not initialized. Call createStackNavigator first.');
226
+ }
227
+ return globalNavigator;
228
+ }
229
+ /**
230
+ * Hook to get the navigator instance in components
231
+ */
232
+ exports.useNavigation = getNavigator;
233
+ /**
234
+ * Get navigation parameters for current component
235
+ * @returns Parameters object (cast as T)
236
+ *
237
+ * This hook reads params from React Context, which is provided by the router.
238
+ * - If called from within an overlay context, returns overlay params
239
+ * - If called from within a page context, returns page params
240
+ * - Supports multiple nested overlays (each gets its own params)
241
+ *
242
+ * Note: We cast the result to T and provide an empty object as fallback.
243
+ * Since required parameters are validated at navigation entry points, we can
244
+ * safely assume the runtime object matches T.
245
+ */
246
+ function useNavigationParams() {
247
+ const overlayParams = (0, react_1.useContext)(exports.OverlayParamsContext);
248
+ const pageParams = (0, react_1.useContext)(exports.PageParamsContext);
249
+ // If in overlay context, return overlay params; otherwise return page params
250
+ // Default to empty object if both are undefined
251
+ return (overlayParams ?? pageParams ?? {});
252
+ }
253
+ //# sourceMappingURL=navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/components/navigation.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoNA,oDAiHC;AAOD,wDA4BC;AAWD,oCAQC;AAoBD,kDAOC;AAtZD,+CAAyD;AACzD,mCAA4C;AAE5C,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAE/E;;;GAGG;AACU,QAAA,iBAAiB,GAAG,IAAA,qBAAa,EAAkC,SAAS,CAAC,CAAC;AAE3F;;;GAGG;AACU,QAAA,oBAAoB,GAAG,IAAA,qBAAa,EAAkC,SAAS,CAAC,CAAC;AA4I9F,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,IAAI,gBAAgB,GAAG,CAAC,CAAC;AACzB,MAAM,iBAAiB,GAAG,GAAW,EAAE;IACrC,OAAO,WAAW,EAAE,gBAAgB,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AACvD,CAAC,CAAC;AAEF;;GAEG;AACH,SAAS,cAAc,CACrB,IAAwB,EACxB,IAAY,EACZ,UAA0D,EAC1D,MAAuC;IAEvC,IAAI,CAAC,UAAU,EAAE,cAAc;QAAE,OAAO;IAExC,MAAM,YAAY,GAAG,MAAM,IAAI,EAAE,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;QAC5C,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,iDAAiD,GAAG,SAAS,IAAI,KAAK,IAAI,KAAK;gBAC7E,eAAe,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,wCAAwC;AACxC,+EAA+E;AAE/E,IAAI,eAAe,GAA+B,IAAI,CAAC;AAEvD;;;GAGG;AACH,SAAS,mBAAmB,CAA+C,MAAoC;IAC7G,IAAI,OAAO,MAAM,KAAK,UAAU,IAAK,MAAc,CAAC,QAAQ,EAAE,CAAC;QAC7D,+CAA+C;QAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,EAAO,CAAC;IACpC,CAAC;IACD,4BAA4B;IAC5B,OAAO,MAAW,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,SAAgB,oBAAoB,CAGlC,OAA+C;IAC/C,+BAA+B;IAC/B,MAAM,eAAe,GAAmC,EAAE,CAAC;IAC3D,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,eAAe,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,kBAAkB,GAAsC,EAAE,CAAC;IACjE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7D,kBAAkB,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,MAAM,eAAe,GAAG,IAAA,cAAK,EAAkB;QAC7C,WAAW,EAAE,OAAO,CAAC,WAAqB;QAC1C,UAAU,EAAE,EAAE;QACd,YAAY,EAAE,EAAE;QAChB,aAAa,EAAE,EAAE;KAClB,CAAC,CAAC;IAEH,uBAAuB;IACvB,MAAM,SAAS,GAA6D;QAC1E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACzB,uBAAuB;YACvB,IAAI,CAAC,eAAe,CAAC,IAAc,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,KAAK,CAAC,2BAA2B,IAAI,yCAAyC,CAAC,CAAC;gBACxF,OAAO;YACT,CAAC;YAED,sBAAsB;YACtB,cAAc,CAAC,MAAM,EAAE,IAAc,EAAE,eAAe,CAAC,IAAc,CAAC,EAAE,MAAM,CAAC,CAAC;YAEhF,eAAe,CAAC,WAAW,GAAG,IAAc,CAAC;YAC7C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,eAAe,CAAC,UAAU,CAAC,IAAc,CAAC,GAAG,MAAM,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,qCAAqC;gBACrC,OAAO,eAAe,CAAC,UAAU,CAAC,IAAc,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,MAAM,EAAE,GAAG,EAAE;YACX,gCAAgC;YAChC,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC/C,CAAC;QAED,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/B,0BAA0B;YAC1B,IAAI,CAAC,kBAAkB,CAAC,OAAiB,CAAC,EAAE,CAAC;gBAC3C,OAAO,CAAC,KAAK,CAAC,8BAA8B,OAAO,yCAAyC,CAAC,CAAC;gBAC9F,OAAO;YACT,CAAC;YAED,sBAAsB;YACtB,cAAc,CAAC,SAAS,EAAE,OAAiB,EAAE,kBAAkB,CAAC,OAAiB,CAAC,EAAE,MAAM,CAAC,CAAC;YAE5F,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAgB,EAAE,IAAI,EAAE,OAAiB,EAAE,EAAE,EAAE,CAAC;YACjE,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAE/C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,UAAU,EAAE,GAAG,EAAE;YACf,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;YACnD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,aAAa,EAAE,GAAG,EAAE;YAClB,2BAA2B;YAC3B,KAAK,MAAM,OAAO,IAAI,eAAe,CAAC,YAAY,EAAE,CAAC;gBACnD,OAAO,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,cAAc;YACd,eAAe,CAAC,YAAY,GAAG,EAAE,CAAC;QACpC,CAAC;QAED,cAAc,EAAE,GAAG,EAAE;YACnB,OAAO,eAAe,CAAC,WAAmC,CAAC;QAC7D,CAAC;QAED,SAAS,EAAE,GAAG,EAAE;YACd,OAAO,eAAe,CAAC,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACjE,CAAC;QAED,eAAe,EAAE,GAAG,EAAE;YACpB,OAAO,CAAC,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;QAC3C,CAAC;QAED,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,OAAO,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAM,IAAe,CAAC,CAAC;QAC3F,CAAC;QAED,YAAY,EAAE;YACZ,KAAK,EAAE,eAAe;YACtB,QAAQ,EAAE,kBAAkB;SAC7B;QACD,MAAM,EAAE,eAAe;KACxB,CAAC;IAEF,4BAA4B;IAC5B,eAAe,GAAG,SAAS,CAAC;IAE5B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,SAA8B;IACnE,OAAO,GAAG,EAAE;QACV,oEAAoE;QACpE,MAAM,QAAQ,GAAG,IAAA,oBAAW,EAAC,SAAS,CAAC,MAAa,CAAoB,CAAC;QACzE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,YAAY,CAAC;QAEnD,6BAA6B;QAC7B,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,cAAc,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAEvD,OAAO,CACL;YACE,8BAAC,yBAAiB,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAC1E,8BAAC,IAAI,OAAG,CACmB;YAE5B,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBACrC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACjD,MAAM,gBAAgB,GAAG,iBAAiB,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBACtE,OAAO,CACL,8BAAC,4BAAoB,CAAC,QAAQ,IAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvF,8BAAC,gBAAgB,OAAG,CACU,CACjC,CAAC;YACJ,CAAC,CAAC,CACD,CACJ,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E;;;;GAIG;AACH,SAAgB,YAAY;IAI1B,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,eAA8D,CAAC;AACxE,CAAC;AAED;;GAEG;AACU,QAAA,aAAa,GAAG,YAAY,CAAC;AAE1C;;;;;;;;;;;;GAYG;AACH,SAAgB,mBAAmB;IACjC,MAAM,aAAa,GAAG,IAAA,kBAAU,EAAC,4BAAoB,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,IAAA,kBAAU,EAAC,yBAAiB,CAAC,CAAC;IAEjD,6EAA6E;IAC7E,gDAAgD;IAChD,OAAO,CAAC,aAAa,IAAI,UAAU,IAAI,EAAE,CAAM,CAAC;AAClD,CAAC"}
@@ -0,0 +1,74 @@
1
+ import type { ClassAttributes, ReactNode } from 'react';
2
+ import type { Node } from './node';
3
+ import type { BubbleEvent } from './events/base';
4
+ import type { MouseEvent } from './events/mouse';
5
+ import type { TouchEvent } from './events/touch';
6
+ import type { KeyboardEvent } from './events/keyboard';
7
+ import { NodeProps } from './bindings/NodeProps';
8
+ import { ClipProps } from './bindings/ClipProps';
9
+ import { FilterProps } from './bindings/FilterProps';
10
+ import { BackdropProps } from './bindings/BackdropProps';
11
+ import { SpriteProps } from './bindings/SpriteProps';
12
+ import { TextProps } from './bindings/TextProps';
13
+ import { AnimationProps } from './bindings/AnimationProps';
14
+ export type Tuple2 = [number, number];
15
+ export type Tuple3 = [number, number, number];
16
+ export type Tuple4 = [number, number, number, number];
17
+ export type DetailedMoyuProps<E extends MoyuNodeAttributes> = ClassAttributes<Node> & E;
18
+ export type MoyuEventHandler<T extends BubbleEvent> = (event: T) => void;
19
+ export interface MoyuListenerAttributes {
20
+ onClick?: MoyuEventHandler<MouseEvent>;
21
+ onMouseEnter?: MoyuEventHandler<MouseEvent>;
22
+ onMouseLeave?: MoyuEventHandler<MouseEvent>;
23
+ onMouseDown?: MoyuEventHandler<MouseEvent>;
24
+ onMouseUp?: MoyuEventHandler<MouseEvent>;
25
+ onMouseMove?: MoyuEventHandler<MouseEvent>;
26
+ onKeyDown?: MoyuEventHandler<KeyboardEvent>;
27
+ onKeyUp?: MoyuEventHandler<KeyboardEvent>;
28
+ onKeyPress?: MoyuEventHandler<KeyboardEvent>;
29
+ onTouchStart?: MoyuEventHandler<TouchEvent>;
30
+ onTouchMove?: MoyuEventHandler<TouchEvent>;
31
+ onTouchEnd?: MoyuEventHandler<TouchEvent>;
32
+ onTouchCancel?: MoyuEventHandler<TouchEvent>;
33
+ }
34
+ export type MoyuNodeAttributes = MoyuListenerAttributes & NodeProps & {
35
+ children?: ReactNode;
36
+ };
37
+ export type MoyuContainerAttributes = MoyuNodeAttributes;
38
+ export type MoyuClipAttributes = ClipProps & MoyuNodeAttributes;
39
+ export type MoyuFilterAttributes = FilterProps & MoyuNodeAttributes;
40
+ export type MoyuBackdropAttributes = BackdropProps & MoyuNodeAttributes;
41
+ export type MoyuAnimationAttributes = AnimationProps & MoyuNodeAttributes;
42
+ export type MoyuSpriteAttributes = SpriteProps & MoyuNodeAttributes;
43
+ export type MoyuTextAttributes = TextProps & MoyuNodeAttributes & {
44
+ onStart?: () => void;
45
+ onFinish?: () => void;
46
+ onProgress?: (progress: number) => void;
47
+ };
48
+ export declare namespace JSX {
49
+ type ElementType = string | React.JSXElementConstructor<any>;
50
+ interface Element extends React.ReactElement<any, any> {
51
+ }
52
+ interface ElementClass extends React.Component<any> {
53
+ render(): React.ReactNode;
54
+ }
55
+ interface ElementAttributesProperty {
56
+ props: {};
57
+ }
58
+ interface ElementChildrenAttribute {
59
+ children: {};
60
+ }
61
+ interface IntrinsicAttributes extends React.Attributes {
62
+ }
63
+ interface IntrinsicClassAttributes<T> extends React.ClassAttributes<T> {
64
+ }
65
+ interface IntrinsicElements {
66
+ container: DetailedMoyuProps<MoyuContainerAttributes>;
67
+ sprite: DetailedMoyuProps<MoyuSpriteAttributes>;
68
+ text: DetailedMoyuProps<MoyuTextAttributes>;
69
+ clip: DetailedMoyuProps<MoyuClipAttributes>;
70
+ filter: DetailedMoyuProps<MoyuFilterAttributes>;
71
+ backdrop: DetailedMoyuProps<MoyuBackdropAttributes>;
72
+ animation: DetailedMoyuProps<MoyuAnimationAttributes>;
73
+ }
74
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=declaration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"declaration.js","sourceRoot":"","sources":["../src/declaration.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ export interface MoyuEvent<T extends Record<string, unknown> = Record<string, unknown>> {
2
+ name: string;
3
+ body: T;
4
+ }
5
+ export interface BubbleEvent {
6
+ targetId: number;
7
+ bubbleTargetIds: number[];
8
+ currentTargetId: number;
9
+ stopPropagation: () => void;
10
+ preventDefault: () => void;
11
+ defaultPrevented: boolean;
12
+ bubbles: boolean;
13
+ }
14
+ export declare function createBubbleEvent<T extends BubbleEvent>(body: Record<string, any> & {
15
+ bubbleTargetIds: number[];
16
+ }, targetId: number): T;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBubbleEvent = createBubbleEvent;
4
+ function createBubbleEvent(body, targetId) {
5
+ const event = {
6
+ ...body,
7
+ targetId,
8
+ currentTargetId: targetId,
9
+ stopPropagation: () => {
10
+ event.bubbles = false;
11
+ },
12
+ preventDefault: () => {
13
+ event.defaultPrevented = true;
14
+ },
15
+ defaultPrevented: false,
16
+ bubbles: true,
17
+ };
18
+ return event;
19
+ }
20
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/events/base.ts"],"names":[],"mappings":";;AAeA,8CAmBC;AAnBD,SAAgB,iBAAiB,CAC/B,IAAyD,EACzD,QAAgB;IAEhB,MAAM,KAAK,GAAgB;QACzB,GAAG,IAAI;QACP,QAAQ;QACR,eAAe,EAAE,QAAQ;QACzB,eAAe,EAAE,GAAG,EAAE;YACpB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QACxB,CAAC;QACD,cAAc,EAAE,GAAG,EAAE;YACnB,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAChC,CAAC;QACD,gBAAgB,EAAE,KAAK;QACvB,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,OAAO,KAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const globalEventListeners: Record<string, ((event: any) => void)[]>;
2
+ export declare const globalRequestAnimationFrameListeners: FrameRequestCallback[];
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.globalRequestAnimationFrameListeners = exports.globalEventListeners = void 0;
4
+ const state_1 = require("../state");
5
+ const base_1 = require("./base");
6
+ exports.globalEventListeners = {};
7
+ exports.globalRequestAnimationFrameListeners = [];
8
+ const BUBBLE_EVENT_NAMES = ['mouseevent', 'touchevent', 'keyboardevent'];
9
+ globalThis.__moyu_receive_event = (raw_event) => {
10
+ const { name, body } = raw_event;
11
+ if (BUBBLE_EVENT_NAMES.includes(name)) {
12
+ handleBubbleEvent(name, body);
13
+ }
14
+ else {
15
+ // handles non-dom events and return
16
+ switch (name) {
17
+ case 'customevent': {
18
+ const { name, body: _body, targetId } = body;
19
+ // if targetId is 0, it is a global event (send to root node or send from plugin)
20
+ if (targetId === 0) {
21
+ for (const listener of exports.globalEventListeners[name.toLowerCase()] ?? []) {
22
+ listener(_body);
23
+ }
24
+ return;
25
+ }
26
+ state_1.STATE.nodeMap[targetId]?.listeners?.[`on${name.charAt(0).toUpperCase() + name.slice(1)}`]?.(_body);
27
+ return;
28
+ }
29
+ case 'nodeevent': {
30
+ const { kind, targetId } = body;
31
+ if (kind === 'Destory') {
32
+ delete state_1.STATE.nodeMap[targetId];
33
+ }
34
+ return;
35
+ }
36
+ case 'animationframecallbackevent': {
37
+ const listeners = exports.globalRequestAnimationFrameListeners.splice(0);
38
+ const { timestamp } = body;
39
+ for (const listener of listeners) {
40
+ listener?.(timestamp);
41
+ }
42
+ return;
43
+ }
44
+ default: {
45
+ exports.globalEventListeners[name]?.forEach((listener) => listener(body));
46
+ return;
47
+ }
48
+ }
49
+ }
50
+ };
51
+ function handleBubbleEvent(name, body) {
52
+ const event = (0, base_1.createBubbleEvent)(body, body.targetId);
53
+ const { kind, bubbleTargetIds } = body;
54
+ // if targetId is 0, it is a global event (send to root node or send from plugin)
55
+ if (body.targetId !== 0) {
56
+ const node = state_1.STATE.nodeMap[body.targetId];
57
+ if (!node) {
58
+ return;
59
+ }
60
+ if (['mouseevent', 'keyboardevent'].includes(name)) {
61
+ node?.listeners?.[`on${kind}`]?.(event);
62
+ while (event.bubbles && bubbleTargetIds.length) {
63
+ // biome-ignore lint/style/noNonNullAssertion: we are sure that the array is not empty, it is a bug of biomejs
64
+ event.currentTargetId = bubbleTargetIds.pop();
65
+ event.currentTargetLabel = state_1.STATE.nodeMap[event.currentTargetId]?.label;
66
+ state_1.STATE.nodeMap[event.currentTargetId]?.listeners?.[`on${kind}`]?.(event);
67
+ }
68
+ }
69
+ else if (name === 'touchevent') {
70
+ const { identifier } = body;
71
+ event.identifier = identifier;
72
+ node?.listeners?.[`on${kind}`]?.(event);
73
+ {
74
+ const _bubbleTargetIds = [...bubbleTargetIds];
75
+ while (event.bubbles && _bubbleTargetIds.length) {
76
+ // biome-ignore lint/style/noNonNullAssertion: we are sure that the array is not empty, it is a bug of biomejs
77
+ event.currentTargetId = _bubbleTargetIds.pop();
78
+ event.currentTargetLabel = state_1.STATE.nodeMap[event.currentTargetId]?.label;
79
+ state_1.STATE.nodeMap[event.currentTargetId]?.listeners?.[`on${kind}`]?.(event);
80
+ }
81
+ }
82
+ // simulate mouse events as same as browsers
83
+ // if (kind === TouchEventKind.TouchEnd && !STATE.touchMoved[identifier] && !event.defaultPrevented) {
84
+ // for (const eventKind of ['MouseMove', 'MouseDown', 'MouseUp', 'Click'] as MouseEventKind[]) {
85
+ // event.bubbles = true;
86
+ // event.kind = eventKind;
87
+ // node?.listeners?.[`on${eventKind}`]?.(event);
88
+ // const _bubbleTargetIds = [...bubbleTargetIds];
89
+ // while (event.bubbles && _bubbleTargetIds.length) {
90
+ // // biome-ignore lint/style/noNonNullAssertion: we are sure that the array is not empty, it is a bug of biomejs
91
+ // event.currentTargetId = _bubbleTargetIds.pop()!;
92
+ // event.currentTargetLabel = STATE.nodeMap[event.currentTargetId]?.label;
93
+ // STATE.nodeMap[event.currentTargetId]?.listeners?.[`on${eventKind}`]?.(event);
94
+ // }
95
+ // }
96
+ // }
97
+ if (kind === 'TouchStart') {
98
+ state_1.STATE.touchMoved[identifier] = false;
99
+ }
100
+ else if (kind === 'TouchMove') {
101
+ state_1.STATE.touchMoved[identifier] = true;
102
+ }
103
+ else if (kind === 'TouchEnd' || kind === 'TouchCancel') {
104
+ delete state_1.STATE.touchMoved[identifier];
105
+ }
106
+ }
107
+ }
108
+ if (event.bubbles) {
109
+ for (const listener of exports.globalEventListeners[kind.toLowerCase()] ?? []) {
110
+ listener(event);
111
+ }
112
+ }
113
+ }
114
+ if (globalThis.__moyu_native) {
115
+ // detect if it is running in browser, if not, polyfill requestAnimationFrame
116
+ globalThis.requestAnimationFrame = (callback) => {
117
+ return exports.globalRequestAnimationFrameListeners.push(callback) - 1;
118
+ };
119
+ globalThis.cancelAnimationFrame = (handle) => {
120
+ exports.globalRequestAnimationFrameListeners.splice(handle, 1);
121
+ };
122
+ }
123
+ //# sourceMappingURL=globals.js.map