@flemo/core 1.16.1 → 1.18.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/dist/index.d.ts CHANGED
@@ -40,7 +40,7 @@ export { SKIP_ANIMATION_ATTR, type TransitionEngine, type TransitionEngineDeps,
40
40
  export { default as createSwipeController } from './core/engine/createSwipeController';
41
41
  export { type SwipeController, type SwipeControllerConfig, type SwipeControllerElements, type SharedBarPresenceLike } from './core/engine/createSwipeController';
42
42
  export { default as computeBarRiding, type BarRidingInput } from './screen/computeBarRiding';
43
- export { animHoldKey, scheduleAnimHoldRelease, eagerlyDecodeImages, ANIM_HOLD_RELEASE_BACKSTOP_MS, type AnimHoldInput } from './screen/animStartAnchor';
43
+ export { animHoldKey, scheduleAnimHoldRelease, createAnimHoldCoordinator, eagerlyDecodeImages, ANIM_HOLD_RELEASE_BACKSTOP_MS, type AnimHoldInput, type AnimHoldCoordinator } from './screen/animStartAnchor';
44
44
  export { default as observeBarHeight } from './screen/observeBarHeight';
45
45
  export { default as observeViewportScrollHeight } from './screen/observeViewportScrollHeight';
46
46
  export type { RegisterTransition, TransitionName, TransitionVariant, TransitionVariantValue, TransitionOptions, BaseTransition, Transition, SwipeInfo, SwipeAnimate } from './transition/typing';
package/dist/index.mjs CHANGED
@@ -496,7 +496,7 @@ function te(e) {
496
496
  }
497
497
  //#endregion
498
498
  //#region src/history/memoryHistoryDriver.ts
499
- function ne(e) {
499
+ function O(e) {
500
500
  let t = [{
501
501
  state: e?.state ?? null,
502
502
  url: e?.url ?? "/"
@@ -538,7 +538,7 @@ function ne(e) {
538
538
  }
539
539
  //#endregion
540
540
  //#region src/navigate/store.ts
541
- function re() {
541
+ function k() {
542
542
  return e((e) => ({
543
543
  status: "IDLE",
544
544
  transitionTaskId: null,
@@ -548,11 +548,11 @@ function re() {
548
548
  }
549
549
  //#endregion
550
550
  //#region src/navigate/createNavigationController.ts
551
- var O = (e, t, n) => {
551
+ var A = (e, t, n) => {
552
552
  let { regexp: r } = i(e);
553
553
  for (let e = t - 1; e >= 0; e--) if (r.test(n[e].pathname)) return t - e;
554
554
  return -1;
555
- }, k = (e, t) => typeof e == "number" && Number.isFinite(e) ? Math.max(0, Math.trunc(e)) : t, A = async (e, t, n, r) => {
555
+ }, ne = (e, t) => typeof e == "number" && Number.isFinite(e) ? Math.max(0, Math.trunc(e)) : t, re = async (e, t, n, r) => {
556
556
  let i, a = new Promise((t) => {
557
557
  i = e.subscribe(() => t(!0));
558
558
  }), o = new Promise((e) => setTimeout(() => e(!1), 200));
@@ -586,10 +586,10 @@ function ie(e) {
586
586
  }
587
587
  let o = c(), { index: d, histories: f, addHistory: g, popHistories: _ } = t.history.getState(), v = (() => {
588
588
  if (u?.until != null) {
589
- let e = O(u.until, d, f);
589
+ let e = A(u.until, d, f);
590
590
  return e < 0 ? 0 : e;
591
591
  }
592
- return Math.min(k(u?.skip, 0), Math.max(0, d));
592
+ return Math.min(ne(u?.skip, 0), Math.max(0, d));
593
593
  })(), { setStatus: y, setTransitionTaskId: b } = t.navigate.getState();
594
594
  y("PUSHING"), b(h);
595
595
  let { pathname: x, toPathname: S } = n(e, l ?? {}), C = {
@@ -616,7 +616,7 @@ function ie(e) {
616
616
  return g({
617
617
  ...C,
618
618
  frameIndex: T + 1
619
- }), await A(r, i, v, () => {
619
+ }), await re(r, i, v, () => {
620
620
  s(), r.pushState({
621
621
  id: h,
622
622
  index: T + 1,
@@ -646,10 +646,10 @@ function ie(e) {
646
646
  }
647
647
  let o = c(), { index: d, histories: f, addHistory: g, replaceHistory: _, popHistories: v } = t.history.getState(), y = (() => {
648
648
  if (u?.until != null) {
649
- let e = O(u.until, d, f);
649
+ let e = A(u.until, d, f);
650
650
  return e < 0 ? 0 : e + 1;
651
651
  }
652
- return Math.min(k(u?.skip, 0) + 1, d + 1);
652
+ return Math.min(ne(u?.skip, 0) + 1, d + 1);
653
653
  })();
654
654
  if (y <= 0) {
655
655
  a.abort();
@@ -681,7 +681,7 @@ function ie(e) {
681
681
  return v(y - 1), g({
682
682
  ...w,
683
683
  frameIndex: E
684
- }), y <= d ? await A(r, i, y, () => {
684
+ }), y <= d ? await re(r, i, y, () => {
685
685
  s(), r.pushState({
686
686
  id: h,
687
687
  index: E,
@@ -690,7 +690,7 @@ function ie(e) {
690
690
  transitionName: p,
691
691
  layoutId: m
692
692
  }, S);
693
- }) : await A(r, i, d, () => {
693
+ }) : await re(r, i, d, () => {
694
694
  s(), r.replaceState({
695
695
  id: h,
696
696
  index: E,
@@ -746,10 +746,10 @@ function ie(e) {
746
746
  pop: async (e) => {
747
747
  await d((t, n) => {
748
748
  if (e?.until != null) {
749
- let r = O(e.until, t, n);
749
+ let r = A(e.until, t, n);
750
750
  return r < 0 ? 0 : r;
751
751
  }
752
- let r = k(e?.skip, 1);
752
+ let r = ne(e?.skip, 1);
753
753
  return r <= 0 ? 0 : Math.min(r, t);
754
754
  }, e?.transitionName);
755
755
  }
@@ -903,7 +903,7 @@ function me(e) {
903
903
  index: 0,
904
904
  histories: [p]
905
905
  }), e.hostedScope;
906
- let m = a ? ne({
906
+ let m = a ? O({
907
907
  state: {
908
908
  id: p.id,
909
909
  index: 0,
@@ -915,7 +915,7 @@ function me(e) {
915
915
  url: p.pathname
916
916
  }) : o, h = a ? fe : g(), _ = {
917
917
  history: s([p], 0),
918
- navigate: re(),
918
+ navigate: k(),
919
919
  transition: le(i),
920
920
  screen: de(),
921
921
  driver: m,
@@ -1401,17 +1401,17 @@ var F = /* @__PURE__ */ new Map(), I = {
1401
1401
  "POPPING-false": "PUSHING-false",
1402
1402
  "COMPLETED-true": "self",
1403
1403
  "COMPLETED-false": "self"
1404
- }, Ae = Object.keys(I), L = (e) => {
1404
+ }, Ae = Object.keys(I), je = (e) => {
1405
1405
  if (!e) return 0;
1406
1406
  let t = e.duration;
1407
1407
  return typeof t == "number" && t >= 0 ? t : 0;
1408
- }, R = (e) => e && typeof e.delay == "number" && e.delay > 0 ? e.delay : 0, je = (e, t) => {
1408
+ }, L = (e) => e && typeof e.delay == "number" && e.delay > 0 ? e.delay : 0, Me = (e, t) => {
1409
1409
  let n = I[t];
1410
1410
  return n === "self" ? null : n === "initial" ? e.initial : e.variants[n].value;
1411
- }, z = (e, t) => {
1412
- let n = je(e, t);
1411
+ }, R = (e, t) => {
1412
+ let n = Me(e, t);
1413
1413
  if (n === null) return null;
1414
- let r = e.variants[t], i = L(r.options), a = R(r.options);
1414
+ let r = e.variants[t], i = je(r.options), a = L(r.options);
1415
1415
  return i <= 0 && a <= 0 ? null : {
1416
1416
  from: n,
1417
1417
  to: r.value,
@@ -1419,7 +1419,7 @@ var F = /* @__PURE__ */ new Map(), I = {
1419
1419
  delay: a,
1420
1420
  ease: r.options?.ease
1421
1421
  };
1422
- }, Me = Ae, Ne = (e) => e.replace(/[^a-zA-Z0-9_-]/g, "_"), Pe = (e) => typeof e == "object" && !!e && !Array.isArray(e), Fe = new Set(/* @__PURE__ */ "opacity.scale.scaleX.scaleY.scaleZ.aspectRatio.columnCount.columns.flex.flexGrow.flexShrink.fontWeight.gridArea.gridColumn.gridColumnEnd.gridColumnStart.gridRow.gridRowEnd.gridRowStart.lineHeight.lineClamp.order.orphans.tabSize.widows.zIndex.zoom.fillOpacity.floodOpacity.stopOpacity.strokeOpacity.strokeDasharray.strokeDashoffset.strokeMiterlimit.strokeWidth".split(".")), Ie = (e, t) => t.startsWith("--") || Fe.has(t) ? `${e}` : t === "rotate" || t === "rotateX" || t === "rotateY" || t === "rotateZ" ? `${e}deg` : `${e}px`, Le = (e, t) => typeof t == "number" ? Ie(t, e) : typeof t == "string" ? t : "", Re = (e) => e.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`), ze = new Set([
1422
+ }, Ne = Ae, Pe = (e) => e.replace(/[^a-zA-Z0-9_-]/g, "_"), Fe = (e) => typeof e == "object" && !!e && !Array.isArray(e), Ie = new Set(/* @__PURE__ */ "opacity.scale.scaleX.scaleY.scaleZ.aspectRatio.columnCount.columns.flex.flexGrow.flexShrink.fontWeight.gridArea.gridColumn.gridColumnEnd.gridColumnStart.gridRow.gridRowEnd.gridRowStart.lineHeight.lineClamp.order.orphans.tabSize.widows.zIndex.zoom.fillOpacity.floodOpacity.stopOpacity.strokeOpacity.strokeDasharray.strokeDashoffset.strokeMiterlimit.strokeWidth".split(".")), Le = (e, t) => t.startsWith("--") || Ie.has(t) ? `${e}` : t === "rotate" || t === "rotateX" || t === "rotateY" || t === "rotateZ" ? `${e}deg` : `${e}px`, Re = (e, t) => typeof t == "number" ? Le(t, e) : typeof t == "string" ? t : "", z = (e) => e.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`), ze = new Set([
1423
1423
  "x",
1424
1424
  "y",
1425
1425
  "z",
@@ -1446,14 +1446,14 @@ var F = /* @__PURE__ */ new Map(), I = {
1446
1446
  }
1447
1447
  }, Ge = (e) => {
1448
1448
  let t = /* @__PURE__ */ new Map(), n = !1, r = /* @__PURE__ */ new Set(), i = (e) => {
1449
- if (!Pe(e)) return;
1449
+ if (!Fe(e)) return;
1450
1450
  let n = [];
1451
1451
  for (let r of Object.keys(e)) {
1452
- let i = e[r], a = Le(r, i);
1452
+ let i = e[r], a = Re(r, i);
1453
1453
  if (a !== "") if (ze.has(r)) n.push(`${r}:${a}`);
1454
1454
  else {
1455
- let e = t.get(Re(r)) ?? /* @__PURE__ */ new Set();
1456
- e.add(a), t.set(Re(r), e);
1455
+ let e = t.get(z(r)) ?? /* @__PURE__ */ new Set();
1456
+ e.add(a), t.set(z(r), e);
1457
1457
  }
1458
1458
  }
1459
1459
  r.add(n.sort().join("|"));
@@ -1464,12 +1464,12 @@ var F = /* @__PURE__ */ new Map(), I = {
1464
1464
  let a = Array.from(t.entries()).filter(([, e]) => e.size > 1).map(([e]) => e);
1465
1465
  return n && a.push("transform"), a;
1466
1466
  }, B = (e) => {
1467
- if (!Pe(e)) return [];
1467
+ if (!Fe(e)) return [];
1468
1468
  let t = [], n = !0, r = [];
1469
1469
  for (let i of Object.keys(e)) {
1470
- let a = e[i], o = Le(i, a);
1470
+ let a = e[i], o = Re(i, a);
1471
1471
  o !== "" && (ze.has(i) ? (t.push(We(i, o)), Ue(i, a) || (n = !1)) : r.push({
1472
- property: Re(i),
1472
+ property: z(i),
1473
1473
  value: o
1474
1474
  }));
1475
1475
  }
@@ -1499,8 +1499,8 @@ var F = /* @__PURE__ */ new Map(), I = {
1499
1499
  }, Ye = (e, t) => {
1500
1500
  let [n, r] = t.split("-");
1501
1501
  return `[data-flemo-part-name="${e}"][data-flemo-status="${n}"][data-flemo-active="${r}"]`;
1502
- }, Xe = (e, t, n) => `flemo-${e}-${Ne(t)}-${n}`, Ze = (e, t, n, r, i, a) => {
1503
- let o = B(r), s = B(i.value), c = L(i.options), l = R(i.options), u = H(i.options?.ease), d = a(t, n), f = e === "screen" ? `${d},\n${Je(t, n)}` : d;
1502
+ }, Xe = (e, t, n) => `flemo-${e}-${Pe(t)}-${n}`, Ze = (e, t, n, r, i, a) => {
1503
+ let o = B(r), s = B(i.value), c = je(i.options), l = L(i.options), u = H(i.options?.ease), d = a(t, n), f = e === "screen" ? `${d},\n${Je(t, n)}` : d;
1504
1504
  if (s.length === 0 && o.length === 0) return "";
1505
1505
  if (c <= 0 && l <= 0) return s.length === 0 ? "" : `${f} {\n${V(s)}\n animation: none;\n}`;
1506
1506
  let p = Xe(e, t, n), m = [
@@ -1544,7 +1544,7 @@ var F = /* @__PURE__ */ new Map(), I = {
1544
1544
  }
1545
1545
  for (let e of t) {
1546
1546
  let t = e.name;
1547
- for (let n of Me) {
1547
+ for (let n of Ne) {
1548
1548
  let i = e.variants[n], a = I[n];
1549
1549
  if (a === "self") {
1550
1550
  r.push($e(qe, t, n, i));
@@ -1556,7 +1556,7 @@ var F = /* @__PURE__ */ new Map(), I = {
1556
1556
  }
1557
1557
  for (let e of n) {
1558
1558
  let t = e.name;
1559
- for (let n of Me) {
1559
+ for (let n of Ne) {
1560
1560
  let i = e.variants[n], a = I[n];
1561
1561
  if (a === "self") {
1562
1562
  r.push($e(Ye, t, n, i));
@@ -1579,7 +1579,7 @@ var F = /* @__PURE__ */ new Map(), I = {
1579
1579
  ].join("\n"), nt = (e, t) => {
1580
1580
  let n = I[t];
1581
1581
  if (n === "self") return !1;
1582
- let r = e.variants[t], i = L(r.options), a = R(r.options);
1582
+ let r = e.variants[t], i = je(r.options), a = L(r.options);
1583
1583
  if (i <= 0 && a <= 0) return !1;
1584
1584
  let o = B(n === "initial" ? e.initial : e.variants[n].value), s = B(r.value);
1585
1585
  return o.length > 0 || s.length > 0;
@@ -2098,29 +2098,30 @@ Y.onFrameGap = (e) => {
2098
2098
  };
2099
2099
  //#endregion
2100
2100
  //#region src/core/engine/types.ts
2101
- var X = "data-flemo-skip-animation", Z = () => {}, Gt = "data-flemo-part-name", Kt = (e) => {
2101
+ var X = "data-flemo-skip-animation", Z = () => {}, Gt = "data-flemo-part-name", Q = (e) => {
2102
2102
  let t = e.parentElement ?? e;
2103
2103
  return Array.from(t.querySelectorAll(`[${Gt}]`)).filter((n) => {
2104
2104
  let r = n.closest("[data-flemo-screen]");
2105
2105
  return !r || r === e || !t.contains(r);
2106
2106
  });
2107
- }, qt = (e, t) => {
2107
+ }, Kt = (e, t) => {
2108
2108
  let [n, r] = t.split("-");
2109
- return Kt(e).filter((e) => e.getAttribute("data-flemo-status") === n && e.getAttribute("data-flemo-active") === r);
2109
+ return Q(e).filter((e) => e.getAttribute("data-flemo-status") === n && e.getAttribute("data-flemo-active") === r);
2110
2110
  };
2111
- function Jt(e) {
2112
- return { driveScreenLifecycle: (t) => {
2113
- let { getElements: n, transitionName: r, prevTransitionName: i, status: a, isActive: s, animHoldReleased: c } = t, l = a === "PUSHING" || a === "POPPING" || a === "REPLACING", u = (t, i, a) => {
2111
+ function qt(e) {
2112
+ let t = /* @__PURE__ */ new Set();
2113
+ return { driveScreenLifecycle: (n) => {
2114
+ let { getElements: r, transitionName: i, prevTransitionName: a, status: s, isActive: c, animHoldReleased: l } = n, u = s === "PUSHING" || s === "POPPING" || s === "REPLACING", d = (t, n, a) => {
2114
2115
  let s = e.getTransitionTaskId();
2115
2116
  if (!s || o.pendingTaskIds.some((e) => e !== s) || !U.playerAllowed()) return null;
2116
- let { scope: c, decorator: l, bars: u } = n();
2117
+ let { scope: c, decorator: l, bars: u } = r();
2117
2118
  if (!c) return null;
2118
- let d = we(r), f = z(d, t);
2119
+ let d = we(i), f = R(d, t);
2119
2120
  if (!f) return null;
2120
2121
  let p = [], m = Y.join(s, {
2121
2122
  element: c,
2122
2123
  motion: f,
2123
- role: i,
2124
+ role: n,
2124
2125
  onComplete: a
2125
2126
  });
2126
2127
  if (!m) return null;
@@ -2135,7 +2136,7 @@ function Jt(e) {
2135
2136
  t && p.push(t);
2136
2137
  }
2137
2138
  if (l && d.decoratorName) {
2138
- let e = P.get(d.decoratorName), n = e ? z(e, t) : null;
2139
+ let e = P.get(d.decoratorName), n = e ? R(e, t) : null;
2139
2140
  if (n) {
2140
2141
  let e = Y.join(s, {
2141
2142
  element: l,
@@ -2145,8 +2146,8 @@ function Jt(e) {
2145
2146
  e && p.push(e);
2146
2147
  }
2147
2148
  }
2148
- for (let e of qt(c, t)) {
2149
- let n = F.get(e.getAttribute(Gt)), r = n ? z(n, t) : null;
2149
+ for (let e of Kt(c, t)) {
2150
+ let n = F.get(e.getAttribute(Gt)), r = n ? R(n, t) : null;
2150
2151
  if (!r) continue;
2151
2152
  let i = Y.join(s, {
2152
2153
  element: e,
@@ -2157,68 +2158,82 @@ function Jt(e) {
2157
2158
  }
2158
2159
  return () => p.forEach((e) => e());
2159
2160
  };
2160
- if (!s) {
2161
- if (a === "COMPLETED") {
2162
- let { scope: e, decorator: t, bars: r } = n();
2161
+ if (!c) {
2162
+ if (s === "COMPLETED") {
2163
+ let { scope: e, decorator: t, bars: n } = r();
2163
2164
  if (e) {
2164
2165
  K(e);
2165
- for (let t of Kt(e)) K(t);
2166
+ for (let t of Q(e)) K(t);
2166
2167
  }
2167
2168
  t && K(t);
2168
- for (let e of r ?? []) e && K(e);
2169
+ for (let e of n ?? []) e && K(e);
2169
2170
  return Z;
2170
2171
  }
2171
- if (a === "REPLACING" && i !== r && e.setReplaceTransitionStatus("PENDING"), l && c) {
2172
- let e = u(`${a}-false`, "passive");
2172
+ if (s === "REPLACING" && a !== i && e.setReplaceTransitionStatus("PENDING"), u && l) {
2173
+ let e = d(`${s}-false`, "passive");
2173
2174
  if (e) return e;
2174
2175
  }
2175
2176
  return Z;
2176
2177
  }
2177
- if (a === "COMPLETED") {
2178
+ if (s === "COMPLETED") {
2178
2179
  e.setDragStatus("IDLE"), e.setReplaceTransitionStatus("IDLE");
2179
- let { scope: t, decorator: r, bars: i } = n();
2180
+ let { scope: t, decorator: n, bars: i } = r();
2180
2181
  if (t) {
2181
2182
  K(t), t.removeAttribute(X);
2182
- for (let e of Kt(t)) K(e);
2183
+ for (let e of Q(t)) K(e);
2183
2184
  }
2184
- r && (K(r), r.removeAttribute(X));
2185
+ n && (K(n), n.removeAttribute(X));
2185
2186
  for (let e of i ?? []) e && (K(e), e.style.removeProperty("will-change"));
2186
2187
  return Z;
2187
2188
  }
2188
- if (a === "IDLE") return Z;
2189
- let { scope: d } = n();
2190
- if (!d) return Z;
2191
- let f = () => {
2189
+ if (s === "IDLE") return Z;
2190
+ let { scope: f } = r();
2191
+ if (!f) return Z;
2192
+ let p = () => {
2192
2193
  let t = e.getTransitionTaskId();
2193
2194
  t && o.resolveTask(t);
2194
- }, p = we(r), m = `${a}-true`, h = d.getAttribute(X) === "true";
2195
- if (!(!h && nt(p, m))) return queueMicrotask(f), Z;
2196
- let g = z(p, m), _ = !h && !!g, v = Xe("screen", r, m), y = (e) => {
2197
- e.target === d && e.animationName === v && (d.removeEventListener("animationend", y), f());
2195
+ }, m = we(i), h = `${s}-true`, g = f.getAttribute(X) === "true";
2196
+ if (!(!g && nt(m, h))) return queueMicrotask(p), Z;
2197
+ let _ = R(m, h), v = !g && !!_, y = Xe("screen", i, h), b, x = () => {
2198
+ b !== void 0 && (clearTimeout(b), b = void 0);
2199
+ }, S = (e) => {
2200
+ e.target === f && e.animationName === y && (f.removeEventListener("animationend", S), x(), p());
2198
2201
  };
2199
- d.addEventListener("animationend", y);
2200
- let b = _ && c ? u(m, "active", f) : null, x = e.getTransitionTaskId(), S = ((g?.delay ?? 0) + (g?.duration ?? .6)) * 1e3 + 1500, C = x ? setTimeout(() => void o.resolveTask(x), S) : void 0;
2201
- return () => {
2202
- C !== void 0 && clearTimeout(C), d.removeEventListener("animationend", y), b?.();
2202
+ f.addEventListener("animationend", S);
2203
+ let C = v && l ? d(h, "active", p) : null, w = e.getTransitionTaskId(), T = (_.delay + _.duration) * 1e3, E = T + 1500, D = w ? setTimeout(() => void o.resolveTask(w), E) : void 0, ee = T + 250, te = () => {
2204
+ x(), b = setTimeout(O, ee);
2205
+ }, O = () => {
2206
+ if (x(), w) {
2207
+ if (e.getTransitionTaskId() === w && f.isConnected && f.getAttribute("data-flemo-skip-animation") !== "true" && nt(m, h) && !t.has(w)) {
2208
+ t.add(w), f.style.animation = "none", f.offsetWidth, f.style.removeProperty("animation"), te();
2209
+ return;
2210
+ }
2211
+ p();
2212
+ }
2213
+ }, k = (e) => {
2214
+ e.target === f && e.animationName === y && O();
2215
+ }, A = !C && l;
2216
+ return A && (f.addEventListener("animationcancel", k), te()), () => {
2217
+ D !== void 0 && clearTimeout(D), f.removeEventListener("animationend", S), A && f.removeEventListener("animationcancel", k), x(), C?.();
2203
2218
  };
2204
2219
  } };
2205
2220
  }
2206
2221
  //#endregion
2207
2222
  //#region src/utils/findScrollable.ts
2208
- function Yt(e, t) {
2209
- let { direction: n = "x", markerSelector: r = "[data-swipe-at-edge]", depthLimit: i = 24, verifyByScroll: a = !1 } = t ?? {}, o = Xt(e);
2223
+ function Jt(e, t) {
2224
+ let { direction: n = "x", markerSelector: r = "[data-swipe-at-edge]", depthLimit: i = 24, verifyByScroll: a = !1 } = t ?? {}, o = Yt(e);
2210
2225
  if (!o) return {
2211
2226
  element: null,
2212
2227
  hasMarker: !1
2213
2228
  };
2214
2229
  let s = o.closest?.(r);
2215
- if (s instanceof HTMLElement && Q(s, n) && (!a || $(s, n))) return {
2230
+ if (s instanceof HTMLElement && $(s, n) && (!a || Xt(s, n))) return {
2216
2231
  element: s,
2217
2232
  hasMarker: !0
2218
2233
  };
2219
2234
  let c = o, l = 0;
2220
2235
  for (; c && l < i;) {
2221
- if (Q(c, n) && (!a || $(c, n))) return {
2236
+ if ($(c, n) && (!a || Xt(c, n))) return {
2222
2237
  element: c,
2223
2238
  hasMarker: !1
2224
2239
  };
@@ -2229,7 +2244,7 @@ function Yt(e, t) {
2229
2244
  hasMarker: !1
2230
2245
  };
2231
2246
  }
2232
- function Xt(e) {
2247
+ function Yt(e) {
2233
2248
  if (!e) return null;
2234
2249
  let t = e, n = typeof t.composedPath == "function" ? t.composedPath() : void 0;
2235
2250
  if (n && n.length) {
@@ -2237,11 +2252,11 @@ function Xt(e) {
2237
2252
  }
2238
2253
  return e instanceof HTMLElement ? e : null;
2239
2254
  }
2240
- function Q(e, t) {
2255
+ function $(e, t) {
2241
2256
  return t === "y" ? e.scrollHeight - e.clientHeight > 1 : e.scrollWidth - e.clientWidth > 1;
2242
2257
  }
2243
- function $(e, t) {
2244
- if (!Q(e, t) || typeof window > "u") return !1;
2258
+ function Xt(e, t) {
2259
+ if (!$(e, t) || typeof window > "u") return !1;
2245
2260
  let n = window.getComputedStyle(e), r = t === "y" ? n.overflowY : n.overflowX;
2246
2261
  return r === "auto" || r === "scroll" || r === "overlay";
2247
2262
  }
@@ -2425,10 +2440,10 @@ function Qt(e) {
2425
2440
  };
2426
2441
  return {
2427
2442
  pointerDown: (t) => {
2428
- e.isReadyForDrag() && (f = Yt(t.target, {
2443
+ e.isReadyForDrag() && (f = Jt(t.target, {
2429
2444
  direction: "x",
2430
2445
  verifyByScroll: !0
2431
- }), p = Yt(t.target, {
2446
+ }), p = Jt(t.target, {
2432
2447
  direction: "y",
2433
2448
  verifyByScroll: !0
2434
2449
  }), m = t.clientX, h = t.clientY, (!f.element && !p.element || f.element || p.element) && (a = !0));
@@ -2481,7 +2496,7 @@ function an(e) {
2481
2496
  function on(e, t = {}) {
2482
2497
  let n = !1, r = 0, i = [], a = () => {
2483
2498
  let r = t.scope;
2484
- if (!r || typeof r.querySelectorAll != "function") {
2499
+ if (t.decodeWait === !1 || !r || typeof r.querySelectorAll != "function") {
2485
2500
  e();
2486
2501
  return;
2487
2502
  }
@@ -2504,14 +2519,54 @@ function on(e, t = {}) {
2504
2519
  i.push(requestAnimationFrame(() => o(e - 1)));
2505
2520
  }, s = requestAnimationFrame(() => {
2506
2521
  r = requestAnimationFrame(() => o(t.extraFrames ?? 0));
2507
- }), c = setTimeout(e, 300);
2522
+ });
2523
+ return () => {
2524
+ n = !0, cancelAnimationFrame(s), r && cancelAnimationFrame(r), i.forEach((e) => cancelAnimationFrame(e));
2525
+ };
2526
+ }
2527
+ function sn(e, t = {}) {
2528
+ let n = on(e, t), r = setTimeout(e, 300);
2508
2529
  return () => {
2509
- n = !0, cancelAnimationFrame(s), r && cancelAnimationFrame(r), i.forEach((e) => cancelAnimationFrame(e)), clearTimeout(c);
2530
+ n(), clearTimeout(r);
2510
2531
  };
2511
2532
  }
2533
+ function cn() {
2534
+ let e = /* @__PURE__ */ new Map(), t = (t, n) => {
2535
+ clearTimeout(n.backstop), e.delete(t);
2536
+ let r = [...n.members];
2537
+ n.members.clear();
2538
+ for (let e of r) e.cancelReadiness(), e.release();
2539
+ }, n = (e) => [...e.members].every((e) => e.ready);
2540
+ return { join: (r, i, a) => {
2541
+ let o = e.get(r);
2542
+ if (!o) {
2543
+ let n = {
2544
+ members: /* @__PURE__ */ new Set(),
2545
+ backstop: setTimeout(() => t(r, n), 300)
2546
+ };
2547
+ e.set(r, n), o = n;
2548
+ }
2549
+ let s = o, c = {
2550
+ release: i,
2551
+ ready: !1,
2552
+ cancelReadiness: on(() => {
2553
+ c.ready = !0, n(s) && t(r, s);
2554
+ }, a)
2555
+ };
2556
+ return s.members.add(c), () => {
2557
+ if (s.members.has(c)) {
2558
+ if (c.cancelReadiness(), s.members.delete(c), s.members.size === 0) {
2559
+ clearTimeout(s.backstop), e.delete(r);
2560
+ return;
2561
+ }
2562
+ n(s) && t(r, s);
2563
+ }
2564
+ };
2565
+ } };
2566
+ }
2512
2567
  //#endregion
2513
2568
  //#region src/screen/observeBarHeight.ts
2514
- function sn(e, t) {
2569
+ function ln(e, t) {
2515
2570
  e.offsetHeight > 0 && t(e.offsetHeight);
2516
2571
  let n = new ResizeObserver(([e]) => {
2517
2572
  e.contentRect.height > 0 && t(e.contentRect.height);
@@ -2522,14 +2577,14 @@ function sn(e, t) {
2522
2577
  }
2523
2578
  //#endregion
2524
2579
  //#region src/screen/observeViewportScrollHeight.ts
2525
- var cn = 0;
2526
- function ln(e) {
2580
+ var un = 0;
2581
+ function dn(e) {
2527
2582
  let t = 0, n = () => {
2528
2583
  cancelAnimationFrame(t), t = requestAnimationFrame(() => {
2529
2584
  let t = document.documentElement.scrollHeight - (window.visualViewport?.height || 0);
2530
2585
  t = t < 0 ? 0 : t;
2531
- let n = t - cn;
2532
- n = n < 0 ? 0 : n, cn ||= t, e(t, n);
2586
+ let n = t - un;
2587
+ n = n < 0 ? 0 : n, un ||= t, e(t, n);
2533
2588
  });
2534
2589
  };
2535
2590
  return window.visualViewport?.addEventListener("resize", n), window.visualViewport?.addEventListener("scroll", n), () => {
@@ -2538,7 +2593,7 @@ function ln(e) {
2538
2593
  }
2539
2594
  //#endregion
2540
2595
  //#region src/utils/isOpaqueColor.ts
2541
- function un(e) {
2596
+ function fn(e) {
2542
2597
  let t = e.trim().toLowerCase();
2543
2598
  if (t === "transparent" || t === "") return !1;
2544
2599
  if (t.match(/^rgb\(\s*\d+[\s,]+\d+[\s,]+\d+\s*\)$/)) return !0;
@@ -2549,7 +2604,7 @@ function un(e) {
2549
2604
  }
2550
2605
  //#endregion
2551
2606
  //#region src/utils/buildRoutePath.ts
2552
- function dn(e, n) {
2607
+ function pn(e, n) {
2553
2608
  let i = n ?? {}, a = t(e)(Object.fromEntries(Object.entries(i).map(([e, t]) => [e, String(t)]))), o = (typeof e == "string" ? r(e) : e).tokens.filter((e) => e.type === "param").map((e) => e.name), s = Object.fromEntries(Object.entries(i).filter(([e]) => !o.includes(e))), c = new URLSearchParams(s).toString();
2554
2609
  return {
2555
2610
  pathname: `${a}${c ? `?${c}` : ""}`,
@@ -2557,4 +2612,4 @@ function dn(e, n) {
2557
2612
  };
2558
2613
  }
2559
2614
  //#endregion
2560
- export { tn as ANIM_HOLD_RELEASE_BACKSTOP_MS, X as SKIP_ANIMATION_ATTR, o as TaskManger, en as animHoldKey, q as animateInline, Xe as animationName, oe as appendParamsQuery, it as applyTransitionStyles, dn as buildRoutePath, $ as canProgrammaticallyScroll, K as clearInlineAnimation, Ge as collectAnimatedProperties, et as compileTransitionStyles, $t as computeBarRiding, ge as computeScreenFreeze, y as consumeSelfInducedPop, h as createBrowserHistoryDriver, Te as createDecorator, s as createHistoryStore, b as createHistorySync, ne as createMemoryHistoryDriver, re as createNavigateStore, ie as createNavigationController, Oe as createPartTransition, Ee as createRawDecorator, ke as createRawPartTransition, _e as createRawTransition, me as createRouterScope, he as createScreenSelector, de as createScreenStore, g as createSelfPopGuard, se as createStepController, Qt as createSwipeController, j as createTransition, Jt as createTransitionEngine, le as createTransitionStore, ye as cupertino, P as decoratorMap, an as eagerlyDecodeImages, H as easingToCss, ee as ensureScopeHistorySync, f as ensureWindowHistoryState, dt as enteringInitialStyle, Yt as findScrollable, c as getMatchedPathPattern, l as getParams, un as isOpaqueColor, d as isServer, xe as layout, v as markSelfInducedPop, ue as matchesPathname, Se as material, Ce as none, sn as observeBarHeight, ln as observeViewportScrollHeight, Q as overflowsAxis, De as overlay, F as partTransitionMap, ae as readStepParams, ut as registerTransitionDefinitions, te as releaseScopeHistorySync, we as resolveTransition, on as scheduleAnimHoldRelease, u as seedInitialHistory, p as seedRouterEntry, ce as subscribeStepParamsRestore, B as targetToDecls, M as transitionMap, nt as variantHasAnimation };
2615
+ export { tn as ANIM_HOLD_RELEASE_BACKSTOP_MS, X as SKIP_ANIMATION_ATTR, o as TaskManger, en as animHoldKey, q as animateInline, Xe as animationName, oe as appendParamsQuery, it as applyTransitionStyles, pn as buildRoutePath, Xt as canProgrammaticallyScroll, K as clearInlineAnimation, Ge as collectAnimatedProperties, et as compileTransitionStyles, $t as computeBarRiding, ge as computeScreenFreeze, y as consumeSelfInducedPop, cn as createAnimHoldCoordinator, h as createBrowserHistoryDriver, Te as createDecorator, s as createHistoryStore, b as createHistorySync, O as createMemoryHistoryDriver, k as createNavigateStore, ie as createNavigationController, Oe as createPartTransition, Ee as createRawDecorator, ke as createRawPartTransition, _e as createRawTransition, me as createRouterScope, he as createScreenSelector, de as createScreenStore, g as createSelfPopGuard, se as createStepController, Qt as createSwipeController, j as createTransition, qt as createTransitionEngine, le as createTransitionStore, ye as cupertino, P as decoratorMap, an as eagerlyDecodeImages, H as easingToCss, ee as ensureScopeHistorySync, f as ensureWindowHistoryState, dt as enteringInitialStyle, Jt as findScrollable, c as getMatchedPathPattern, l as getParams, fn as isOpaqueColor, d as isServer, xe as layout, v as markSelfInducedPop, ue as matchesPathname, Se as material, Ce as none, ln as observeBarHeight, dn as observeViewportScrollHeight, $ as overflowsAxis, De as overlay, F as partTransitionMap, ae as readStepParams, ut as registerTransitionDefinitions, te as releaseScopeHistorySync, we as resolveTransition, sn as scheduleAnimHoldRelease, u as seedInitialHistory, p as seedRouterEntry, ce as subscribeStepParamsRestore, B as targetToDecls, M as transitionMap, nt as variantHasAnimation };
@@ -12,5 +12,11 @@ export declare function eagerlyDecodeImages(scope: HTMLElement | null): void;
12
12
  export interface AnimHoldReleaseOptions {
13
13
  extraFrames?: number;
14
14
  scope?: HTMLElement | null;
15
+ decodeWait?: boolean;
15
16
  }
17
+ export declare function scheduleAnimHoldReadiness(onReady: () => void, options?: AnimHoldReleaseOptions): () => void;
16
18
  export declare function scheduleAnimHoldRelease(release: () => void, options?: AnimHoldReleaseOptions): () => void;
19
+ export interface AnimHoldCoordinator {
20
+ join(key: string, release: () => void, options?: AnimHoldReleaseOptions): () => void;
21
+ }
22
+ export declare function createAnimHoldCoordinator(): AnimHoldCoordinator;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flemo/core",
3
- "version": "1.16.1",
3
+ "version": "1.18.0",
4
4
  "description": "Framework-agnostic primitives for flemo: history, navigation, transitions, task manager.",
5
5
  "main": "./dist/index.mjs",
6
6
  "module": "./dist/index.mjs",