@sigx/lynx-navigation 0.4.0 → 0.4.1
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.
- package/dist/components/Drawer.js +74 -0
- package/dist/components/Drawer.js.map +1 -0
- package/dist/components/EdgeBackHandle.js +144 -0
- package/dist/components/EdgeBackHandle.js.map +1 -0
- package/dist/components/EntryScope.d.ts +1 -1
- package/dist/components/EntryScope.d.ts.map +1 -1
- package/dist/components/EntryScope.js +39 -0
- package/dist/components/EntryScope.js.map +1 -0
- package/dist/components/Header.js +103 -0
- package/dist/components/Header.js.map +1 -0
- package/dist/components/Layer.d.ts +2 -2
- package/dist/components/Layer.d.ts.map +1 -1
- package/dist/components/Layer.js +66 -0
- package/dist/components/Layer.js.map +1 -0
- package/dist/components/Link.d.ts +2 -2
- package/dist/components/Link.d.ts.map +1 -1
- package/dist/components/Link.js +51 -0
- package/dist/components/Link.js.map +1 -0
- package/dist/components/NavigationRoot.d.ts +2 -2
- package/dist/components/NavigationRoot.d.ts.map +1 -1
- package/dist/components/NavigationRoot.js +67 -0
- package/dist/components/NavigationRoot.js.map +1 -0
- package/dist/components/Screen.js +98 -0
- package/dist/components/Screen.js.map +1 -0
- package/dist/components/Stack.js +257 -0
- package/dist/components/Stack.js.map +1 -0
- package/dist/components/TabBar.d.ts +1 -1
- package/dist/components/TabBar.d.ts.map +1 -1
- package/dist/components/TabBar.js +63 -0
- package/dist/components/TabBar.js.map +1 -0
- package/dist/components/Tabs.js +168 -0
- package/dist/components/Tabs.js.map +1 -0
- package/dist/define-routes.d.ts +1 -1
- package/dist/define-routes.d.ts.map +1 -1
- package/{src/define-routes.d.ts → dist/define-routes.js} +4 -2
- package/dist/define-routes.js.map +1 -0
- package/dist/hooks/use-focus.js +87 -0
- package/dist/hooks/use-focus.js.map +1 -0
- package/dist/hooks/use-hardware-back.js +84 -0
- package/dist/hooks/use-hardware-back.js.map +1 -0
- package/dist/hooks/use-linking-nav.d.ts +3 -3
- package/dist/hooks/use-linking-nav.d.ts.map +1 -1
- package/dist/hooks/use-linking-nav.js +109 -0
- package/dist/hooks/use-linking-nav.js.map +1 -0
- package/dist/hooks/use-nav-internal.d.ts +2 -2
- package/dist/hooks/use-nav-internal.d.ts.map +1 -1
- package/dist/hooks/use-nav-internal.js +55 -0
- package/dist/hooks/use-nav-internal.js.map +1 -0
- package/dist/hooks/use-nav-serializer.d.ts +1 -1
- package/dist/hooks/use-nav-serializer.d.ts.map +1 -1
- package/dist/hooks/use-nav-serializer.js +181 -0
- package/dist/hooks/use-nav-serializer.js.map +1 -0
- package/dist/hooks/use-nav.d.ts +2 -2
- package/dist/hooks/use-nav.d.ts.map +1 -1
- package/dist/hooks/use-nav.js +11 -0
- package/dist/hooks/use-nav.js.map +1 -0
- package/dist/hooks/use-params.d.ts +1 -1
- package/dist/hooks/use-params.d.ts.map +1 -1
- package/{src/hooks/use-params.d.ts → dist/hooks/use-params.js} +6 -2
- package/dist/hooks/use-params.js.map +1 -0
- package/dist/hooks/use-screen-chrome.d.ts +1 -1
- package/dist/hooks/use-screen-chrome.d.ts.map +1 -1
- package/dist/hooks/use-screen-chrome.js +102 -0
- package/dist/hooks/use-screen-chrome.js.map +1 -0
- package/dist/hooks/use-screen-options.d.ts +1 -1
- package/dist/hooks/use-screen-options.d.ts.map +1 -1
- package/dist/hooks/use-screen-options.js +43 -0
- package/dist/hooks/use-screen-options.js.map +1 -0
- package/dist/hooks/use-search.d.ts +1 -1
- package/dist/hooks/use-search.d.ts.map +1 -1
- package/{src/hooks/use-search.d.ts → dist/hooks/use-search.js} +6 -2
- package/dist/hooks/use-search.js.map +1 -0
- package/dist/href.d.ts +2 -2
- package/dist/href.d.ts.map +1 -1
- package/dist/href.js +57 -0
- package/dist/href.js.map +1 -0
- package/dist/index.d.ts +33 -33
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -1160
- package/dist/index.js.map +1 -1
- package/dist/internal/layer-plan.d.ts +1 -1
- package/dist/internal/layer-plan.d.ts.map +1 -1
- package/dist/internal/layer-plan.js +102 -0
- package/dist/internal/layer-plan.js.map +1 -0
- package/dist/internal/screen-registry.d.ts +1 -1
- package/dist/internal/screen-registry.d.ts.map +1 -1
- package/{src/internal/screen-registry.d.ts → dist/internal/screen-registry.js} +32 -21
- package/dist/internal/screen-registry.js.map +1 -0
- package/{src/internal/screen-width.d.ts → dist/internal/screen-width.js} +17 -2
- package/dist/internal/screen-width.js.map +1 -0
- package/dist/navigator/core.d.ts +3 -3
- package/dist/navigator/core.d.ts.map +1 -1
- package/dist/navigator/core.js +394 -0
- package/dist/navigator/core.js.map +1 -0
- package/dist/register.d.ts +1 -1
- package/dist/register.d.ts.map +1 -1
- package/dist/register.js +2 -0
- package/dist/register.js.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/url/build.js +30 -0
- package/dist/url/build.js.map +1 -0
- package/dist/url/compile.js +83 -0
- package/dist/url/compile.js.map +1 -0
- package/dist/url/format.js +102 -0
- package/dist/url/format.js.map +1 -0
- package/dist/url/index.d.ts +6 -6
- package/dist/url/index.d.ts.map +1 -1
- package/dist/url/index.js +13 -0
- package/dist/url/index.js.map +1 -0
- package/dist/url/parse.d.ts +1 -1
- package/dist/url/parse.d.ts.map +1 -1
- package/dist/url/parse.js +94 -0
- package/dist/url/parse.js.map +1 -0
- package/dist/url/registry.d.ts +2 -2
- package/dist/url/registry.d.ts.map +1 -1
- package/{src/url/registry.d.ts → dist/url/registry.js} +28 -12
- package/dist/url/registry.js.map +1 -0
- package/dist/url/validate.d.ts +1 -1
- package/dist/url/validate.d.ts.map +1 -1
- package/dist/url/validate.js +37 -0
- package/dist/url/validate.js.map +1 -0
- package/package.json +13 -12
- package/src/components/EdgeBackHandle.tsx +2 -2
- package/src/components/EntryScope.tsx +3 -3
- package/src/components/Header.tsx +3 -3
- package/src/components/Layer.tsx +3 -3
- package/src/components/Link.tsx +4 -4
- package/src/components/NavigationRoot.tsx +6 -6
- package/src/components/Screen.tsx +3 -3
- package/src/components/Stack.tsx +8 -8
- package/src/components/TabBar.tsx +1 -1
- package/src/define-routes.ts +1 -1
- package/src/hooks/use-focus.ts +2 -2
- package/src/hooks/use-hardware-back.ts +1 -1
- package/src/hooks/use-linking-nav.ts +4 -4
- package/src/hooks/use-nav-internal.ts +2 -2
- package/src/hooks/use-nav-serializer.ts +3 -3
- package/src/hooks/use-nav.ts +2 -2
- package/src/hooks/use-params.ts +2 -2
- package/src/hooks/use-screen-chrome.ts +3 -3
- package/src/hooks/use-screen-options.ts +3 -3
- package/src/hooks/use-search.ts +2 -2
- package/src/href.ts +6 -6
- package/src/index.ts +33 -33
- package/src/internal/layer-plan.ts +2 -2
- package/src/internal/screen-registry.ts +1 -1
- package/src/navigator/core.ts +3 -3
- package/src/register.ts +1 -1
- package/src/url/build.ts +2 -2
- package/src/url/index.ts +6 -6
- package/src/url/parse.ts +6 -6
- package/src/url/registry.ts +3 -3
- package/src/url/validate.ts +1 -1
- package/src/components/Drawer.d.ts +0 -55
- package/src/components/EdgeBackHandle.d.ts +0 -1
- package/src/components/EntryScope.d.ts +0 -25
- package/src/components/Header.d.ts +0 -6
- package/src/components/Layer.d.ts +0 -33
- package/src/components/Link.d.ts +0 -60
- package/src/components/NavigationRoot.d.ts +0 -36
- package/src/components/Screen.d.ts +0 -97
- package/src/components/Stack.d.ts +0 -90
- package/src/components/TabBar.d.ts +0 -38
- package/src/components/Tabs.d.ts +0 -109
- package/src/hooks/use-focus.d.ts +0 -45
- package/src/hooks/use-hardware-back.d.ts +0 -37
- package/src/hooks/use-linking-nav.d.ts +0 -91
- package/src/hooks/use-nav-internal.d.ts +0 -91
- package/src/hooks/use-nav-serializer.d.ts +0 -82
- package/src/hooks/use-nav.d.ts +0 -111
- package/src/hooks/use-screen-chrome.d.ts +0 -18
- package/src/hooks/use-screen-options.d.ts +0 -2
- package/src/href.d.ts +0 -54
- package/src/index.d.ts +0 -39
- package/src/internal/layer-plan.d.ts +0 -68
- package/src/navigator/core.d.ts +0 -96
- package/src/register.d.ts +0 -37
- package/src/types.d.ts +0 -217
- package/src/url/build.d.ts +0 -15
- package/src/url/compile.d.ts +0 -34
- package/src/url/format.d.ts +0 -28
- package/src/url/parse.d.ts +0 -20
- package/src/url/validate.d.ts +0 -23
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@sigx/lynx/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* `<Drawer>` — minimal off-canvas drawer navigator.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
*
|
|
7
|
+
* ```tsx
|
|
8
|
+
* <NavigationRoot routes={routes}>
|
|
9
|
+
* <Drawer slots={{ sidebar: () => <view><text>Menu</text></view> }}>
|
|
10
|
+
* <Stack />
|
|
11
|
+
* </Drawer>
|
|
12
|
+
* </NavigationRoot>
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* `useDrawer()` from inside any descendant gives `{ isOpen, open(), close(),
|
|
16
|
+
* toggle() }`. The sidebar is laid out absolutely on the left and is
|
|
17
|
+
* visible whenever `isOpen` is true.
|
|
18
|
+
*
|
|
19
|
+
* Scope: this slice ships the state primitive + the bare-bones layout.
|
|
20
|
+
* Gesture-driven open (edge swipe from the left) and MTS slide-in are out
|
|
21
|
+
* of scope — the app shell can wrap its sidebar JSX in its own transition.
|
|
22
|
+
*
|
|
23
|
+
* Design note: the sidebar lives in a named slot (`sidebar`) rather than
|
|
24
|
+
* a render-prop or a `<Drawer.Sidebar>` child. Mixing
|
|
25
|
+
* "register-yourself-as-a-fill" children with the parent's own visible
|
|
26
|
+
* layout creates a feedback loop in sigx's reactive scope (the parent's
|
|
27
|
+
* render reads the fill, child's setup writes it, parent re-renders,
|
|
28
|
+
* child re-mounts, …). A scoped slot avoids that entirely and keeps the
|
|
29
|
+
* call site declarative.
|
|
30
|
+
*
|
|
31
|
+
* `default` slot is the main content (almost always a `<Stack>`).
|
|
32
|
+
*/
|
|
33
|
+
import { component, defineInjectable, defineProvide, signal, } from '@sigx/lynx';
|
|
34
|
+
/**
|
|
35
|
+
* Access the enclosing Drawer navigator. Throws when called outside
|
|
36
|
+
* `<Drawer>`.
|
|
37
|
+
*/
|
|
38
|
+
export const useDrawer = defineInjectable(() => {
|
|
39
|
+
throw new Error('[lynx-navigation] useDrawer() called outside of a <Drawer> component.');
|
|
40
|
+
});
|
|
41
|
+
export const Drawer = component(({ props, slots }) => {
|
|
42
|
+
// `isOpenSig` uses the `{value}` wrapper pattern — sigx's `signal()` of
|
|
43
|
+
// a primitive returns a proxy that requires `.value` reads; wrapping in
|
|
44
|
+
// an object makes the proxy carry a mutable boolean.
|
|
45
|
+
const isOpenSig = signal({
|
|
46
|
+
value: props.initialOpen === true,
|
|
47
|
+
});
|
|
48
|
+
const nav = {
|
|
49
|
+
get isOpen() {
|
|
50
|
+
return isOpenSig.value;
|
|
51
|
+
},
|
|
52
|
+
open() {
|
|
53
|
+
isOpenSig.value = true;
|
|
54
|
+
},
|
|
55
|
+
close() {
|
|
56
|
+
isOpenSig.value = false;
|
|
57
|
+
},
|
|
58
|
+
toggle() {
|
|
59
|
+
isOpenSig.value = !isOpenSig.value;
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
defineProvide(useDrawer, () => nav);
|
|
63
|
+
return () => {
|
|
64
|
+
const open = isOpenSig.value;
|
|
65
|
+
return (_jsxs("view", { style: { width: '100%', height: '100%' }, children: [_jsx("view", { style: { width: '100%', height: '100%' }, children: slots.default?.() }), _jsx("view", { style: {
|
|
66
|
+
position: 'absolute',
|
|
67
|
+
left: 0,
|
|
68
|
+
top: 0,
|
|
69
|
+
bottom: 0,
|
|
70
|
+
display: open ? 'flex' : 'none',
|
|
71
|
+
}, children: slots.sidebar?.() })] }));
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=Drawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Drawer.js","sourceRoot":"","sources":["../../src/components/Drawer.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EACH,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,MAAM,GAGT,MAAM,YAAY,CAAC;AAcpB;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CAAY,GAAG,EAAE;IACtD,MAAM,IAAI,KAAK,CACX,uEAAuE,CAC1E,CAAC;AACN,CAAC,CAAC,CAAC;AAOH,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IAC9D,wEAAwE;IACxE,wEAAwE;IACxE,qDAAqD;IACrD,MAAM,SAAS,GAA+B,MAAM,CAAC;QACjD,KAAK,EAAE,KAAK,CAAC,WAAW,KAAK,IAAI;KACpC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAc;QACnB,IAAI,MAAM;YACN,OAAO,SAAS,CAAC,KAAK,CAAC;QAC3B,CAAC;QACD,IAAI;YACA,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC;QAC3B,CAAC;QACD,KAAK;YACD,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;QAC5B,CAAC;QACD,MAAM;YACF,SAAS,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC;QACvC,CAAC;KACJ,CAAC;IAEF,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAEpC,OAAO,GAAG,EAAE;QACR,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC;QAC7B,OAAO,CACH,gBAAM,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAE1C,eAAM,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YACzC,KAAK,CAAC,OAAO,EAAE,EAAE,GACf,EAKP,eACI,KAAK,EAAE;wBACH,QAAQ,EAAE,UAAU;wBACpB,IAAI,EAAE,CAAC;wBACP,GAAG,EAAE,CAAC;wBACN,MAAM,EAAE,CAAC;wBACT,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;qBAClC,YAEA,KAAK,CAAC,OAAO,EAAE,EAAE,GACf,IACJ,CACV,CAAC;IACN,CAAC,CAAC;AACN,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { jsx as _jsx } from "@sigx/lynx/jsx-runtime";
|
|
2
|
+
import { component, Gesture, runOnBackground, useGestureDetector, useMainThreadRef, } from '@sigx/lynx';
|
|
3
|
+
import { withTiming } from '@sigx/lynx-motion';
|
|
4
|
+
import { useNavInternals } from '../hooks/use-nav-internal.js';
|
|
5
|
+
import { SCREEN_WIDTH } from '../internal/screen-width.js';
|
|
6
|
+
/**
|
|
7
|
+
* Edge-pan recognizer for iOS-style swipe-back. Mounts as an absolutely-
|
|
8
|
+
* positioned 20px-wide strip on the left edge of the active screen; only
|
|
9
|
+
* exists when `nav.canGoBack && !transition`.
|
|
10
|
+
*
|
|
11
|
+
* `Gesture.Pan().minDistance(MIN_DISTANCE)` lets quick taps pass through to
|
|
12
|
+
* whatever's behind the strip (back button, screen header, etc.). Only
|
|
13
|
+
* horizontal drags past the threshold activate the gesture.
|
|
14
|
+
*
|
|
15
|
+
* MT/BG split:
|
|
16
|
+
* - All gesture handlers run on MT. They write `progress.current.value`
|
|
17
|
+
* directly per frame (no per-frame bridge crossing) and dispatch
|
|
18
|
+
* `runOnBackground(...)` only at start/commit/cancel — three BG hops
|
|
19
|
+
* per gesture max.
|
|
20
|
+
* - The transition state machine on BG mounts the underneath
|
|
21
|
+
* `<ScreenContainer>` once `beginBackGesture` lands; the gesture's
|
|
22
|
+
* in-flight progress writes are picked up the moment the binding
|
|
23
|
+
* registers (Phase 0.5 polish: pre-mount underneath when canGoBack to
|
|
24
|
+
* eliminate the brief pre-mount latency).
|
|
25
|
+
*
|
|
26
|
+
* Implementation notes (matching `<Draggable>`):
|
|
27
|
+
* - Single `useMainThreadRef` holding an object — primitive refs don't
|
|
28
|
+
* survive worklet capture cleanly in some Lynx versions, while object
|
|
29
|
+
* refs do (the worklet runtime resolves the ref via the
|
|
30
|
+
* `_workletRefMap`).
|
|
31
|
+
* - `e: any` rather than `e: unknown` — type annotations are erased, but
|
|
32
|
+
* SWC's worklet transform has been observed to behave better with the
|
|
33
|
+
* looser annotation. Keeps us aligned with Draggable verbatim.
|
|
34
|
+
* - Empty `onBegin`: load-bearing on iOS — without a registered onBegin
|
|
35
|
+
* callback, `LynxPanGestureHandler` skips the begin path and onStart/
|
|
36
|
+
* onEnd never fire (per Draggable's notes).
|
|
37
|
+
*/
|
|
38
|
+
/** Fraction of screen width past which a release commits the back nav. */
|
|
39
|
+
const COMMIT_TRANSLATION = 0.33;
|
|
40
|
+
/** px/sec horizontal speed past which a release commits, regardless of distance. */
|
|
41
|
+
const COMMIT_VELOCITY = 300;
|
|
42
|
+
/** Width of the touchable strip on the left edge of every screen. */
|
|
43
|
+
const EDGE_ZONE_WIDTH = 20;
|
|
44
|
+
/** Minimum movement before the gesture activates (lets taps pass through). */
|
|
45
|
+
const MIN_DISTANCE = 8;
|
|
46
|
+
const SNAP_DURATION_SEC = 0.18;
|
|
47
|
+
/**
|
|
48
|
+
* Pre-computed milliseconds for the BG-side `setTimeout`. Module-level so
|
|
49
|
+
* it's in scope for both the MT worklet (`withTiming` argument) and the BG
|
|
50
|
+
* callback wrapped by `runOnBackground` (`setTimeout` argument). Locals
|
|
51
|
+
* declared inside an MT worklet body are MT-only — the BG callback's
|
|
52
|
+
* closure can't see them, hence "ReferenceError: snapMs is not defined".
|
|
53
|
+
*/
|
|
54
|
+
const SNAP_DURATION_MS = Math.round(SNAP_DURATION_SEC * 1000);
|
|
55
|
+
export const EdgeBackHandle = component(() => {
|
|
56
|
+
const ref = useMainThreadRef(null);
|
|
57
|
+
// Per-gesture transient state — captured as a plain closure object
|
|
58
|
+
// rather than a `useMainThreadRef`. Lynx's SWC worklet transform deep-
|
|
59
|
+
// copies plain objects into `_c` once at register time; mutations on MT
|
|
60
|
+
// persist across calls because the same `_c` is bound for the lifetime
|
|
61
|
+
// of the gesture registration. Using a `useMainThreadRef` here was
|
|
62
|
+
// crashing on iOS with `cannot read property 'current' of undefined`
|
|
63
|
+
// — the resolved-ref capture path looked up an empty
|
|
64
|
+
// `_workletRefMap` entry under a race I haven't fully tracked down.
|
|
65
|
+
// Plain object avoids that path entirely.
|
|
66
|
+
const state = {
|
|
67
|
+
startPageX: 0,
|
|
68
|
+
prevPageX: 0,
|
|
69
|
+
prevTime: 0,
|
|
70
|
+
velocity: 0,
|
|
71
|
+
};
|
|
72
|
+
const internals = useNavInternals();
|
|
73
|
+
const progress = internals.progress;
|
|
74
|
+
const beginBackGesture = internals.beginBackGesture;
|
|
75
|
+
const commitBackGesture = internals.commitBackGesture;
|
|
76
|
+
const cancelBackGesture = internals.cancelBackGesture;
|
|
77
|
+
const pan = Gesture.Pan()
|
|
78
|
+
.minDistance(MIN_DISTANCE)
|
|
79
|
+
.onBegin(() => {
|
|
80
|
+
'main thread';
|
|
81
|
+
})
|
|
82
|
+
.onStart((e) => {
|
|
83
|
+
'main thread';
|
|
84
|
+
const p = e && e.params;
|
|
85
|
+
const pageX = (p && p.pageX) || 0;
|
|
86
|
+
state.startPageX = pageX;
|
|
87
|
+
state.prevPageX = pageX;
|
|
88
|
+
state.prevTime = Date.now();
|
|
89
|
+
state.velocity = 0;
|
|
90
|
+
runOnBackground(() => {
|
|
91
|
+
beginBackGesture();
|
|
92
|
+
})();
|
|
93
|
+
})
|
|
94
|
+
.onUpdate((e) => {
|
|
95
|
+
'main thread';
|
|
96
|
+
if (!progress)
|
|
97
|
+
return;
|
|
98
|
+
const p = e && e.params;
|
|
99
|
+
const pageX = (p && p.pageX) || 0;
|
|
100
|
+
const dx = pageX - state.startPageX;
|
|
101
|
+
const prog = Math.max(0, Math.min(1, dx / SCREEN_WIDTH));
|
|
102
|
+
progress.current.value = prog;
|
|
103
|
+
const now = Date.now();
|
|
104
|
+
const dt = now - state.prevTime;
|
|
105
|
+
if (dt > 0) {
|
|
106
|
+
state.velocity =
|
|
107
|
+
((pageX - state.prevPageX) / dt) * 1000;
|
|
108
|
+
}
|
|
109
|
+
state.prevPageX = pageX;
|
|
110
|
+
state.prevTime = now;
|
|
111
|
+
})
|
|
112
|
+
.onEnd((e) => {
|
|
113
|
+
'main thread';
|
|
114
|
+
if (!progress)
|
|
115
|
+
return;
|
|
116
|
+
const p = e && e.params;
|
|
117
|
+
const pageX = (p && p.pageX) || 0;
|
|
118
|
+
const dx = pageX - state.startPageX;
|
|
119
|
+
const fraction = dx / SCREEN_WIDTH;
|
|
120
|
+
const commit = fraction > COMMIT_TRANSLATION ||
|
|
121
|
+
state.velocity > COMMIT_VELOCITY;
|
|
122
|
+
if (commit) {
|
|
123
|
+
withTiming(progress, 1, { duration: SNAP_DURATION_SEC });
|
|
124
|
+
runOnBackground(() => {
|
|
125
|
+
setTimeout(() => commitBackGesture(), SNAP_DURATION_MS);
|
|
126
|
+
})();
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
withTiming(progress, 0, { duration: SNAP_DURATION_SEC });
|
|
130
|
+
runOnBackground(() => {
|
|
131
|
+
setTimeout(() => cancelBackGesture(), SNAP_DURATION_MS);
|
|
132
|
+
})();
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
useGestureDetector(ref, pan);
|
|
136
|
+
return () => (_jsx("view", { "main-thread:ref": ref, style: {
|
|
137
|
+
position: 'absolute',
|
|
138
|
+
top: '0',
|
|
139
|
+
left: '0',
|
|
140
|
+
width: `${EDGE_ZONE_WIDTH}px`,
|
|
141
|
+
bottom: '0',
|
|
142
|
+
} }));
|
|
143
|
+
});
|
|
144
|
+
//# sourceMappingURL=EdgeBackHandle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EdgeBackHandle.js","sourceRoot":"","sources":["../../src/components/EdgeBackHandle.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Define } from '@sigx/lynx';
|
|
2
|
-
import type { StackEntry } from '../types';
|
|
2
|
+
import type { StackEntry } from '../types.js';
|
|
3
3
|
type EntryScopeProps = Define.Prop<'entry', StackEntry, true> & Define.Slot<'default'>;
|
|
4
4
|
/**
|
|
5
5
|
* Provider wrapper for a single screen mount.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntryScope.d.ts","sourceRoot":"","sources":["../../src/components/EntryScope.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAQhF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"EntryScope.d.ts","sourceRoot":"","sources":["../../src/components/EntryScope.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAQhF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,KAAK,eAAe,GACd,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,GACtC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAE7B;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,UAAU;;EAgBrB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { component, defineProvide, onUnmounted } from '@sigx/lynx';
|
|
2
|
+
import { useCurrentEntry, useCurrentEntryOptional, useNavInternals, useScreenRegistry, } from '../hooks/use-nav-internal.js';
|
|
3
|
+
import { createScreenRegistry } from '../internal/screen-registry.js';
|
|
4
|
+
/**
|
|
5
|
+
* Provider wrapper for a single screen mount.
|
|
6
|
+
*
|
|
7
|
+
* `<Stack>` and `<ScreenContainer>` instantiate this around each route
|
|
8
|
+
* component so calls to `useIsFocused()` / `useFocusEffect()` /
|
|
9
|
+
* `<Screen>` inside that screen resolve through `useCurrentEntry()` and
|
|
10
|
+
* `useScreenRegistry()` to the entry it was rendered for. Without this
|
|
11
|
+
* wrapper there'd be no per-screen way to know "which stack entry am I?"
|
|
12
|
+
* — the navigator only knows what's currently on top.
|
|
13
|
+
*
|
|
14
|
+
* Also allocates a fresh `ScreenRegistry` per entry and publishes it to
|
|
15
|
+
* the navigator's cross-entry registry map, so persistent chrome (HeaderBar
|
|
16
|
+
* / TabBar — later slices) can read the focused entry's options + slot
|
|
17
|
+
* fills without remounting itself.
|
|
18
|
+
*
|
|
19
|
+
* Renders the default slot directly; no extra layout element is inserted,
|
|
20
|
+
* so this is layout-neutral for the screen it wraps.
|
|
21
|
+
*/
|
|
22
|
+
export const EntryScope = component(({ props, slots }) => {
|
|
23
|
+
const internals = useNavInternals();
|
|
24
|
+
const registry = createScreenRegistry(props.entry);
|
|
25
|
+
internals.screens.register(registry);
|
|
26
|
+
onUnmounted(() => {
|
|
27
|
+
// Pass the registry instance — `unregister` is identity-checked,
|
|
28
|
+
// so this is a no-op when a newer EntryScope has already taken
|
|
29
|
+
// over the same entry key (e.g. at the transition→idle handoff
|
|
30
|
+
// where the reconciler mounts the new EntryScope before
|
|
31
|
+
// unmounting the old).
|
|
32
|
+
internals.screens.unregister(registry);
|
|
33
|
+
});
|
|
34
|
+
defineProvide(useCurrentEntry, () => props.entry);
|
|
35
|
+
defineProvide(useCurrentEntryOptional, () => props.entry);
|
|
36
|
+
defineProvide(useScreenRegistry, () => registry);
|
|
37
|
+
return () => slots.default?.();
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=EntryScope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryScope.js","sourceRoot":"","sources":["../../src/components/EntryScope.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAe,MAAM,YAAY,CAAC;AAChF,OAAO,EACH,eAAe,EACf,uBAAuB,EACvB,eAAe,EACf,iBAAiB,GACpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAOtE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IACtE,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,WAAW,CAAC,GAAG,EAAE;QACb,iEAAiE;QACjE,+DAA+D;QAC/D,+DAA+D;QAC/D,wDAAwD;QACxD,uBAAuB;QACvB,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,aAAa,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,aAAa,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1D,aAAa,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;AACnC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@sigx/lynx/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* `<Header>` — default navigator header chrome.
|
|
4
|
+
*
|
|
5
|
+
* Reads from the currently-focused entry's `ScreenRegistry`:
|
|
6
|
+
*
|
|
7
|
+
* - If `slots.header` is set, render that (full override).
|
|
8
|
+
* - Else render the default layout: headerLeft (back button when
|
|
9
|
+
* `nav.canGoBack`), title (from `options.title`, or the route name as
|
|
10
|
+
* a fallback), headerRight.
|
|
11
|
+
*
|
|
12
|
+
* Persistent: the Header component itself is mounted once near the root and
|
|
13
|
+
* stays mounted across navigations — it reactively switches its content
|
|
14
|
+
* when `nav.current` changes, rather than being remounted per screen. That
|
|
15
|
+
* matters because mounting cost adds to perceived transition latency.
|
|
16
|
+
*
|
|
17
|
+
* Header chrome is opt-in. Consumers place `<Header />` inside
|
|
18
|
+
* `<NavigationRoot>` above `<Stack />`. We don't auto-inject because:
|
|
19
|
+
* - app shells vary (some want the header inside a `<SafeArea>`, some
|
|
20
|
+
* want a custom toolbar, some want no header at all in tabs).
|
|
21
|
+
* - making it opt-in keeps `<Stack>`'s contract narrow.
|
|
22
|
+
*/
|
|
23
|
+
import { component, computed } from '@sigx/lynx';
|
|
24
|
+
import { useNav } from '../hooks/use-nav.js';
|
|
25
|
+
import { useNavInternals } from '../hooks/use-nav-internal.js';
|
|
26
|
+
/**
|
|
27
|
+
* Resolve a title (string or getter) to a plain string.
|
|
28
|
+
*
|
|
29
|
+
* Getter is the more general case; the `<Screen title={() => state.value}>`
|
|
30
|
+
* call site is how reactive titles work. A plain string is wrapped in a
|
|
31
|
+
* trivial closure so consumers always handle one shape.
|
|
32
|
+
*/
|
|
33
|
+
function resolveTitle(t, routeName) {
|
|
34
|
+
if (typeof t === 'function')
|
|
35
|
+
return t();
|
|
36
|
+
if (typeof t === 'string')
|
|
37
|
+
return t;
|
|
38
|
+
return routeName;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Default back-button rendering. Plain `<text>` with a tap handler — apps
|
|
42
|
+
* that want an icon or a custom design override via
|
|
43
|
+
* `<Screen.HeaderLeft>`. Kept minimal because there's no shared icon
|
|
44
|
+
* primitive at the navigation layer.
|
|
45
|
+
*/
|
|
46
|
+
const DefaultBackButton = component(({ props }) => {
|
|
47
|
+
return () => (_jsx("view", { bindtap: () => props.onPress(), "accessibility-element": true, "accessibility-label": "Back", "accessibility-trait": "button", children: _jsx("text", { children: "\u2039 Back" }) }));
|
|
48
|
+
});
|
|
49
|
+
const DefaultTitle = component(({ props }) => {
|
|
50
|
+
return () => (_jsx("view", { children: _jsx("text", { children: props.text }) }));
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* Persistent header chrome. Mount once above `<Stack>`; reactively follows
|
|
54
|
+
* the focused entry. No props in v1 — styling is a host-app concern,
|
|
55
|
+
* arrived at through the slot fills.
|
|
56
|
+
*/
|
|
57
|
+
export const Header = component(() => {
|
|
58
|
+
const nav = useNav();
|
|
59
|
+
const internals = useNavInternals();
|
|
60
|
+
// Snapshot computeds — each one reads only what it needs so the header
|
|
61
|
+
// doesn't re-run wholesale on every signal touch. The slot-fill thunks
|
|
62
|
+
// captured by `<Screen.Header>` etc. are themselves reactive (they
|
|
63
|
+
// execute on every render of the consumer's tree), so re-running the
|
|
64
|
+
// outer template is enough to pick up downstream updates.
|
|
65
|
+
const currentEntry = computed(() => nav.current);
|
|
66
|
+
const headerSlot = computed(() => {
|
|
67
|
+
const reg = internals.screens.get(currentEntry.value.key);
|
|
68
|
+
return reg?.slots.header;
|
|
69
|
+
});
|
|
70
|
+
const headerLeftSlot = computed(() => {
|
|
71
|
+
const reg = internals.screens.get(currentEntry.value.key);
|
|
72
|
+
return reg?.slots.headerLeft;
|
|
73
|
+
});
|
|
74
|
+
const headerRightSlot = computed(() => {
|
|
75
|
+
const reg = internals.screens.get(currentEntry.value.key);
|
|
76
|
+
return reg?.slots.headerRight;
|
|
77
|
+
});
|
|
78
|
+
const headerShown = computed(() => {
|
|
79
|
+
const reg = internals.screens.get(currentEntry.value.key);
|
|
80
|
+
// Default true — most screens want a header. Opting out is one prop
|
|
81
|
+
// on `<Screen>`.
|
|
82
|
+
return reg?.options.headerShown !== false;
|
|
83
|
+
});
|
|
84
|
+
const titleText = computed(() => {
|
|
85
|
+
const reg = internals.screens.get(currentEntry.value.key);
|
|
86
|
+
return resolveTitle(reg?.options.title, currentEntry.value.route);
|
|
87
|
+
});
|
|
88
|
+
return () => {
|
|
89
|
+
if (!headerShown.value)
|
|
90
|
+
return null;
|
|
91
|
+
// Full-override path: `<Screen.Header>` supplied its own content,
|
|
92
|
+
// we render that and skip the default layout entirely.
|
|
93
|
+
const override = headerSlot.value;
|
|
94
|
+
if (override)
|
|
95
|
+
return override();
|
|
96
|
+
return (_jsxs("view", { children: [_jsx("view", { children: headerLeftSlot.value
|
|
97
|
+
? headerLeftSlot.value()
|
|
98
|
+
: nav.canGoBack
|
|
99
|
+
? _jsx(DefaultBackButton, { onPress: () => nav.pop() })
|
|
100
|
+
: null }), _jsx(DefaultTitle, { text: titleText.value }), _jsx("view", { children: headerRightSlot.value ? headerRightSlot.value() : null })] }));
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=Header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":"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"}
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
* via a daisy `bg-base-*` class on the screen body).
|
|
26
26
|
*/
|
|
27
27
|
import { type ComponentFactory, type Define } from '@sigx/lynx';
|
|
28
|
-
import type { LayerAnimation } from '../internal/layer-plan';
|
|
29
|
-
import type { RouteMap, StackEntry } from '../types';
|
|
28
|
+
import type { LayerAnimation } from '../internal/layer-plan.js';
|
|
29
|
+
import type { RouteMap, StackEntry } from '../types.js';
|
|
30
30
|
export type LayerProps = Define.Prop<'entry', StackEntry, true> & Define.Prop<'routes', RouteMap, true>
|
|
31
31
|
/** When set, the host view animates per the transform spec. */
|
|
32
32
|
& Define.Prop<'animation', LayerAnimation | null, false>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layer.d.ts","sourceRoot":"","sources":["../../src/components/Layer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAIH,KAAK,gBAAgB,EACrB,KAAK,MAAM,EAEd,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"Layer.d.ts","sourceRoot":"","sources":["../../src/components/Layer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAIH,KAAK,gBAAgB,EACrB,KAAK,MAAM,EAEd,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGxD,MAAM,MAAM,UAAU,GAChB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,GACtC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC;AACvC,+DAA+D;GAC7D,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;AAE7D,eAAO,MAAM,KAAK,wCAkDhB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsx as _jsx } from "@sigx/lynx/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* `<Layer>` — one row in `<Stack>`'s layered render. Absolutely-
|
|
4
|
+
* positioned host view that fills the Stack's relative wrapper, with
|
|
5
|
+
* an optional MT-bound `translateX` / `translateY` animation driven
|
|
6
|
+
* by a `SharedValue<number>` from the navigator's transition state.
|
|
7
|
+
*
|
|
8
|
+
* `<Stack>` emits one `<Layer>` per entry returned by
|
|
9
|
+
* `computeLayers(...)`. Layer.key in the parent is
|
|
10
|
+
* `layer-${entry.key}-${animationVariant(animation)}` so that:
|
|
11
|
+
*
|
|
12
|
+
* - The same entry under the same animation state is preserved across
|
|
13
|
+
* renders (modal underneath stays mounted through the modal
|
|
14
|
+
* lifecycle; per-tab Stack state survives).
|
|
15
|
+
* - An entry transitioning between animated and static (e.g. a card
|
|
16
|
+
* top after its push transition completes) remounts so the
|
|
17
|
+
* `useAnimatedStyle` binding can be rebound — the underlying
|
|
18
|
+
* `useAnimatedStyle` is set-once at setup and can't switch its
|
|
19
|
+
* mapper at runtime.
|
|
20
|
+
*
|
|
21
|
+
* Layouts:
|
|
22
|
+
* - Host view is `position: absolute; top/right/bottom/left: 0;
|
|
23
|
+
* display: flex; flexDirection: column` so descendants that
|
|
24
|
+
* flex-fill (SafeAreaView, daisyui screens) get a sized parent.
|
|
25
|
+
* - No background. Screens own their own surface colour (typically
|
|
26
|
+
* via a daisy `bg-base-*` class on the screen body).
|
|
27
|
+
*/
|
|
28
|
+
import { component, useMainThreadRef, useAnimatedStyle, } from '@sigx/lynx';
|
|
29
|
+
import { Suspense, isLazyComponent } from '@sigx/lynx';
|
|
30
|
+
import { EntryScope } from './EntryScope.js';
|
|
31
|
+
export const Layer = component(({ props }) => {
|
|
32
|
+
const ref = useMainThreadRef(null);
|
|
33
|
+
// `useAnimatedStyle` binds once at setup. Calling it conditionally
|
|
34
|
+
// is safe because setup runs once per mount and props.animation
|
|
35
|
+
// never changes for a given Layer instance — animation changes
|
|
36
|
+
// re-key the Layer at the parent, forcing a fresh mount.
|
|
37
|
+
if (props.animation) {
|
|
38
|
+
const a = props.animation;
|
|
39
|
+
useAnimatedStyle(ref, a.progress, a.axis, {
|
|
40
|
+
inputRange: [a.inputRange[0], a.inputRange[1]],
|
|
41
|
+
outputRange: [a.outputRange[0], a.outputRange[1]],
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return () => {
|
|
45
|
+
const route = props.routes[props.entry.route];
|
|
46
|
+
if (!route)
|
|
47
|
+
return null;
|
|
48
|
+
const Comp = route.component;
|
|
49
|
+
if (typeof Comp !== 'function')
|
|
50
|
+
return null;
|
|
51
|
+
const entryParams = props.entry.params;
|
|
52
|
+
const body = isLazyComponent(Comp) && route.fallback
|
|
53
|
+
? (_jsx(Suspense, { fallback: route.fallback, children: _jsx(Comp, { ...entryParams }) }))
|
|
54
|
+
: _jsx(Comp, { ...entryParams });
|
|
55
|
+
return (_jsx("view", { "main-thread:ref": ref, style: {
|
|
56
|
+
position: 'absolute',
|
|
57
|
+
top: '0',
|
|
58
|
+
left: '0',
|
|
59
|
+
right: '0',
|
|
60
|
+
bottom: '0',
|
|
61
|
+
display: 'flex',
|
|
62
|
+
flexDirection: 'column',
|
|
63
|
+
}, children: _jsx(EntryScope, { entry: props.entry, children: body }, props.entry.key) }));
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=Layer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Layer.js","sourceRoot":"","sources":["../../src/components/Layer.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EACH,SAAS,EACT,gBAAgB,EAChB,gBAAgB,GAInB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAQ7C,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAa,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IACrD,MAAM,GAAG,GAAG,gBAAgB,CAA4B,IAAI,CAAC,CAAC;IAC9D,mEAAmE;IACnE,gEAAgE;IAChE,+DAA+D;IAC/D,yDAAyD;IACzD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;QAC1B,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE;YACtC,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC9C,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;SACpD,CAAC,CAAC;IACP,CAAC;IAED,OAAO,GAAG,EAAE;QACR,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,SAIlB,CAAC;QACF,IAAI,OAAO,IAAI,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;QAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAiC,CAAC;QAClE,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ;YAChD,CAAC,CAAC,CACE,KAAC,QAAQ,IAAC,QAAQ,EAAE,KAAK,CAAC,QAAiB,YACvC,KAAC,IAAI,OAAK,WAAW,GAAI,GAClB,CACd;YACD,CAAC,CAAC,KAAC,IAAI,OAAK,WAAW,GAAI,CAAC;QAChC,OAAO,CACH,kCACqB,GAAG,EACpB,KAAK,EAAE;gBACH,QAAQ,EAAE,UAAU;gBACpB,GAAG,EAAE,GAAG;gBACR,IAAI,EAAE,GAAG;gBACT,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,MAAM;gBACf,aAAa,EAAE,QAAQ;aAC1B,YAED,KAAC,UAAU,IAAuB,KAAK,EAAE,KAAK,CAAC,KAAK,YAC/C,IAAI,IADQ,KAAK,CAAC,KAAK,CAAC,GAAG,CAEnB,GACV,CACV,CAAC;IACN,CAAC,CAAC;AACN,CAAC,CAAC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { RouteId, RouteParams, RouteSearch } from '../register';
|
|
2
|
-
import type { RoutesWithParams } from '../hooks/use-nav';
|
|
1
|
+
import type { RouteId, RouteParams, RouteSearch } from '../register.js';
|
|
2
|
+
import type { RoutesWithParams } from '../hooks/use-nav.js';
|
|
3
3
|
/**
|
|
4
4
|
* Per-route conditional props for `<Link>`.
|
|
5
5
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/components/Link.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/components/Link.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;;;;;;;;;;;;GAaG;AACH,KAAK,gBAAgB,GAAG;KACnB,CAAC,IAAI,OAAO,GAAG,CAAC,SAAS,gBAAgB,GACpC;QAAE,EAAE,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;KAAE,GAC1D;QAAE,EAAE,EAAE,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,SAAS,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;KAAE;CAC/D,CAAC,OAAO,CAAC,CAAC;AAEX;;;;;;;;GAQG;AACH,MAAM,MAAM,SAAS,GAAG,gBAAgB,GAAG;IACvC,8DAA8D;IAC9D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAwDF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,IAAI,EAA0B,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx } from "@sigx/lynx/jsx-runtime";
|
|
2
|
+
import { component } from '@sigx/lynx';
|
|
3
|
+
import { useNav } from '../hooks/use-nav.js';
|
|
4
|
+
import { useNavRoutes } from '../hooks/use-nav-internal.js';
|
|
5
|
+
const LinkImpl = component(({ props, slots }) => {
|
|
6
|
+
const nav = useNav();
|
|
7
|
+
const routes = useNavRoutes();
|
|
8
|
+
const handlePress = () => {
|
|
9
|
+
const route = props.to;
|
|
10
|
+
const routeDef = routes[route];
|
|
11
|
+
if (!routeDef) {
|
|
12
|
+
// Defensive: prop was typed against the registry, so this shouldn't
|
|
13
|
+
// happen at runtime — but if it does (e.g. a stale Link survived a
|
|
14
|
+
// route removal), surface a clear error rather than crashing on
|
|
15
|
+
// the navigator's lookup.
|
|
16
|
+
throw new Error(`[lynx-navigation] <Link to='${route}'>: route is not registered.`);
|
|
17
|
+
}
|
|
18
|
+
const hasParams = !!routeDef.params;
|
|
19
|
+
const action = props.replace ? nav.replace : nav.push;
|
|
20
|
+
// Branch on whether the route declares a params schema so positional
|
|
21
|
+
// args land correctly: routes-with-params shift everything one slot
|
|
22
|
+
// (push/replace overload signatures `(name, params, search?, options?)`
|
|
23
|
+
// vs `(name, search?, options?)`). Calling the wrong shape silently
|
|
24
|
+
// puts `search` into the `options` slot.
|
|
25
|
+
if (hasParams) {
|
|
26
|
+
action(route, props.params, props.search);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
action(route, props.search);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
return () => (_jsx("view", { bindtap: handlePress, children: slots.default?.() }));
|
|
33
|
+
}, { name: 'Link' });
|
|
34
|
+
/**
|
|
35
|
+
* Declarative navigation. Same typing as `nav.push` — pass `params` only when
|
|
36
|
+
* the route declares a schema. Wraps a `<view>` that fires `nav.push` (or
|
|
37
|
+
* `nav.replace` if `replace` is set) on tap.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```tsx
|
|
41
|
+
* <Link to="home">Home</Link>
|
|
42
|
+
* <Link to="profile" params={{ id: '42' }}>View profile</Link>
|
|
43
|
+
* <Link to="profile" params={{ id: '42' }} search={{ tab: 'about' }}>About</Link>
|
|
44
|
+
* <Link to="settings" replace>Settings (no back)</Link>
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* The cast widens the inferred prop type from the loose impl to the strict
|
|
48
|
+
* `LinkProps` so JSX usage gets per-route discrimination. Runtime is identical.
|
|
49
|
+
*/
|
|
50
|
+
export const Link = LinkImpl;
|
|
51
|
+
//# sourceMappingURL=Link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Link.js","sourceRoot":"","sources":["../../src/components/Link.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAe,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAqD5D,MAAM,QAAQ,GAAG,SAAS,CAAiB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IAC5D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,MAAM,WAAW,GAAG,GAAS,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,oEAAoE;YACpE,mEAAmE;YACnE,gEAAgE;YAChE,0BAA0B;YAC1B,MAAM,IAAI,KAAK,CACX,+BAA+B,KAAK,8BAA8B,CACrE,CAAC;QACN,CAAC;QACD,MAAM,SAAS,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QACtD,qEAAqE;QACrE,oEAAoE;QACpE,wEAAwE;QACxE,oEAAoE;QACpE,yCAAyC;QACzC,IAAI,SAAS,EAAE,CAAC;YACX,MAAuD,CACpD,KAAK,EACL,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,MAAM,CACf,CAAC;QACN,CAAC;aAAM,CAAC;YACH,MAA2C,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACtE,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,GAAG,EAAE,CAAC,CAGT,eAAM,OAAO,EAAE,WAAW,YAAG,KAAK,CAAC,OAAO,EAAE,EAAE,GAAQ,CACzD,CAAC;AACN,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAErB;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,QAAoD,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Define } from '@sigx/lynx';
|
|
2
|
-
import type { RouteId } from '../register';
|
|
3
|
-
import type { RouteMap } from '../types';
|
|
2
|
+
import type { RouteId } from '../register.js';
|
|
3
|
+
import type { RouteMap } from '../types.js';
|
|
4
4
|
type NavigationRootProps = Define.Prop<'routes', RouteMap, true> & Define.Prop<'initialRoute', RouteId> & Define.Prop<'initialParams', Record<string, unknown>> & Define.Prop<'initialSearch', Record<string, unknown>>
|
|
5
5
|
/**
|
|
6
6
|
* Enable slide-from-right transitions on push/pop. Defaults to true.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NavigationRoot.d.ts","sourceRoot":"","sources":["../../src/components/NavigationRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAInF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"NavigationRoot.d.ts","sourceRoot":"","sources":["../../src/components/NavigationRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAInF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAgB,QAAQ,EAAc,MAAM,aAAa,CAAC;AAGtE,KAAK,mBAAmB,GAClB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,GACrC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,GACpC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACrD,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACvD;;;;GAIG;GACD,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;AAClC;;;;GAIG;GACD,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,GACxC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAE7B;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,cAAc;;EAiDzB,CAAC"}
|