mythik-react 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 (244) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +4 -0
  3. package/README.md +83 -0
  4. package/dist/MythikApp.d.ts +61 -0
  5. package/dist/MythikApp.d.ts.map +1 -0
  6. package/dist/MythikApp.js +381 -0
  7. package/dist/MythikApp.js.map +1 -0
  8. package/dist/MythikRenderer.d.ts +31 -0
  9. package/dist/MythikRenderer.d.ts.map +1 -0
  10. package/dist/MythikRenderer.js +900 -0
  11. package/dist/MythikRenderer.js.map +1 -0
  12. package/dist/animation/index.d.ts +7 -0
  13. package/dist/animation/index.d.ts.map +1 -0
  14. package/dist/animation/index.js +5 -0
  15. package/dist/animation/index.js.map +1 -0
  16. package/dist/animation/stylesheet-singleton.d.ts +12 -0
  17. package/dist/animation/stylesheet-singleton.d.ts.map +1 -0
  18. package/dist/animation/stylesheet-singleton.js +107 -0
  19. package/dist/animation/stylesheet-singleton.js.map +1 -0
  20. package/dist/animation/useElementAnimations.d.ts +30 -0
  21. package/dist/animation/useElementAnimations.d.ts.map +1 -0
  22. package/dist/animation/useElementAnimations.js +254 -0
  23. package/dist/animation/useElementAnimations.js.map +1 -0
  24. package/dist/animation/usePrefersReducedMotion.d.ts +2 -0
  25. package/dist/animation/usePrefersReducedMotion.d.ts.map +1 -0
  26. package/dist/animation/usePrefersReducedMotion.js +29 -0
  27. package/dist/animation/usePrefersReducedMotion.js.map +1 -0
  28. package/dist/animation/useShapeAnimations.d.ts +21 -0
  29. package/dist/animation/useShapeAnimations.d.ts.map +1 -0
  30. package/dist/animation/useShapeAnimations.js +119 -0
  31. package/dist/animation/useShapeAnimations.js.map +1 -0
  32. package/dist/app-context.d.ts +15 -0
  33. package/dist/app-context.d.ts.map +1 -0
  34. package/dist/app-context.js +9 -0
  35. package/dist/app-context.js.map +1 -0
  36. package/dist/background/BackgroundLayer.d.ts +7 -0
  37. package/dist/background/BackgroundLayer.d.ts.map +1 -0
  38. package/dist/background/BackgroundLayer.js +50 -0
  39. package/dist/background/BackgroundLayer.js.map +1 -0
  40. package/dist/background/BackgroundStack.d.ts +19 -0
  41. package/dist/background/BackgroundStack.d.ts.map +1 -0
  42. package/dist/background/BackgroundStack.js +59 -0
  43. package/dist/background/BackgroundStack.js.map +1 -0
  44. package/dist/background/BlobLayer.d.ts +12 -0
  45. package/dist/background/BlobLayer.d.ts.map +1 -0
  46. package/dist/background/BlobLayer.js +60 -0
  47. package/dist/background/BlobLayer.js.map +1 -0
  48. package/dist/background/index.d.ts +3 -0
  49. package/dist/background/index.d.ts.map +1 -0
  50. package/dist/background/index.js +3 -0
  51. package/dist/background/index.js.map +1 -0
  52. package/dist/css-hover.d.ts +15 -0
  53. package/dist/css-hover.d.ts.map +1 -0
  54. package/dist/css-hover.js +51 -0
  55. package/dist/css-hover.js.map +1 -0
  56. package/dist/index.d.ts +10 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +11 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/primitives/accordion.d.ts +12 -0
  61. package/dist/primitives/accordion.d.ts.map +1 -0
  62. package/dist/primitives/accordion.js +25 -0
  63. package/dist/primitives/accordion.js.map +1 -0
  64. package/dist/primitives/area-chart.d.ts +14 -0
  65. package/dist/primitives/area-chart.d.ts.map +1 -0
  66. package/dist/primitives/area-chart.js +18 -0
  67. package/dist/primitives/area-chart.js.map +1 -0
  68. package/dist/primitives/audio-player.d.ts +9 -0
  69. package/dist/primitives/audio-player.d.ts.map +1 -0
  70. package/dist/primitives/audio-player.js +5 -0
  71. package/dist/primitives/audio-player.js.map +1 -0
  72. package/dist/primitives/bar-chart.d.ts +14 -0
  73. package/dist/primitives/bar-chart.d.ts.map +1 -0
  74. package/dist/primitives/bar-chart.js +22 -0
  75. package/dist/primitives/bar-chart.js.map +1 -0
  76. package/dist/primitives/box.d.ts +21 -0
  77. package/dist/primitives/box.d.ts.map +1 -0
  78. package/dist/primitives/box.js +54 -0
  79. package/dist/primitives/box.js.map +1 -0
  80. package/dist/primitives/button.d.ts +14 -0
  81. package/dist/primitives/button.d.ts.map +1 -0
  82. package/dist/primitives/button.js +28 -0
  83. package/dist/primitives/button.js.map +1 -0
  84. package/dist/primitives/camera.d.ts +15 -0
  85. package/dist/primitives/camera.d.ts.map +1 -0
  86. package/dist/primitives/camera.js +25 -0
  87. package/dist/primitives/camera.js.map +1 -0
  88. package/dist/primitives/checkbox.d.ts +12 -0
  89. package/dist/primitives/checkbox.d.ts.map +1 -0
  90. package/dist/primitives/checkbox.js +24 -0
  91. package/dist/primitives/checkbox.js.map +1 -0
  92. package/dist/primitives/divider.d.ts +9 -0
  93. package/dist/primitives/divider.d.ts.map +1 -0
  94. package/dist/primitives/divider.js +10 -0
  95. package/dist/primitives/divider.js.map +1 -0
  96. package/dist/primitives/drawer.d.ts +21 -0
  97. package/dist/primitives/drawer.d.ts.map +1 -0
  98. package/dist/primitives/drawer.js +38 -0
  99. package/dist/primitives/drawer.js.map +1 -0
  100. package/dist/primitives/file-upload.d.ts +27 -0
  101. package/dist/primitives/file-upload.d.ts.map +1 -0
  102. package/dist/primitives/file-upload.js +225 -0
  103. package/dist/primitives/file-upload.js.map +1 -0
  104. package/dist/primitives/grid.d.ts +13 -0
  105. package/dist/primitives/grid.d.ts.map +1 -0
  106. package/dist/primitives/grid.js +13 -0
  107. package/dist/primitives/grid.js.map +1 -0
  108. package/dist/primitives/icon.d.ts +22 -0
  109. package/dist/primitives/icon.d.ts.map +1 -0
  110. package/dist/primitives/icon.js +52 -0
  111. package/dist/primitives/icon.js.map +1 -0
  112. package/dist/primitives/image.d.ts +13 -0
  113. package/dist/primitives/image.d.ts.map +1 -0
  114. package/dist/primitives/image.js +38 -0
  115. package/dist/primitives/image.js.map +1 -0
  116. package/dist/primitives/index.d.ts +57 -0
  117. package/dist/primitives/index.d.ts.map +1 -0
  118. package/dist/primitives/index.js +106 -0
  119. package/dist/primitives/index.js.map +1 -0
  120. package/dist/primitives/input.d.ts +32 -0
  121. package/dist/primitives/input.d.ts.map +1 -0
  122. package/dist/primitives/input.js +192 -0
  123. package/dist/primitives/input.js.map +1 -0
  124. package/dist/primitives/kanban-board.d.ts +13 -0
  125. package/dist/primitives/kanban-board.d.ts.map +1 -0
  126. package/dist/primitives/kanban-board.js +5 -0
  127. package/dist/primitives/kanban-board.js.map +1 -0
  128. package/dist/primitives/line-chart.d.ts +14 -0
  129. package/dist/primitives/line-chart.d.ts.map +1 -0
  130. package/dist/primitives/line-chart.js +17 -0
  131. package/dist/primitives/line-chart.js.map +1 -0
  132. package/dist/primitives/list.d.ts +13 -0
  133. package/dist/primitives/list.d.ts.map +1 -0
  134. package/dist/primitives/list.js +10 -0
  135. package/dist/primitives/list.js.map +1 -0
  136. package/dist/primitives/modal.d.ts +20 -0
  137. package/dist/primitives/modal.d.ts.map +1 -0
  138. package/dist/primitives/modal.js +60 -0
  139. package/dist/primitives/modal.js.map +1 -0
  140. package/dist/primitives/pie-chart.d.ts +15 -0
  141. package/dist/primitives/pie-chart.d.ts.map +1 -0
  142. package/dist/primitives/pie-chart.js +36 -0
  143. package/dist/primitives/pie-chart.js.map +1 -0
  144. package/dist/primitives/screen-outlet.d.ts +9 -0
  145. package/dist/primitives/screen-outlet.d.ts.map +1 -0
  146. package/dist/primitives/screen-outlet.js +92 -0
  147. package/dist/primitives/screen-outlet.js.map +1 -0
  148. package/dist/primitives/screen.d.ts +9 -0
  149. package/dist/primitives/screen.d.ts.map +1 -0
  150. package/dist/primitives/screen.js +10 -0
  151. package/dist/primitives/screen.js.map +1 -0
  152. package/dist/primitives/scroll.d.ts +11 -0
  153. package/dist/primitives/scroll.d.ts.map +1 -0
  154. package/dist/primitives/scroll.js +10 -0
  155. package/dist/primitives/scroll.js.map +1 -0
  156. package/dist/primitives/select.d.ts +19 -0
  157. package/dist/primitives/select.d.ts.map +1 -0
  158. package/dist/primitives/select.js +109 -0
  159. package/dist/primitives/select.js.map +1 -0
  160. package/dist/primitives/signature.d.ts +13 -0
  161. package/dist/primitives/signature.d.ts.map +1 -0
  162. package/dist/primitives/signature.js +45 -0
  163. package/dist/primitives/signature.js.map +1 -0
  164. package/dist/primitives/skeleton.d.ts +14 -0
  165. package/dist/primitives/skeleton.d.ts.map +1 -0
  166. package/dist/primitives/skeleton.js +41 -0
  167. package/dist/primitives/skeleton.js.map +1 -0
  168. package/dist/primitives/slider.d.ts +15 -0
  169. package/dist/primitives/slider.d.ts.map +1 -0
  170. package/dist/primitives/slider.js +7 -0
  171. package/dist/primitives/slider.js.map +1 -0
  172. package/dist/primitives/spacer.d.ts +9 -0
  173. package/dist/primitives/spacer.d.ts.map +1 -0
  174. package/dist/primitives/spacer.js +9 -0
  175. package/dist/primitives/spacer.js.map +1 -0
  176. package/dist/primitives/spatial-map-editing.d.ts +472 -0
  177. package/dist/primitives/spatial-map-editing.d.ts.map +1 -0
  178. package/dist/primitives/spatial-map-editing.js +886 -0
  179. package/dist/primitives/spatial-map-editing.js.map +1 -0
  180. package/dist/primitives/spatial-map.d.ts +1073 -0
  181. package/dist/primitives/spatial-map.d.ts.map +1 -0
  182. package/dist/primitives/spatial-map.js +1705 -0
  183. package/dist/primitives/spatial-map.js.map +1 -0
  184. package/dist/primitives/stack.d.ts +13 -0
  185. package/dist/primitives/stack.d.ts.map +1 -0
  186. package/dist/primitives/stack.js +12 -0
  187. package/dist/primitives/stack.js.map +1 -0
  188. package/dist/primitives/table.d.ts +115 -0
  189. package/dist/primitives/table.d.ts.map +1 -0
  190. package/dist/primitives/table.js +498 -0
  191. package/dist/primitives/table.js.map +1 -0
  192. package/dist/primitives/tabs.d.ts +17 -0
  193. package/dist/primitives/tabs.d.ts.map +1 -0
  194. package/dist/primitives/tabs.js +13 -0
  195. package/dist/primitives/tabs.js.map +1 -0
  196. package/dist/primitives/text.d.ts +11 -0
  197. package/dist/primitives/text.d.ts.map +1 -0
  198. package/dist/primitives/text.js +69 -0
  199. package/dist/primitives/text.js.map +1 -0
  200. package/dist/primitives/textarea.d.ts +15 -0
  201. package/dist/primitives/textarea.d.ts.map +1 -0
  202. package/dist/primitives/textarea.js +23 -0
  203. package/dist/primitives/textarea.js.map +1 -0
  204. package/dist/primitives/toast-container.d.ts +15 -0
  205. package/dist/primitives/toast-container.d.ts.map +1 -0
  206. package/dist/primitives/toast-container.js +160 -0
  207. package/dist/primitives/toast-container.js.map +1 -0
  208. package/dist/primitives/toggle.d.ts +12 -0
  209. package/dist/primitives/toggle.d.ts.map +1 -0
  210. package/dist/primitives/toggle.js +18 -0
  211. package/dist/primitives/toggle.js.map +1 -0
  212. package/dist/primitives/touchable.d.ts +10 -0
  213. package/dist/primitives/touchable.d.ts.map +1 -0
  214. package/dist/primitives/touchable.js +6 -0
  215. package/dist/primitives/touchable.js.map +1 -0
  216. package/dist/primitives/use-design-tokens.d.ts +127 -0
  217. package/dist/primitives/use-design-tokens.d.ts.map +1 -0
  218. package/dist/primitives/use-design-tokens.js +251 -0
  219. package/dist/primitives/use-design-tokens.js.map +1 -0
  220. package/dist/primitives/use-theme.d.ts +11 -0
  221. package/dist/primitives/use-theme.d.ts.map +1 -0
  222. package/dist/primitives/use-theme.js +17 -0
  223. package/dist/primitives/use-theme.js.map +1 -0
  224. package/dist/primitives/wizard.d.ts +11 -0
  225. package/dist/primitives/wizard.d.ts.map +1 -0
  226. package/dist/primitives/wizard.js +15 -0
  227. package/dist/primitives/wizard.js.map +1 -0
  228. package/dist/runtime/context-dispatcher.d.ts +3 -0
  229. package/dist/runtime/context-dispatcher.d.ts.map +1 -0
  230. package/dist/runtime/context-dispatcher.js +11 -0
  231. package/dist/runtime/context-dispatcher.js.map +1 -0
  232. package/dist/runtime/row-dispatcher.d.ts +19 -0
  233. package/dist/runtime/row-dispatcher.d.ts.map +1 -0
  234. package/dist/runtime/row-dispatcher.js +25 -0
  235. package/dist/runtime/row-dispatcher.js.map +1 -0
  236. package/dist/types.d.ts +10 -0
  237. package/dist/types.d.ts.map +1 -0
  238. package/dist/types.js +2 -0
  239. package/dist/types.js.map +1 -0
  240. package/dist/use-device-context.d.ts +8 -0
  241. package/dist/use-device-context.d.ts.map +1 -0
  242. package/dist/use-device-context.js +54 -0
  243. package/dist/use-device-context.js.map +1 -0
  244. package/package.json +59 -0
