@multiplatform.one/core 6.0.4 → 6.3.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 (38) hide show
  1. package/README.md +57 -0
  2. package/package.json +28 -32
  3. package/src/app/CreateApp.tsx +86 -7
  4. package/src/app/CreateRootLayout.web.tsx +36 -0
  5. package/src/app/TanstackDevtools.tsx +8 -1
  6. package/src/app/rootLayoutShared.ts +11 -0
  7. package/types/app/CreateApp.d.ts +132 -0
  8. package/types/app/CreateApp.d.ts.map +1 -0
  9. package/types/app/CreateRootLayout.d.ts +13 -0
  10. package/types/app/CreateRootLayout.d.ts.map +1 -0
  11. package/types/app/CreateRootLayout.native.d.ts +14 -0
  12. package/types/app/CreateRootLayout.native.d.ts.map +1 -0
  13. package/types/app/CreateRootLayout.web.d.ts +21 -0
  14. package/types/app/CreateRootLayout.web.d.ts.map +1 -0
  15. package/types/app/TanstackDevtools.d.ts +7 -0
  16. package/types/app/TanstackDevtools.d.ts.map +1 -0
  17. package/types/app/TanstackProvider.d.ts +3 -0
  18. package/types/app/TanstackProvider.d.ts.map +1 -0
  19. package/types/app/index.d.ts +28 -0
  20. package/types/app/index.d.ts.map +1 -0
  21. package/types/app/loadWalletProvider.native.d.ts +3 -0
  22. package/types/app/loadWalletProvider.native.d.ts.map +1 -0
  23. package/types/app/loadWalletProvider.web.d.ts +4 -0
  24. package/types/app/loadWalletProvider.web.d.ts.map +1 -0
  25. package/types/app/rootLayoutShared.d.ts +67 -0
  26. package/types/app/rootLayoutShared.d.ts.map +1 -0
  27. package/types/app/tanstackProvider.native.d.ts +3 -0
  28. package/types/app/tanstackProvider.native.d.ts.map +1 -0
  29. package/types/healthz.d.ts +3 -0
  30. package/types/healthz.d.ts.map +1 -0
  31. package/types/index.d.ts +3 -0
  32. package/types/index.d.ts.map +1 -0
  33. package/types/layouts/CreateDefaultLayout.d.ts +57 -0
  34. package/types/layouts/CreateDefaultLayout.d.ts.map +1 -0
  35. package/types/layouts/index.d.ts +3 -0
  36. package/types/layouts/index.d.ts.map +1 -0
  37. package/CHANGELOG.md +0 -85
  38. package/tsconfig.json +0 -11
