@multiplatform.one/core 7.0.0 → 7.2.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.
@@ -0,0 +1,385 @@
1
+ import { EventClient } from "@tanstack/devtools-event-client";
2
+ import { useEffect } from "react";
3
+
4
+ // ---------------------------------------------------------------------------
5
+ // Keyboard trigger
6
+ // ---------------------------------------------------------------------------
7
+
8
+ /**
9
+ * Keyboard shortcut that toggles the devtools shell (Ctrl+` / Cmd+`).
10
+ * Handled inside `@tanstack/react-devtools`, which skips editable targets
11
+ * (inputs, textareas, contentEditable), so it cannot collide with app
12
+ * typing. Exported so tests pin the binding.
13
+ */
14
+ export const devtoolsOpenHotkey = ["CtrlOrMeta", "`"] as const;
15
+
16
+ // ---------------------------------------------------------------------------
17
+ // Programmatic open — the same event the devtools shell's own trigger emits
18
+ // ---------------------------------------------------------------------------
19
+
20
+ /**
21
+ * Plugin id of the TanStack Devtools shell's internal event client
22
+ * (`devtoolsEventClient` in `@tanstack/devtools-client`). The shell
23
+ * subscribes to `<pluginId>:trigger-toggled` and opens/closes on the
24
+ * payload's `isOpen`. The spec asserts both strings
25
+ * against the installed packages so an upstream rename fails the build
26
+ * instead of silently breaking shake-to-open.
27
+ */
28
+ export const devtoolsShellPluginId = "tanstack-devtools-core";
29
+
30
+ /** Event suffix the shell listens on for open/close state changes. */
31
+ export const devtoolsTriggerToggledEvent = "trigger-toggled";
32
+
33
+ interface DevtoolsShellEventMap {
34
+ "trigger-toggled": { isOpen: boolean };
35
+ }
36
+
37
+ let shellEventClient: EventClient<DevtoolsShellEventMap> | undefined;
38
+
39
+ /**
40
+ * Open the TanStack Devtools shell programmatically by emitting the same
41
+ * bus event the shell's own (hidden) trigger button uses. Open-only by
42
+ * design: a continued shake must not immediately re-close the panel —
43
+ * closing stays on the close button / Escape / the keyboard shortcut.
44
+ * The event client queues emits until the bus connects, so an early shake
45
+ * racing the shell mount is still delivered.
46
+ */
47
+ export function openDevtoolsShell() {
48
+ shellEventClient ??= new EventClient<DevtoolsShellEventMap>({
49
+ pluginId: devtoolsShellPluginId,
50
+ });
51
+ shellEventClient.emit(devtoolsTriggerToggledEvent, { isOpen: true });
52
+ }
53
+
54
+ // ---------------------------------------------------------------------------
55
+ // Shake detection — pure state machine over devicemotion samples
56
+ // ---------------------------------------------------------------------------
57
+
58
+ const gravityMs2 = 9.81;
59
+
60
+ /** Defaults: deliberate shakes peak 15–25 m/s²; walking/bumps stay under ~8. */
61
+ export const shakeDefaults = {
62
+ /** m/s² a sample must exceed to count as a shake peak. */
63
+ threshold: 12,
64
+ /** Minimum ms between counted peaks (one swing = one peak, not many samples). */
65
+ minPeakGapMs: 80,
66
+ /** Peaks required inside the rolling window to fire. */
67
+ peakCount: 3,
68
+ /** Rolling window (ms) the peaks must land in. */
69
+ windowMs: 1000,
70
+ /** Dead time (ms) after firing before the detector re-arms. */
71
+ cooldownMs: 2000,
72
+ } as const;
73
+
74
+ interface MotionAxes {
75
+ x?: number | null;
76
+ y?: number | null;
77
+ z?: number | null;
78
+ }
79
+
80
+ /** Structural subset of DeviceMotionEvent the detector needs (testable in node). */
81
+ export interface MotionEventLike {
82
+ acceleration?: MotionAxes | null;
83
+ accelerationIncludingGravity?: MotionAxes | null;
84
+ }
85
+
86
+ /**
87
+ * Acceleration magnitude (m/s²) of a devicemotion sample. Prefers the
88
+ * gravity-excluded reading; falls back to the including-gravity reading
89
+ * minus standard gravity. Returns null when the event carries no data
90
+ * (some desktop browsers fire devicemotion with all-null axes).
91
+ */
92
+ export function motionMagnitude(event: MotionEventLike): number | null {
93
+ const a = event.acceleration;
94
+ if (a && (a.x != null || a.y != null || a.z != null)) {
95
+ return Math.hypot(a.x ?? 0, a.y ?? 0, a.z ?? 0);
96
+ }
97
+ const g = event.accelerationIncludingGravity;
98
+ if (g && (g.x != null || g.y != null || g.z != null)) {
99
+ return Math.abs(Math.hypot(g.x ?? 0, g.y ?? 0, g.z ?? 0) - gravityMs2);
100
+ }
101
+ return null;
102
+ }
103
+
104
+ export interface ShakeDetectorOptions {
105
+ onShake: () => void;
106
+ threshold?: number;
107
+ minPeakGapMs?: number;
108
+ peakCount?: number;
109
+ windowMs?: number;
110
+ cooldownMs?: number;
111
+ }
112
+
113
+ export interface ShakeDetector {
114
+ /** Feed a devicemotion sample. `now` is injectable for tests. */
115
+ handleMotion: (event: MotionEventLike, now?: number) => void;
116
+ /** Drop all peaks and cooldown state. */
117
+ reset: () => void;
118
+ }
119
+
120
+ /**
121
+ * Debounced shake detector: fires `onShake` when `peakCount` peaks above
122
+ * `threshold` (each at least `minPeakGapMs` apart) land inside a rolling
123
+ * `windowMs`, then goes dead for `cooldownMs` before re-arming.
124
+ */
125
+ export function createShakeDetector({
126
+ onShake,
127
+ threshold = shakeDefaults.threshold,
128
+ minPeakGapMs = shakeDefaults.minPeakGapMs,
129
+ peakCount = shakeDefaults.peakCount,
130
+ windowMs = shakeDefaults.windowMs,
131
+ cooldownMs = shakeDefaults.cooldownMs,
132
+ }: ShakeDetectorOptions): ShakeDetector {
133
+ let peaks: number[] = [];
134
+ let lastPeakAt = Number.NEGATIVE_INFINITY;
135
+ let cooldownUntil = Number.NEGATIVE_INFINITY;
136
+
137
+ function reset() {
138
+ peaks = [];
139
+ lastPeakAt = Number.NEGATIVE_INFINITY;
140
+ cooldownUntil = Number.NEGATIVE_INFINITY;
141
+ }
142
+
143
+ function handleMotion(event: MotionEventLike, now: number = Date.now()) {
144
+ if (now < cooldownUntil) return;
145
+ const magnitude = motionMagnitude(event);
146
+ if (magnitude == null || magnitude <= threshold) return;
147
+ if (now - lastPeakAt < minPeakGapMs) return;
148
+ lastPeakAt = now;
149
+ peaks = peaks.filter((at) => now - at <= windowMs);
150
+ peaks.push(now);
151
+ if (peaks.length < peakCount) return;
152
+ peaks = [];
153
+ lastPeakAt = Number.NEGATIVE_INFINITY;
154
+ cooldownUntil = now + cooldownMs;
155
+ onShake();
156
+ }
157
+
158
+ return { handleMotion, reset };
159
+ }
160
+
161
+ // ---------------------------------------------------------------------------
162
+ // Motion permission — iOS 13+ WebKit gesture-gated grant flow
163
+ // ---------------------------------------------------------------------------
164
+
165
+ export type MotionPermissionState = "granted" | "awaiting-gesture" | "requesting" | "denied";
166
+
167
+ export interface MotionPermissionFlow {
168
+ readonly state: MotionPermissionState;
169
+ /**
170
+ * Call from a user gesture (pointerup/click). Resolves once the
171
+ * permission settles; no-ops unless state is "awaiting-gesture".
172
+ */
173
+ handleGesture: () => Promise<void>;
174
+ }
175
+
176
+ /**
177
+ * Permission state machine. Platforms without
178
+ * `DeviceMotionEvent.requestPermission` (Android, desktop) grant
179
+ * immediately; iOS WebKit waits for a user gesture, asks once, and lands
180
+ * on granted or denied. A denial is terminal for this page load — Safari
181
+ * remembers the answer per site, so later loads resolve silently.
182
+ */
183
+ export function createMotionPermissionFlow({
184
+ requestPermission,
185
+ onGranted,
186
+ onDenied,
187
+ }: {
188
+ requestPermission?: () => Promise<string>;
189
+ onGranted: () => void;
190
+ onDenied?: () => void;
191
+ }): MotionPermissionFlow {
192
+ let state: MotionPermissionState = requestPermission ? "awaiting-gesture" : "granted";
193
+ if (state === "granted") onGranted();
194
+
195
+ async function handleGesture() {
196
+ if (state !== "awaiting-gesture" || !requestPermission) return;
197
+ state = "requesting";
198
+ let result: string;
199
+ try {
200
+ result = await requestPermission();
201
+ } catch {
202
+ // requestPermission rejects when called outside a user gesture or in
203
+ // an insecure context — treat as denied for this load.
204
+ result = "denied";
205
+ }
206
+ if (result === "granted") {
207
+ state = "granted";
208
+ onGranted();
209
+ } else {
210
+ state = "denied";
211
+ onDenied?.();
212
+ }
213
+ }
214
+
215
+ return {
216
+ get state() {
217
+ return state;
218
+ },
219
+ handleGesture,
220
+ };
221
+ }
222
+
223
+ // ---------------------------------------------------------------------------
224
+ // Motion arming — a DELIBERATE, app-driven grant (no arbitrary tap grab)
225
+ // ---------------------------------------------------------------------------
226
+
227
+ interface DeviceMotionEventConstructorLike {
228
+ requestPermission?: () => Promise<string>;
229
+ }
230
+
231
+ function motionEventCtor(): DeviceMotionEventConstructorLike | undefined {
232
+ return (globalThis as { DeviceMotionEvent?: DeviceMotionEventConstructorLike }).DeviceMotionEvent;
233
+ }
234
+
235
+ /**
236
+ * True only on the platform that gates devicemotion behind a user-gesture
237
+ * grant: iOS 13+ WebKit exposes `DeviceMotionEvent.requestPermission`.
238
+ * Android and desktop return false — they deliver motion events without a
239
+ * prompt, so shake-to-open arms itself there and no trigger UI is needed.
240
+ */
241
+ export function isMotionPermissionRequired(): boolean {
242
+ return typeof motionEventCtor()?.requestPermission === "function";
243
+ }
244
+
245
+ /**
246
+ * The window event an app dispatches from a DELIBERATE user gesture to arm
247
+ * shake-to-open on iOS (e.g. the SHC console's triple-tap on the build
248
+ * number in Settings › Estate). It is a window CustomEvent rather than an
249
+ * imported function on purpose: the trigger lives in a feature package that
250
+ * does not — and must not — depend on this core build. `dispatchEvent` is
251
+ * synchronous, so the `requestPermission()` this fires runs INSIDE the
252
+ * originating gesture's call stack, which is the whole reason iOS accepts
253
+ * it. `armDevtoolsMotion()` dispatches it for callers that CAN import core.
254
+ */
255
+ export const devtoolsArmMotionEvent = "mpo:devtools-arm-motion";
256
+
257
+ /**
258
+ * The window event core dispatches back once an arm attempt settles, so a
259
+ * trigger UI can report the honest outcome. `detail.granted` is true only
260
+ * when motion is now live.
261
+ */
262
+ export const devtoolsMotionArmedEvent = "mpo:devtools-motion-armed";
263
+
264
+ // The grant is a one-shot module latch plus a set of attachers (one per
265
+ // mounted `useShakeToOpen`). Once granted, a shell that mounts LATER — a
266
+ // colour-scheme change remounts it under a new key — attaches immediately
267
+ // instead of waiting for a second arm gesture.
268
+ let motionGranted = false;
269
+ const motionAttachers = new Set<() => void>();
270
+
271
+ function registerMotionAttacher(attach: () => void): () => void {
272
+ if (motionGranted) {
273
+ attach();
274
+ return () => {};
275
+ }
276
+ motionAttachers.add(attach);
277
+ return () => {
278
+ motionAttachers.delete(attach);
279
+ };
280
+ }
281
+
282
+ function grantAndAttachAll() {
283
+ motionGranted = true;
284
+ // Safe to iterate directly: `attach` adds a devicemotion listener and
285
+ // never mutates the set, and a shell mounting mid-grant sees
286
+ // motionGranted === true and attaches without registering.
287
+ for (const attach of motionAttachers) attach();
288
+ }
289
+
290
+ /** Test seam: forget the grant and drop attachers between cases. */
291
+ export function __resetMotionArming() {
292
+ motionGranted = false;
293
+ motionAttachers.clear();
294
+ }
295
+
296
+ /**
297
+ * Request motion permission from within a user gesture and, on grant,
298
+ * attach every waiting shake listener. Idempotent once granted. Resolves
299
+ * to the settled permission state; a denial is terminal for this page load
300
+ * (Safari remembers it per site). Broadcast the outcome on
301
+ * `devtoolsMotionArmedEvent` so a trigger UI can report it.
302
+ */
303
+ export async function requestMotionPermissionFromGesture(): Promise<MotionPermissionState> {
304
+ if (motionGranted) return "granted";
305
+ const ctor = motionEventCtor();
306
+ const flow = createMotionPermissionFlow({
307
+ // Invoke as a static method on the constructor — a detached reference
308
+ // throws in WebKit.
309
+ requestPermission:
310
+ typeof ctor?.requestPermission === "function" ? () => ctor.requestPermission!() : undefined,
311
+ onGranted: grantAndAttachAll,
312
+ });
313
+ // Non-iOS: the flow granted (and attached) synchronously in its
314
+ // constructor — nothing to await.
315
+ if (flow.state !== "granted") await flow.handleGesture();
316
+ if (typeof window !== "undefined") {
317
+ window.dispatchEvent(
318
+ new CustomEvent(devtoolsMotionArmedEvent, {
319
+ detail: { granted: flow.state === "granted" },
320
+ }),
321
+ );
322
+ }
323
+ return flow.state;
324
+ }
325
+
326
+ /**
327
+ * Arm shake-to-open programmatically. For callers that CAN import core
328
+ * (the app layer); a feature package instead dispatches
329
+ * `devtoolsArmMotionEvent` directly. Must be called from a user gesture on
330
+ * iOS. No-op on the server.
331
+ */
332
+ export function armDevtoolsMotion(): void {
333
+ if (typeof window === "undefined") return;
334
+ window.dispatchEvent(new Event(devtoolsArmMotionEvent));
335
+ }
336
+
337
+ // ---------------------------------------------------------------------------
338
+ // React wiring
339
+ // ---------------------------------------------------------------------------
340
+
341
+ /**
342
+ * Shake-to-open for the devtools shell. Attaches a `devicemotion` listener
343
+ * and opens the shell on a detected shake. Desktop browsers deliver no
344
+ * devicemotion events, so the listener is inert there — the keyboard
345
+ * shortcut is the desktop path.
346
+ *
347
+ * iOS 13+ gates devicemotion behind a permission prompt that can ONLY be
348
+ * requested from a user gesture, and the first shake cannot self-grant. So
349
+ * on iOS the listener attaches only after the app arms it — by dispatching
350
+ * `devtoolsArmMotionEvent` from a deliberate gesture (the console wires the
351
+ * build-number triple-tap). Android/desktop attach immediately. SSR-safe;
352
+ * every listener is torn down on unmount.
353
+ */
354
+ export function useShakeToOpen(enabled: boolean, onShake: () => void = openDevtoolsShell) {
355
+ useEffect(() => {
356
+ if (!enabled || typeof window === "undefined") return;
357
+
358
+ const detector = createShakeDetector({ onShake });
359
+ const motionListener = (event: Event) =>
360
+ detector.handleMotion(event as unknown as MotionEventLike);
361
+ const attach = () => window.addEventListener("devicemotion", motionListener, { passive: true });
362
+ const detach = () => window.removeEventListener("devicemotion", motionListener);
363
+
364
+ if (!isMotionPermissionRequired()) {
365
+ // Android / desktop: no grant needed — listen right away.
366
+ attach();
367
+ return detach;
368
+ }
369
+
370
+ // iOS: attach now if a prior deliberate arm already granted; otherwise
371
+ // wait for the app's arm event (dispatched from a user gesture, so the
372
+ // permission request it fires stays inside that gesture's stack).
373
+ const removeAttacher = registerMotionAttacher(attach);
374
+ const armListener = () => {
375
+ void requestMotionPermissionFromGesture();
376
+ };
377
+ window.addEventListener(devtoolsArmMotionEvent, armListener);
378
+
379
+ return () => {
380
+ detach();
381
+ removeAttacher();
382
+ window.removeEventListener(devtoolsArmMotionEvent, armListener);
383
+ };
384
+ }, [enabled, onShake]);
385
+ }
@@ -15,6 +15,15 @@ export declare function followPageOriginForLoopback(configured: string): string;
15
15
  export interface TanstackConfig {
16
16
  /** Show React Query devtools (web only, ignored on native and in Storybook). */
17
17
  debug?: boolean;
18
+ /**
19
+ * Shake the device to open the devtools shell (web only; requires
20
+ * `debug`). Defaults to true whenever the devtools mount. On iOS 13+
21
+ * WebKit the motion permission is requested once from the user's first
22
+ * tap; Android and desktop need no permission (desktop simply never
23
+ * fires devicemotion — use the Ctrl/Cmd+` shortcut there). Set false to
24
+ * keep the keyboard shortcut as the only trigger.
25
+ */
26
+ shakeToOpen?: boolean;
18
27
  /** Options forwarded to the QueryClient constructor. */
19
28
  queryClientOptions?: Record<string, unknown>;
20
29
  /**
@@ -33,6 +42,22 @@ export interface TanstackConfig {
33
42
  * Passed automatically by `createApp()` from the theme config.
34
43
  */
35
44
  tamaguiConfig?: unknown;
45
+ /**
46
+ * Theme COLOR names the devtools panel offers in its accent dropdown
47
+ * (e.g. `["", "blue", "green", "purple"]`; `""` is the base theme).
48
+ * The panel renders the dropdown only when this AND `onThemeColorChange`
49
+ * are both set, and only then does the panel's Randomize action touch the
50
+ * accent — otherwise the picker is inert.
51
+ */
52
+ themeColors?: string[];
53
+ /** The theme color the app currently has applied (`""` for the base). */
54
+ currentThemeColor?: string;
55
+ /**
56
+ * Apply a theme color the user picked. The app owns this because a theme
57
+ * color is app state, not devtools state: the panel changes nothing on its
58
+ * own, it hands the choice back.
59
+ */
60
+ onThemeColorChange?: (color: string) => void;
36
61
  }