@@ -0,0 +1,381 @@
1
+ import React from 'react';
2
+ import { createMythik, createAppEngine } from 'mythik';
3
+ import { createAuthEngine } from 'mythik';
4
+ import { createFrameworkFetch } from 'mythik';
5
+ import { createAuthInterceptor } from 'mythik';
6
+ import { createLoggingInterceptor } from 'mythik';
7
+ import { createTimeoutInterceptor } from 'mythik';
8
+ import { createRetryInterceptor } from 'mythik';
9
+ import { registerReactPrimitives } from './primitives/index.js';
10
+ import { MythikRenderer } from './MythikRenderer.js';
11
+ import { AppContext } from './app-context.js';
12
+ /** Renders the login screen fullscreen (no app layout) while user is not authenticated */
13
+ function LoginScreenLoader({ screenId, specStore, svc, fetcherFn, storage, storageConfig, exportAdapters }) {
14
+ const [spec, setSpec] = React.useState(null);
15
+ React.useEffect(() => {
16
+ specStore.load(screenId).then((s) => setSpec(s)).catch((err) => {
17
+ console.error(`[Mythik Auth] Failed to load login screen "${screenId}":`, err);
18
+ });
19
+ }, [screenId]);
20
+ if (!spec) {
21
+ return React.createElement('div', {
22
+ style: { display: 'flex', alignItems: 'center', justifyContent: 'center', minHeight: '100vh' },
23
+ }, React.createElement('div', {
24
+ style: { width: 32, height: 32, border: '3px solid #E2E8F0', borderTopColor: '#0D9488', borderRadius: '50%', animation: 'spin 0.8s linear infinite' },
25
+ }));
26
+ }
27
+ return React.createElement(MythikRenderer, { spec, instance: svc, fetcher: fetcherFn, storage, storageConfig, exportAdapters });
28
+ }
29
+ /**
30
+ * Creates a SpecStore that injects Bearer tokens into screen load requests.
31
+ * Use with mythik-server when auth is configured.
32
+ * MythikApp automatically syncs the token from AuthEngine after login/refresh.
33
+ *
34
+ * @param apiUrl — Base URL of the Mythik server (e.g., 'http://localhost:3010')
35
+ * @param options.screenPath — URL path pattern for screens. Default: '/api/screens'
36
+ *
37
+ * @example
38
+ * const specStore = createAuthSpecStore('http://localhost:3010');
39
+ * <MythikApp specStore={specStore} auth={{ provider: authProvider }} ... />
40
+ */
41
+ export function createAuthSpecStore(apiUrl, options) {
42
+ const screenPath = options?.screenPath ?? '/api/screens';
43
+ const tokenRef = { current: null };
44
+ return {
45
+ _tokenRef: tokenRef,
46
+ load: async (id) => {
47
+ const headers = {};
48
+ if (tokenRef.current)
49
+ headers['Authorization'] = `Bearer ${tokenRef.current}`;
50
+ const res = await fetch(`${apiUrl}${screenPath}/${id}`, { headers });
51
+ if (!res.ok)
52
+ throw new Error(`Screen "${id}" not found`);
53
+ return res.json();
54
+ },
55
+ save: async () => { },
56
+ list: async () => [],
57
+ delete: async () => { },
58
+ };
59
+ }
60
+ export function MythikApp({ appSpec, specStore, onPlugins, security, auth, storage, storageConfig, exportAdapters, fetcher }) {
61
+ const { svc, appEngine, authEngine, fetcherFn, unsubAuth, unsubTokenRef } = React.useMemo(() => {
62
+ // 1. Create MythikInstance with tokens/state from AppSpec
63
+ const instance = createMythik({
64
+ initialState: appSpec.sharedState ?? {},
65
+ tokens: appSpec.tokens,
66
+ translations: appSpec.translations,
67
+ security,
68
+ });
69
+ // 2. Register React primitives (including screen-outlet)
70
+ registerReactPrimitives(instance.plugins);
71
+ if (onPlugins)
72
+ onPlugins(instance.plugins);
73
+ // 3. Create AppEngine
74
+ const engine = createAppEngine({ appSpec, store: instance.store, specStore });
75
+ // 4. Register navigation actions BEFORE applyPlugins
76
+ instance.plugins.registerAction({
77
+ name: 'navigateScreen',
78
+ handler: async (params) => {
79
+ const screen = params.screen;
80
+ if (!screen)
81
+ throw new Error('navigateScreen requires "screen" param');
82
+ await engine.navigate(screen, params);
83
+ },
84
+ });
85
+ instance.plugins.registerAction({
86
+ name: 'goBackScreen',
87
+ handler: async () => {
88
+ engine.goBack();
89
+ },
90
+ });
91
+ instance.plugins.registerAction({
92
+ name: 'navigationGuardCancel',
93
+ handler: async () => {
94
+ engine.navigationGuardCancel();
95
+ },
96
+ });
97
+ instance.plugins.registerAction({
98
+ name: 'navigationGuardProceed',
99
+ handler: async () => {
100
+ await engine.navigationGuardProceed();
101
+ },
102
+ });
103
+ instance.plugins.registerAction({
104
+ name: 'navigationGuardSaveAndProceed',
105
+ handler: async () => {
106
+ await engine.navigationGuardSaveAndProceed();
107
+ },
108
+ });
109
+ instance.plugins.registerAction({
110
+ name: 'navigationGuardDiscardAndProceed',
111
+ handler: async () => {
112
+ await engine.navigationGuardDiscardAndProceed();
113
+ },
114
+ });
115
+ // 5. Auth setup (when both auth prop and appSpec.navigation.auth are present)
116
+ let authEng;
117
+ let frameworkFetch;
118
+ const authConfig = appSpec.navigation.auth;
119
+ if (auth && authConfig) {
120
+ // Create AuthEngine
121
+ authEng = createAuthEngine({
122
+ provider: auth.provider,
123
+ store: instance.store,
124
+ config: {
125
+ loginScreen: authConfig.loginScreen,
126
+ protectedScreens: authConfig.protectedScreens,
127
+ roleAccess: authConfig.roleAccess,
128
+ persistence: authConfig.persistence ?? 'local',
129
+ tokenRefresh: authConfig.tokenRefresh !== false,
130
+ authDomains: authConfig.authDomains ?? [],
131
+ sessionExpiredMessage: authConfig.sessionExpiredMessage,
132
+ },
133
+ });
134
+ // Build framework fetch interceptor chain
135
+ const interceptors = [];
136
+ // Auth interceptor (always first — injects Bearer headers)
137
+ interceptors.push(createAuthInterceptor({
138
+ getToken: () => authEng.getAccessToken(),
139
+ authDomains: authConfig.authDomains ?? [],
140
+ onUnauthorized: async (url, options) => {
141
+ // 401 reactive refresh: attempt refresh then retry through framework fetch
142
+ try {
143
+ await authEng.refreshSession();
144
+ const newToken = authEng.getAccessToken();
145
+ if (newToken) {
146
+ const headers = { ...(options.headers ?? {}) };
147
+ headers['Authorization'] = `Bearer ${newToken}`;
148
+ // Use raw globalThis.fetch for the retry to avoid re-triggering auth interceptor
149
+ // (the token is already manually injected above)
150
+ return await globalThis.fetch(url, { ...options, headers });
151
+ }
152
+ }
153
+ catch {
154
+ // Refresh failed — session expired flow handled by AuthEngine
155
+ }
156
+ return null;
157
+ },
158
+ }));
159
+ // Built-in declarative interceptors
160
+ if (authConfig.interceptors?.logging) {
161
+ interceptors.push(createLoggingInterceptor());
162
+ }
163
+ if (authConfig.interceptors?.timeout) {
164
+ interceptors.push(createTimeoutInterceptor(authConfig.interceptors.timeout.ms));
165
+ }
166
+ // Custom interceptors from auth config prop
167
+ if (auth.interceptors) {
168
+ interceptors.push(...auth.interceptors);
169
+ }
170
+ frameworkFetch = createFrameworkFetch({
171
+ interceptors,
172
+ });
173
+ // Retry interceptor needs the fetch function for retrying
174
+ if (authConfig.interceptors?.retryOnError) {
175
+ frameworkFetch.addInterceptor(createRetryInterceptor(authConfig.interceptors.retryOnError, (url, opts) => frameworkFetch.fetch(url, opts)));
176
+ }
177
+ // Register auth actions
178
+ instance.plugins.registerAction({
179
+ name: 'login',
180
+ handler: async (params) => {
181
+ await authEng.login(params);
182
+ // Navigate away from login screen after successful auth
183
+ const currentScreen = instance.store.get('/navigation/currentScreen');
184
+ if (currentScreen === authConfig.loginScreen) {
185
+ // Try initialScreen first, fall back to first accessible screen
186
+ if (engine.canAccess(appSpec.navigation.initialScreen, instance.store.get('/auth/user/role'))) {
187
+ await engine.navigate(appSpec.navigation.initialScreen);
188
+ }
189
+ else {
190
+ // Find first accessible screen from /app/screens
191
+ const screens = instance.store.get('/app/screens');
192
+ const firstAccessible = screens?.[0]?.id;
193
+ if (firstAccessible) {
194
+ await engine.navigate(firstAccessible);
195
+ }
196
+ }
197
+ }
198
+ },
199
+ });
200
+ instance.plugins.registerAction({
201
+ name: 'logout',
202
+ handler: async () => {
203
+ await authEng.logout();
204
+ // Clear login form state so credentials don't persist after logout
205
+ instance.store.set('/login', undefined);
206
+ await engine.navigate(authConfig.loginScreen);
207
+ },
208
+ });
209
+ instance.plugins.registerAction({
210
+ name: 'refreshSession',
211
+ handler: async () => {
212
+ await authEng.refreshSession();
213
+ },
214
+ });
215
+ }
216
+ // 6. Apply all plugins (primitives + actions including auth)
217
+ instance.applyPlugins();
218
+ // 7. Mount engines
219
+ engine.mount();
220
+ // 8. Subscribe to auth state changes to refresh sidebar
221
+ let unsubAuth;
222
+ if (auth && authConfig) {
223
+ unsubAuth = instance.store.subscribe((_state, changedPath) => {
224
+ if (changedPath.startsWith('/auth/user') || changedPath === '/auth/isAuthenticated') {
225
+ engine.refreshScreenList();
226
+ // Cross-tab logout: if isAuthenticated flipped to false, navigate to login
227
+ if (changedPath === '/auth/isAuthenticated') {
228
+ const isAuthenticated = instance.store.get('/auth/isAuthenticated');
229
+ const currentScreen = instance.store.get('/navigation/currentScreen');
230
+ if (!isAuthenticated && currentScreen !== authConfig.loginScreen) {
231
+ engine.navigate(authConfig.loginScreen).catch(() => { });
232
+ }
233
+ }
234
+ }
235
+ });
236
+ }
237
+ // Sync token to authSpecStore if used (keeps specStore.load authenticated)
238
+ let unsubTokenRef;
239
+ if (authEng && '_tokenRef' in specStore) {
240
+ const tokenRef = specStore._tokenRef;
241
+ unsubTokenRef = instance.store.subscribe((_s, path) => {
242
+ if (path === '/auth/isAuthenticated') {
243
+ tokenRef.current = authEng.getAccessToken();
244
+ }
245
+ });
246
+ }
247
+ return { svc: instance, appEngine: engine, authEngine: authEng, fetcherFn: frameworkFetch?.fetch ?? fetcher, unsubAuth, unsubTokenRef };
248
+ }, [appSpec, specStore, fetcher]);
249
+ // Auth readiness gate — don't render until session restore attempt completes
250
+ const [authReady, setAuthReady] = React.useState(!authEngine); // true if no auth configured
251
+ // Mount AuthEngine (restore session from persistence)
252
+ React.useEffect(() => {
253
+ if (authEngine) {
254
+ authEngine.mount().then(() => {
255
+ // If session was restored and we're on the login screen, navigate away
256
+ const isAuthenticated = svc.store.get('/auth/isAuthenticated');
257
+ const currentScreen = svc.store.get('/navigation/currentScreen');
258
+ const authConfig = appSpec.navigation.auth;
259
+ if (isAuthenticated && authConfig && currentScreen === authConfig.loginScreen) {
260
+ const role = svc.store.get('/auth/user/role');
261
+ if (appEngine.canAccess(appSpec.navigation.initialScreen, role)) {
262
+ appEngine.navigate(appSpec.navigation.initialScreen).catch(() => { });
263
+ }
264
+ else {
265
+ const screens = svc.store.get('/app/screens');
266
+ const firstAccessible = screens?.[0]?.id;
267
+ if (firstAccessible) {
268
+ appEngine.navigate(firstAccessible).catch(() => { });
269
+ }
270
+ }
271
+ }
272
+ }).catch((err) => {
273
+ console.warn('[Mythik Auth] Mount failed:', err);
274
+ }).finally(() => {
275
+ setAuthReady(true);
276
+ });
277
+ }
278
+ }, [authEngine]);
279
+ // Tab focus revalidation — refresh token when user returns to tab (throttled)
280
+ React.useEffect(() => {
281
+ if (!authEngine)
282
+ return;
283
+ let lastRefresh = Date.now();
284
+ const MIN_REFRESH_INTERVAL = 30_000; // Don't refresh more than once per 30s
285
+ function onVisibilityChange() {
286
+ if (document.visibilityState === 'visible' && authEngine.isAuthenticated()) {
287
+ const now = Date.now();
288
+ if (now - lastRefresh < MIN_REFRESH_INTERVAL)
289
+ return; // Throttle
290
+ lastRefresh = now;
291
+ authEngine.refreshSession().catch(() => {
292
+ // Refresh failed silently — proactive refresh or next 401 will handle it
293
+ });
294
+ }
295
+ }
296
+ document.addEventListener('visibilitychange', onVisibilityChange);
297
+ return () => document.removeEventListener('visibilitychange', onVisibilityChange);
298
+ }, [authEngine]);
299
+ const pendingCleanupsRef = React.useRef([]);
300
+ // Cleanup on unmount. React.StrictMode runs a dev-only cleanup/setup cycle;
301
+ // defer destructive cleanup and cancel it only when the same engine remounts.
302
+ React.useEffect(() => {
303
+ const matchingCleanups = pendingCleanupsRef.current.filter((cleanup) => cleanup.appEngine === appEngine &&
304
+ cleanup.authEngine === authEngine &&
305
+ cleanup.unsubAuth === unsubAuth &&
306
+ cleanup.unsubTokenRef === unsubTokenRef);
307
+ if (matchingCleanups.length > 0) {
308
+ for (const cleanup of matchingCleanups) {
309
+ clearTimeout(cleanup.timer);
310
+ }
311
+ pendingCleanupsRef.current = pendingCleanupsRef.current.filter((cleanup) => !matchingCleanups.includes(cleanup));
312
+ }
313
+ return () => {
314
+ const cleanup = {
315
+ appEngine,
316
+ authEngine,
317
+ unsubAuth,
318
+ unsubTokenRef,
319
+ timer: setTimeout(() => {
320
+ unsubAuth?.();
321
+ unsubTokenRef?.();
322
+ authEngine?.destroy();
323
+ appEngine.unmount();
324
+ pendingCleanupsRef.current = pendingCleanupsRef.current.filter((entry) => entry !== cleanup);
325
+ }, 0),
326
+ };
327
+ pendingCleanupsRef.current.push(cleanup);
328
+ };
329
+ }, [appEngine, authEngine, unsubAuth, unsubTokenRef]);
330
+ React.useEffect(() => {
331
+ const guard = appSpec.navigation.editorSessionGuard;
332
+ if (guard?.enabled !== true || guard.blockBrowserUnload === false)
333
+ return;
334
+ const handler = (event) => {
335
+ if (!appEngine.hasGuardedDirtySessions())
336
+ return;
337
+ event.preventDefault();
338
+ event.returnValue = '';
339
+ };
340
+ window.addEventListener('beforeunload', handler);
341
+ return () => window.removeEventListener('beforeunload', handler);
342
+ }, [appEngine, appSpec.navigation.editorSessionGuard]);
343
+ // Track auth state reactively for login/layout switching
344
+ // (Must be before any conditional returns — React Rules of Hooks)
345
+ const [isAuthenticated, setIsAuthenticated] = React.useState(authEngine ? !!svc.store.get('/auth/isAuthenticated') : true);
346
+ React.useEffect(() => {
347
+ if (!authEngine)
348
+ return;
349
+ return svc.store.subscribe((_state, changedPath) => {
350
+ if (changedPath === '/auth/isAuthenticated') {
351
+ setIsAuthenticated(!!svc.store.get('/auth/isAuthenticated'));
352
+ }
353
+ });
354
+ }, [svc, authEngine]);
355
+ // Convert AppSpec layout to a renderable Spec
356
+ const layoutSpec = React.useMemo(() => ({
357
+ root: appSpec.layout.root,
358
+ elements: appSpec.layout.elements,
359
+ templates: appSpec.templates,
360
+ }), [appSpec]);
361
+ const onSpecRuntimeMount = React.useCallback((runtime) => {
362
+ appEngine.attachEditorSessionEngine(runtime?.editorSessionEngine ?? null);
363
+ }, [appEngine]);
364
+ // Provide context and render layout
365
+ const contextValue = React.useMemo(() => ({ appEngine, svc, specStore, fetcher: fetcherFn, onSpecRuntimeMount }), [appEngine, svc, specStore, fetcherFn, onSpecRuntimeMount]);
366
+ // Show loading spinner while auth session is being restored
367
+ if (!authReady) {
368
+ return React.createElement('div', {
369
+ style: { display: 'flex', alignItems: 'center', justifyContent: 'center', minHeight: '100vh' },
370
+ }, React.createElement('div', {
371
+ style: { width: 32, height: 32, border: '3px solid #E2E8F0', borderTopColor: '#0D9488', borderRadius: '50%', animation: 'spin 0.8s linear infinite' },
372
+ }));
373
+ }
374
+ // Auth configured + not authenticated → render login screen directly (no app layout)
375
+ const loginScreenId = appSpec.navigation.auth?.loginScreen;
376
+ if (authEngine && !isAuthenticated && loginScreenId) {
377
+ return React.createElement(AppContext.Provider, { value: contextValue }, React.createElement(LoginScreenLoader, { screenId: loginScreenId, specStore, svc, fetcherFn, storage, storageConfig, exportAdapters }));
378
+ }
379
+ return React.createElement(AppContext.Provider, { value: contextValue }, React.createElement(MythikRenderer, { spec: layoutSpec, instance: svc, fetcher: fetcherFn, storage, storageConfig, exportAdapters }));
380
+ }
381
+ //# sourceMappingURL=MythikApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MythikApp.js","sourceRoot":"","sources":["../src/MythikApp.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { Spec, MythikInstance, StorageAdapter, StorageAdapterConfig, ExportAdapter, SpecRuntime } from 'mythik';
2
+ import type { MythikConfig } from 'mythik';
3
+ interface MythikRendererProps {
4
+ spec: Spec;
5
+ config?: MythikConfig;
6
+ instance?: MythikInstance;
7
+ autoDeviceContext?: boolean;
8
+ /** Override fetch for auth header injection. Passed from MythikApp when auth is configured. */
9
+ fetcher?: (url: string, options?: RequestInit) => Promise<Response>;
10
+ /** Storage adapter for file uploads. Enables uploadFile/deleteFile actions. */
11
+ storage?: StorageAdapter;
12
+ /** Global storage limits (allowedTypes, maxSize). */
13
+ storageConfig?: StorageAdapterConfig;
14
+ /** Export adapters keyed by format. CSV is always built-in. */
15
+ exportAdapters?: Record<string, ExportAdapter>;
16
+ /** Enable auto-skeleton loading placeholders. Default: true. */
17
+ autoSkeleton?: boolean;
18
+ /**
19
+ * Emit each spec element's id as a `data-mythik-id` attribute on its rendered
20
+ * primitive root. Off by default — turn on for inspector tools, dev overlays,
21
+ * E2E test selectors. The id is the spec key (e.g. `btn-random`); same value
22
+ * the consumer already has in spec.elements, so this is a structural metadata
23
+ * exposure, not a secret.
24
+ */
25
+ emitElementIds?: boolean;
26
+ /** Called when this renderer mounts/unmounts its per-spec runtime. */
27
+ onSpecRuntimeMount?: (runtime: SpecRuntime | null) => void;
28
+ }
29
+ export declare function MythikRenderer({ spec, config, instance, autoDeviceContext, fetcher, storage, storageConfig, exportAdapters, autoSkeleton, emitElementIds, onSpecRuntimeMount }: MythikRendererProps): import("react/jsx-runtime").JSX.Element;
30
+ export {};
31
+ //# sourceMappingURL=MythikRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MythikRenderer.d.ts","sourceRoot":"","sources":["../src/MythikRenderer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAc,cAAc,EAAmD,cAAc,EAAE,oBAAoB,EAAmB,aAAa,EAAmB,WAAW,EAAE,MAAM,QAAQ,CAAC;AAEpN,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAqD3C,UAAU,mBAAmB;IAC3B,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+FAA+F;IAC/F,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpE,+EAA+E;IAC/E,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,qDAAqD;IACrD,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC/C,gEAAgE;IAChE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sEAAsE;IACtE,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;CAC5D;AAotBD,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,MAAW,EAAE,QAAQ,EAAE,iBAAwB,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,YAAmB,EAAE,cAAsB,EAAE,kBAAkB,EAAE,EAAE,mBAAmB,2CA+T9N"}