package/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # @multiplatform.one/core
2
+
3
+ App shell for multiplatform.one: provider composition (`createApp`), root
4
+ layout factories, and default screen layouts — so an app wires TanStack Query,
5
+ Keycloak, Frappe, Web3, and theming in one declaration.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ pnpm add @multiplatform.one/core
11
+ ```
12
+
13
+ Heavy integrations (`@multiplatform.one/keycloak`, `frappe`, `frappe-ui`,
14
+ `web3`, `@tanstack/react-query`, `one`, `tamagui`, …) are **peer dependencies**
15
+ and lazy-loaded — install only the ones your app enables.
16
+
17
+ ## What it owns
18
+
19
+ - **`createApp(config)`** — returns `{ AppProvider, withApp, useAppConfig }`;
20
+ composes providers outermost → innermost:
21
+ config → TanStack → Web3 → Keycloak → Frappe → custom providers → Theme
22
+ - **`createRootLayout(config)`** — platform-split root layout (web/native) with
23
+ head, Sentry, and loader-data handling
24
+ - **`createDefaultLayout(options)`** / `createTanstackProvider` — screen layout
25
+ and query-client factories
26
+
27
+ ## What it must not do
28
+
29
+ - No screens and no UI catalog — this package is wiring, not widgets
30
+ - No direct Frappe/Keycloak/Web3 implementations — it composes the dedicated
31
+ packages behind lazy provider boundaries
32
+
33
+ ## Usage
34
+
35
+ ```tsx
36
+ import { createApp } from "@multiplatform.one/core";
37
+ import { themeConfig } from "@package/config";
38
+
39
+ const { AppProvider } = createApp({
40
+ theme: themeConfig,
41
+ tanstack: true, // TanStack Query with defaults (devtools in dev)
42
+ keycloak: true, // read settings from env config
43
+ frappe: true,
44
+ });
45
+
46
+ export function App({ children }) {
47
+ return <AppProvider>{children}</AppProvider>;
48
+ }
49
+ ```
50
+
51
+ Pass `true` to a provider slot to read all settings from env config, or an
52
+ object (`TanstackConfig`, `KeycloakConfig`, `FrappeConfig`, `Web3AppConfig`)
53
+ to configure explicitly. Disabled slots add zero bundle weight.
54
+
55
+ ## License
56
+
57
+ Apache-2.0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplatform.one/core",
3
- "version": "6.0.4",
3
+ "version": "6.3.0",
4
4
  "description": "Core framework shell, provider composition, and layout factories for multiplatform.one",
5
5
  "keywords": [
6
6
  "app",
@@ -9,21 +9,31 @@
9
9
  ],
10
10
  "license": "Apache-2.0",
11
11
  "author": "BitSpur",
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://gitlab.com/bitspur/frappe/multiplatform.one.git",
15
+ "directory": "public/core"
16
+ },
12
17
  "source": "src/index.ts",
18
+ "files": [
19
+ "src",
20
+ "types",
21
+ "!types/.tsbuildinfo"
22
+ ],
13
23
  "sideEffects": true,
14
24
  "main": "src/index.ts",
15
25
  "module": "src/index.ts",
16
- "types": "src/index.ts",
26
+ "types": "types/index.d.ts",
17
27
  "exports": {
18
28
  "./package.json": "./package.json",
19
29
  "./healthz": {
20
- "types": "./src/healthz.ts",
30
+ "types": "./types/healthz.d.ts",
21
31
  "source": "./src/healthz.ts",
22
32
  "default": "./src/healthz.ts"
23
33
  },
24
34
  ".": {
25
35
  "source": "./src/index.ts",
26
- "types": "./src/index.ts",
36
+ "types": "./types/index.d.ts",
27
37
  "default": "./src/index.ts"
28
38
  }
29
39
  },
@@ -36,12 +46,12 @@
36
46
  "@tanstack/react-form-devtools": "0.2.22",
37
47
  "@tanstack/react-pacer-devtools": "^0.7.0",
38
48
  "react-cookie": "^8.1.2",
39
- "@multiplatform.one/i18n": "6.0.4",
40
- "@multiplatform.one/logger": "6.0.4",
41
- "@multiplatform.one/platform": "6.0.4",
42
- "@multiplatform.one/theme": "6.0.4",
43
- "@multiplatform.one/store": "6.0.4",
44
- "@multiplatform.one/web3": "6.0.4"
49
+ "@multiplatform.one/i18n": "6.3.0",
50
+ "@multiplatform.one/logger": "6.3.0",
51
+ "@multiplatform.one/platform": "6.3.0",
52
+ "@multiplatform.one/theme": "6.3.0",
53
+ "@multiplatform.one/store": "6.3.0",
54
+ "@multiplatform.one/web3": "6.3.0"
45
55
  },
46
56
  "devDependencies": {
47
57
  "@sentry/react": "^10.51.0",
@@ -57,8 +67,8 @@
57
67
  "react-native-safe-area-context": "~5.7.0",
58
68
  "tamagui": "2.0.0-rc.41",
59
69
  "typescript": "~5.9.3",
60
- "@multiplatform.one/frappe": "6.0.4",
61
- "@multiplatform.one/web3": "6.0.4"
70
+ "@multiplatform.one/web3": "6.3.0",
71
+ "@multiplatform.one/frappe": "6.3.0"
62
72
  },
63
73
  "peerDependencies": {
64
74
  "@sentry/react": "^9.0.0",
@@ -74,33 +84,18 @@
74
84
  "react-native-gesture-handler": ">=2.0.0",
75
85
  "react-native-safe-area-context": ">=4.0.0",
76
86
  "tamagui": "^2.0.0-rc",
77
- "@multiplatform.one/frappe": "6.0.4",
78
- "@multiplatform.one/keycloak": "6.0.4",
79
- "@multiplatform.one/frappe-ui": "6.0.4",
80
- "@multiplatform.one/web3": "6.0.4"
87
+ "@multiplatform.one/web3": "^6.3.0",
88
+ "@multiplatform.one/frappe-ui": "^6.3.0",
89
+ "@multiplatform.one/frappe": "^6.3.0",
90
+ "@multiplatform.one/keycloak": "^6.3.0"
81
91
  },
82
92
  "peerDependenciesMeta": {
83
- "@multiplatform.one/frappe": {
84
- "optional": true
85
- },
86
- "@multiplatform.one/frappe-ui": {
87
- "optional": true
88
- },
89
- "@multiplatform.one/keycloak": {
90
- "optional": true
91
- },
92
93
  "@multiplatform.one/web3": {
93
94
  "optional": true
94
95
  },
95
96
  "@sentry/react": {
96
97
  "optional": true
97
98
  },
98
- "@tanstack/react-query": {
99
- "optional": true
100
- },
101
- "@tanstack/react-query-devtools": {
102
- "optional": true
103
- },
104
99
  "@vxrn/color-scheme": {
105
100
  "optional": true
106
101
  },
@@ -121,6 +116,7 @@
121
116
  }
122
117
  },
123
118
  "scripts": {
124
- "typecheck": "tsc --noEmit"
119
+ "typecheck": "tsc --noEmit",
120
+ "build": "rm -rf types 2>/dev/null && tsc -p tsconfig.build.json"
125
121
  }
126
122
  }
@@ -20,6 +20,31 @@ import LazyWalletProvider from "./loadWalletProvider";
20
20
 
21
21
  export type ProviderComponent = ComponentType<PropsWithChildren>;
22
22
 
23
+ const LOOPBACK_HOSTS = new Set(["localhost", "127.0.0.1", "[::1]"]);
24
+
25
+ /**
26
+ * Follow the page origin when a loopback-configured backend is opened from a
27
+ * non-loopback host. Dev configs point at `http://localhost:8000`, which is
28
+ * correct on the dev machine but breaks the moment the app is opened via a
29
+ * LAN IP (`http://10.x.x.x:3456` → the API and the Socket.IO handshake would
30
+ * target the *visitor's* machine, and Chromium's Local Network Access policy
31
+ * flags the cross-origin loopback fetch). Rewriting only the hostname keeps
32
+ * the configured scheme and port, and only ever triggers in a browser whose
33
+ * page host is itself not loopback — SSR and same-machine dev are untouched.
34
+ */
35
+ export function followPageOriginForLoopback(configured: string): string {
36
+ if (typeof window === "undefined" || !window.location?.hostname) return configured;
37
+ try {
38
+ const url = new URL(configured);
39
+ const pageHost = window.location.hostname;
40
+ if (!LOOPBACK_HOSTS.has(url.hostname) || LOOPBACK_HOSTS.has(pageHost)) return configured;
41
+ url.hostname = pageHost;
42
+ return url.toString().replace(/\/$/, "");
43
+ } catch {
44
+ return configured;
45
+ }
46
+ }
47
+
23
48
  // ---------------------------------------------------------------------------
24
49
  // Provider config types
25
50
  // ---------------------------------------------------------------------------
@@ -58,6 +83,12 @@ export interface KeycloakConfig {
58
83
  iframeSso?: boolean;
59
84
  loginRedirectUri?: string;
60
85
  messageHandlerKeys?: string[];
86
+ /** Better Auth server base URL (native sign-in). When omitted, reads
87
+ * BETTER_AUTH_BASE_URL, then falls back to BASE_URL (the app server proxies
88
+ * /api/auth). */
89
+ betterAuthBaseUrl?: string;
90
+ /** App scheme for the Expo auth-session redirect (native). */
91
+ expoScheme?: string;
61
92
  }
62
93
 
