@sigx/lynx-navigation 0.4.0 → 0.4.2

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 (187) hide show
  1. package/dist/components/Drawer.js +74 -0
  2. package/dist/components/Drawer.js.map +1 -0
  3. package/dist/components/EdgeBackHandle.js +144 -0
  4. package/dist/components/EdgeBackHandle.js.map +1 -0
  5. package/dist/components/EntryScope.d.ts +1 -1
  6. package/dist/components/EntryScope.d.ts.map +1 -1
  7. package/dist/components/EntryScope.js +39 -0
  8. package/dist/components/EntryScope.js.map +1 -0
  9. package/dist/components/Header.js +103 -0
  10. package/dist/components/Header.js.map +1 -0
  11. package/dist/components/Layer.d.ts +2 -2
  12. package/dist/components/Layer.d.ts.map +1 -1
  13. package/dist/components/Layer.js +66 -0
  14. package/dist/components/Layer.js.map +1 -0
  15. package/dist/components/Link.d.ts +2 -2
  16. package/dist/components/Link.d.ts.map +1 -1
  17. package/dist/components/Link.js +51 -0
  18. package/dist/components/Link.js.map +1 -0
  19. package/dist/components/NavigationRoot.d.ts +2 -2
  20. package/dist/components/NavigationRoot.d.ts.map +1 -1
  21. package/dist/components/NavigationRoot.js +67 -0
  22. package/dist/components/NavigationRoot.js.map +1 -0
  23. package/dist/components/Screen.js +98 -0
  24. package/dist/components/Screen.js.map +1 -0
  25. package/dist/components/Stack.js +257 -0
  26. package/dist/components/Stack.js.map +1 -0
  27. package/dist/components/TabBar.d.ts +1 -1
  28. package/dist/components/TabBar.d.ts.map +1 -1
  29. package/dist/components/TabBar.js +63 -0
  30. package/dist/components/TabBar.js.map +1 -0
  31. package/dist/components/Tabs.d.ts +8 -3
  32. package/dist/components/Tabs.d.ts.map +1 -1
  33. package/dist/components/Tabs.js +168 -0
  34. package/dist/components/Tabs.js.map +1 -0
  35. package/dist/define-routes.d.ts +1 -1
  36. package/dist/define-routes.d.ts.map +1 -1
  37. package/{src/define-routes.d.ts → dist/define-routes.js} +4 -2
  38. package/dist/define-routes.js.map +1 -0
  39. package/dist/hooks/use-focus.js +87 -0
  40. package/dist/hooks/use-focus.js.map +1 -0
  41. package/dist/hooks/use-hardware-back.js +84 -0
  42. package/dist/hooks/use-hardware-back.js.map +1 -0
  43. package/dist/hooks/use-linking-nav.d.ts +3 -3
  44. package/dist/hooks/use-linking-nav.d.ts.map +1 -1
  45. package/dist/hooks/use-linking-nav.js +109 -0
  46. package/dist/hooks/use-linking-nav.js.map +1 -0
  47. package/dist/hooks/use-nav-internal.d.ts +2 -2
  48. package/dist/hooks/use-nav-internal.d.ts.map +1 -1
  49. package/dist/hooks/use-nav-internal.js +55 -0
  50. package/dist/hooks/use-nav-internal.js.map +1 -0
  51. package/dist/hooks/use-nav-serializer.d.ts +1 -1
  52. package/dist/hooks/use-nav-serializer.d.ts.map +1 -1
  53. package/dist/hooks/use-nav-serializer.js +181 -0
  54. package/dist/hooks/use-nav-serializer.js.map +1 -0
  55. package/dist/hooks/use-nav.d.ts +2 -2
  56. package/dist/hooks/use-nav.d.ts.map +1 -1
  57. package/dist/hooks/use-nav.js +11 -0
  58. package/dist/hooks/use-nav.js.map +1 -0
  59. package/dist/hooks/use-params.d.ts +1 -1
  60. package/dist/hooks/use-params.d.ts.map +1 -1
  61. package/{src/hooks/use-params.d.ts → dist/hooks/use-params.js} +6 -2
  62. package/dist/hooks/use-params.js.map +1 -0
  63. package/dist/hooks/use-screen-chrome.d.ts +1 -1
  64. package/dist/hooks/use-screen-chrome.d.ts.map +1 -1
  65. package/dist/hooks/use-screen-chrome.js +102 -0
  66. package/dist/hooks/use-screen-chrome.js.map +1 -0
  67. package/dist/hooks/use-screen-options.d.ts +1 -1
  68. package/dist/hooks/use-screen-options.d.ts.map +1 -1
  69. package/dist/hooks/use-screen-options.js +43 -0
  70. package/dist/hooks/use-screen-options.js.map +1 -0
  71. package/dist/hooks/use-search.d.ts +1 -1
  72. package/dist/hooks/use-search.d.ts.map +1 -1
  73. package/{src/hooks/use-search.d.ts → dist/hooks/use-search.js} +6 -2
  74. package/dist/hooks/use-search.js.map +1 -0
  75. package/dist/href.d.ts +2 -2
  76. package/dist/href.d.ts.map +1 -1
  77. package/dist/href.js +57 -0
  78. package/dist/href.js.map +1 -0
  79. package/dist/index.d.ts +33 -33
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +30 -1160
  82. package/dist/index.js.map +1 -1
  83. package/dist/internal/layer-plan.d.ts +1 -1
  84. package/dist/internal/layer-plan.d.ts.map +1 -1
  85. package/dist/internal/layer-plan.js +102 -0
  86. package/dist/internal/layer-plan.js.map +1 -0
  87. package/dist/internal/screen-registry.d.ts +1 -1
  88. package/dist/internal/screen-registry.d.ts.map +1 -1
  89. package/{src/internal/screen-registry.d.ts → dist/internal/screen-registry.js} +32 -21
  90. package/dist/internal/screen-registry.js.map +1 -0
  91. package/{src/internal/screen-width.d.ts → dist/internal/screen-width.js} +17 -2
  92. package/dist/internal/screen-width.js.map +1 -0
  93. package/dist/navigator/core.d.ts +3 -3
  94. package/dist/navigator/core.d.ts.map +1 -1
  95. package/dist/navigator/core.js +394 -0
  96. package/dist/navigator/core.js.map +1 -0
  97. package/dist/register.d.ts +1 -1
  98. package/dist/register.d.ts.map +1 -1
  99. package/dist/register.js +2 -0
  100. package/dist/register.js.map +1 -0
  101. package/dist/types.js +9 -0
  102. package/dist/types.js.map +1 -0
  103. package/dist/url/build.js +30 -0
  104. package/dist/url/build.js.map +1 -0
  105. package/dist/url/compile.js +83 -0
  106. package/dist/url/compile.js.map +1 -0
  107. package/dist/url/format.js +102 -0
  108. package/dist/url/format.js.map +1 -0
  109. package/dist/url/index.d.ts +6 -6
  110. package/dist/url/index.d.ts.map +1 -1
  111. package/dist/url/index.js +13 -0
  112. package/dist/url/index.js.map +1 -0
  113. package/dist/url/parse.d.ts +1 -1
  114. package/dist/url/parse.d.ts.map +1 -1
  115. package/dist/url/parse.js +94 -0
  116. package/dist/url/parse.js.map +1 -0
  117. package/dist/url/registry.d.ts +2 -2
  118. package/dist/url/registry.d.ts.map +1 -1
  119. package/{src/url/registry.d.ts → dist/url/registry.js} +28 -12
  120. package/dist/url/registry.js.map +1 -0
  121. package/dist/url/validate.d.ts +1 -1
  122. package/dist/url/validate.d.ts.map +1 -1
  123. package/dist/url/validate.js +37 -0
  124. package/dist/url/validate.js.map +1 -0
  125. package/package.json +16 -13
  126. package/src/components/EdgeBackHandle.tsx +2 -2
  127. package/src/components/EntryScope.tsx +3 -3
  128. package/src/components/Header.tsx +3 -3
  129. package/src/components/Layer.tsx +3 -3
  130. package/src/components/Link.tsx +4 -4
  131. package/src/components/NavigationRoot.tsx +6 -6
  132. package/src/components/Screen.tsx +3 -3
  133. package/src/components/Stack.tsx +8 -8
  134. package/src/components/TabBar.tsx +1 -1
  135. package/src/components/Tabs.tsx +8 -3
  136. package/src/define-routes.ts +1 -1
  137. package/src/hooks/use-focus.ts +2 -2
  138. package/src/hooks/use-hardware-back.ts +1 -1
  139. package/src/hooks/use-linking-nav.ts +4 -4
  140. package/src/hooks/use-nav-internal.ts +2 -2
  141. package/src/hooks/use-nav-serializer.ts +3 -3
  142. package/src/hooks/use-nav.ts +2 -2
  143. package/src/hooks/use-params.ts +2 -2
  144. package/src/hooks/use-screen-chrome.ts +3 -3
  145. package/src/hooks/use-screen-options.ts +3 -3
  146. package/src/hooks/use-search.ts +2 -2
  147. package/src/href.ts +6 -6
  148. package/src/index.ts +33 -33
  149. package/src/internal/layer-plan.ts +2 -2
  150. package/src/internal/screen-registry.ts +1 -1
  151. package/src/navigator/core.ts +3 -3
  152. package/src/register.ts +1 -1
  153. package/src/url/build.ts +2 -2
  154. package/src/url/index.ts +6 -6
  155. package/src/url/parse.ts +6 -6
  156. package/src/url/registry.ts +3 -3
  157. package/src/url/validate.ts +1 -1
  158. package/src/components/Drawer.d.ts +0 -55
  159. package/src/components/EdgeBackHandle.d.ts +0 -1
  160. package/src/components/EntryScope.d.ts +0 -25
  161. package/src/components/Header.d.ts +0 -6
  162. package/src/components/Layer.d.ts +0 -33
  163. package/src/components/Link.d.ts +0 -60
  164. package/src/components/NavigationRoot.d.ts +0 -36
  165. package/src/components/Screen.d.ts +0 -97
  166. package/src/components/Stack.d.ts +0 -90
  167. package/src/components/TabBar.d.ts +0 -38
  168. package/src/components/Tabs.d.ts +0 -109
  169. package/src/hooks/use-focus.d.ts +0 -45
  170. package/src/hooks/use-hardware-back.d.ts +0 -37
  171. package/src/hooks/use-linking-nav.d.ts +0 -91
  172. package/src/hooks/use-nav-internal.d.ts +0 -91
  173. package/src/hooks/use-nav-serializer.d.ts +0 -82
  174. package/src/hooks/use-nav.d.ts +0 -111
  175. package/src/hooks/use-screen-chrome.d.ts +0 -18
  176. package/src/hooks/use-screen-options.d.ts +0 -2
  177. package/src/href.d.ts +0 -54
  178. package/src/index.d.ts +0 -39
  179. package/src/internal/layer-plan.d.ts +0 -68
  180. package/src/navigator/core.d.ts +0 -96
  181. package/src/register.d.ts +0 -37
  182. package/src/types.d.ts +0 -217
  183. package/src/url/build.d.ts +0 -15
  184. package/src/url/compile.d.ts +0 -34
  185. package/src/url/format.d.ts +0 -28
  186. package/src/url/parse.d.ts +0 -20
  187. 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,UAAU,CAAC;AAE3C,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"}
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,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGrD,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"}
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,aAAa,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;;;;;;;;;;;;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"}
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,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAgB,QAAQ,EAAc,MAAM,UAAU,CAAC;AAGnE,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"}
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"}