@flemo/react 1.4.1 → 1.5.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.
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  <h1>flemo</h1>
5
5
 
6
- **Native-like screen transitions for React**
6
+ **Native-like screen transitions for the web**
7
7
 
8
8
  [![npm](https://img.shields.io/npm/v/@flemo/react.svg)](https://www.npmjs.com/package/@flemo/react)
9
9
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
@@ -12,9 +12,10 @@
12
12
 
13
13
  ---
14
14
 
15
- flemo is a React router whose unit of routing is a **screen**, not a page. Push, pop, and the
15
+ flemo is a router whose unit of routing is a **screen**, not a page. Push, pop, and the
16
16
  animations and gestures between screens are handled by flemo, so you don't need to wire a
17
- router and a motion library together yourself.
17
+ router and a motion library together yourself. `@flemo/react` is the React binding (the
18
+ framework-agnostic core lives in `@flemo/core`).
18
19
 
19
20
  ## Install
20
21
 
package/dist/Router.d.ts CHANGED
@@ -1,11 +1,15 @@
1
- import { PropsWithChildren } from 'react';
2
- import { PartTransition, Decorator, Transition, TransitionName } from '@flemo/core';
1
+ import { CSSProperties, PropsWithChildren } from 'react';
2
+ import { HistoryDriver, PartTransition, Decorator, Transition, TransitionName } from '@flemo/core';
3
3
  interface RouterProps {
4
4
  initPath?: string;
5
5
  defaultTransitionName?: TransitionName;
6
6
  transitions?: Transition[];
7
7
  decorators?: Decorator[];
8
8
  partTransitions?: PartTransition[];
9
+ history?: "browser" | "memory";
10
+ createDriver?: (routerKey?: string) => HistoryDriver;
11
+ className?: string;
12
+ style?: CSSProperties;
9
13
  }
10
- declare function Router({ children, initPath, defaultTransitionName, transitions, decorators, partTransitions }: PropsWithChildren<RouterProps>): import("react").JSX.Element;
14
+ declare function Router({ children, initPath, defaultTransitionName, transitions, decorators, partTransitions, history, createDriver, className, style }: PropsWithChildren<RouterProps>): import("react").JSX.Element;
11
15
  export default Router;
@@ -0,0 +1,2 @@
1
+ declare const RouterDepthContext: import('react').Context<number>;
2
+ export default RouterDepthContext;
package/dist/Slot.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { CSSProperties, PropsWithChildren } from 'react';
2
+ export interface SlotProps {
3
+ className?: string;
4
+ style?: CSSProperties;
5
+ }
6
+ declare function Slot({ children, className, style }: PropsWithChildren<SlotProps>): import("react").JSX.Element;
7
+ export default Slot;
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.d.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  export { default as Router } from './Router';
2
2
  export { default as Route, type RegisterRoute } from './Route';
3
+ export { default as Slot, type SlotProps } from './Slot';
4
+ export { default as Layer } from './screen/Layer';
3
5
  export { default as useNavigate } from './navigate/useNavigate';
6
+ export { default as usePathname } from './navigate/usePathname';
4
7
  export { default as useStep } from './navigate/useStep';
5
8
  export { default as useScreen } from './screen/useScreen';
6
9
  export { default as useParams } from './screen/ParamsProvider/useParams';
@@ -18,5 +21,5 @@ export { default as RouterScopeProvider } from './stores/RouterScopeProvider';
18
21
  export { type FlemoStores } from './stores/StoreContext';
19
22
  export { type SharedBarPresence } from './screen/store';
20
23
  export { default as useViewportScrollHeight } from './screen/useViewportScrollHeight';
21
- export { createTransition, createRawTransition, createDecorator, createRawDecorator, createPartTransition, createRawPartTransition, partTransitionMap } from '@flemo/core';
22
- export type { TransitionName, RegisterTransition, DecoratorName, RegisterDecorator, PartTransitionName, RegisterPartTransition, PartTransitionOptions } from '@flemo/core';
24
+ export { createTransition, createRawTransition, createDecorator, createRawDecorator, createPartTransition, createRawPartTransition, partTransitionMap, createBrowserHistoryDriver } from '@flemo/core';
25
+ export type { TransitionName, RegisterTransition, DecoratorName, RegisterDecorator, PartTransitionName, RegisterPartTransition, PartTransitionOptions, HistoryDriver, HistoryNavEvent } from '@flemo/core';
package/dist/index.mjs CHANGED
@@ -1,24 +1,29 @@
1
- import e, { Children as t, createContext as n, useContext as r, useEffect as i, useImperativeHandle as a, useInsertionEffect as o, useLayoutEffect as s, useReducer as c, useRef as l, useState as u } from "react";
2
- import { TaskManger as d, applyTransitionStyles as f, computeScreenFreeze as p, createDecorator as m, createHistoryStore as h, createHistorySync as g, createNavigateStore as _, createNavigationController as v, createPartTransition as y, createRawDecorator as b, createRawPartTransition as ee, createRawTransition as x, createScreenSelector as te, createScreenStore as S, createSwipeController as ne, createTransition as C, createTransitionEngine as re, createTransitionStore as w, decoratorMap as T, driveBarRiding as ie, ensureWindowHistoryState as E, getMatchedPathPattern as ae, isServer as D, markSelfInducedPop as oe, partTransitionMap as O, partTransitionMap as k, seedInitialHistory as A, transitionMap as j } from "@flemo/core";
3
- import { jsx as M, jsxs as se } from "react/jsx-runtime";
1
+ import e, { Activity as t, Children as n, createContext as r, isValidElement as i, useContext as a, useEffect as o, useId as s, useImperativeHandle as c, useInsertionEffect as l, useLayoutEffect as u, useReducer as d, useRef as f, useState as p } from "react";
2
+ import { TaskManger as m, applyTransitionStyles as h, computeScreenFreeze as g, consumeSelfInducedPop as _, createBrowserHistoryDriver as v, createBrowserHistoryDriver as y, createDecorator as b, createHistoryStore as ee, createHistorySync as x, createMemoryHistoryDriver as te, createNavigateStore as ne, createNavigationController as S, createPartTransition as C, createRawDecorator as w, createRawPartTransition as T, createRawTransition as E, createScreenSelector as re, createScreenStore as D, createSelfPopGuard as ie, createSwipeController as O, createTransition as k, createTransitionEngine as A, createTransitionStore as j, decoratorMap as M, driveBarRiding as N, ensureWindowHistoryState as P, getMatchedPathPattern as F, isServer as ae, markSelfInducedPop as I, partTransitionMap as L, partTransitionMap as R, seedInitialHistory as oe, transitionMap as z } from "@flemo/core";
3
+ import { jsx as B, jsxs as se } from "react/jsx-runtime";
4
+ import { createPortal as ce } from "react-dom";
4
5
  //#region \0rolldown/runtime.js
5
- var ce = (e, t) => () => (t || (e((t = { exports: {} }).exports, t), e = null), t.exports), N = n(null);
6
+ var le = (e, t) => () => (t || (e((t = { exports: {} }).exports, t), e = null), t.exports), V = r(null);
6
7
  //#endregion
7
8
  //#region src/stores/useStores.ts
8
- function P() {
9
- let e = r(N);
9
+ function H() {
10
+ let e = a(V);
10
11
  if (!e) throw Error("flemo stores are missing. Render inside a <Router>.");
11
12
  return e;
12
13
  }
13
14
  //#endregion
14
15
  //#region src/history/HistoryListener.tsx
15
- function F() {
16
- let e = P();
17
- return i(() => g({ stores: e }), [e]), null;
16
+ function ue() {
17
+ let e = H();
18
+ return o(() => x({
19
+ stores: e,
20
+ driver: e.driver,
21
+ consume: e.consume
22
+ }), [e]), null;
18
23
  }
19
24
  //#endregion
20
25
  //#region src/screen/ScreenContext.ts
21
- var I = (/* @__PURE__ */ ce(((e) => {
26
+ var de = (/* @__PURE__ */ le(((e) => {
22
27
  Object.defineProperty(e, "__esModule", { value: !0 }), e.PathError = e.TokenData = void 0, e.parse = c, e.compile = l, e.pathToRegexp = f;
23
28
  var t = "/", n = (e) => e, r = /^[$_\p{ID_Start}]$/u, i = /^[$\u200c\u200d\p{ID_Continue}]$/u;
24
29
  function a(e) {
@@ -205,7 +210,7 @@ var I = (/* @__PURE__ */ ce(((e) => {
205
210
  function h(e, t) {
206
211
  return t.length > e.length ? h(t, e) : (e === t && (t = ""), t.length > 1 ? `(?:(?!${a(e)}|${a(t)})[^])` : e.length > 1 ? `(?:(?!${a(e)})[^${a(t)}])` : `[^${a(e + t)}]`);
207
212
  }
208
- })))(), L = n({
213
+ })))(), U = r({
209
214
  id: "",
210
215
  isActive: !1,
211
216
  isRoot: !0,
@@ -220,15 +225,15 @@ var I = (/* @__PURE__ */ ce(((e) => {
220
225
  });
221
226
  //#endregion
222
227
  //#region src/screen/useScreen.ts
223
- function R() {
224
- return r(L);
228
+ function W() {
229
+ return a(U);
225
230
  }
226
231
  //#endregion
227
232
  //#region src/screen/ParamsProvider/ParamsContext.ts
228
- var le = n({}), z = n(() => {});
233
+ var G = r({}), K = r(() => {});
229
234
  //#endregion
230
235
  //#region src/screen/ParamsProvider/ParamsReducer.ts
231
- function ue(e, t) {
236
+ function q(e, t) {
232
237
  switch (t.type) {
233
238
  case "SET": return t.params;
234
239
  default: return e;
@@ -236,67 +241,75 @@ function ue(e, t) {
236
241
  }
237
242
  //#endregion
238
243
  //#region src/screen/ParamsProvider/ParamsProvider.tsx
239
- function B({ children: e }) {
240
- let { isActive: t, params: n } = R(), [r, a] = c(ue, n);
241
- return i(() => {
242
- let e = async (e) => {
243
- e.state?.step && await d.addTask(async () => {
244
+ function J({ children: e }) {
245
+ let { isActive: t, params: n } = W(), { driver: r } = H(), [i, a] = d(q, n);
246
+ return o(() => {
247
+ if (t) return r.subscribe((e) => {
248
+ let t = e.state;
249
+ t?.step && m.addTask(async () => {
244
250
  a({
245
251
  type: "SET",
246
- params: e.state?.params || {}
252
+ params: t.params ?? {}
247
253
  });
248
254
  });
249
- };
250
- return t && window.addEventListener("popstate", e), () => {
251
- window.removeEventListener("popstate", e);
252
- };
253
- }, [t, a]), /* @__PURE__ */ M(z.Provider, {
255
+ });
256
+ }, [
257
+ t,
258
+ a,
259
+ r
260
+ ]), /* @__PURE__ */ B(K.Provider, {
254
261
  value: a,
255
- children: /* @__PURE__ */ M(le.Provider, {
256
- value: r,
262
+ children: /* @__PURE__ */ B(G.Provider, {
263
+ value: i,
257
264
  children: e
258
265
  })
259
266
  });
260
267
  }
261
268
  //#endregion
262
269
  //#region ../../node_modules/.pnpm/zustand@5.0.14_@types+react@19.2.17_react@19.2.7/node_modules/zustand/esm/react.mjs
263
- var V = (e) => e;
264
- function H(t, n = V) {
270
+ var Y = (e) => e;
271
+ function X(t, n = Y) {
265
272
  let r = e.useSyncExternalStore(t.subscribe, e.useCallback(() => n(t.getState()), [t, n]), e.useCallback(() => n(t.getInitialState()), [t, n]));
266
273
  return e.useDebugValue(r), r;
267
274
  }
268
275
  //#endregion
269
276
  //#region src/stores/useHistoryStore.ts
270
- function U(e) {
271
- return H(P().history, e);
277
+ function Z(e) {
278
+ return X(H().history, e);
272
279
  }
273
280
  //#endregion
274
281
  //#region src/renderer/Renderer.tsx
275
- function W({ children: e }) {
276
- let n = U((e) => e.index);
277
- return te(U((e) => e.histories), n).map((n) => {
278
- let [r] = t.toArray(e).filter((e) => (0, I.pathToRegexp)(e.props.path).regexp.test(n.pathname));
279
- return /* @__PURE__ */ M(L.Provider, {
282
+ function Q({ children: e }) {
283
+ let t = Z((e) => e.index);
284
+ return re(Z((e) => e.histories), t).map((t) => {
285
+ let [r] = n.toArray(e).filter((e) => (0, de.pathToRegexp)(e.props.path).regexp.test(t.pathname));
286
+ return /* @__PURE__ */ B(U.Provider, {
280
287
  value: {
281
- ...n,
282
- routePath: ae(r.props.path, n.pathname)
288
+ ...t,
289
+ routePath: F(r.props.path, t.pathname)
283
290
  },
284
- children: /* @__PURE__ */ M(B, { children: r })
285
- }, n.id);
291
+ children: /* @__PURE__ */ B(J, { children: r })
292
+ }, t.id);
286
293
  });
287
294
  }
288
295
  //#endregion
296
+ //#region src/screen/ScreenViewportContext.ts
297
+ var fe = r({ contained: !1 });
298
+ function pe() {
299
+ return a(fe);
300
+ }
301
+ //#endregion
289
302
  //#region src/transition/styles.ts
290
- function G(e, t, n = []) {
291
- o(() => {
292
- for (let t of e) j.set(t.name, t);
293
- for (let e of t) T.set(e.name, e);
294
- for (let e of n) k.set(e.name, e);
295
- return f(), () => {
296
- for (let t of e) j.delete(t.name);
297
- for (let e of t) T.delete(e.name);
298
- for (let e of n) k.delete(e.name);
299
- f();
303
+ function me(e, t, n = []) {
304
+ l(() => {
305
+ for (let t of e) z.set(t.name, t);
306
+ for (let e of t) M.set(e.name, e);
307
+ for (let e of n) R.set(e.name, e);
308
+ return h(), () => {
309
+ for (let t of e) z.delete(t.name);
310
+ for (let e of t) M.delete(e.name);
311
+ for (let e of n) R.delete(e.name);
312
+ h();
300
313
  };
301
314
  }, [
302
315
  e,
@@ -305,37 +318,121 @@ function G(e, t, n = []) {
305
318
  ]);
306
319
  }
307
320
  //#endregion
321
+ //#region src/RouterDepthContext.ts
322
+ var he = r(0), ge = { contained: !0 };
323
+ function _e({ children: e, className: t, style: n }) {
324
+ return /* @__PURE__ */ B("div", {
325
+ className: t,
326
+ style: {
327
+ position: "relative",
328
+ overflow: "hidden",
329
+ ...n
330
+ },
331
+ children: /* @__PURE__ */ B(fe.Provider, {
332
+ value: ge,
333
+ children: /* @__PURE__ */ B(Q, { children: e })
334
+ })
335
+ });
336
+ }
337
+ //#endregion
308
338
  //#region src/Router.tsx
309
- var K = [], q = [], J = [];
310
- function Y({ children: e, initPath: n = "/", defaultTransitionName: a = "cupertino", transitions: o = K, decorators: s = q, partTransitions: c = J }) {
311
- let l = D() ? n || "/" : window.location.pathname, d = D() ? l.split("?")[1] || "" : window.location.search, f = r(N), [p] = u(() => {
312
- let n = A(t.toArray(e).map((e) => e.props.path).flat(), l, d, a);
313
- return f ? (f.history.getState().index === -1 && f.history.setState({
339
+ function ve(e) {
340
+ let t = null;
341
+ return n.forEach(e, (e) => {
342
+ if (t || !i(e)) return;
343
+ if (e.type === _e) {
344
+ t = n.toArray(e.props.children).filter(i);
345
+ return;
346
+ }
347
+ let r = e.props.children;
348
+ if (r) {
349
+ let e = ve(r);
350
+ e && (t = e);
351
+ }
352
+ }), t;
353
+ }
354
+ var ye = {
355
+ mark: () => {},
356
+ consume: () => !1
357
+ }, be = [], xe = [], Se = [], Ce = { contained: !0 };
358
+ function we({ children: e, initPath: t = "/", defaultTransitionName: r = "cupertino", transitions: i = be, decorators: c = xe, partTransitions: l = Se, history: u = "browser", createDriver: d, className: f, style: m }) {
359
+ let h = a(he), g = h > 0, _ = u === "memory", v = s(), b = ve(e), x = b !== null, S = a(V), C = g ? null : S, w = C !== null, T = d ?? y, [E] = p(() => _ ? null : T(w ? void 0 : v)), re = !g && !_ && !ae(), O = re && E ? E.readPathname() : t || "/", k = O.indexOf("?"), A = (k >= 0 ? O.slice(0, k) : O) || "/", M = re ? window.location.search : k >= 0 ? O.slice(k) : "", [N] = p(() => {
360
+ let t = oe((b ?? n.toArray(e)).map((e) => e.props.path).flat(), A, M, r);
361
+ if (C) return C.history.getState().index === -1 && C.history.setState({
314
362
  index: 0,
315
- histories: [n]
316
- }), f) : {
317
- history: h([n], 0),
318
- navigate: _(),
319
- transition: w(a),
320
- screen: S()
363
+ histories: [t]
364
+ }), C;
365
+ let i = _ ? te({
366
+ state: {
367
+ id: t.id,
368
+ index: 0,
369
+ status: "IDLE",
370
+ params: t.params,
371
+ transitionName: t.transitionName,
372
+ layoutId: t.layoutId
373
+ },
374
+ url: t.pathname
375
+ }) : E, a = _ ? ye : ie();
376
+ return {
377
+ history: ee([t], 0),
378
+ navigate: ne(),
379
+ transition: j(r),
380
+ screen: D(),
381
+ driver: i,
382
+ markSelfInduced: a.mark,
383
+ consume: a.consume
321
384
  };
322
385
  });
323
- return p.transition.setState({ defaultTransitionName: a }), G(o, s, c), i(() => {
324
- E(a);
325
- }, [a]), /* @__PURE__ */ se(N.Provider, {
326
- value: p,
327
- children: [/* @__PURE__ */ M(F, {}), /* @__PURE__ */ M(W, { children: e })]
386
+ N.transition.setState({ defaultTransitionName: r }), me(i, c, l), o(() => {
387
+ _ || ae() || (P(w ? null : v, r, N.history.getState().histories[0]?.params ?? {}), g && !w && E && E.readPathname() !== A && E.replaceState(E.readState(), A));
388
+ }, [
389
+ _,
390
+ w,
391
+ g,
392
+ v,
393
+ A,
394
+ r,
395
+ N.history,
396
+ E
397
+ ]);
398
+ let F = x ? e : /* @__PURE__ */ B(Q, { children: e }), I = /* @__PURE__ */ B(he.Provider, {
399
+ value: h + 1,
400
+ children: /* @__PURE__ */ se(V.Provider, {
401
+ value: N,
402
+ children: [!_ && /* @__PURE__ */ B(ue, {}), g ? /* @__PURE__ */ B(fe.Provider, {
403
+ value: Ce,
404
+ children: F
405
+ }) : F]
406
+ })
328
407
  });
408
+ return g ? /* @__PURE__ */ B("div", {
409
+ className: f,
410
+ style: {
411
+ position: "relative",
412
+ overflow: "hidden",
413
+ ...m
414
+ },
415
+ children: I
416
+ }) : I;
329
417
  }
330
418
  //#endregion
331
419
  //#region src/Route.tsx
332
- function de({ element: e }) {
420
+ function Te({ element: e }) {
333
421
  return e;
334
422
  }
335
423
  //#endregion
424
+ //#region src/screen/LayerMountContext.ts
425
+ var Ee = r(null);
426
+ //#endregion
427
+ //#region src/screen/Layer.tsx
428
+ function De({ children: e }) {
429
+ let t = a(Ee);
430
+ return t ? ce(e, t) : e;
431
+ }
432
+ //#endregion
336
433
  //#region src/utils/buildRoutePath.ts
337
- function X(e, t) {
338
- let n = t ?? {}, r = (0, I.compile)(e)(Object.fromEntries(Object.entries(n).map(([e, t]) => [e, String(t)]))), i = (typeof e == "string" ? (0, I.parse)(e) : e).tokens.filter((e) => e.type === "param").map((e) => e.name), a = Object.fromEntries(Object.entries(n).filter(([e]) => !i.includes(e))), o = new URLSearchParams(a).toString();
434
+ function Oe(e, t) {
435
+ let n = t ?? {}, r = (0, de.compile)(e)(Object.fromEntries(Object.entries(n).map(([e, t]) => [e, String(t)]))), i = (typeof e == "string" ? (0, de.parse)(e) : e).tokens.filter((e) => e.type === "param").map((e) => e.name), a = Object.fromEntries(Object.entries(n).filter(([e]) => !i.includes(e))), o = new URLSearchParams(a).toString();
339
436
  return {
340
437
  pathname: `${r}${o ? `?${o}` : ""}`,
341
438
  toPathname: r
@@ -343,73 +440,90 @@ function X(e, t) {
343
440
  }
344
441
  //#endregion
345
442
  //#region src/navigate/useNavigate.ts
346
- function fe() {
347
- let e = v({
348
- stores: P(),
349
- buildPathname: (e, t) => X(e, t)
443
+ function ke() {
444
+ let e = H(), t = S({
445
+ stores: e,
446
+ buildPathname: (e, t) => Oe(e, t),
447
+ driver: e.driver,
448
+ markSelfInduced: e.markSelfInduced
350
449
  });
351
450
  return {
352
- push: (t, n, r) => e.push(t, n ?? {}, r),
353
- replace: (t, n, r) => e.replace(t, n ?? {}, r),
354
- pop: (t) => e.pop(t)
451
+ push: (e, n, r) => t.push(e, n ?? {}, r),
452
+ replace: (e, n, r) => t.replace(e, n ?? {}, r),
453
+ pop: (e) => t.pop(e)
355
454
  };
356
455
  }
357
456
  //#endregion
457
+ //#region src/navigate/usePathname.ts
458
+ function Ae() {
459
+ return Z((e) => e.histories[e.pendingIndex]?.pathname ?? "/");
460
+ }
461
+ //#endregion
358
462
  //#region src/navigate/useStep.ts
359
- function pe() {
360
- let { routePath: e } = R(), t = P(), n = r(z);
463
+ var je = (e) => {
464
+ let t = e;
465
+ return t?.step ? t.params ?? {} : null;
466
+ }, Me = (e, t) => {
467
+ let n = new URLSearchParams(Object.fromEntries(Object.entries(t).map(([e, t]) => [e, String(t)]))).toString();
468
+ return n ? `${e}?${n}` : e;
469
+ };
470
+ function Ne() {
471
+ let { routePath: e } = W(), t = H(), n = a(K), { driver: r, markSelfInduced: i } = t, [s, c] = p(null);
472
+ o(() => {
473
+ if (!e) return c(je(r.readState())), r.subscribe((e) => c(je(e.state)));
474
+ }, [e, r]);
475
+ let l = (t) => e ? Oe(e, t).pathname : Me(r.readPathname(), t), u = (t) => {
476
+ n({
477
+ type: "SET",
478
+ params: t
479
+ }), e || c(t);
480
+ };
361
481
  return {
362
- pushStep: async (t) => {
363
- (await d.addTask(async () => {
364
- let { pathname: r } = X(e, t);
365
- return window.history.state?.step || window.history.replaceState({
366
- ...window.history.state,
482
+ step: s,
483
+ pushStep: async (e) => {
484
+ (await m.addTask(async () => {
485
+ let t = l(e), n = r.readState();
486
+ return n?.step || r.replaceState({
487
+ ...n,
367
488
  step: !0
368
- }, "", window.location.pathname), window.history.pushState({
369
- ...window.history.state,
489
+ }, r.readPathname()), r.pushState({
490
+ ...r.readState(),
370
491
  step: !0,
371
- params: t
372
- }, "", r), async () => n({
373
- type: "SET",
374
- params: t
375
- });
492
+ params: e
493
+ }, t), async () => u(e);
376
494
  })).result?.();
377
495
  },
378
- replaceStep: async (t) => {
379
- (await d.addTask(async () => {
380
- let { pathname: r } = X(e, t);
381
- return window.history.replaceState({
382
- ...window.history.state,
496
+ replaceStep: async (e) => {
497
+ (await m.addTask(async () => {
498
+ let t = l(e);
499
+ return r.replaceState({
500
+ ...r.readState(),
383
501
  step: !0,
384
- params: t
385
- }, "", r), async () => n({
386
- type: "SET",
387
- params: t
388
- });
502
+ params: e
503
+ }, t), async () => u(e);
389
504
  })).result?.();
390
505
  },
391
506
  popStep: async () => {
392
- let e = d.generateTaskId();
393
- (await d.addTask(async (r) => {
394
- let i = new Promise((e) => {
395
- window.addEventListener("popstate", (t) => e(t.state), { once: !0 });
396
- }), a = new Promise((e) => setTimeout(() => e(void 0), 200));
397
- oe(), window.history.back();
398
- let o = await Promise.race([i, a]);
399
- if (!o) {
400
- r.abort();
507
+ let e = m.generateTaskId();
508
+ (await m.addTask(async (n) => {
509
+ let a = new Promise((e) => {
510
+ let t = r.subscribe((n) => {
511
+ t(), e(n.state);
512
+ });
513
+ }), o = new Promise((e) => setTimeout(() => e(void 0), 200));
514
+ i(), r.back();
515
+ let s = await Promise.race([a, o]);
516
+ if (!s) {
517
+ n.abort();
401
518
  return;
402
519
  }
403
- if (o.step) {
404
- n({
405
- type: "SET",
406
- params: o.params ?? {}
407
- }), r.abort();
520
+ if (s.step) {
521
+ u(s.params ?? {}), n.abort();
408
522
  return;
409
523
  }
410
- let { setStatus: s, setTransitionTaskId: c } = t.navigate.getState(), { index: l, popHistory: u } = t.history.getState();
411
- return s("POPPING"), c(e), async () => {
412
- u(l), s("COMPLETED");
524
+ let { setStatus: c, setTransitionTaskId: l } = t.navigate.getState(), { index: d, popHistory: f } = t.history.getState();
525
+ return c("POPPING"), l(e), async () => {
526
+ f(d), c("COMPLETED");
413
527
  };
414
528
  }, {
415
529
  id: e,
@@ -420,34 +534,33 @@ function pe() {
420
534
  }
421
535
  //#endregion
422
536
  //#region src/screen/ParamsProvider/useParams.ts
423
- function me() {
424
- return r(le);
537
+ function Pe() {
538
+ return a(G);
425
539
  }
426
540
  //#endregion
427
541
  //#region src/screen/ScreenFreeze.tsx
428
- function Z({ freeze: e, children: t }) {
429
- let n = l(t);
430
- return e || (n.current = t), /* @__PURE__ */ M("div", {
431
- style: { display: e ? "none" : void 0 },
432
- children: n.current
542
+ function Fe({ freeze: e, children: n }) {
543
+ return /* @__PURE__ */ B(t, {
544
+ mode: e ? "hidden" : "visible",
545
+ children: n
433
546
  });
434
547
  }
435
548
  //#endregion
436
549
  //#region src/stores/useNavigateStore.ts
437
- function Q(e) {
438
- return H(P().navigate, e);
550
+ function $(e) {
551
+ return X(H().navigate, e);
439
552
  }
440
553
  //#endregion
441
554
  //#region src/screen/ScreenDecorator.tsx
442
- function he({ ref: e, style: t, ...n }) {
443
- let { isActive: r, transitionName: i } = R(), o = l(null);
444
- a(e, () => o.current);
445
- let s = Q((e) => e.status), { decoratorName: c } = j.get(i) ?? j.get("none"), u = T.get(c);
446
- return u ? /* @__PURE__ */ M("div", {
447
- ref: o,
555
+ function Ie({ ref: e, style: t, ...n }) {
556
+ let { isActive: r, transitionName: i } = W(), a = f(null);
557
+ c(e, () => a.current);
558
+ let o = $((e) => e.status), { decoratorName: s } = z.get(i) ?? z.get("none"), l = M.get(s);
559
+ return l ? /* @__PURE__ */ B("div", {
560
+ ref: a,
448
561
  "data-flemo-decorator": !0,
449
- "data-flemo-decorator-name": u.name,
450
- "data-flemo-status": s,
562
+ "data-flemo-decorator-name": l.name,
563
+ "data-flemo-status": o,
451
564
  "data-flemo-active": r ? "true" : "false",
452
565
  style: {
453
566
  position: "absolute",
@@ -464,16 +577,16 @@ function he({ ref: e, style: t, ...n }) {
464
577
  }
465
578
  //#endregion
466
579
  //#region src/screen/useViewportScrollHeight.ts
467
- var ge = 0;
468
- function _e() {
469
- let [e, t] = u(0), [n, r] = u(0);
470
- return i(() => {
580
+ var Le = 0;
581
+ function Re() {
582
+ let [e, t] = p(0), [n, r] = p(0);
583
+ return o(() => {
471
584
  let e = 0, n = () => {
472
585
  cancelAnimationFrame(e), e = requestAnimationFrame(() => {
473
586
  let e = document.documentElement.scrollHeight - (window.visualViewport?.height || 0);
474
587
  e = e < 0 ? 0 : e;
475
- let n = e - ge;
476
- n = n < 0 ? 0 : n, ge ||= e, r(n), t(e);
588
+ let n = e - Le;
589
+ n = n < 0 ? 0 : n, Le ||= e, r(n), t(e);
477
590
  });
478
591
  };
479
592
  return window.visualViewport?.addEventListener("resize", n), window.visualViewport?.addEventListener("scroll", n), () => {
@@ -486,164 +599,164 @@ function _e() {
486
599
  }
487
600
  //#endregion
488
601
  //#region src/stores/useScreenStore.ts
489
- function $(e) {
490
- return H(P().screen, e);
602
+ function ze(e) {
603
+ return X(H().screen, e);
491
604
  }
492
605
  //#endregion
493
606
  //#region src/screen/ScreenMotion.tsx
494
- function ve({ children: e, statusBarHeight: t, statusBarColor: n, systemNavigationBarHeight: r, systemNavigationBarColor: a, sharedAppBar: o, sharedNavigationBar: c, appBar: d, navigationBar: f, hideStatusBar: p, hideSystemNavigationBar: m, backgroundColor: h = "white", contentScrollable: g = !0, ..._ }) {
495
- let { id: v, isActive: y, isRoot: b, zIndex: ee, transitionName: x, prevTransitionName: te } = R(), S = P(), C = Q((e) => e.status), w = $((e) => e.dragStatus), E = S.screen.getState().setDragStatus, ae = S.screen.getState().setReplaceTransitionStatus, D = U((e) => e.index), oe = l(null);
496
- oe.current ||= re({
497
- getTransitionTaskId: () => S.navigate.getState().transitionTaskId,
607
+ function Be({ children: e, statusBarHeight: t, statusBarColor: n, systemNavigationBarHeight: r, systemNavigationBarColor: i, sharedTopBar: a, sharedBottomBar: s, topBar: c, bottomBar: l, hideStatusBar: d, hideSystemNavigationBar: m, backgroundColor: h = "white", contentScrollable: g = !0, ..._ }) {
608
+ let { id: v, isActive: y, isRoot: b, zIndex: ee, transitionName: x, prevTransitionName: te } = W(), { contained: ne } = pe(), S = ne ? "absolute" : "fixed", C = H(), w = $((e) => e.status), T = ze((e) => e.dragStatus), E = C.screen.getState().setDragStatus, re = C.screen.getState().setReplaceTransitionStatus, D = Z((e) => e.index), ie = f(null);
609
+ ie.current ||= A({
610
+ getTransitionTaskId: () => C.navigate.getState().transitionTaskId,
498
611
  setDragStatus: E,
499
- setReplaceTransitionStatus: ae
612
+ setReplaceTransitionStatus: re
500
613
  });
501
- let O = oe.current, k = j.get(x) ?? j.get("none"), { initial: A, swipeDirection: ce, decoratorName: N } = k, F = T.get(N), { viewportScrollHeight: I } = _e(), L = I > 0, [le, z] = u(0), [ue, B] = u(0), V = l(null), H = l(null), W = l(null), G = l(null), K = l(null), q = l({
502
- transition: k,
503
- decorator: F,
504
- hasSharedAppBar: !!o,
505
- hasSharedNavigationBar: !!c,
506
- viewportScrollHeight: I,
614
+ let k = ie.current, j = z.get(x) ?? z.get("none"), { initial: P, swipeDirection: F, decoratorName: ae } = j, I = M.get(ae), { viewportScrollHeight: L } = Re(), R = L > 0, [oe, ce] = p(0), [le, V] = p(0), [ue, de] = p(null), U = f(null), G = f(null), K = f(null), q = f(null), J = f(null), Y = f({
615
+ transition: j,
616
+ decorator: I,
617
+ hasSharedTopBar: !!a,
618
+ hasSharedBottomBar: !!s,
619
+ viewportScrollHeight: L,
507
620
  isRoot: b,
508
621
  isActive: y,
509
- status: C,
510
- dragStatus: w,
622
+ status: w,
623
+ dragStatus: T,
511
624
  index: D
512
625
  });
513
- q.current = {
514
- transition: k,
515
- decorator: F,
516
- hasSharedAppBar: !!o,
517
- hasSharedNavigationBar: !!c,
518
- viewportScrollHeight: I,
626
+ Y.current = {
627
+ transition: j,
628
+ decorator: I,
629
+ hasSharedTopBar: !!a,
630
+ hasSharedBottomBar: !!s,
631
+ viewportScrollHeight: L,
519
632
  isRoot: b,
520
633
  isActive: y,
521
- status: C,
522
- dragStatus: w,
634
+ status: w,
635
+ dragStatus: T,
523
636
  index: D
524
637
  };
525
- let J = l(null);
526
- J.current ||= ne({
527
- getTransition: () => q.current.transition,
528
- getDecorator: () => q.current.decorator,
638
+ let X = f(null);
639
+ X.current ||= O({
640
+ getTransition: () => Y.current.transition,
641
+ getDecorator: () => Y.current.decorator,
529
642
  getElements: () => ({
530
- scope: H.current,
531
- screenContainer: V.current,
532
- decorator: W.current,
533
- sharedAppBar: G.current,
534
- sharedNavigationBar: K.current
643
+ scope: G.current,
644
+ screenContainer: U.current,
645
+ decorator: K.current,
646
+ sharedTopBar: q.current,
647
+ sharedBottomBar: J.current
535
648
  }),
536
- hasSharedAppBar: () => q.current.hasSharedAppBar,
537
- hasSharedNavigationBar: () => q.current.hasSharedNavigationBar,
538
- getViewportScrollHeight: () => q.current.viewportScrollHeight,
649
+ hasSharedTopBar: () => Y.current.hasSharedTopBar,
650
+ hasSharedBottomBar: () => Y.current.hasSharedBottomBar,
651
+ getViewportScrollHeight: () => Y.current.viewportScrollHeight,
539
652
  isReadyForDrag: () => {
540
- let e = q.current;
653
+ let e = Y.current;
541
654
  return !e.isRoot && e.isActive && e.status === "COMPLETED" && e.dragStatus === "IDLE" && !!e.transition.swipeDirection && e.viewportScrollHeight < 10;
542
655
  },
543
656
  getPartnerBars: () => {
544
- let e = q.current, t = S.history.getState().histories, n = e.isActive ? t[e.index - 1]?.id : t[e.index]?.id;
545
- return n ? S.screen.getState().sharedBars[n] : void 0;
657
+ let e = Y.current, t = C.history.getState().histories, n = e.isActive ? t[e.index - 1]?.id : t[e.index]?.id;
658
+ return n ? C.screen.getState().sharedBars[n] : void 0;
546
659
  },
547
660
  setDragStatus: E,
548
661
  back: () => window.history.back()
549
662
  });
550
- let Y = J.current, de = (e) => Y.pointerDown(e.nativeEvent), X = (e) => Y.pointerMove(e.nativeEvent), fe = (e) => Y.pointerUp(e.nativeEvent);
551
- i(() => {
552
- let e = H.current;
663
+ let Q = X.current, fe = (e) => Q.pointerDown(e.nativeEvent), me = (e) => Q.pointerMove(e.nativeEvent), he = (e) => Q.pointerUp(e.nativeEvent);
664
+ o(() => {
665
+ let e = G.current;
553
666
  if (!e) return;
554
667
  let t = (e) => {
555
- Y.shouldPreventTouch() && e.preventDefault(), e.target?.dataset.swipeAtEdgeBar === "true" && e.preventDefault();
668
+ Q.shouldPreventTouch() && e.preventDefault(), e.target?.dataset.swipeAtEdgeBar === "true" && e.preventDefault();
556
669
  };
557
670
  return e.addEventListener("touchmove", t, { passive: !1 }), () => {
558
671
  e.removeEventListener("touchmove", t);
559
672
  };
560
- }, [Y]), s(() => O.driveScreenLifecycle({
673
+ }, [Q]), u(() => k.driveScreenLifecycle({
561
674
  getElements: () => ({
562
- scope: H.current,
563
- decorator: W.current,
564
- bars: [G.current, K.current]
675
+ scope: G.current,
676
+ decorator: K.current,
677
+ bars: [q.current, J.current]
565
678
  }),
566
679
  transitionName: x,
567
680
  prevTransitionName: te,
568
- status: C,
681
+ status: w,
569
682
  isActive: y
570
683
  }), [
571
- O,
572
- C,
684
+ k,
685
+ w,
573
686
  y,
574
687
  te,
575
688
  x
576
- ]), s(() => {
577
- let e = G.current;
689
+ ]), u(() => {
690
+ let e = q.current;
578
691
  if (!e) {
579
- z(0);
692
+ ce(0);
580
693
  return;
581
694
  }
582
- e.offsetHeight > 0 && z(e.offsetHeight);
695
+ e.offsetHeight > 0 && ce(e.offsetHeight);
583
696
  let t = new ResizeObserver(([e]) => {
584
- e.contentRect.height > 0 && z(e.contentRect.height);
697
+ e.contentRect.height > 0 && ce(e.contentRect.height);
585
698
  });
586
699
  return t.observe(e), () => {
587
700
  t.disconnect();
588
701
  };
589
- }, [o]), s(() => {
590
- let e = K.current;
702
+ }, [a]), u(() => {
703
+ let e = J.current;
591
704
  if (!e) {
592
- B(0);
705
+ V(0);
593
706
  return;
594
707
  }
595
- e.offsetHeight > 0 && B(e.offsetHeight);
708
+ e.offsetHeight > 0 && V(e.offsetHeight);
596
709
  let t = new ResizeObserver(([e]) => {
597
- e.contentRect.height > 0 && B(e.contentRect.height);
710
+ e.contentRect.height > 0 && V(e.contentRect.height);
598
711
  });
599
712
  return t.observe(e), () => {
600
713
  t.disconnect();
601
714
  };
602
- }, [c]), s(() => {
603
- let { registerSharedBars: e, unregisterSharedBars: t } = S.screen.getState();
715
+ }, [s]), u(() => {
716
+ let { registerSharedBars: e, unregisterSharedBars: t } = C.screen.getState();
604
717
  return e(v, {
605
- appBar: !!o,
606
- navigationBar: !!c
718
+ topBar: !!a,
719
+ bottomBar: !!s
607
720
  }), () => t(v);
608
721
  }, [
609
722
  v,
610
- o,
611
- c,
612
- S.screen
723
+ a,
724
+ s,
725
+ C.screen
613
726
  ]);
614
- let pe = y || ee === D - 1, me = !!o, Z = !!c;
615
- s(() => ie({
616
- appBar: G.current,
617
- navBar: K.current,
618
- isTopOrTopPrev: pe,
727
+ let ge = y || ee === D - 1, _e = !!a, ve = !!s;
728
+ u(() => N({
729
+ topBar: q.current,
730
+ navBar: J.current,
731
+ isTopOrTopPrev: ge,
619
732
  isActive: y,
620
733
  index: D,
621
- hasAppBar: me,
622
- hasNavBar: Z,
623
- getStatus: () => S.navigate.getState().status,
624
- getHistories: () => S.history.getState().histories,
625
- getSharedBars: () => S.screen.getState().sharedBars,
626
- subscribeStatus: (e) => S.navigate.subscribe(e),
627
- subscribeSharedBars: (e) => S.screen.subscribe(e)
734
+ hasTopBar: _e,
735
+ hasNavBar: ve,
736
+ getStatus: () => C.navigate.getState().status,
737
+ getHistories: () => C.history.getState().histories,
738
+ getSharedBars: () => C.screen.getState().sharedBars,
739
+ subscribeStatus: (e) => C.navigate.subscribe(e),
740
+ subscribeSharedBars: (e) => C.screen.subscribe(e)
628
741
  }), [
629
- pe,
742
+ ge,
630
743
  y,
631
744
  D,
632
- me,
633
- Z,
634
- S.history,
635
- S.navigate,
636
- S.screen
745
+ _e,
746
+ ve,
747
+ C.history,
748
+ C.navigate,
749
+ C.screen
637
750
  ]);
638
- let ge = (() => {
639
- if (!y || C !== "PUSHING" && C !== "REPLACING") return {};
751
+ let ye = (() => {
752
+ if (!y || w !== "PUSHING" && w !== "REPLACING") return {};
640
753
  let e = {};
641
- return typeof A.x == "number" && (e.transform = `translateX(${A.x}px)`), typeof A.x == "string" && (e.transform = `translateX(${A.x})`), typeof A.y == "number" && (e.transform = `translateY(${A.y}px)`), typeof A.y == "string" && (e.transform = `translateY(${A.y})`), typeof A.opacity == "number" && (e.opacity = `${A.opacity}`), e;
754
+ return typeof P.x == "number" && (e.transform = `translateX(${P.x}px)`), typeof P.x == "string" && (e.transform = `translateX(${P.x})`), typeof P.y == "number" && (e.transform = `translateY(${P.y}px)`), typeof P.y == "string" && (e.transform = `translateY(${P.y})`), typeof P.opacity == "number" && (e.opacity = `${P.opacity}`), e;
642
755
  })();
643
756
  return /* @__PURE__ */ se("div", {
644
- ref: V,
757
+ ref: U,
645
758
  style: {
646
- position: "fixed",
759
+ position: S,
647
760
  top: 0,
648
761
  left: 0,
649
762
  width: "100%",
@@ -655,10 +768,10 @@ function ve({ children: e, statusBarHeight: t, statusBarColor: n, systemNavigati
655
768
  overscrollBehavior: "contain"
656
769
  },
657
770
  children: [
658
- /* @__PURE__ */ M("div", {
771
+ /* @__PURE__ */ B("div", {
659
772
  "data-swipe-at-edge-bar": !0,
660
773
  style: {
661
- position: "fixed",
774
+ position: S,
662
775
  top: 0,
663
776
  left: 0,
664
777
  width: 8,
@@ -667,15 +780,15 @@ function ve({ children: e, statusBarHeight: t, statusBarColor: n, systemNavigati
667
780
  }
668
781
  }),
669
782
  /* @__PURE__ */ se("div", {
670
- ref: H,
783
+ ref: G,
671
784
  ..._,
672
- onPointerDown: de,
673
- onPointerMove: X,
674
- onPointerUp: fe,
675
- onPointerCancel: fe,
785
+ onPointerDown: fe,
786
+ onPointerMove: me,
787
+ onPointerUp: he,
788
+ onPointerCancel: he,
676
789
  "data-flemo-screen": !0,
677
790
  "data-flemo-transition": x,
678
- "data-flemo-status": C,
791
+ "data-flemo-status": w,
679
792
  "data-flemo-active": y ? "true" : "false",
680
793
  style: {
681
794
  display: "flex",
@@ -683,93 +796,103 @@ function ve({ children: e, statusBarHeight: t, statusBarColor: n, systemNavigati
683
796
  height: "100%",
684
797
  backgroundColor: h,
685
798
  overflowY: g ? void 0 : "auto",
686
- touchAction: ce === "x" ? "pan-y" : ce === "y" ? "pan-x" : "auto",
687
- ...ge,
799
+ touchAction: F === "x" ? "pan-y" : F === "y" ? "pan-x" : "auto",
800
+ ...ye,
688
801
  ..._.style
689
802
  },
690
803
  children: [
691
- !p && t && /* @__PURE__ */ M("div", {
804
+ !d && t && /* @__PURE__ */ B("div", {
692
805
  style: { minHeight: t },
693
- children: /* @__PURE__ */ M("div", { style: {
694
- position: "fixed",
806
+ children: /* @__PURE__ */ B("div", { style: {
807
+ position: S,
695
808
  top: 0,
696
809
  width: "100%",
697
810
  minHeight: t,
698
811
  backgroundColor: n
699
812
  } })
700
813
  }),
701
- o && /* @__PURE__ */ M("div", { style: {
814
+ a && /* @__PURE__ */ B("div", { style: {
702
815
  width: "100%",
703
- minHeight: le
816
+ minHeight: oe
704
817
  } }),
705
- d,
706
- /* @__PURE__ */ M("div", {
818
+ c,
819
+ /* @__PURE__ */ B("div", {
707
820
  style: {
708
821
  display: "flex",
709
822
  flexDirection: "column",
710
823
  flexGrow: 1,
711
824
  overflowY: g ? "auto" : void 0,
712
- ...C !== "IDLE" && C !== "COMPLETED" ? { willChange: "opacity" } : null
825
+ ...w !== "IDLE" && w !== "COMPLETED" ? {
826
+ transform: "translateZ(0)",
827
+ willChange: "transform"
828
+ } : null
713
829
  },
714
- children: e
830
+ children: /* @__PURE__ */ B(Ee.Provider, {
831
+ value: ue,
832
+ children: e
833
+ })
715
834
  }),
716
- f,
717
- c && /* @__PURE__ */ M("div", { style: {
718
- display: L ? "none" : void 0,
835
+ l,
836
+ s && /* @__PURE__ */ B("div", { style: {
837
+ display: R ? "none" : void 0,
719
838
  width: "100%",
720
- minHeight: ue
839
+ minHeight: le
721
840
  } }),
722
- !m && r && /* @__PURE__ */ M("div", {
841
+ !m && r && /* @__PURE__ */ B("div", {
723
842
  style: {
724
- display: L ? "none" : void 0,
843
+ display: R ? "none" : void 0,
725
844
  minHeight: r
726
845
  },
727
- children: /* @__PURE__ */ M("div", { style: {
728
- position: "fixed",
846
+ children: /* @__PURE__ */ B("div", { style: {
847
+ position: S,
729
848
  bottom: 0,
730
849
  width: "100%",
731
850
  minHeight: r,
732
- backgroundColor: a
851
+ backgroundColor: i
733
852
  } })
853
+ }),
854
+ /* @__PURE__ */ B("div", {
855
+ ref: de,
856
+ "data-flemo-layer-mount": !0
734
857
  })
735
858
  ]
736
859
  }),
737
- o && /* @__PURE__ */ M("div", {
738
- ref: G,
860
+ a && /* @__PURE__ */ B("div", {
861
+ ref: q,
739
862
  "data-flemo-bar": "app",
740
863
  "data-flemo-bar-transition": x,
741
- "data-flemo-bar-status": C,
864
+ "data-flemo-bar-status": w,
742
865
  "data-flemo-bar-active": y ? "true" : "false",
743
866
  style: {
744
- position: "fixed",
745
- top: p ? 0 : t,
867
+ position: S,
868
+ top: d ? 0 : t,
746
869
  left: 0,
747
870
  width: "100%",
748
871
  zIndex: 1
749
872
  },
750
- children: o
873
+ children: a
751
874
  }),
752
- c && /* @__PURE__ */ M("div", {
753
- ref: K,
875
+ s && /* @__PURE__ */ B("div", {
876
+ ref: J,
754
877
  "data-flemo-bar": "nav",
755
878
  "data-flemo-bar-transition": x,
756
- "data-flemo-bar-status": C,
879
+ "data-flemo-bar-status": w,
757
880
  "data-flemo-bar-active": y ? "true" : "false",
758
881
  style: {
759
- display: L ? "none" : void 0,
760
- position: "fixed",
882
+ display: R ? "none" : void 0,
883
+ position: S,
761
884
  bottom: m ? 0 : r,
762
885
  left: 0,
763
886
  width: "100%",
764
887
  zIndex: 1
765
888
  },
766
- children: c
889
+ children: s
767
890
  }),
768
- F && /* @__PURE__ */ M(he, { ref: W }),
769
- /* @__PURE__ */ M("div", {
891
+ I && /* @__PURE__ */ B(Ie, { ref: K }),
892
+ /* @__PURE__ */ B("div", {
770
893
  "data-swipe-at-edge-bar": !0,
771
894
  style: {
772
- position: "fixed",
895
+ position: S,
773
896
  top: 0,
774
897
  right: 0,
775
898
  width: 8,
@@ -782,19 +905,19 @@ function ve({ children: e, statusBarHeight: t, statusBarColor: n, systemNavigati
782
905
  }
783
906
  //#endregion
784
907
  //#region src/screen/Screen.tsx
785
- function ye({ children: e, ...t }) {
786
- let { isActive: n, isPrev: r, zIndex: i } = R();
787
- return /* @__PURE__ */ M(Z, {
788
- freeze: p({
908
+ function Ve({ children: e, ...t }) {
909
+ let { isActive: n, isPrev: r, zIndex: i } = W();
910
+ return /* @__PURE__ */ B(Fe, {
911
+ freeze: g({
789
912
  isActive: n,
790
913
  isPrev: r,
791
914
  zIndex: i,
792
- index: U((e) => e.index),
793
- status: Q((e) => e.status),
794
- dragStatus: $((e) => e.dragStatus),
795
- replaceTransitionStatus: $((e) => e.replaceTransitionStatus)
915
+ index: Z((e) => e.index),
916
+ status: $((e) => e.status),
917
+ dragStatus: ze((e) => e.dragStatus),
918
+ replaceTransitionStatus: ze((e) => e.replaceTransitionStatus)
796
919
  }),
797
- children: /* @__PURE__ */ M(ve, {
920
+ children: /* @__PURE__ */ B(Be, {
798
921
  ...t,
799
922
  children: e
800
923
  })
@@ -802,12 +925,12 @@ function ye({ children: e, ...t }) {
802
925
  }
803
926
  //#endregion
804
927
  //#region src/screen/Part.tsx
805
- function be({ ref: e, name: t, style: n, children: r, ...i }) {
806
- let { isActive: a } = R();
807
- return /* @__PURE__ */ M("div", {
928
+ function He({ ref: e, name: t, style: n, children: r, ...i }) {
929
+ let { isActive: a } = W();
930
+ return /* @__PURE__ */ B("div", {
808
931
  ref: e,
809
932
  "data-flemo-part-name": t,
810
- "data-flemo-status": Q((e) => e.status),
933
+ "data-flemo-status": $((e) => e.status),
811
934
  "data-flemo-active": a ? "true" : "false",
812
935
  style: n,
813
936
  ...i,
@@ -816,17 +939,20 @@ function be({ ref: e, name: t, style: n, children: r, ...i }) {
816
939
  }
817
940
  //#endregion
818
941
  //#region src/stores/RouterScopeProvider.tsx
819
- function xe({ children: e }) {
820
- let [t] = u(() => ({
821
- history: h(),
822
- navigate: _(),
823
- transition: w(),
824
- screen: S()
942
+ function Ue({ children: e }) {
943
+ let [t] = p(() => ({
944
+ history: ee(),
945
+ navigate: ne(),
946
+ transition: j(),
947
+ screen: D(),
948
+ driver: y(),
949
+ markSelfInduced: I,
950
+ consume: _
825
951
  }));
826
- return /* @__PURE__ */ M(N.Provider, {
952
+ return /* @__PURE__ */ B(V.Provider, {
827
953
  value: t,
828
954
  children: e
829
955
  });
830
956
  }
831
957
  //#endregion
832
- export { be as Part, de as Route, Y as Router, xe as RouterScopeProvider, ye as Screen, L as ScreenContext, he as ScreenDecorator, Z as ScreenFreeze, ve as ScreenMotion, m as createDecorator, y as createPartTransition, b as createRawDecorator, ee as createRawPartTransition, x as createRawTransition, C as createTransition, O as partTransitionMap, U as useHistoryStore, fe as useNavigate, Q as useNavigateStore, me as useParams, R as useScreen, $ as useScreenStore, pe as useStep, P as useStores, _e as useViewportScrollHeight };
958
+ export { De as Layer, He as Part, Te as Route, we as Router, Ue as RouterScopeProvider, Ve as Screen, U as ScreenContext, Ie as ScreenDecorator, Fe as ScreenFreeze, Be as ScreenMotion, _e as Slot, v as createBrowserHistoryDriver, b as createDecorator, C as createPartTransition, w as createRawDecorator, T as createRawPartTransition, E as createRawTransition, k as createTransition, L as partTransitionMap, Z as useHistoryStore, ke as useNavigate, $ as useNavigateStore, Pe as useParams, Ae as usePathname, W as useScreen, ze as useScreenStore, Ne as useStep, H as useStores, Re as useViewportScrollHeight };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export default function usePathname(): string;
@@ -1,6 +1,9 @@
1
1
  import { RegisterRoute } from '../Route';
2
- export default function useStep<T extends keyof RegisterRoute>(): {
3
- pushStep: (params: RegisterRoute[T]) => Promise<void>;
4
- replaceStep: (params: RegisterRoute[T]) => Promise<void>;
2
+ type StepParams<T> = [T] extends [never] ? Record<string, unknown> : T extends keyof RegisterRoute ? RegisterRoute[T] : T;
3
+ export default function useStep<T extends keyof RegisterRoute | object = never>(): {
4
+ step: StepParams<T> | null;
5
+ pushStep: (params: StepParams<T>) => Promise<void>;
6
+ replaceStep: (params: StepParams<T>) => Promise<void>;
5
7
  popStep: () => Promise<void>;
6
8
  };
9
+ export {};
@@ -0,0 +1,3 @@
1
+ import { PropsWithChildren, ReactNode } from 'react';
2
+ declare function Layer({ children }: PropsWithChildren): ReactNode;
3
+ export default Layer;
@@ -0,0 +1,2 @@
1
+ declare const LayerMountContext: import('react').Context<HTMLElement | null>;
2
+ export default LayerMountContext;
@@ -5,10 +5,10 @@ export interface ScreenProps extends PropsWithChildren<Omit<ComponentPropsWithou
5
5
  systemNavigationBarHeight?: string;
6
6
  systemNavigationBarColor?: string;
7
7
  backgroundColor?: string;
8
- sharedAppBar?: ReactNode;
9
- sharedNavigationBar?: ReactNode;
10
- appBar?: ReactNode;
11
- navigationBar?: ReactNode;
8
+ sharedTopBar?: ReactNode;
9
+ sharedBottomBar?: ReactNode;
10
+ topBar?: ReactNode;
11
+ bottomBar?: ReactNode;
12
12
  hideStatusBar?: boolean;
13
13
  hideSystemNavigationBar?: boolean;
14
14
  contentScrollable?: boolean;
@@ -1,3 +1,3 @@
1
1
  import { ScreenProps } from './Screen';
2
- declare function ScreenMotion({ children, statusBarHeight, statusBarColor, systemNavigationBarHeight, systemNavigationBarColor, sharedAppBar, sharedNavigationBar, appBar, navigationBar, hideStatusBar, hideSystemNavigationBar, backgroundColor, contentScrollable, ...props }: ScreenProps): import("react").JSX.Element;
2
+ declare function ScreenMotion({ children, statusBarHeight, statusBarColor, systemNavigationBarHeight, systemNavigationBarColor, sharedTopBar, sharedBottomBar, topBar, bottomBar, hideStatusBar, hideSystemNavigationBar, backgroundColor, contentScrollable, ...props }: ScreenProps): import("react").JSX.Element;
3
3
  export default ScreenMotion;
@@ -0,0 +1,6 @@
1
+ export interface ScreenViewportContextValue {
2
+ contained: boolean;
3
+ }
4
+ declare const ScreenViewportContext: import('react').Context<ScreenViewportContextValue>;
5
+ export declare function useScreenViewport(): ScreenViewportContextValue;
6
+ export default ScreenViewportContext;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,10 +1,13 @@
1
- import { HistoryStoreApi, NavigateStoreApi, TransitionStoreApi } from '@flemo/core';
1
+ import { HistoryDriver, HistoryStoreApi, NavigateStoreApi, TransitionStoreApi } from '@flemo/core';
2
2
  import { ScreenStoreApi } from '../screen/store';
3
3
  export interface FlemoStores {
4
4
  history: HistoryStoreApi;
5
5
  navigate: NavigateStoreApi;
6
6
  transition: TransitionStoreApi;
7
7
  screen: ScreenStoreApi;
8
+ driver: HistoryDriver;
9
+ markSelfInduced: () => void;
10
+ consume: () => boolean;
8
11
  }
9
12
  declare const StoreContext: import('react').Context<FlemoStores | null>;
10
13
  export default StoreContext;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flemo/react",
3
- "version": "1.4.1",
3
+ "version": "1.5.0",
4
4
  "description": "React bindings for flemo: Router, Route, Screen, and the screen-transition runtime.",
5
5
  "main": "./dist/index.mjs",
6
6
  "module": "./dist/index.mjs",
@@ -36,7 +36,7 @@
36
36
  "dependencies": {
37
37
  "path-to-regexp": "^8.4.2",
38
38
  "zustand": "^5.0.14",
39
- "@flemo/core": "1.5.0"
39
+ "@flemo/core": "1.6.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@testing-library/jest-dom": "^6.9.1",