63
94
  export interface FrappeConfig {
@@ -71,7 +102,7 @@ export interface FrappeConfig {
71
102
  socketPort?: number;
72
103
  auth?: {
73
104
  useToken?: boolean;
74
- token?: string;
105
+ token?: string | (() => string | Promise<string>);
75
106
  type?: string;
76
107
  };
77
108
  }
@@ -85,9 +116,17 @@ export interface Web3AppConfig {
85
116
  appUrl?: string;
86
117
  appIcon?: string;
87
118
  enableTestnets?: boolean;
88
- /** Native: URL serving the wallet WebView HTML (preferred over the inline string). */
119
+ /** Add the local dev chain (`make localnet`). When omitted, reads WEB3_LOCALNET_ENABLED. */
120
+ localnet?: boolean;
121
+ /** Local EVM JSON-RPC endpoint for localnet. When omitted, reads WEB3_EVM_RPC. */
122
+ localnetRpcUrl?: string;
123
+ /** Solana JSON-RPC endpoint. When omitted, reads WEB3_SOLANA_RPC. */
124
+ solanaRpcUrl?: string;
125
+ /** Sui JSON-RPC endpoint. When omitted, reads WEB3_SUI_RPC. */
126
+ suiRpcUrl?: string;
127
+ /** Native: URL serving the wallet WebView HTML. When omitted, reads WEB3_WEBVIEW_URL. */
89
128
  webViewUrl?: string;
90
- /** E2E only (native): route connect through the in-WebView mock wallet. */
129
+ /** E2E only (native): route connect through the in-WebView mock wallet. When omitted, reads WEB3_MOCK_WALLET. */
91
130
  mockWallet?: boolean;
92
131
  }
93
132
 
@@ -186,8 +225,12 @@ export function createApp(appConfig: CreateAppConfig) {
186
225
  (isWeb && typeof window !== "undefined" ? window.location.origin : ""),
187
226
  appIcon: cfg.appIcon,
188
227
  enableTestnets: testnetsEnabled,
189
- webViewUrl: cfg.webViewUrl,
190
- mockWallet: cfg.mockWallet,
228
+ localnet: cfg.localnet ?? config.get("WEB3_LOCALNET_ENABLED") === "1",
229
+ localnetRpcUrl: cfg.localnetRpcUrl || config.get("WEB3_EVM_RPC") || undefined,
230
+ solanaRpcUrl: cfg.solanaRpcUrl || config.get("WEB3_SOLANA_RPC") || undefined,
231
+ suiRpcUrl: cfg.suiRpcUrl || config.get("WEB3_SUI_RPC") || undefined,
232
+ webViewUrl: cfg.webViewUrl || config.get("WEB3_WEBVIEW_URL") || undefined,
233
+ mockWallet: cfg.mockWallet ?? config.get("WEB3_MOCK_WALLET") === "1",
191
234
  }}
192
235
  >
193
236
  {children}
@@ -216,6 +259,8 @@ export function createApp(appConfig: CreateAppConfig) {
216
259
  iframeSso?: boolean;
217
260
  loginRedirectUri?: string;
218
261
  messageHandlerKeys?: string[];
262
+ betterAuthBaseUrl?: string;
263
+ expoScheme?: string;
219
264
  }>
220
265
  >,
221
266
  };
