@flemo/react 1.5.0 → 1.5.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 (2) hide show
  1. package/dist/index.mjs +285 -276
  2. package/package.json +4 -4
package/dist/index.mjs CHANGED
@@ -1,21 +1,21 @@
1
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";
2
+ import { TaskManger as m, animHoldKey as h, applyTransitionStyles as g, computeBarRiding as _, computeScreenFreeze as v, consumeSelfInducedPop as y, createBrowserHistoryDriver as b, createBrowserHistoryDriver as x, createDecorator as S, createHistoryStore as ee, createHistorySync as C, createMemoryHistoryDriver as te, createNavigateStore as ne, createNavigationController as w, createPartTransition as T, createRawDecorator as E, createRawPartTransition as D, createRawTransition as O, createScreenSelector as k, createScreenStore as A, createSelfPopGuard as re, createSwipeController as j, createTransition as ie, createTransitionEngine as M, createTransitionStore as ae, decoratorMap as N, ensureWindowHistoryState as oe, getMatchedPathPattern as P, isServer as F, markSelfInducedPop as I, partTransitionMap as se, partTransitionMap as ce, scheduleAnimHoldRelease as le, seedInitialHistory as ue, transitionMap as L } from "@flemo/core";
3
+ import { jsx as R, jsxs as de } from "react/jsx-runtime";
4
+ import { createPortal as fe } from "react-dom";
5
5
  //#region \0rolldown/runtime.js
6
- var le = (e, t) => () => (t || (e((t = { exports: {} }).exports, t), e = null), t.exports), V = r(null);
6
+ var pe = (e, t) => () => (t || (e((t = { exports: {} }).exports, t), e = null), t.exports), z = r(null);
7
7
  //#endregion
8
8
  //#region src/stores/useStores.ts