37
62
  export interface KeycloakConfig {
38
63
  /** Force-enable or disable. When omitted, reads KEYCLOAK_ENABLED from env config. */
@@ -1 +1 @@
1
- {"version":3,"file":"CreateApp.d.ts","sourceRoot":"","sources":["../../src/app/CreateApp.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CreateApp.d.ts","sourceRoot":"","sources":["../../src/app/CreateApp.tsx"],"names":[],"mappings":"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"}
@@ -1 +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"}
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;AAQtD,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,CA4L3E"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Publishes the SSR-resolved PUBLIC config into the served document.
3
+ *
4
+ * Mounted in `<head>` by `createRootLayout` (web). Deliberately the SAME shape
5
+ * one uses for `__one_server_context__` — an inline `<script>` assigning a
6
+ * `globalThis` key, `async` + `href` so React 19 keys it stably, and
7
+ * `suppressHydrationWarning` because the client renders an EMPTY body for the
8
+ * already-executed script (one's `server/ServerContextScript` does exactly
9
+ * this). It is a sibling payload on the established seam, not a second
10
+ * transport.
11
+ *
12
+ * XSS: the injected string is NOT user content. It is built by
13
+ * `serializeRuntimePublicConfig`, which (a) walks the BUILD-TIME public key
14
+ * allowlist rather than any request-derived input, and (b) emits the values
15
+ * through a JSON serializer that escapes `<`, `>`, U+2028 and U+2029 — so the
16
+ * body cannot close its own `</script>` tag or terminate a JS statement. This
17
+ * is the same sanitizer shape one ships as `utils/htmlEscape.safeJsonStringify`
18
+ * for the server-context payload. React offers no other way to emit a script
19
+ * body: text children of `<script>` are HTML-escaped, which would corrupt the
20
+ * JSON quoting.
21
+ *
22
+ * Ordering: an inline classic script in `<head>` runs during document parse,
23
+ * while the app bundle is a deferred module script — so `globalThis` already
24
+ * carries the payload by the time `@multiplatform.one/platform` constructs its
25
+ * `Config`.
26
+ *
27
+ * On the browser the body is empty: `serializeRuntimePublicConfig()` reads
28
+ * `process.env`, which only exists on the server. Rendering it client-side
29
+ * would publish an EMPTY payload over the real one.
30
+ */
31
+ export declare function RuntimePublicConfigScript(): import("react/jsx-runtime").JSX.Element;
32
+ export declare namespace RuntimePublicConfigScript {
33
+ var displayName: string;
34
+ }
35
+ //# sourceMappingURL=RuntimePublicConfigScript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuntimePublicConfigScript.d.ts","sourceRoot":"","sources":["../../src/app/RuntimePublicConfigScript.tsx"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,yBAAyB,4CAgBxC;yBAhBe,yBAAyB"}
@@ -1 +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"}
1
+ {"version":3,"file":"TanstackDevtools.d.ts","sourceRoot":"","sources":["../../src/app/TanstackDevtools.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAoClD,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,2CAiEvB"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Keyboard shortcut that toggles the devtools shell (Ctrl+` / Cmd+`).
3
+ * Handled inside `@tanstack/react-devtools`, which skips editable targets
4
+ * (inputs, textareas, contentEditable), so it cannot collide with app
5
+ * typing. Exported so tests pin the binding.
6
+ */
7
+ export declare const devtoolsOpenHotkey: readonly ["CtrlOrMeta", "`"];
8
+ /**
9
+ * Plugin id of the TanStack Devtools shell's internal event client
10
+ * (`devtoolsEventClient` in `@tanstack/devtools-client`). The shell
11
+ * subscribes to `<pluginId>:trigger-toggled` and opens/closes on the
12
+ * payload's `isOpen`. The spec asserts both strings
13
+ * against the installed packages so an upstream rename fails the build
14
+ * instead of silently breaking shake-to-open.
15
+ */
16
+ export declare const devtoolsShellPluginId = "tanstack-devtools-core";
17
+ /** Event suffix the shell listens on for open/close state changes. */
18
+ export declare const devtoolsTriggerToggledEvent = "trigger-toggled";
19
+ /**
20
+ * Open the TanStack Devtools shell programmatically by emitting the same
21
+ * bus event the shell's own (hidden) trigger button uses. Open-only by
22
+ * design: a continued shake must not immediately re-close the panel —
23
+ * closing stays on the close button / Escape / the keyboard shortcut.
24
+ * The event client queues emits until the bus connects, so an early shake
25
+ * racing the shell mount is still delivered.
26
+ */
27
+ export declare function openDevtoolsShell(): void;
28
+ /** Defaults: deliberate shakes peak 15–25 m/s²; walking/bumps stay under ~8. */
29
+ export declare const shakeDefaults: {
30
+ /** m/s² a sample must exceed to count as a shake peak. */
31
+ readonly threshold: 12;
32
+ /** Minimum ms between counted peaks (one swing = one peak, not many samples). */
33
+ readonly minPeakGapMs: 80;
34
+ /** Peaks required inside the rolling window to fire. */
35
+ readonly peakCount: 3;
36
+ /** Rolling window (ms) the peaks must land in. */
37
+ readonly windowMs: 1000;
38
+ /** Dead time (ms) after firing before the detector re-arms. */
39
+ readonly cooldownMs: 2000;
40
+ };
41
+ interface MotionAxes {
42
+ x?: number | null;
43
+ y?: number | null;
44
+ z?: number | null;
45
+ }
46
+ /** Structural subset of DeviceMotionEvent the detector needs (testable in node). */
47
+ export interface MotionEventLike {
48
+ acceleration?: MotionAxes | null;
49
+ accelerationIncludingGravity?: MotionAxes | null;
50
+ }
51
+ /**
52
+ * Acceleration magnitude (m/s²) of a devicemotion sample. Prefers the
53
+ * gravity-excluded reading; falls back to the including-gravity reading
54
+ * minus standard gravity. Returns null when the event carries no data
55
+ * (some desktop browsers fire devicemotion with all-null axes).
56
+ */
57
+ export declare function motionMagnitude(event: MotionEventLike): number | null;
58
+ export interface ShakeDetectorOptions {
59
+ onShake: () => void;
60
+ threshold?: number;
61
+ minPeakGapMs?: number;
62
+ peakCount?: number;
63
+ windowMs?: number;
64
+ cooldownMs?: number;
65
+ }
66
+ export interface ShakeDetector {
67
+ /** Feed a devicemotion sample. `now` is injectable for tests. */
68
+ handleMotion: (event: MotionEventLike, now?: number) => void;
69
+ /** Drop all peaks and cooldown state. */
70
+ reset: () => void;
71
+ }
72
+ /**
73
+ * Debounced shake detector: fires `onShake` when `peakCount` peaks above
74
+ * `threshold` (each at least `minPeakGapMs` apart) land inside a rolling
75
+ * `windowMs`, then goes dead for `cooldownMs` before re-arming.
76
+ */
77
+ export declare function createShakeDetector({ onShake, threshold, minPeakGapMs, peakCount, windowMs, cooldownMs, }: ShakeDetectorOptions): ShakeDetector;
78
+ export type MotionPermissionState = "granted" | "awaiting-gesture" | "requesting" | "denied";
79
+ export interface MotionPermissionFlow {
80
+ readonly state: MotionPermissionState;
81
+ /**
82
+ * Call from a user gesture (pointerup/click). Resolves once the
83
+ * permission settles; no-ops unless state is "awaiting-gesture".
84
+ */
85
+ handleGesture: () => Promise<void>;
86
+ }
87
+ /**
88
+ * Permission state machine. Platforms without
89
+ * `DeviceMotionEvent.requestPermission` (Android, desktop) grant
90
+ * immediately; iOS WebKit waits for a user gesture, asks once, and lands
91
+ * on granted or denied. A denial is terminal for this page load — Safari
92
+ * remembers the answer per site, so later loads resolve silently.
93
+ */
94
+ export declare function createMotionPermissionFlow({ requestPermission, onGranted, onDenied, }: {
95
+ requestPermission?: () => Promise<string>;
96
+ onGranted: () => void;
97
+ onDenied?: () => void;
98
+ }): MotionPermissionFlow;
99
+ /**
100
+ * True only on the platform that gates devicemotion behind a user-gesture
101
+ * grant: iOS 13+ WebKit exposes `DeviceMotionEvent.requestPermission`.
102
+ * Android and desktop return false — they deliver motion events without a
103
+ * prompt, so shake-to-open arms itself there and no trigger UI is needed.
104
+ */
105
+ export declare function isMotionPermissionRequired(): boolean;
106
+ /**
107
+ * The window event an app dispatches from a DELIBERATE user gesture to arm
108
+ * shake-to-open on iOS (e.g. the SHC console's triple-tap on the build
109
+ * number in Settings › Estate). It is a window CustomEvent rather than an
110
+ * imported function on purpose: the trigger lives in a feature package that
111
+ * does not — and must not — depend on this core build. `dispatchEvent` is
112
+ * synchronous, so the `requestPermission()` this fires runs INSIDE the
113
+ * originating gesture's call stack, which is the whole reason iOS accepts
114
+ * it. `armDevtoolsMotion()` dispatches it for callers that CAN import core.
115
+ */
116
+ export declare const devtoolsArmMotionEvent = "mpo:devtools-arm-motion";
117
+ /**
118
+ * The window event core dispatches back once an arm attempt settles, so a
119
+ * trigger UI can report the honest outcome. `detail.granted` is true only
120
+ * when motion is now live.
121
+ */
122
+ export declare const devtoolsMotionArmedEvent = "mpo:devtools-motion-armed";
123
+ /** Test seam: forget the grant and drop attachers between cases. */
124
+ export declare function __resetMotionArming(): void;
125
+ /**
126
+ * Request motion permission from within a user gesture and, on grant,
127
+ * attach every waiting shake listener. Idempotent once granted. Resolves
128
+ * to the settled permission state; a denial is terminal for this page load
129
+ * (Safari remembers it per site). Broadcast the outcome on
130
+ * `devtoolsMotionArmedEvent` so a trigger UI can report it.
131
+ */
132
+ export declare function requestMotionPermissionFromGesture(): Promise<MotionPermissionState>;
133
+ /**
134
+ * Arm shake-to-open programmatically. For callers that CAN import core
135
+ * (the app layer); a feature package instead dispatches
136
+ * `devtoolsArmMotionEvent` directly. Must be called from a user gesture on
137
+ * iOS. No-op on the server.
138
+ */
139
+ export declare function armDevtoolsMotion(): void;
140
+ /**
141
+ * Shake-to-open for the devtools shell. Attaches a `devicemotion` listener
142
+ * and opens the shell on a detected shake. Desktop browsers deliver no
143
+ * devicemotion events, so the listener is inert there — the keyboard
144
+ * shortcut is the desktop path.
145
+ *
146
+ * iOS 13+ gates devicemotion behind a permission prompt that can ONLY be
147
+ * requested from a user gesture, and the first shake cannot self-grant. So
148
+ * on iOS the listener attaches only after the app arms it — by dispatching
149
+ * `devtoolsArmMotionEvent` from a deliberate gesture (the console wires the
150
+ * build-number triple-tap). Android/desktop attach immediately. SSR-safe;
151
+ * every listener is torn down on unmount.
152
+ */
153
+ export declare function useShakeToOpen(enabled: boolean, onShake?: () => void): void;
154
+ export {};
155
+ //# sourceMappingURL=devtoolsTrigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtoolsTrigger.d.ts","sourceRoot":"","sources":["../../src/app/devtoolsTrigger.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,8BAA+B,CAAC;AAM/D;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAE9D,sEAAsE;AACtE,eAAO,MAAM,2BAA2B,oBAAoB,CAAC;AAQ7D;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,SAKhC;AAQD,gFAAgF;AAChF,eAAO,MAAM,aAAa;IACxB,0DAA0D;;IAE1D,iFAAiF;;IAEjF,wDAAwD;;IAExD,kDAAkD;;IAElD,+DAA+D;;CAEvD,CAAC;AAEX,UAAU,UAAU;IAClB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnB;AAED,oFAAoF;AACpF,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,4BAA4B,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;CAClD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAUrE;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,YAAY,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,yCAAyC;IACzC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,SAAmC,EACnC,YAAyC,EACzC,SAAmC,EACnC,QAAiC,EACjC,UAAqC,GACtC,EAAE,oBAAoB,GAAG,aAAa,CA2BtC;AAMD,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,kBAAkB,GAAG,YAAY,GAAG,QAAQ,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC;;;OAGG;IACH,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,EACzC,iBAAiB,EACjB,SAAS,EACT,QAAQ,GACT,EAAE;IACD,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,GAAG,oBAAoB,CA8BvB;AAcD;;;;;GAKG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,4BAA4B,CAAC;AAEhE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,8BAA8B,CAAC;AA4BpE,oEAAoE;AACpE,wBAAgB,mBAAmB,SAGlC;AAED;;;;;;GAMG;AACH,wBAAsB,kCAAkC,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAqBzF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,MAAM,IAAwB,QA+BvF"}