@@ -237,6 +282,13 @@ export function createApp(appConfig: CreateAppConfig) {
237
282
  iframeSso={cfg.iframeSso}
238
283
  loginRedirectUri={cfg.loginRedirectUri}
239
284
  messageHandlerKeys={cfg.messageHandlerKeys || []}
285
+ betterAuthBaseUrl={
286
+ cfg.betterAuthBaseUrl ||
287
+ config.get("BETTER_AUTH_BASE_URL") ||
288
+ config.get("BASE_URL") ||
289
+ undefined
290
+ }
291
+ expoScheme={cfg.expoScheme}
240
292
  >
241
293
  {children}
242
294
  </LazyKeycloakProvider>
@@ -260,12 +312,39 @@ export function createApp(appConfig: CreateAppConfig) {
260
312
  const enabled = cfg.enabled ?? config.get("FRAPPE_ENABLED") === "1";
261
313
  if (!enabled) return children;
262
314
 
263
- const baseURL = cfg.baseURL || config.get("BASE_URL") || "http://localhost:8000";
315
+ // LAN dev: a loopback-configured bench follows the page origin's host
316
+ // (the Socket.IO URL derives from baseURL too, so realtime follows).
317
+ const baseURL = followPageOriginForLoopback(
318
+ cfg.baseURL || config.get("BASE_URL") || "http://localhost:8000",
319
+ );
264
320
  const socketPort =
265
321
  cfg.socketPort ?? (Number(config.get("FRAPPE_SOCKETIO_PORT")) || undefined);
266
322
 
323
+ // Keycloak auth uses ONE transport on every platform: the HttpClient
324
+ // and the Socket.IO handshake send `Authorization: Bearer <keycloak
325
+ // access token>`, fetched lazily from better-auth's /get-access-token
326
+ // (which refreshes server-side; SecureStore jar on native, session
327
+ // cookie on web). The bench's frappe_keycloak auth hook validates the
328
+ // JWT. Cookies alone can't cover realtime: frappe's socketio middleware
329
+ // only accepts a frappe `sid` cookie or an Authorization header, so the
330
+ // better-auth account cookie never authenticated the socket on web.
331
+ // When signed out the getter resolves undefined and requests fall back
332
+ // to guest.
333
+ const auth =
334
+ cfg.auth ??
335
+ (appConfig.keycloak
336
+ ? {
337
+ useToken: true,
338
+ type: "Bearer",
339
+ token: async () => {
340
+ const mod = await import("@multiplatform.one/keycloak");
341
+ return (await mod.getKeycloakBearerToken()) || "";
342
+ },
343
+ }
344
+ : undefined);
345
+
267
346
  return (
268
- <FrappeProvider baseURL={baseURL} socketPort={socketPort} auth={cfg.auth}>
347
+ <FrappeProvider baseURL={baseURL} socketPort={socketPort} auth={auth}>
269
348
  {children}
270
349
  </FrappeProvider>
271
350
  );
@@ -123,10 +123,46 @@ export function createRootLayout(cfg: CreateRootLayoutConfig): ComponentType {
123
123
  i18n.changeLanguage(rootLoaderData.detectedLanguage);
124
124
  }
125
125
 
126
+ // LC-33 FONT-STABLE-MOUNT (DF-17 / Axiom 8 STABLE GROUND): Inter must be
127
+ // usable at first paint. The Tamagui font CSS is injected as a JS side
128
+ // effect (theme's createFontLoader.web), so without a head declaration
129
+ // the fallback→Inter swap reflows settled text (H1 width jumped 74px in
130
+ // the dogfood axiom review). Preloading the same Inter binaries the app
131
+ // serves from /fonts (extracted from @tamagui/font-inter — identical
132
+ // metrics to the late-injected face) and declaring the face in the head
133
+ // means first paint already renders Inter; `font-display: optional`
134
+ // guarantees the head face itself never swaps after first paint.
135
+ const interFonts = cfg.head?.interFonts !== false;
136
+ const interFontCss = [
137
+ '@font-face{font-family:"Inter";font-style:normal;font-weight:400;font-display:optional;src:url("/fonts/inter-400.woff2") format("woff2")}',
138
+ '@font-face{font-family:"Inter";font-style:normal;font-weight:700;font-display:optional;src:url("/fonts/inter-700.woff2") format("woff2")}',
139
+ ].join("");
140
+
126
141
  return (
127
142
  <html lang={htmlLang}>
128
143
  <head>
129
144
  <meta charSet="utf-8" />
145
+ {interFonts && (
146
+ <>
147
+ <link
148
+ rel="preload"
149
+ href="/fonts/inter-400.woff2"
150
+ as="font"
151
+ type="font/woff2"
152
+ crossOrigin=""
153
+ />
154
+ <link
155
+ rel="preload"
156
+ href="/fonts/inter-700.woff2"
157
+ as="font"
158
+ type="font/woff2"
159
+ crossOrigin=""
160
+ />
161
+ <style precedence="reset" href="__font_inter">
162
+ {interFontCss}
163
+ </style>
164
+ </>
165
+ )}
130
166
  {/* Critical reset CSS with data-precedence so React 19 hoists it
131
167
  to the very top of <head> – BEFORE the Tamagui atomic CSS.
132
168
  This eliminates FOUC during streaming SSR. */}
@@ -61,7 +61,14 @@ function useFrappePlugin() {
61
61
  ]);
62
62
  const sync = __getActiveSyncModule();
63
63
  if (sync && !cancelled) {
64
- setPlugin(frappeDevtoolsPlugin(sync));
64
+ // SyncModule is a class (nominal typing); when this file is
65
+ // typechecked through nested node_modules symlinks with
66
+ // preserveSymlinks, the two dynamic imports above can resolve to
67
+ // distinct copies of the same source file, making the identical
68
+ // class types mutually unassignable. Same runtime object either way.
69
+ setPlugin(
70
+ frappeDevtoolsPlugin(sync as unknown as Parameters<typeof frappeDevtoolsPlugin>[0]),
71
+ );
65
72
  return true;
66
73
  }
67
74
  } catch {
@@ -5,6 +5,17 @@ import type { AppProviderProps } from "./CreateApp";
5
5
  export interface HeadConfig {
6
6
  /** Path to favicon (e.g. "/favicon.svg"). */
7
7
  favicon?: string;
8
+ /**
9
+ * Preload + declare the default Inter faces (400/700) in the document
10
+ * head with `font-display: optional` so first paint is font-stable
11
+ * (LC-33 FONT-STABLE-MOUNT / DF-17): without a head declaration the
12
+ * Tamagui font CSS arrives as a JS side effect and the fallback→Inter
13
+ * swap reflows settled text. Defaults to true; requires the app to
14
+ * serve `/fonts/inter-400.woff2` + `/fonts/inter-700.woff2` from its
15
+ * public directory. Set false for apps that don't use Inter or ship
16
+ * their own head declaration.
17
+ */
18
+ interFonts?: boolean;
8
19
  }
9
20
 
10
21
  export interface SentryConfig {
@@ -0,0 +1,132 @@
1
+ import { type ComponentType, type PropsWithChildren } from "react";
2
+ import type { ThemeConfig } from "@multiplatform.one/theme";
3
+ export type ProviderComponent = ComponentType<PropsWithChildren>;
4
+ /**
5
+ * Follow the page origin when a loopback-configured backend is opened from a
6
+ * non-loopback host. Dev configs point at `http://localhost:8000`, which is
7
+ * correct on the dev machine but breaks the moment the app is opened via a
8
+ * LAN IP (`http://10.x.x.x:3456` → the API and the Socket.IO handshake would
9
+ * target the *visitor's* machine, and Chromium's Local Network Access policy
10
+ * flags the cross-origin loopback fetch). Rewriting only the hostname keeps
11
+ * the configured scheme and port, and only ever triggers in a browser whose
12
+ * page host is itself not loopback — SSR and same-machine dev are untouched.
13
+ */
14
+ export declare function followPageOriginForLoopback(configured: string): string;
15
+ export interface TanstackConfig {
16
+ /** Show React Query devtools (web only, ignored on native and in Storybook). */
17
+ debug?: boolean;
18
+ /** Options forwarded to the QueryClient constructor. */
19
+ queryClientOptions?: Record<string, unknown>;
20
+ /**
21
+ * Pass `useUserScheme` from `one` / `@vxrn/color-scheme` so the theme
22
+ * devtools panel can control the color scheme (light / dark / system).
23
+ */
24
+ useUserScheme?: () => {
25
+ setting: "system" | "light" | "dark";
26
+ value: "light" | "dark";
27
+ set: (s: "system" | "light" | "dark") => void;
28
+ };
29
+ /**
30
+ * Tamagui config object (from `createTamagui()`). When provided, the
31
+ * TanStack Devtools theme panel extracts `$color1`–`$color12` directly
32
+ * from the config's themes for the color line visualizer.
33
+ * Passed automatically by `createApp()` from the theme config.
34
+ */
35
+ tamaguiConfig?: unknown;
36
+ }
37
+ export interface KeycloakConfig {
38
+ /** Force-enable or disable. When omitted, reads KEYCLOAK_ENABLED from env config. */
39
+ enabled?: boolean;
40
+ baseUrl?: string;
41
+ clientId?: string;
42
+ publicClientId?: string;
43
+ realm?: string;
44
+ debug?: boolean;
45
+ iframeSso?: boolean;
46
+ loginRedirectUri?: string;
47
+ messageHandlerKeys?: string[];
48
+ /** Better Auth server base URL (native sign-in). When omitted, reads
49
+ * BETTER_AUTH_BASE_URL, then falls back to BASE_URL (the app server proxies
50
+ * /api/auth). */
51
+ betterAuthBaseUrl?: string;
52
+ /** App scheme for the Expo auth-session redirect (native). */
53
+ expoScheme?: string;
54
+ }
55
+ export interface FrappeConfig {
56
+ /** Force-enable or disable. When omitted, reads FRAPPE_ENABLED from env config. */
57
+ enabled?: boolean;
58
+ baseURL?: string;
59
+ /**
60
+ * Override port for Socket.IO realtime connection (e.g. 9000 in dev).
61
+ * Omit in production behind a reverse proxy.
62
+ */
63
+ socketPort?: number;
64
+ auth?: {
65
+ useToken?: boolean;
66
+ token?: string | (() => string | Promise<string>);
67
+ type?: string;
68
+ };
69
+ }
70
+ export interface Web3AppConfig {
71
+ /** Force-enable or disable. When omitted, reads WEB3_ENABLED from env config. */
72
+ enabled?: boolean;
73
+ walletConnectProjectId?: string;
74
+ appName?: string;
75
+ appDescription?: string;
76
+ appUrl?: string;
77
+ appIcon?: string;
78
+ enableTestnets?: boolean;
79
+ /** Add the local dev chain (`make localnet`). When omitted, reads WEB3_LOCALNET_ENABLED. */
80
+ localnet?: boolean;
81
+ /** Local EVM JSON-RPC endpoint for localnet. When omitted, reads WEB3_EVM_RPC. */
82
+ localnetRpcUrl?: string;
83
+ /** Solana JSON-RPC endpoint. When omitted, reads WEB3_SOLANA_RPC. */
84
+ solanaRpcUrl?: string;
85
+ /** Sui JSON-RPC endpoint. When omitted, reads WEB3_SUI_RPC. */
86
+ suiRpcUrl?: string;
87
+ /** Native: URL serving the wallet WebView HTML. When omitted, reads WEB3_WEBVIEW_URL. */
88
+ webViewUrl?: string;
89
+ /** E2E only (native): route connect through the in-WebView mock wallet. When omitted, reads WEB3_MOCK_WALLET. */
90
+ mockWallet?: boolean;
91
+ }
92
+ export interface CreateAppConfig {
93
+ /** ThemeConfig to pass to the built-in ThemeProvider. */
94
+ theme?: ThemeConfig;
95
+ /**
96
+ * Additional providers composed outermost-to-innermost order.
97
+ * Each component receives `{ children }` and must render them.
98
+ * The first provider in the array becomes the outermost wrapper.
99
+ */
100
+ providers?: ProviderComponent[];
101
+ /** TanStack Query provider with optional devtools. Pass `true` for defaults. */
102
+ tanstack?: TanstackConfig | boolean;
103
+ /** Keycloak auth provider (lazy-loaded). Pass `true` to read all settings from env config. */
104
+ keycloak?: KeycloakConfig | boolean;
105
+ /** Frappe provider (lazy-loaded). Pass `true` to read all settings from env config. */
106
+ frappe?: FrappeConfig | boolean;
107
+ /** Web3 wallet provider (lazy-loaded). Pass `true` to read all settings from env config. */
108
+ web3?: Web3AppConfig | boolean;
109
+ }
110
+ export interface AppProviderProps extends PropsWithChildren {
111
+ /** System color scheme for theme resolution. */
112
+ systemTheme?: "light" | "dark";
113
+ /** Override the theme config set at createApp() time (useful for Storybook). */
114
+ themeConfig?: ThemeConfig;
115
+ }
116
+ /**
117
+ * Creates a pre-configured app shell with composable providers.
118
+ *
119
+ * Returns `{ AppProvider, withApp, useAppConfig }`.
120
+ *
121
+ * Provider composition order (outermost → innermost):
122
+ * config context → TanStack → Web3 → Keycloak → Frappe → custom providers → ThemeProvider → children
123
+ */
124
+ export declare function createApp(appConfig: CreateAppConfig): {
125
+ AppProvider: {
126
+ ({ children, systemTheme, themeConfig }: AppProviderProps): import("react/jsx-runtime").JSX.Element;
127
+ displayName: string;
128
+ };
129
+ withApp: <P extends Record<string, unknown>>(Screen: ComponentType<P>) => ComponentType<P>;
130
+ useAppConfig: () => CreateAppConfig;
131
+ };
132
+ //# sourceMappingURL=CreateApp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateApp.d.ts","sourceRoot":"","sources":["../../src/app/CreateApp.tsx"],"names":[],"mappings":"AAAA,OAAc,EAKZ,KAAK,aAAa,EAClB,KAAK,iBAAiB,EAEvB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAU5D,MAAM,MAAM,iBAAiB,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAC;AAIjE;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAWtE;AAMD,MAAM,WAAW,cAAc;IAC7B,gFAAgF;IAChF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM;QACpB,OAAO,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;QACrC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;QACxB,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;KAC/C,CAAC;IACF;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,qFAAqF;IACrF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B;;qBAEiB;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,iFAAiF;IACjF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iHAAiH;IACjH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAMD,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAChC,gFAAgF;IAChF,QAAQ,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;IACpC,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;IACpC,uFAAuF;IACvF,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC;IAChC,4FAA4F;IAC5F,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,gFAAgF;IAChF,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAQD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,eAAe;;iDAsLW,gBAAgB;;;cA2B5D,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,aAAa,CAAC,CAAC,CAAC,KAAG,aAAa,CAAC,CAAC,CAAC;wBAatE,eAAe;EAKzC"}
@@ -0,0 +1,13 @@
1
+ import { type ComponentType } from "react";
2
+ import type { CreateRootLayoutConfig } from "./rootLayoutShared";
3
+ export type { CreateRootLayoutConfig, HeadConfig, RootLayoutProps, RootLoaderData, SentryConfig, } from "./rootLayoutShared";
4
+ /**
5
+ * Creates a root layout component (universal fallback for Tauri / desktop).
6
+ *
7
+ * Handles i18n initialization, color-scheme detection via `matchMedia`,
8
+ * and wraps content in `LoadProgressBar` → `AppProvider` → `RootLayout` → `<Slot />`.
9
+ *
10
+ * `head` and `sentry` config options are ignored in the universal fallback.
11
+ */
12
+ export declare function createRootLayout(cfg: CreateRootLayoutConfig): ComponentType;
13
+ //# sourceMappingURL=CreateRootLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateRootLayout.d.ts","sourceRoot":"","sources":["../../src/app/CreateRootLayout.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,aAAa,EAAkB,MAAM,OAAO,CAAC;AAKhF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEjE,YAAY,EACV,sBAAsB,EACtB,UAAU,EACV,eAAe,EACf,cAAc,EACd,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,sBAAsB,GAAG,aAAa,CAwC3E"}
@@ -0,0 +1,14 @@
1
+ import type { ComponentType } from "react";
2
+ import type { CreateRootLayoutConfig } from "./rootLayoutShared";
3
+ export type { CreateRootLayoutConfig, HeadConfig, RootLayoutProps, RootLoaderData, SentryConfig, } from "./rootLayoutShared";
4
+ /**
5
+ * Creates a root layout component for **React Native** (iOS + Android).
6
+ *
7
+ * Handles i18n initialization, color-scheme detection via `@vxrn/color-scheme`,
8
+ * and wraps content in `GestureHandlerRootView` → `SafeAreaProvider` →
9
+ * `SchemeProvider` → `AppProvider` → `RootLayout` → `<Slot />`.
10
+ *
11
+ * `head` and `sentry` config options are ignored on native.
12
+ */
13
+ export declare function createRootLayout(cfg: CreateRootLayoutConfig): ComponentType;
14
+ //# sourceMappingURL=CreateRootLayout.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateRootLayout.native.d.ts","sourceRoot":"","sources":["../../src/app/CreateRootLayout.native.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,OAAO,CAAC;AAQtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEjE,YAAY,EACV,sBAAsB,EACtB,UAAU,EACV,eAAe,EACf,cAAc,EACd,YAAY,GACb,MAAM,oBAAoB,CAAC;AAM5B;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,sBAAsB,GAAG,aAAa,CAsC3E"}
@@ -0,0 +1,21 @@
1
+ import type { ComponentType } from "react";
2
+ import type { CreateRootLayoutConfig } from "./rootLayoutShared";
3
+ export type { CreateRootLayoutConfig, HeadConfig, RootLayoutProps, RootLoaderData, SentryConfig, } from "./rootLayoutShared";
4
+ /**
5
+ * Creates a root layout component for **web** (browser + SSR).
6
+ *
7
+ * Handles i18n initialization, Sentry setup, color-scheme detection via
8
+ * `SchemeProvider` (blocking script + localStorage – no cookie needed),
9
+ * `<Head>` meta tags, `<LoadProgressBar>`, and wraps content in
10
+ * `SchemeProvider` → `CookiesProvider` → `AppProvider` → `RootLayout` → `<Slot />`.
11
+ *
12
+ * Light/dark scheme: handled by `@vxrn/color-scheme` `SchemeProvider` which
13
+ * injects a blocking `<script>` that reads `localStorage` / `matchMedia`
14
+ * before the first paint. Works even when cookies are disabled.
15
+ *
16
+ * Theme properties (color theme, padding, borderRadius, …): synced via
17
+ * `mp.preset` + `mp.overrides` cookies so SSR can render with the user's full
18
+ * theme. The cookies are populated by `useTheme` in `@multiplatform.one/theme`.
19
+ */
20
+ export declare function createRootLayout(cfg: CreateRootLayoutConfig): ComponentType;
21
+ //# sourceMappingURL=CreateRootLayout.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateRootLayout.web.d.ts","sourceRoot":"","sources":["../../src/app/CreateRootLayout.web.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,OAAO,CAAC;AAOtD,OAAO,KAAK,EAAE,sBAAsB,EAAkB,MAAM,oBAAoB,CAAC;AAEjF,YAAY,EACV,sBAAsB,EACtB,UAAU,EACV,eAAe,EACf,cAAc,EACd,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,sBAAsB,GAAG,aAAa,CAoL3E"}
@@ -0,0 +1,7 @@
1
+ import type { TanstackConfig } from "./CreateApp";
2
+ export interface TanstackDevtoolsProps {
3
+ resolvedScheme: "light" | "dark";
4
+ tanstackConfig: TanstackConfig;
5
+ }
6
+ export default function TanstackDevtoolsWrapper({ resolvedScheme, tanstackConfig, }: TanstackDevtoolsProps): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=TanstackDevtools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TanstackDevtools.d.ts","sourceRoot":"","sources":["../../src/app/TanstackDevtools.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAsBlD,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,cAAc,EAAE,cAAc,CAAC;CAChC;AAkED,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAAC,EAC9C,cAAc,EACd,cAAc,GACf,EAAE,qBAAqB,2CA0CvB"}
@@ -0,0 +1,3 @@
1
+ import type { ProviderComponent, TanstackConfig } from "./CreateApp";
2
+ export declare function createTanstackProvider(tanstackConfig: TanstackConfig): ProviderComponent;
3
+ //# sourceMappingURL=TanstackProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TanstackProvider.d.ts","sourceRoot":"","sources":["../../src/app/TanstackProvider.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIrE,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,cAAc,GAAG,iBAAiB,CAiCxF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * ## Platform File Extension Conventions
3
+ *
4
+ * The framework uses platform-specific file extensions for automatic
5
+ * bundler resolution. When multiple variants exist for a module, the
6
+ * bundler picks the most specific match for the current target:
7
+ *
8
+ * | Extension | Target |
9
+ * | ---------------- | --------------------------------------- |
10
+ * | `.web.tsx` | Web (browser + SSR) |
11
+ * | `.native.tsx` | React Native (iOS + Android) |
12
+ * | `.ios.tsx` | iOS only |
13
+ * | `.android.tsx` | Android only |
14
+ * | `.tauri.tsx` | Tauri desktop (macOS, Windows, Linux) |
15
+ * | `.storybook-expo.ts` | Storybook running in Expo |
16
+ * | (no suffix) | Universal fallback / shared code |
17
+ *
18
+ * Resolution priority (most → least specific):
19
+ * `.ios.tsx` > `.native.tsx` > `.tsx` (on iOS)
20
+ * `.web.tsx` > `.tsx` (on web)
21
+ * `.tauri.tsx` > `.tsx` (on Tauri)
22
+ *
23
+ * When creating platform-specific variants, always keep a universal
24
+ * fallback file (e.g. `index.ts`) that exports the default API.
25
+ */
26
+ export * from "./CreateApp";
27
+ export * from "./CreateRootLayout";
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("react").LazyExoticComponent<typeof import("@multiplatform.one/web3/native").WalletProvider>;
2
+ export default _default;
3
+ //# sourceMappingURL=loadWalletProvider.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadWalletProvider.native.d.ts","sourceRoot":"","sources":["../../src/app/loadWalletProvider.native.ts"],"names":[],"mappings":";AAWA,wBAEE"}
@@ -0,0 +1,4 @@
1
+ import { type ComponentType, type PropsWithChildren } from "react";
2
+ declare const WalletProvider: ComponentType<PropsWithChildren<Record<string, unknown>>>;
3
+ export default WalletProvider;
4
+ //# sourceMappingURL=loadWalletProvider.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadWalletProvider.web.d.ts","sourceRoot":"","sources":["../../src/app/loadWalletProvider.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAO5F,QAAA,MAAM,cAAc,EAAE,aAAa,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CACrC,CAAC;AAC1C,eAAe,cAAc,CAAC"}
@@ -0,0 +1,67 @@
1
+ import type { ComponentType, PropsWithChildren } from "react";
2
+ import type { I18nConfigOptions } from "@multiplatform.one/i18n";
3
+ import type { AppProviderProps } from "./CreateApp";
4
+ export interface HeadConfig {
5
+ /** Path to favicon (e.g. "/favicon.svg"). */
6
+ favicon?: string;
7
+ /**
8
+ * Preload + declare the default Inter faces (400/700) in the document
9
+ * head with `font-display: optional` so first paint is font-stable
10
+ * (LC-33 FONT-STABLE-MOUNT / DF-17): without a head declaration the
11
+ * Tamagui font CSS arrives as a JS side effect and the fallback→Inter
12
+ * swap reflows settled text. Defaults to true; requires the app to
13
+ * serve `/fonts/inter-400.woff2` + `/fonts/inter-700.woff2` from its
14
+ * public directory. Set false for apps that don't use Inter or ship
15
+ * their own head declaration.
16
+ */
17
+ interFonts?: boolean;
18
+ }
19
+ export interface SentryConfig {
20
+ /** Sentry DSN. When provided, Sentry is initialized on the web client. */
21
+ dsn?: string;
22
+ }
23
+ /** Shape of the root layout loader data used by createRootLayout. */
24
+ export interface RootLoaderData {
25
+ cookieHeader?: string;
26
+ /** Language detected from request (cookie or Accept-Language header). */
27
+ detectedLanguage?: string;
28
+ /** Server-side session from the auth loader (used for SSR hydration). */
29
+ session?: unknown;
30
+ [key: string]: unknown;
31
+ }
32
+ /**
33
+ * Props accepted by the `RootLayout` component.
34
+ *
35
+ * `ssrSession` is provided only on web during SSR so auth-related UI
36
+ * (e.g. user name, logout button) can render on the first paint without
37
+ * waiting for a client-side session fetch.
38
+ */
39
+ export interface RootLayoutProps extends PropsWithChildren {
40
+ /** Server-side session data for SSR hydration (web only). */
41
+ ssrSession?: unknown;
42
+ }
43
+ /**
44
+ * Configuration for `createRootLayout()`.
45
+ *
46
+ * The factory initializes i18n, detects color scheme, wraps with the
47
+ * appropriate platform providers, and renders the RootLayout + Slot.
48
+ */
49
+ export interface CreateRootLayoutConfig {
50
+ /** The AppProvider component returned from `createApp()`. */
51
+ AppProvider: ComponentType<AppProviderProps>;
52
+ /** Root layout shell that wraps route content (navigation chrome, header, etc.). */
53
+ RootLayout: ComponentType<RootLayoutProps>;
54
+ /** i18n configuration. i18next is initialized as a side-effect when the factory is called. */
55
+ i18n: I18nConfigOptions;
56
+ /** `<Head>` meta tags for web. Ignored on native. */
57
+ head?: HeadConfig;
58
+ /** Sentry error tracking. Initialized on the web client only. Ignored on native. */
59
+ sentry?: SentryConfig;
60
+ /**
61
+ * Native font map returned by `importFonts()` from `@package/fonts`.
62
+ * Passed to `useFonts()` so custom fonts load before the first render.
63
+ * Ignored on web (fonts are loaded via CSS side-effect imports).
64
+ */
65
+ fonts?: Record<string, number>;
66
+ }
67
+ //# sourceMappingURL=rootLayoutShared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rootLayoutShared.d.ts","sourceRoot":"","sources":["../../src/app/rootLayoutShared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,UAAU;IACzB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,WAAW,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAC7C,oFAAoF;IACpF,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAC3C,8FAA8F;IAC9F,IAAI,EAAE,iBAAiB,CAAC;IACxB,qDAAqD;IACrD,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,oFAAoF;IACpF,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC"}
@@ -0,0 +1,3 @@
1
+ import type { ProviderComponent, TanstackConfig } from "./CreateApp";
2
+ export declare function createTanstackProvider(tanstackConfig: TanstackConfig): ProviderComponent;
3
+ //# sourceMappingURL=tanstackProvider.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tanstackProvider.native.d.ts","sourceRoot":"","sources":["../../src/app/tanstackProvider.native.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAErE,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,cAAc,GAAG,iBAAiB,CAQxF"}
@@ -0,0 +1,3 @@
1
+ /** Health check handler compatible with One framework +api.ts convention. */
2
+ export declare function GET(_request: Request): Promise<Response>;
3
+ //# sourceMappingURL=healthz.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"healthz.d.ts","sourceRoot":"","sources":["../src/healthz.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,wBAAsB,GAAG,CAAC,QAAQ,EAAE,OAAO,qBAE1C"}
@@ -0,0 +1,3 @@
1
+ export * from "./app/index";
2
+ export * from "./layouts/index";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,57 @@
1
+ import type { ComponentType, ReactNode } from "react";
2
+ import { type WithLayout } from "@multiplatform.one/platform";
3
+ export type SafeAreaEdge = "top" | "bottom" | "left" | "right";
4
+ export interface CreateDefaultLayoutOptions {
5
+ /**
6
+ * SafeArea wrapper component.
7
+ * Pass SafeAreaWrapper from @multiplatform.one/components.
8
+ */
9
+ SafeAreaWrapper?: ComponentType<any>;
10
+ /**
11
+ * Edges to apply safe area insets to.
12
+ * @default ["top", "left", "right"]
13
+ */
14
+ safeAreaEdges?: SafeAreaEdge[];
15
+ /**
16
+ * Background color token for the safe area wrapper.
17
+ * @default "$background"
18
+ */
19
+ safeAreaBackground?: string;
20
+ /**
21
+ * KeyboardAvoiding wrapper component.
22
+ * Pass KeyboardAvoidingWrapper from @multiplatform.one/components.
23
+ */
24
+ KeyboardAvoidingWrapper?: ComponentType<any>;
25
+ /**
26
+ * Background color token for the content area.
27
+ * @default "$background"
28
+ */
29
+ background?: string;
30
+ /**
31
+ * Toast component to render inside the layout.
32
+ */
33
+ Toast?: ComponentType;
34
+ /**
35
+ * Debug overlay configuration.
36
+ * - `true`: enable a minimal debug overlay (visible when DEBUG=1)
37
+ * - `ComponentType`: render this component as the debug view when DEBUG=1
38
+ */
39
+ debug?: boolean | ComponentType;
40
+ /**
41
+ * Additional layout HOCs to compose with the default layout.
42
+ */
43
+ extraLayouts?: WithLayout[];
44
+ }
45
+ export interface DefaultLayoutProps {
46
+ children: ReactNode;
47
+ }
48
+ /**
49
+ * Factory that creates a DefaultLayout component and withDefaultLayout HOC
50
+ * from configuration. Handles SafeArea, KeyboardAvoiding, fullscreen YStack,
51
+ * Toast, and optional debug overlay composition.
52
+ */
53
+ export declare function createDefaultLayout(options?: CreateDefaultLayoutOptions): {
54
+ DefaultLayout: ({ children }: DefaultLayoutProps) => import("react/jsx-runtime").JSX.Element;
55
+ withDefaultLayout: WithLayout;
56
+ };
57
+ //# sourceMappingURL=CreateDefaultLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateDefaultLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/CreateDefaultLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGtD,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEhF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,eAAe,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IAErC;;;OAGG;IACH,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAE/B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,uBAAuB,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IAE7C;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IAEtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;IAEhC;;OAEG;IACH,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,0BAA+B;kCAYrC,kBAAkB;;EAiDxD"}
@@ -0,0 +1,3 @@
1
+ export { createDefaultLayout } from "./CreateDefaultLayout";
2
+ export type { CreateDefaultLayoutOptions, DefaultLayoutProps, SafeAreaEdge, } from "./CreateDefaultLayout";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/layouts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EACV,0BAA0B,EAC1B,kBAAkB,EAClB,YAAY,GACb,MAAM,uBAAuB,CAAC"}
package/CHANGELOG.md DELETED
@@ -1,85 +0,0 @@
1
- # @multiplatform.one/core
2
-
3
- ## 6.0.4
4
-
5
- ### Patch Changes
6
-
7
- - Updated dependencies
8
- - @multiplatform.one/web3@6.0.4
9
- - @multiplatform.one/frappe@6.0.4
10
- - @multiplatform.one/frappe-ui@6.0.4
11
- - @multiplatform.one/i18n@6.0.4
12
- - @multiplatform.one/keycloak@6.0.4
13
- - @multiplatform.one/logger@6.0.4
14
- - @multiplatform.one/platform@6.0.4
15
- - @multiplatform.one/store@6.0.4
16
- - @multiplatform.one/theme@6.0.4
17
-
18
- ## 6.0.3
19
-
20
- ### Patch Changes
21
-
22
- - Updated dependencies
23
- - @multiplatform.one/web3@6.0.3
24
- - @multiplatform.one/frappe@6.0.3
25
- - @multiplatform.one/frappe-ui@6.0.3
26
- - @multiplatform.one/i18n@6.0.3
27
- - @multiplatform.one/keycloak@6.0.3
28
- - @multiplatform.one/logger@6.0.3
29
- - @multiplatform.one/platform@6.0.3
30
- - @multiplatform.one/store@6.0.3
31
- - @multiplatform.one/theme@6.0.3
32
-
33
- ## 6.0.2
34
-
35
- ### Patch Changes
36
-
37
- - Updated dependencies
38
- - @multiplatform.one/web3@6.0.2
39
- - @multiplatform.one/frappe@6.0.2
40
- - @multiplatform.one/frappe-ui@6.0.2
41
- - @multiplatform.one/i18n@6.0.2
42
- - @multiplatform.one/keycloak@6.0.2
43
- - @multiplatform.one/logger@6.0.2
44
- - @multiplatform.one/platform@6.0.2
45
- - @multiplatform.one/store@6.0.2
46
- - @multiplatform.one/theme@6.0.2
47
-
48
- ## 6.0.1
49
-
50
- ### Patch Changes
51
-
52
- - Updated dependencies
53
- - @multiplatform.one/web3@6.0.1
54
- - @multiplatform.one/frappe@6.0.1
55
- - @multiplatform.one/frappe-ui@6.0.1
56
- - @multiplatform.one/i18n@6.0.1
57
- - @multiplatform.one/keycloak@6.0.1
58
- - @multiplatform.one/logger@6.0.1
59
- - @multiplatform.one/platform@6.0.1
60
- - @multiplatform.one/store@6.0.1
61
- - @multiplatform.one/theme@6.0.1
62
-
63
- ## 6.0.0
64
-
65
- ### Major Changes
66
-
67
- - Unified 6.0.0 release: realign all public `@multiplatform.one/*` packages onto a single, matching version line (changesets `fixed` group). Highlights:
68
- - **web3 split** into standalone `@multiplatform.one/connectkit` and `@multiplatform.one/gpg` packages; `web3` now depends on them instead of bundling ConnectKit.
69
- - **Sign-In With GPG** screen added to the ConnectKit modal.
70
- - **Native workspace web-resolution fix** + platform-split wrappers (rich-text / `TextEditor`, forms `Barcode`) so web-only libraries stay out of the native Hermes bundle.
71
-
72
- From this release on, these packages are versioned together.
73
-
74
- ### Patch Changes
75
-
76
- - Updated dependencies
77
- - @multiplatform.one/frappe@6.0.0
78
- - @multiplatform.one/frappe-ui@6.0.0
79
- - @multiplatform.one/i18n@6.0.0
80
- - @multiplatform.one/keycloak@6.0.0
81
- - @multiplatform.one/logger@6.0.0
82
- - @multiplatform.one/platform@6.0.0
83
- - @multiplatform.one/store@6.0.0
84
- - @multiplatform.one/theme@6.0.0
85
- - @multiplatform.one/web3@6.0.0
package/tsconfig.json DELETED
@@ -1,11 +0,0 @@
1
- {
2
- "$schema": "https://json.schemastore.org/tsconfig",
3
- "extends": "../../tsconfig.base.json",
4
- "compilerOptions": {
5
- "composite": false,
6
- "noEmit": true
7
- },
8
- "include": ["src/**/*"],
9
- "exclude": ["node_modules"],
10
- "references": []
11
- }