9
- function H() {
10
- let e = a(V);
9
+ function B() {
10
+ let e = a(z);
11
11
  if (!e) throw Error("flemo stores are missing. Render inside a <Router>.");
12
12
  return e;
13
13
  }
14
14
  //#endregion
15
15
  //#region src/history/HistoryListener.tsx
16
- function ue() {
17
- let e = H();
18
- return o(() => x({
16
+ function V() {
17
+ let e = B();
18
+ return o(() => C({
19
19
  stores: e,
20
20
  driver: e.driver,
21
21
  consume: e.consume
@@ -23,7 +23,7 @@ function ue() {
23
23
  }
24
24
  //#endregion
25
25
  //#region src/screen/ScreenContext.ts
26
- var de = (/* @__PURE__ */ le(((e) => {
26
+ var me = (/* @__PURE__ */ pe(((e) => {
27
27
  Object.defineProperty(e, "__esModule", { value: !0 }), e.PathError = e.TokenData = void 0, e.parse = c, e.compile = l, e.pathToRegexp = f;
28
28
  var t = "/", n = (e) => e, r = /^[$_\p{ID_Start}]$/u, i = /^[$\u200c\u200d\p{ID_Continue}]$/u;
29
29
  function a(e) {
@@ -210,7 +210,7 @@ var de = (/* @__PURE__ */ le(((e) => {
210
210
  function h(e, t) {
211
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)}]`);
212
212
  }
213
- })))(), U = r({
213
+ })))(), H = r({
214
214
  id: "",
215
215
  isActive: !1,
216
216
  isRoot: !0,
@@ -225,15 +225,15 @@ var de = (/* @__PURE__ */ le(((e) => {
225
225
  });
226
226
  //#endregion
227
227
  //#region src/screen/useScreen.ts
228
- function W() {
229
- return a(U);
228
+ function U() {
229
+ return a(H);
230
230
  }
231
231
  //#endregion
232
232
  //#region src/screen/ParamsProvider/ParamsContext.ts
233
- var G = r({}), K = r(() => {});
233
+ var he = r({}), ge = r(() => {});
234
234
  //#endregion
235
235
  //#region src/screen/ParamsProvider/ParamsReducer.ts
236
- function q(e, t) {
236
+ function _e(e, t) {
237
237
  switch (t.type) {
238
238
  case "SET": return t.params;
239
239
  default: return e;
@@ -241,8 +241,8 @@ function q(e, t) {
241
241
  }
242
242
  //#endregion
243
243
  //#region src/screen/ParamsProvider/ParamsProvider.tsx
244
- function J({ children: e }) {
245
- let { isActive: t, params: n } = W(), { driver: r } = H(), [i, a] = d(q, n);
244
+ function W({ children: e }) {
245
+ let { isActive: t, params: n } = U(), { driver: r } = B(), [i, a] = d(_e, n);
246
246
  return o(() => {
247
247
  if (t) return r.subscribe((e) => {
248
248
  let t = e.state;
@@ -257,9 +257,9 @@ function J({ children: e }) {
257
257
  t,
258
258
  a,
259
259
  r
260
- ]), /* @__PURE__ */ B(K.Provider, {
260
+ ]), /* @__PURE__ */ R(ge.Provider, {
261
261
  value: a,
262
- children: /* @__PURE__ */ B(G.Provider, {
262
+ children: /* @__PURE__ */ R(he.Provider, {
263
263
  value: i,
264
264
  children: e
265
265
  })
@@ -267,49 +267,49 @@ function J({ children: e }) {
267
267
  }
268
268
  //#endregion
269
269
  //#region ../../node_modules/.pnpm/zustand@5.0.14_@types+react@19.2.17_react@19.2.7/node_modules/zustand/esm/react.mjs
270
- var Y = (e) => e;
271
- function X(t, n = Y) {
270
+ var ve = (e) => e;
271
+ function G(t, n = ve) {
272
272
  let r = e.useSyncExternalStore(t.subscribe, e.useCallback(() => n(t.getState()), [t, n]), e.useCallback(() => n(t.getInitialState()), [t, n]));
273
273
  return e.useDebugValue(r), r;
274
274
  }
275
275
  //#endregion
276
276
  //#region src/stores/useHistoryStore.ts
277
- function Z(e) {
278
- return X(H().history, e);
277
+ function K(e) {
278
+ return G(B().history, e);
279
279
  }
280
280
  //#endregion
281
281
  //#region src/renderer/Renderer.tsx
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, {
282
+ function q({ children: e }) {
283
+ let t = K((e) => e.index);
284
+ return k(K((e) => e.histories), t).map((t) => {
285
+ let [r] = n.toArray(e).filter((e) => (0, me.pathToRegexp)(e.props.path).regexp.test(t.pathname));
286
+ return /* @__PURE__ */ R(H.Provider, {
287
287
  value: {
288
288
  ...t,
289
- routePath: F(r.props.path, t.pathname)
289
+ routePath: P(r.props.path, t.pathname)
290
290
  },
291
- children: /* @__PURE__ */ B(J, { children: r })
291
+ children: /* @__PURE__ */ R(W, { children: r })
292
292
  }, t.id);
293
293
  });
294
294
  }
295
295
  //#endregion
296
296
  //#region src/screen/ScreenViewportContext.ts
297
- var fe = r({ contained: !1 });
298
- function pe() {
299
- return a(fe);
297
+ var J = r({ contained: !1 });
298
+ function ye() {
299
+ return a(J);
300
300
  }
301
301
  //#endregion
302
302
  //#region src/transition/styles.ts
303
- function me(e, t, n = []) {
303
+ function be(e, t, n = []) {
304
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();
305
+ for (let t of e) L.set(t.name, t);
306
+ for (let e of t) N.set(e.name, e);
307
+ for (let e of n) ce.set(e.name, e);
308
+ return g(), () => {
309
+ for (let t of e) L.delete(t.name);
310
+ for (let e of t) N.delete(e.name);
311
+ for (let e of n) ce.delete(e.name);
312
+ g();
313
313
  };
314
314
  }, [
315
315
  e,
@@ -319,45 +319,45 @@ function me(e, t, n = []) {
319
319
  }
320
320
  //#endregion
321
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", {
322
+ var Y = r(0), xe = { contained: !0 };
323
+ function Se({ children: e, className: t, style: n }) {
324
+ return /* @__PURE__ */ R("div", {
325
325
  className: t,
326
326
  style: {
327
327
  position: "relative",
328
328
  overflow: "hidden",
329
329
  ...n
330
330
  },
331
- children: /* @__PURE__ */ B(fe.Provider, {
332
- value: ge,
333
- children: /* @__PURE__ */ B(Q, { children: e })
331
+ children: /* @__PURE__ */ R(J.Provider, {
332
+ value: xe,
333
+ children: /* @__PURE__ */ R(q, { children: e })
334
334
  })
335
335
  });
336
336
  }
337
337
  //#endregion
338
338
  //#region src/Router.tsx
339
- function ve(e) {
339
+ function Ce(e) {
340
340
  let t = null;
341
341
  return n.forEach(e, (e) => {
342
342
  if (t || !i(e)) return;
343
- if (e.type === _e) {
343
+ if (e.type === Se) {
344
344
  t = n.toArray(e.props.children).filter(i);
345
345
  return;
346
346
  }
347
347
  let r = e.props.children;
348
348
  if (r) {
349
- let e = ve(r);
349
+ let e = Ce(r);
350
350
  e && (t = e);
351
351
  }
352
352
  }), t;
353
353
  }
354
- var ye = {
354
+ var we = {
355
355
  mark: () => {},
356
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);
357
+ }, Te = [], Ee = [], X = [], De = { contained: !0 };
358
+ function Oe({ children: e, initPath: t = "/", defaultTransitionName: r = "cupertino", transitions: i = Te, decorators: c = Ee, partTransitions: l = X, history: u = "browser", createDriver: d, className: f, style: m }) {
359
+ let h = a(Y), g = h > 0, _ = u === "memory", v = s(), y = Ce(e), b = y !== null, S = a(z), C = g ? null : S, w = C !== null, T = d ?? x, [E] = p(() => _ ? null : T(w ? void 0 : v)), D = !g && !_ && !F(), O = D && E ? E.readPathname() : t || "/", k = O.indexOf("?"), j = (k >= 0 ? O.slice(0, k) : O) || "/", ie = D ? window.location.search : k >= 0 ? O.slice(k) : "", [M] = p(() => {
360
+ let t = ue((y ?? n.toArray(e)).map((e) => e.props.path).flat(), j, ie, r);
361
361
  if (C) return C.history.getState().index === -1 && C.history.setState({
362
362
  index: 0,
363
363
  histories: [t]
@@ -372,67 +372,67 @@ function we({ children: e, initPath: t = "/", defaultTransitionName: r = "cupert
372
372
  layoutId: t.layoutId
373
373
  },
374
374
  url: t.pathname
375
- }) : E, a = _ ? ye : ie();
375
+ }) : E, a = _ ? we : re();
376
376
  return {
377
377
  history: ee([t], 0),
378
378
  navigate: ne(),
379
- transition: j(r),
380
- screen: D(),
379
+ transition: ae(r),
380
+ screen: A(),
381
381
  driver: i,
382
382
  markSelfInduced: a.mark,
383
383
  consume: a.consume
384
384
  };
385
385
  });
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));
386
+ M.transition.setState({ defaultTransitionName: r }), be(i, c, l), o(() => {
387
+ _ || F() || (oe(w ? null : v, r, M.history.getState().histories[0]?.params ?? {}), g && !w && E && E.readPathname() !== j && E.replaceState(E.readState(), j));
388
388
  }, [
389
389
  _,
390
390
  w,
391
391
  g,
392
392
  v,
393
- A,
393
+ j,
394
394
  r,
395
- N.history,
395
+ M.history,
396
396
  E
397
397
  ]);
398
- let F = x ? e : /* @__PURE__ */ B(Q, { children: e }), I = /* @__PURE__ */ B(he.Provider, {
398
+ let N = b ? e : /* @__PURE__ */ R(q, { children: e }), P = /* @__PURE__ */ R(Y.Provider, {
399
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]
400
+ children: /* @__PURE__ */ de(z.Provider, {
401
+ value: M,
402
+ children: [!_ && /* @__PURE__ */ R(V, {}), g ? /* @__PURE__ */ R(J.Provider, {
403
+ value: De,
404
+ children: N
405
+ }) : N]
406
406
  })
407
407
  });
408
- return g ? /* @__PURE__ */ B("div", {
408
+ return g ? /* @__PURE__ */ R("div", {
409
409
  className: f,
410
410
  style: {
411
411
  position: "relative",
412
412
  overflow: "hidden",
413
413
  ...m
414
414
  },
415
- children: I
416
- }) : I;
415
+ children: P
416
+ }) : P;
417
417
  }
418
418
  //#endregion
419
419
  //#region src/Route.tsx
420
- function Te({ element: e }) {
420
+ function Z({ element: e }) {
421
421
  return e;
422
422
  }
423
423
  //#endregion
424
424
  //#region src/screen/LayerMountContext.ts
425
- var Ee = r(null);
425
+ var ke = r(null);
426
426
  //#endregion
427
427
  //#region src/screen/Layer.tsx
428
- function De({ children: e }) {
429
- let t = a(Ee);
430
- return t ? ce(e, t) : e;
428
+ function Ae({ children: e }) {
429
+ let t = a(ke);
430
+ return t ? fe(e, t) : e;
431
431
  }
432
432
  //#endregion
433
433
  //#region src/utils/buildRoutePath.ts
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();
434
+ function je(e, t) {
435
+ let n = t ?? {}, r = (0, me.compile)(e)(Object.fromEntries(Object.entries(n).map(([e, t]) => [e, String(t)]))), i = (typeof e == "string" ? (0, me.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();
436
436
  return {
437
437
  pathname: `${r}${o ? `?${o}` : ""}`,
438
438
  toPathname: r
@@ -440,10 +440,10 @@ function Oe(e, t) {
440
440
  }
441
441
  //#endregion
442
442
  //#region src/navigate/useNavigate.ts
443
- function ke() {
444
- let e = H(), t = S({
443
+ function Me() {
444
+ let e = B(), t = w({
445
445
  stores: e,
446
- buildPathname: (e, t) => Oe(e, t),
446
+ buildPathname: (e, t) => je(e, t),
447
447
  driver: e.driver,
448
448
  markSelfInduced: e.markSelfInduced
449
449
  });
@@ -455,24 +455,24 @@ function ke() {
455
455
  }
456
456
  //#endregion
457
457
  //#region src/navigate/usePathname.ts
458
- function Ae() {
459
- return Z((e) => e.histories[e.pendingIndex]?.pathname ?? "/");
458
+ function Ne() {
459
+ return K((e) => e.histories[e.pendingIndex]?.pathname ?? "/");
460
460
  }
461
461
  //#endregion
462
462
  //#region src/navigate/useStep.ts
463
- var je = (e) => {
463
+ var Pe = (e) => {
464
464
  let t = e;
465
465
  return t?.step ? t.params ?? {} : null;
466
- }, Me = (e, t) => {
466
+ }, Fe = (e, t) => {
467
467
  let n = new URLSearchParams(Object.fromEntries(Object.entries(t).map(([e, t]) => [e, String(t)]))).toString();
468
468
  return n ? `${e}?${n}` : e;
469
469
  };
470
- function Ne() {
471
- let { routePath: e } = W(), t = H(), n = a(K), { driver: r, markSelfInduced: i } = t, [s, c] = p(null);
470
+ function Ie() {
471
+ let { routePath: e } = U(), t = B(), n = a(ge), { driver: r, markSelfInduced: i } = t, [s, c] = p(null);
472
472
  o(() => {
473
- if (!e) return c(je(r.readState())), r.subscribe((e) => c(je(e.state)));
473
+ if (!e) return c(Pe(r.readState())), r.subscribe((e) => c(Pe(e.state)));
474
474
  }, [e, r]);
475
- let l = (t) => e ? Oe(e, t).pathname : Me(r.readPathname(), t), u = (t) => {
475
+ let l = (t) => e ? je(e, t).pathname : Fe(r.readPathname(), t), u = (t) => {
476
476
  n({
477
477
  type: "SET",
478
478
  params: t
@@ -534,29 +534,29 @@ function Ne() {
534
534
  }
535
535
  //#endregion
536
536
  //#region src/screen/ParamsProvider/useParams.ts
537
- function Pe() {
538
- return a(G);
537
+ function Le() {
538
+ return a(he);
539
539
  }
540
540
  //#endregion
541
541
  //#region src/screen/ScreenFreeze.tsx
542
- function Fe({ freeze: e, children: n }) {
543
- return /* @__PURE__ */ B(t, {
542
+ function Re({ freeze: e, children: n }) {
543
+ return /* @__PURE__ */ R(t, {
544
544
  mode: e ? "hidden" : "visible",
545
545
  children: n
546
546
  });
547
547
  }
548
548
  //#endregion
549
549
  //#region src/stores/useNavigateStore.ts
550
- function $(e) {
551
- return X(H().navigate, e);
550
+ function Q(e) {
551
+ return G(B().navigate, e);
552
552
  }
553
553
  //#endregion
554
554
  //#region src/screen/ScreenDecorator.tsx
555
- function Ie({ ref: e, style: t, ...n }) {
556
- let { isActive: r, transitionName: i } = W(), a = f(null);
555
+ function ze({ ref: e, style: t, ...n }) {
556
+ let { isActive: r, transitionName: i } = U(), a = f(null);
557
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", {
558
+ let o = Q((e) => e.status), { decoratorName: s } = L.get(i) ?? L.get("none"), l = N.get(s);
559
+ return l ? /* @__PURE__ */ R("div", {
560
560
  ref: a,
561
561
  "data-flemo-decorator": !0,
562
562
  "data-flemo-decorator-name": l.name,
@@ -577,16 +577,16 @@ function Ie({ ref: e, style: t, ...n }) {
577
577
  }
578
578
  //#endregion
579
579
  //#region src/screen/useViewportScrollHeight.ts
580
- var Le = 0;
581
- function Re() {
580
+ var Be = 0;
581
+ function Ve() {
582
582
  let [e, t] = p(0), [n, r] = p(0);
583
583
  return o(() => {
584
584
  let e = 0, n = () => {
585
585
  cancelAnimationFrame(e), e = requestAnimationFrame(() => {
586
586
  let e = document.documentElement.scrollHeight - (window.visualViewport?.height || 0);
587
587
  e = e < 0 ? 0 : e;
588
- let n = e - Le;
589
- n = n < 0 ? 0 : n, Le ||= e, r(n), t(e);
588
+ let n = e - Be;
589
+ n = n < 0 ? 0 : n, Be ||= e, r(n), t(e);
590
590
  });
591
591
  };
592
592
  return window.visualViewport?.addEventListener("resize", n), window.visualViewport?.addEventListener("scroll", n), () => {
@@ -599,164 +599,165 @@ function Re() {
599
599
  }
600
600
  //#endregion
601
601
  //#region src/stores/useScreenStore.ts
602
- function ze(e) {
603
- return X(H().screen, e);
602
+ function $(e) {
603
+ return G(B().screen, e);
604
604
  }
605
605
  //#endregion
606
606
  //#region src/screen/ScreenMotion.tsx
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,
611
- setDragStatus: E,
612
- setReplaceTransitionStatus: re
607
+ function He({ children: e, statusBarHeight: t, statusBarColor: n, systemNavigationBarHeight: r, systemNavigationBarColor: i, sharedTopBar: a, sharedBottomBar: s, topBar: c, bottomBar: l, hideStatusBar: d, hideSystemNavigationBar: m, backgroundColor: g = "white", contentScrollable: v = !0, ...y }) {
608
+ let { id: b, isActive: x, isRoot: S, zIndex: ee, transitionName: C, prevTransitionName: te } = U(), { contained: ne } = ye(), w = ne ? "absolute" : "fixed", T = B(), E = Q((e) => e.status), D = $((e) => e.dragStatus), O = T.screen.getState().setDragStatus, k = T.screen.getState().setReplaceTransitionStatus, A = K((e) => e.index), re = K((e) => e.histories), ie = x ? re[A - 1]?.id : re[A]?.id, ae = $((e) => ie ? e.sharedBars[ie] : void 0), oe = f(null);
609
+ oe.current ||= M({
610
+ getTransitionTaskId: () => T.navigate.getState().transitionTaskId,
611
+ setDragStatus: O,
612
+ setReplaceTransitionStatus: k
613
613
  });
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,
614
+ let P = oe.current, F = L.get(C) ?? L.get("none"), { initial: I, swipeDirection: se, decoratorName: ce } = F, ue = N.get(ce), { viewportScrollHeight: fe } = Ve(), pe = fe > 0, [z, V] = p(0), [me, H] = p(0), [he, ge] = p(null), _e = f(null), W = f(null), ve = f(null), G = f(null), q = f(null), J = f({
615
+ transition: F,
616
+ decorator: ue,
617
617
  hasSharedTopBar: !!a,
618
618
  hasSharedBottomBar: !!s,
619
- viewportScrollHeight: L,
620
- isRoot: b,
621
- isActive: y,
622
- status: w,
623
- dragStatus: T,
624
- index: D
619
+ viewportScrollHeight: fe,
620
+ isRoot: S,
621
+ isActive: x,
622
+ status: E,
623
+ dragStatus: D,
624
+ index: A
625
625
  });
626
- Y.current = {
627
- transition: j,
628
- decorator: I,
626
+ J.current = {
627
+ transition: F,
628
+ decorator: ue,
629
629
  hasSharedTopBar: !!a,
630
630
  hasSharedBottomBar: !!s,
631
- viewportScrollHeight: L,
632
- isRoot: b,
633
- isActive: y,
634
- status: w,
635
- dragStatus: T,
636
- index: D
631
+ viewportScrollHeight: fe,
632
+ isRoot: S,
633
+ isActive: x,
634
+ status: E,
635
+ dragStatus: D,
636
+ index: A
637
637
  };
638
- let X = f(null);
639
- X.current ||= O({
640
- getTransition: () => Y.current.transition,
641
- getDecorator: () => Y.current.decorator,
638
+ let be = f(null);
639
+ be.current ||= j({
640
+ getTransition: () => J.current.transition,
641
+ getDecorator: () => J.current.decorator,
642
642
  getElements: () => ({
643
- scope: G.current,
644
- screenContainer: U.current,
645
- decorator: K.current,
646
- sharedTopBar: q.current,
647
- sharedBottomBar: J.current
643
+ scope: W.current,
644
+ screenContainer: _e.current,
645
+ decorator: ve.current,
646
+ sharedTopBar: G.current,
647
+ sharedBottomBar: q.current
648
648
  }),
649
- hasSharedTopBar: () => Y.current.hasSharedTopBar,
650
- hasSharedBottomBar: () => Y.current.hasSharedBottomBar,
651
- getViewportScrollHeight: () => Y.current.viewportScrollHeight,
649
+ hasSharedTopBar: () => J.current.hasSharedTopBar,
650
+ hasSharedBottomBar: () => J.current.hasSharedBottomBar,
651
+ getViewportScrollHeight: () => J.current.viewportScrollHeight,
652
652
  isReadyForDrag: () => {
653
- let e = Y.current;
653
+ let e = J.current;
654
654
  return !e.isRoot && e.isActive && e.status === "COMPLETED" && e.dragStatus === "IDLE" && !!e.transition.swipeDirection && e.viewportScrollHeight < 10;
655
655
  },
656
656
  getPartnerBars: () => {
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;
657
+ let e = J.current, t = T.history.getState().histories, n = e.isActive ? t[e.index - 1]?.id : t[e.index]?.id;
658
+ return n ? T.screen.getState().sharedBars[n] : void 0;
659
659
  },
660
- setDragStatus: E,
660
+ setDragStatus: O,
661
661
  back: () => window.history.back()
662
662
  });
663
- let Q = X.current, fe = (e) => Q.pointerDown(e.nativeEvent), me = (e) => Q.pointerMove(e.nativeEvent), he = (e) => Q.pointerUp(e.nativeEvent);
663
+ let Y = be.current, xe = (e) => Y.pointerDown(e.nativeEvent), Se = (e) => Y.pointerMove(e.nativeEvent), Ce = (e) => Y.pointerUp(e.nativeEvent);
664
664
  o(() => {
665
- let e = G.current;
665
+ let e = W.current;
666
666
  if (!e) return;
667
667
  let t = (e) => {
668
- Q.shouldPreventTouch() && e.preventDefault(), e.target?.dataset.swipeAtEdgeBar === "true" && e.preventDefault();
668
+ Y.shouldPreventTouch() && e.preventDefault(), e.target?.dataset.swipeAtEdgeBar === "true" && e.preventDefault();
669
669
  };
670
670
  return e.addEventListener("touchmove", t, { passive: !1 }), () => {
671
671
  e.removeEventListener("touchmove", t);
672
672
  };
673
- }, [Q]), u(() => k.driveScreenLifecycle({
673
+ }, [Y]), u(() => P.driveScreenLifecycle({
674
674
  getElements: () => ({
675
- scope: G.current,
676
- decorator: K.current,
677
- bars: [q.current, J.current]
675
+ scope: W.current,
676
+ decorator: ve.current,
677
+ bars: [G.current, q.current]
678
678
  }),
679
- transitionName: x,
679
+ transitionName: C,
680
680
  prevTransitionName: te,
681
- status: w,
682
- isActive: y
681
+ status: E,
682
+ isActive: x
683
683
  }), [
684
- k,
685
- w,
686
- y,
684
+ P,
685
+ E,
686
+ x,
687
687
  te,
688
- x
688
+ C
689
689
  ]), u(() => {
690
- let e = q.current;
690
+ let e = G.current;
691
691
  if (!e) {
692
- ce(0);
692
+ V(0);
693
693
  return;
694
694
  }
695
- e.offsetHeight > 0 && ce(e.offsetHeight);
695
+ e.offsetHeight > 0 && V(e.offsetHeight);
696
696
  let t = new ResizeObserver(([e]) => {
697
- e.contentRect.height > 0 && ce(e.contentRect.height);
697
+ e.contentRect.height > 0 && V(e.contentRect.height);
698
698
  });
699
699
  return t.observe(e), () => {
700
700
  t.disconnect();
701
701
  };
702
702
  }, [a]), u(() => {
703
- let e = J.current;
703
+ let e = q.current;
704
704
  if (!e) {
705
- V(0);
705
+ H(0);
706
706
  return;
707
707
  }
708
- e.offsetHeight > 0 && V(e.offsetHeight);
708
+ e.offsetHeight > 0 && H(e.offsetHeight);
709
709
  let t = new ResizeObserver(([e]) => {
710
- e.contentRect.height > 0 && V(e.contentRect.height);
710
+ e.contentRect.height > 0 && H(e.contentRect.height);
711
711
  });
712
712
  return t.observe(e), () => {
713
713
  t.disconnect();
714
714
  };
715
715
  }, [s]), u(() => {
716
- let { registerSharedBars: e, unregisterSharedBars: t } = C.screen.getState();
717
- return e(v, {
716
+ let { registerSharedBars: e, unregisterSharedBars: t } = T.screen.getState();
717
+ return e(b, {
718
718
  topBar: !!a,
719
719
  bottomBar: !!s
720
- }), () => t(v);
720
+ }), () => t(b);
721
721
  }, [
722
- v,
722
+ b,
723
723
  a,
724
724
  s,
725
- C.screen
725
+ T.screen
726
726
  ]);
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,
732
- isActive: y,
733
- index: D,
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)
741
- }), [
742
- ge,
743
- y,
744
- D,
745
- _e,
746
- ve,
747
- C.history,
748
- C.navigate,
749
- C.screen
750
- ]);
751
- let ye = (() => {
752
- if (!y || w !== "PUSHING" && w !== "REPLACING") return {};
727
+ let we = x || ee === A - 1, { app: Te, nav: Ee } = _({
728
+ status: E,
729
+ isTopOrTopPrev: we,
730
+ hasTopBar: !!a,
731
+ hasNavBar: !!s,
732
+ partnerBars: ae
733
+ }), X = h({
734
+ status: E,
735
+ isTopOrTopPrev: we,
736
+ transitionName: C
737
+ }), [De, Oe] = p({
738
+ key: X,
739
+ released: X === null
740
+ });
741
+ De.key !== X && Oe({
742
+ key: X,
743
+ released: X === null
744
+ });
745
+ let Z = X !== null && De.key === X && !De.released;
746
+ o(() => {
747
+ if (Z) return le(() => Oe((e) => e.key === X && !e.released ? {
748
+ key: X,
749
+ released: !0
750
+ } : e));
751
+ }, [Z, X]);
752
+ let Ae = (() => {
753
+ if (!x || E !== "PUSHING" && E !== "REPLACING") return {};
753
754
  let 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;
755
+ return typeof I.x == "number" && (e.transform = `translateX(${I.x}px)`), typeof I.x == "string" && (e.transform = `translateX(${I.x})`), typeof I.y == "number" && (e.transform = `translateY(${I.y}px)`), typeof I.y == "string" && (e.transform = `translateY(${I.y})`), typeof I.opacity == "number" && (e.opacity = `${I.opacity}`), e;
755
756
  })();
756
- return /* @__PURE__ */ se("div", {
757
- ref: U,
757
+ return /* @__PURE__ */ de("div", {
758
+ ref: _e,
758
759
  style: {
759
- position: S,
760
+ position: w,
760
761
  top: 0,
761
762
  left: 0,
762
763
  width: "100%",
@@ -768,10 +769,10 @@ function Be({ children: e, statusBarHeight: t, statusBarColor: n, systemNavigati
768
769
  overscrollBehavior: "contain"
769
770
  },
770
771
  children: [
771
- /* @__PURE__ */ B("div", {
772
+ /* @__PURE__ */ R("div", {
772
773
  "data-swipe-at-edge-bar": !0,
773
774
  style: {
774
- position: S,
775
+ position: w,
775
776
  top: 0,
776
777
  left: 0,
777
778
  width: 8,
@@ -779,92 +780,95 @@ function Be({ children: e, statusBarHeight: t, statusBarColor: n, systemNavigati
779
780
  zIndex: 1
780
781
  }
781
782
  }),
782
- /* @__PURE__ */ se("div", {
783
- ref: G,
784
- ..._,
785
- onPointerDown: fe,
786
- onPointerMove: me,
787
- onPointerUp: he,
788
- onPointerCancel: he,
783
+ /* @__PURE__ */ de("div", {
784
+ ref: W,
785
+ ...y,
786
+ onPointerDown: xe,
787
+ onPointerMove: Se,
788
+ onPointerUp: Ce,
789
+ onPointerCancel: Ce,
789
790
  "data-flemo-screen": !0,
790
- "data-flemo-transition": x,
791
- "data-flemo-status": w,
792
- "data-flemo-active": y ? "true" : "false",
791
+ "data-flemo-transition": C,
792
+ "data-flemo-status": E,
793
+ "data-flemo-active": x ? "true" : "false",
794
+ "data-flemo-anim-hold": Z ? "true" : "false",
793
795
  style: {
794
796
  display: "flex",
795
797
  flexDirection: "column",
796
798
  height: "100%",
797
- backgroundColor: h,
798
- overflowY: g ? void 0 : "auto",
799
- touchAction: F === "x" ? "pan-y" : F === "y" ? "pan-x" : "auto",
800
- ...ye,
801
- ..._.style
799
+ backgroundColor: g,
800
+ overflowY: v ? void 0 : "auto",
801
+ touchAction: se === "x" ? "pan-y" : se === "y" ? "pan-x" : "auto",
802
+ ...Ae,
803
+ ...y.style
802
804
  },
803
805
  children: [
804
- !d && t && /* @__PURE__ */ B("div", {
806
+ !d && t && /* @__PURE__ */ R("div", {
805
807
  style: { minHeight: t },
806
- children: /* @__PURE__ */ B("div", { style: {
807
- position: S,
808
+ children: /* @__PURE__ */ R("div", { style: {
809
+ position: w,
808
810
  top: 0,
809
811
  width: "100%",
810
812
  minHeight: t,
811
813
  backgroundColor: n
812
814
  } })
813
815
  }),
814
- a && /* @__PURE__ */ B("div", { style: {
816
+ a && /* @__PURE__ */ R("div", { style: {
815
817
  width: "100%",
816
- minHeight: oe
818
+ minHeight: z
817
819
  } }),
818
820
  c,
819
- /* @__PURE__ */ B("div", {
821
+ /* @__PURE__ */ R("div", {
820
822
  style: {
821
823
  display: "flex",
822
824
  flexDirection: "column",
823
825
  flexGrow: 1,
824
- overflowY: g ? "auto" : void 0,
825
- ...w !== "IDLE" && w !== "COMPLETED" ? {
826
+ overflowY: v ? "auto" : void 0,
827
+ ...E !== "IDLE" && E !== "COMPLETED" ? {
826
828
  transform: "translateZ(0)",
827
829
  willChange: "transform"
828
830
  } : null
829
831
  },
830
- children: /* @__PURE__ */ B(Ee.Provider, {
831
- value: ue,
832
+ children: /* @__PURE__ */ R(ke.Provider, {
833
+ value: he,
832
834
  children: e
833
835
  })
834
836
  }),
835
837
  l,
836
- s && /* @__PURE__ */ B("div", { style: {
837
- display: R ? "none" : void 0,
838
+ s && /* @__PURE__ */ R("div", { style: {
839
+ display: pe ? "none" : void 0,
838
840
  width: "100%",
839
- minHeight: le
841
+ minHeight: me
840
842
  } }),
841
- !m && r && /* @__PURE__ */ B("div", {
843
+ !m && r && /* @__PURE__ */ R("div", {
842
844
  style: {
843
- display: R ? "none" : void 0,
845
+ display: pe ? "none" : void 0,
844
846
  minHeight: r
845
847
  },
846
- children: /* @__PURE__ */ B("div", { style: {
847
- position: S,
848
+ children: /* @__PURE__ */ R("div", { style: {
849
+ position: w,
848
850
  bottom: 0,
849
851
  width: "100%",
850
852
  minHeight: r,
851
853
  backgroundColor: i
852
854
  } })
853
855
  }),
854
- /* @__PURE__ */ B("div", {
855
- ref: de,
856
+ /* @__PURE__ */ R("div", {
857
+ ref: ge,
856
858
  "data-flemo-layer-mount": !0
857
859
  })
858
860
  ]
859
861
  }),
860
- a && /* @__PURE__ */ B("div", {
861
- ref: q,
862
+ a && /* @__PURE__ */ R("div", {
863
+ ref: G,
862
864
  "data-flemo-bar": "app",
863
- "data-flemo-bar-transition": x,
864
- "data-flemo-bar-status": w,
865
- "data-flemo-bar-active": y ? "true" : "false",
865
+ "data-flemo-bar-transition": C,
866
+ "data-flemo-bar-status": E,
867
+ "data-flemo-bar-active": x ? "true" : "false",
868
+ "data-flemo-bar-riding": Te ? "true" : "false",
869
+ "data-flemo-anim-hold": Z ? "true" : "false",
866
870
  style: {
867
- position: S,
871
+ position: w,
868
872
  top: d ? 0 : t,
869
873
  left: 0,
870
874
  width: "100%",
@@ -872,15 +876,17 @@ function Be({ children: e, statusBarHeight: t, statusBarColor: n, systemNavigati
872
876
  },
873
877
  children: a
874
878
  }),
875
- s && /* @__PURE__ */ B("div", {
876
- ref: J,
879
+ s && /* @__PURE__ */ R("div", {
880
+ ref: q,
877
881
  "data-flemo-bar": "nav",
878
- "data-flemo-bar-transition": x,
879
- "data-flemo-bar-status": w,
880
- "data-flemo-bar-active": y ? "true" : "false",
882
+ "data-flemo-bar-transition": C,
883
+ "data-flemo-bar-status": E,
884
+ "data-flemo-bar-active": x ? "true" : "false",
885
+ "data-flemo-bar-riding": Ee ? "true" : "false",
886
+ "data-flemo-anim-hold": Z ? "true" : "false",
881
887
  style: {
882
- display: R ? "none" : void 0,
883
- position: S,
888
+ display: pe ? "none" : void 0,
889
+ position: w,
884
890
  bottom: m ? 0 : r,
885
891
  left: 0,
886
892
  width: "100%",
@@ -888,11 +894,14 @@ function Be({ children: e, statusBarHeight: t, statusBarColor: n, systemNavigati
888
894
  },
889
895
  children: s
890
896
  }),
891
- I && /* @__PURE__ */ B(Ie, { ref: K }),
892
- /* @__PURE__ */ B("div", {
897
+ ue && /* @__PURE__ */ R(ze, {
898
+ ref: ve,
899
+ "data-flemo-anim-hold": Z ? "true" : "false"
900
+ }),
901
+ /* @__PURE__ */ R("div", {
893
902
  "data-swipe-at-edge-bar": !0,
894
903
  style: {
895
- position: S,
904
+ position: w,
896
905
  top: 0,
897
906
  right: 0,
898
907
  width: 8,
@@ -905,19 +914,19 @@ function Be({ children: e, statusBarHeight: t, statusBarColor: n, systemNavigati
905
914
  }
906
915
  //#endregion
907
916
  //#region src/screen/Screen.tsx
908
- function Ve({ children: e, ...t }) {
909
- let { isActive: n, isPrev: r, zIndex: i } = W();
910
- return /* @__PURE__ */ B(Fe, {
911
- freeze: g({
917
+ function Ue({ children: e, ...t }) {
918
+ let { isActive: n, isPrev: r, zIndex: i } = U();
919
+ return /* @__PURE__ */ R(Re, {
920
+ freeze: v({
912
921
  isActive: n,
913
922
  isPrev: r,
914
923
  zIndex: i,
915
- index: Z((e) => e.index),
916
- status: $((e) => e.status),
917
- dragStatus: ze((e) => e.dragStatus),
918
- replaceTransitionStatus: ze((e) => e.replaceTransitionStatus)
924
+ index: K((e) => e.index),
925
+ status: Q((e) => e.status),
926
+ dragStatus: $((e) => e.dragStatus),
927
+ replaceTransitionStatus: $((e) => e.replaceTransitionStatus)
919
928
  }),
920
- children: /* @__PURE__ */ B(Be, {
929
+ children: /* @__PURE__ */ R(He, {
921
930
  ...t,
922
931
  children: e
923
932
  })
@@ -925,12 +934,12 @@ function Ve({ children: e, ...t }) {
925
934
  }
926
935
  //#endregion
927
936
  //#region src/screen/Part.tsx
928
- function He({ ref: e, name: t, style: n, children: r, ...i }) {
929
- let { isActive: a } = W();
930
- return /* @__PURE__ */ B("div", {
937
+ function We({ ref: e, name: t, style: n, children: r, ...i }) {
938
+ let { isActive: a } = U();
939
+ return /* @__PURE__ */ R("div", {
931
940
  ref: e,
932
941
  "data-flemo-part-name": t,
933
- "data-flemo-status": $((e) => e.status),
942
+ "data-flemo-status": Q((e) => e.status),
934
943
  "data-flemo-active": a ? "true" : "false",
935
944
  style: n,
936
945
  ...i,
@@ -939,20 +948,20 @@ function He({ ref: e, name: t, style: n, children: r, ...i }) {
939
948
  }
940
949
  //#endregion
941
950
  //#region src/stores/RouterScopeProvider.tsx
942
- function Ue({ children: e }) {
951
+ function Ge({ children: e }) {
943
952
  let [t] = p(() => ({
944
953
  history: ee(),
945
954
  navigate: ne(),
946
- transition: j(),
947
- screen: D(),
948
- driver: y(),
955
+ transition: ae(),
956
+ screen: A(),
957
+ driver: x(),
949
958
  markSelfInduced: I,
950
- consume: _
959
+ consume: y
951
960
  }));
952
- return /* @__PURE__ */ B(V.Provider, {
961
+ return /* @__PURE__ */ R(z.Provider, {
953
962
  value: t,
954
963
  children: e
955
964
  });
956
965
  }
957
966
  //#endregion
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 };
967
+ export { Ae as Layer, We as Part, Z as Route, Oe as Router, Ge as RouterScopeProvider, Ue as Screen, H as ScreenContext, ze as ScreenDecorator, Re as ScreenFreeze, He as ScreenMotion, Se as Slot, b as createBrowserHistoryDriver, S as createDecorator, T as createPartTransition, E as createRawDecorator, D as createRawPartTransition, O as createRawTransition, ie as createTransition, se as partTransitionMap, K as useHistoryStore, Me as useNavigate, Q as useNavigateStore, Le as useParams, Ne as usePathname, U as useScreen, $ as useScreenStore, Ie as useStep, B as useStores, Ve as useViewportScrollHeight };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flemo/react",
3
- "version": "1.5.0",
3
+ "version": "1.5.2",
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.6.0"
39
+ "@flemo/core": "1.7.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@testing-library/jest-dom": "^6.9.1",
@@ -54,8 +54,8 @@
54
54
  "vite": "^8.0.16",
55
55
  "vite-plugin-dts": "^5.0.2",
56
56
  "vitest": "^4.1.9",
57
- "@flemo/tsconfig": "0.0.0",
58
- "@flemo/eslint-config": "0.0.0"
57
+ "@flemo/eslint-config": "0.0.0",
58
+ "@flemo/tsconfig": "0.0.0"
59
59
  },
60
60
  "peerDependencies": {
61
61
  "react": "^19.2.7",