@flemo/core 1.8.0 → 1.10.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.
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.d.ts CHANGED
@@ -8,14 +8,15 @@ export { default as createMemoryHistoryDriver } from './history/memoryHistoryDri
8
8
  export { default as createNavigateStore, type NavigateStatus, type NavigateStore, type NavigateStoreApi } from './navigate/store';
9
9
  export { markSelfInducedPop, consumeSelfInducedPop, createSelfPopGuard, type SelfPopGuard } from './navigate/selfPopGuard';
10
10
  export { default as createNavigationController, type NavigationControllerDeps, type DistanceOptions, type NavigateOptions, type PopOptions } from './navigate/createNavigationController';
11
- export { default as createStepController, readStepParams, appendParamsQuery, type StepControllerDeps } from './navigate/createStepController';
11
+ export { default as createStepController, readStepParams, appendParamsQuery, subscribeStepParamsRestore, type StepControllerDeps } from './navigate/createStepController';
12
12
  export { default as createRouterScope, type FlemoStores, type CreateRouterScopeInput } from './core/createRouterScope';
13
- export { default as createScreenStore, type ScreenStore, type ScreenStoreApi, type SharedBarPresence } from './screen/store';
13
+ export { default as createScreenStore, type ScreenStore, type ScreenStoreApi, type SharedBarPresence, type ScreenSurface } from './screen/store';
14
14
  export { default as createScreenSelector, type ScreenSelection } from './screen/createScreenSelector';
15
15
  export { default as computeScreenFreeze, type ScreenFreezeInput } from './screen/computeScreenFreeze';
16
16
  export { default as createTransition } from './transition/createTransition';
17
17
  export { default as createRawTransition } from './transition/createRawTransition';
18
18
  export { transitionMap } from './transition/transition';
19
+ export { default as resolveTransition } from './transition/resolveTransition';
19
20
  export { default as createTransitionStore, type TransitionStore, type TransitionStoreApi } from './transition/store';
20
21
  export { default as createDecorator } from './transition/decorator/createDecorator';
21
22
  export { default as createRawDecorator } from './transition/decorator/createRawDecorator';
@@ -38,7 +39,7 @@ export { SKIP_ANIMATION_ATTR, type TransitionEngine, type TransitionEngineDeps,
38
39
  export { default as createSwipeController } from './core/engine/createSwipeController';
39
40
  export { type SwipeController, type SwipeControllerConfig, type SwipeControllerElements, type SharedBarPresenceLike } from './core/engine/createSwipeController';
40
41
  export { default as computeBarRiding, type BarRidingInput } from './screen/computeBarRiding';
41
- export { animHoldKey, scheduleAnimHoldRelease, ANIM_HOLD_RELEASE_BACKSTOP_MS, type AnimHoldInput } from './screen/animStartAnchor';
42
+ export { animHoldKey, scheduleAnimHoldRelease, eagerlyDecodeImages, ANIM_HOLD_RELEASE_BACKSTOP_MS, type AnimHoldInput } from './screen/animStartAnchor';
42
43
  export { default as observeBarHeight } from './screen/observeBarHeight';
43
44
  export { default as observeViewportScrollHeight } from './screen/observeViewportScrollHeight';
44
45
  export type { RegisterTransition, TransitionName, TransitionVariant, TransitionVariantValue, TransitionOptions, BaseTransition, Transition, SwipeInfo, SwipeAnimate } from './transition/typing';
@@ -48,5 +49,6 @@ export { default as isServer } from './utils/isServer';
48
49
  export { default as getParams } from './utils/getParams';
49
50
  export { default as getMatchedPathPattern } from './utils/getMatchedPathPattern';
50
51
  export { default as matchesPathname } from './utils/matchesPathname';
52
+ export { default as isOpaqueColor } from './utils/isOpaqueColor';
51
53
  export { default as buildRoutePath } from './utils/buildRoutePath';
52
54
  export { default as findScrollable, overflowsAxis, canProgrammaticallyScroll } from './utils/findScrollable';
package/dist/index.mjs CHANGED
@@ -633,9 +633,17 @@ function ne(e) {
633
633
  }
634
634
  };
635
635
  }
636
+ function re(e, t) {
637
+ return e.subscribe((e) => {
638
+ let n = e.state;
639
+ n?.step && a.addTask(async () => {
640
+ t(n.params ?? {});
641
+ });
642
+ });
643
+ }
636
644
  //#endregion
637
645
  //#region src/transition/store.ts
638
- function re(t = "cupertino") {
646
+ function T(t = "cupertino") {
639
647
  return e((e) => ({
640
648
  defaultTransitionName: t,
641
649
  setDefaultTransitionName: (t) => e({ defaultTransitionName: t })
@@ -643,11 +651,12 @@ function re(t = "cupertino") {
643
651
  }
644
652
  //#endregion
645
653
  //#region src/screen/store.ts
646
- function T() {
654
+ function E() {
647
655
  return e((e) => ({
648
656
  dragStatus: "IDLE",
649
657
  replaceTransitionStatus: "IDLE",
650
658
  sharedBars: {},
659
+ screenSurfaces: {},
651
660
  setDragStatus: (t) => e({ dragStatus: t }),
652
661
  setReplaceTransitionStatus: (t) => e({ replaceTransitionStatus: t }),
653
662
  registerSharedBars: (t, n) => e((e) => ({ sharedBars: {
@@ -657,6 +666,17 @@ function T() {
657
666
  unregisterSharedBars: (t) => e((e) => {
658
667
  let n = { ...e.sharedBars };
659
668
  return delete n[t], { sharedBars: n };
669
+ }),
670
+ registerScreenSurface: (t, n) => e((e) => {
671
+ let r = e.screenSurfaces[t];
672
+ return r && r.opaqueBackground === n.opaqueBackground ? e : { screenSurfaces: {
673
+ ...e.screenSurfaces,
674
+ [t]: n
675
+ } };
676
+ }),
677
+ unregisterScreenSurface: (t) => e((e) => {
678
+ let n = { ...e.screenSurfaces };
679
+ return delete n[t], { screenSurfaces: n };
660
680
  })
661
681
  }));
662
682
  }
@@ -686,8 +706,8 @@ function ae(e) {
686
706
  return {
687
707
  history: o([c], 0),
688
708
  navigate: b(),
689
- transition: re(i),
690
- screen: T(),
709
+ transition: T(i),
710
+ screen: E(),
691
711
  driver: u,
692
712
  markSelfInduced: d.mark,
693
713
  consume: d.consume
@@ -714,7 +734,7 @@ function se(e) {
714
734
  }
715
735
  //#endregion
716
736
  //#region src/transition/createTransition.ts
717
- function E({ name: e, initial: t, idle: n, enter: r, enterBack: i, exit: a, exitBack: o, options: s }) {
737
+ function D({ name: e, initial: t, idle: n, enter: r, enterBack: i, exit: a, exitBack: o, options: s }) {
718
738
  return {
719
739
  name: e,
720
740
  initial: t,
@@ -759,7 +779,7 @@ function ce({ name: e, initial: t, idle: n, pushOnEnter: r, pushOnExit: i, repla
759
779
  var le = (e, t, n) => {
760
780
  let [r, i] = t, [a, o] = n;
761
781
  return i === r ? a : a + (e - r) / (i - r) * (o - a);
762
- }, ue = E({
782
+ }, ue = D({
763
783
  name: "cupertino",
764
784
  initial: { x: "100%" },
765
785
  idle: {
@@ -846,7 +866,7 @@ var le = (e, t, n) => {
846
866
  }), de = (e, t, n) => {
847
867
  let [r, i] = t, [a, o] = n;
848
868
  return i === r ? a : a + (e - r) / (i - r) * (o - a);
849
- }, fe = E({
869
+ }, fe = D({
850
870
  name: "layout",
851
871
  initial: { opacity: .97 },
852
872
  idle: {
@@ -891,7 +911,7 @@ var le = (e, t, n) => {
891
911
  }, { duration: .3 })]), c;
892
912
  }
893
913
  }
894
- }), pe = E({
914
+ }), O = D({
895
915
  name: "material",
896
916
  initial: { y: "100%" },
897
917
  idle: {
@@ -999,7 +1019,7 @@ var le = (e, t, n) => {
999
1019
  })]), c;
1000
1020
  }
1001
1021
  }
1002
- }), me = E({
1022
+ }), pe = D({
1003
1023
  name: "none",
1004
1024
  initial: {},
1005
1025
  idle: {
@@ -1022,15 +1042,20 @@ var le = (e, t, n) => {
1022
1042
  value: {},
1023
1043
  options: { duration: 0 }
1024
1044
  }
1025
- }), D = new Map([
1026
- ["none", me],
1045
+ }), k = new Map([
1046
+ ["none", pe],
1027
1047
  ["cupertino", ue],
1028
- ["material", pe],
1048
+ ["material", O],
1029
1049
  ["layout", fe]
1030
1050
  ]);
1031
1051
  //#endregion
1052
+ //#region src/transition/resolveTransition.ts
1053
+ function A(e) {
1054
+ return k.get(e) ?? k.get("none");
1055
+ }
1056
+ //#endregion
1032
1057
  //#region src/transition/decorator/createDecorator.ts
1033
- function he({ name: e, initial: t, idle: n, enter: r, exit: i, options: a }) {
1058
+ function me({ name: e, initial: t, idle: n, enter: r, exit: i, options: a }) {
1034
1059
  return {
1035
1060
  name: e,
1036
1061
  initial: t,
@@ -1051,7 +1076,7 @@ function he({ name: e, initial: t, idle: n, enter: r, exit: i, options: a }) {
1051
1076
  }
1052
1077
  //#endregion
1053
1078
  //#region src/transition/decorator/createRawDecorator.ts
1054
- function ge({ name: e, initial: t, idle: n, pushOnEnter: r, pushOnExit: i, replaceOnEnter: a, replaceOnExit: o, popOnEnter: s, popOnExit: c, completedOnEnter: l, completedOnExit: u, options: d }) {
1079
+ function he({ name: e, initial: t, idle: n, pushOnEnter: r, pushOnExit: i, replaceOnEnter: a, replaceOnExit: o, popOnEnter: s, popOnExit: c, completedOnEnter: l, completedOnExit: u, options: d }) {
1055
1080
  return {
1056
1081
  name: e,
1057
1082
  initial: t,
@@ -1072,30 +1097,30 @@ function ge({ name: e, initial: t, idle: n, pushOnEnter: r, pushOnExit: i, repla
1072
1097
  }
1073
1098
  //#endregion
1074
1099
  //#region src/transition/decorator/overlay.ts
1075
- var O = "rgba(0, 0, 0, 0.3)", _e = he({
1100
+ var j = "rgba(0, 0, 0, 0.3)", M = me({
1076
1101
  name: "overlay",
1077
1102
  initial: {
1078
1103
  opacity: 0,
1079
- backgroundColor: O
1104
+ backgroundColor: j
1080
1105
  },
1081
1106
  idle: {
1082
1107
  value: {
1083
1108
  opacity: 0,
1084
- backgroundColor: O
1109
+ backgroundColor: j
1085
1110
  },
1086
1111
  options: { duration: 0 }
1087
1112
  },
1088
1113
  enter: {
1089
1114
  value: {
1090
1115
  opacity: 1,
1091
- backgroundColor: O
1116
+ backgroundColor: j
1092
1117
  },
1093
1118
  options: { duration: .7 }
1094
1119
  },
1095
1120
  exit: {
1096
1121
  value: {
1097
1122
  opacity: 0,
1098
- backgroundColor: O
1123
+ backgroundColor: j
1099
1124
  },
1100
1125
  options: { duration: .6 }
1101
1126
  },
@@ -1104,10 +1129,10 @@ var O = "rgba(0, 0, 0, 0.3)", _e = he({
1104
1129
  onSwipe: (e, t, { animate: n, prevDecorator: r }) => n(r, { opacity: Math.max(0, 1 - t / 100) }, { duration: 0 }),
1105
1130
  onSwipeEnd: (e, { animate: t, prevDecorator: n }) => t(n, { opacity: +!e }, { duration: .3 })
1106
1131
  }
1107
- }), k = new Map([["overlay", _e]]);
1132
+ }), N = new Map([["overlay", M]]);
1108
1133
  //#endregion
1109
1134
  //#region src/transition/partTransition/createPartTransition.ts
1110
- function ve({ name: e, initial: t, idle: n, enter: r, exit: i, options: a }) {
1135
+ function ge({ name: e, initial: t, idle: n, enter: r, exit: i, options: a }) {
1111
1136
  return {
1112
1137
  name: e,
1113
1138
  initial: t,
@@ -1128,7 +1153,7 @@ function ve({ name: e, initial: t, idle: n, enter: r, exit: i, options: a }) {
1128
1153
  }
1129
1154
  //#endregion
1130
1155
  //#region src/transition/partTransition/createRawPartTransition.ts
1131
- function ye({ name: e, initial: t, idle: n, pushOnEnter: r, pushOnExit: i, replaceOnEnter: a, replaceOnExit: o, popOnEnter: s, popOnExit: c, completedOnEnter: l, completedOnExit: u, options: d }) {
1156
+ function _e({ name: e, initial: t, idle: n, pushOnEnter: r, pushOnExit: i, replaceOnEnter: a, replaceOnExit: o, popOnEnter: s, popOnExit: c, completedOnEnter: l, completedOnExit: u, options: d }) {
1132
1157
  return {
1133
1158
  name: e,
1134
1159
  initial: t,
@@ -1149,7 +1174,7 @@ function ye({ name: e, initial: t, idle: n, pushOnEnter: r, pushOnExit: i, repla
1149
1174
  }
1150
1175
  //#endregion
1151
1176
  //#region src/transition/partTransition/partTransition.ts
1152
- var A = /* @__PURE__ */ new Map(), j = {
1177
+ var P = /* @__PURE__ */ new Map(), F = {
1153
1178
  "IDLE-true": "self",
1154
1179
  "IDLE-false": "self",
1155
1180
  "PUSHING-true": "initial",
@@ -1160,7 +1185,7 @@ var A = /* @__PURE__ */ new Map(), j = {
1160
1185
  "POPPING-false": "PUSHING-false",
1161
1186
  "COMPLETED-true": "self",
1162
1187
  "COMPLETED-false": "self"
1163
- }, M = Object.keys(j), N = M, be = (e) => e.replace(/[^a-zA-Z0-9_-]/g, "_"), P = (e) => typeof e == "object" && !!e && !Array.isArray(e), xe = 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(".")), Se = (e, t) => t.startsWith("--") || xe.has(t) ? `${e}` : t === "rotate" || t === "rotateX" || t === "rotateY" || t === "rotateZ" ? `${e}deg` : `${e}px`, F = (e, t) => typeof t == "number" ? Se(t, e) : typeof t == "string" ? t : "", I = (e) => e.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`), Ce = new Set([
1188
+ }, ve = Object.keys(F), ye = ve, be = (e) => e.replace(/[^a-zA-Z0-9_-]/g, "_"), xe = (e) => typeof e == "object" && !!e && !Array.isArray(e), Se = 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(".")), Ce = (e, t) => t.startsWith("--") || Se.has(t) ? `${e}` : t === "rotate" || t === "rotateX" || t === "rotateY" || t === "rotateZ" ? `${e}deg` : `${e}px`, we = (e, t) => typeof t == "number" ? Ce(t, e) : typeof t == "string" ? t : "", Te = (e) => e.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`), Ee = new Set([
1164
1189
  "x",
1165
1190
  "y",
1166
1191
  "z",
@@ -1171,7 +1196,7 @@ var A = /* @__PURE__ */ new Map(), j = {
1171
1196
  "rotateX",
1172
1197
  "rotateY",
1173
1198
  "rotateZ"
1174
- ]), we = /^-?0(\.0+)?(px|%|em|rem|vh|vw|vmin|vmax)?$/, Te = /^-?0(\.0+)?(deg|rad|grad|turn)?$/, Ee = /^1(\.0+)?$/, De = (e, t) => e === "scale" || e === "scaleX" || e === "scaleY" ? t === 1 ? !0 : typeof t == "string" ? Ee.test(t.trim()) : !1 : e === "rotate" || e === "rotateX" || e === "rotateY" || e === "rotateZ" ? t === 0 ? !0 : typeof t == "string" ? Te.test(t.trim()) : !1 : t === 0 ? !0 : typeof t == "string" ? we.test(t.trim()) : !1, Oe = (e, t) => {
1199
+ ]), De = /^-?0(\.0+)?(px|%|em|rem|vh|vw|vmin|vmax)?$/, Oe = /^-?0(\.0+)?(deg|rad|grad|turn)?$/, ke = /^1(\.0+)?$/, Ae = (e, t) => e === "scale" || e === "scaleX" || e === "scaleY" ? t === 1 ? !0 : typeof t == "string" ? ke.test(t.trim()) : !1 : e === "rotate" || e === "rotateX" || e === "rotateY" || e === "rotateZ" ? t === 0 ? !0 : typeof t == "string" ? Oe.test(t.trim()) : !1 : t === 0 ? !0 : typeof t == "string" ? De.test(t.trim()) : !1, je = (e, t) => {
1175
1200
  switch (e) {
1176
1201
  case "x": return `translateX(${t})`;
1177
1202
  case "y": return `translateY(${t})`;
@@ -1185,23 +1210,23 @@ var A = /* @__PURE__ */ new Map(), j = {
1185
1210
  case "rotateY": return `rotateY(${t})`;
1186
1211
  default: return "";
1187
1212
  }
1188
- }, ke = (e) => {
1213
+ }, Me = (e) => {
1189
1214
  let t = /* @__PURE__ */ new Set(), n = !1, r = (e) => {
1190
- if (P(e)) for (let r of Object.keys(e)) {
1215
+ if (xe(e)) for (let r of Object.keys(e)) {
1191
1216
  let i = e[r];
1192
- F(r, i) !== "" && (Ce.has(r) ? n = !0 : t.add(I(r)));
1217
+ we(r, i) !== "" && (Ee.has(r) ? n = !0 : t.add(Te(r)));
1193
1218
  }
1194
1219
  };
1195
1220
  r(e.initial);
1196
1221
  for (let t of Object.values(e.variants)) r(t.value);
1197
1222
  return n && t.add("transform"), Array.from(t);
1198
- }, L = (e) => {
1199
- if (!P(e)) return [];
1223
+ }, I = (e) => {
1224
+ if (!xe(e)) return [];
1200
1225
  let t = [], n = !0, r = [];
1201
1226
  for (let i of Object.keys(e)) {
1202
- let a = e[i], o = F(i, a);
1203
- o !== "" && (Ce.has(i) ? (t.push(Oe(i, o)), De(i, a) || (n = !1)) : r.push({
1204
- property: I(i),
1227
+ let a = e[i], o = we(i, a);
1228
+ o !== "" && (Ee.has(i) ? (t.push(je(i, o)), Ae(i, a) || (n = !1)) : r.push({
1229
+ property: Te(i),
1205
1230
  value: o
1206
1231
  }));
1207
1232
  }
@@ -1209,7 +1234,7 @@ var A = /* @__PURE__ */ new Map(), j = {
1209
1234
  property: "transform",
1210
1235
  value: n ? "none" : t.join(" ")
1211
1236
  }), r;
1212
- }, R = (e) => e.map((e) => ` ${e.property}: ${e.value};`).join("\n"), z = (e) => Array.isArray(e) ? e.length === 4 && e.every((e) => typeof e == "number") ? `cubic-bezier(${e.join(", ")})` : "linear" : typeof e == "string" ? {
1237
+ }, L = (e) => e.map((e) => ` ${e.property}: ${e.value};`).join("\n"), R = (e) => Array.isArray(e) ? e.length === 4 && e.every((e) => typeof e == "number") ? `cubic-bezier(${e.join(", ")})` : "linear" : typeof e == "string" ? {
1213
1238
  linear: "linear",
1214
1239
  easeIn: "ease-in",
1215
1240
  easeOut: "ease-out",
@@ -1219,11 +1244,11 @@ var A = /* @__PURE__ */ new Map(), j = {
1219
1244
  backIn: "cubic-bezier(0.31, 0.01, 0.66, -0.59)",
1220
1245
  backOut: "cubic-bezier(0.33, 1.53, 0.69, 0.99)",
1221
1246
  anticipate: "cubic-bezier(0.36, 0, 0.66, -0.56)"
1222
- }[e] ?? "ease" : "ease", Ae = (e) => {
1247
+ }[e] ?? "ease" : "ease", z = (e) => {
1223
1248
  if (!e) return 0;
1224
1249
  let t = e.duration;
1225
1250
  return typeof t == "number" && t >= 0 ? t : 0;
1226
- }, je = (e) => e && typeof e.delay == "number" && e.delay > 0 ? e.delay : 0, Me = (e, t) => {
1251
+ }, B = (e) => e && typeof e.delay == "number" && e.delay > 0 ? e.delay : 0, V = (e, t) => {
1227
1252
  let [n, r] = t.split("-");
1228
1253
  return `[data-flemo-screen][data-flemo-transition="${e}"][data-flemo-status="${n}"][data-flemo-active="${r}"]`;
1229
1254
  }, Ne = (e, t) => {
@@ -1235,17 +1260,17 @@ var A = /* @__PURE__ */ new Map(), j = {
1235
1260
  }, Fe = (e, t) => {
1236
1261
  let [n, r] = t.split("-");
1237
1262
  return `[data-flemo-part-name="${e}"][data-flemo-status="${n}"][data-flemo-active="${r}"]`;
1238
- }, B = (e, t, n) => `flemo-${e}-${be(t)}-${n}`, V = (e, t, n, r, i, a) => {
1239
- let o = L(r), s = L(i.value), c = Ae(i.options), l = je(i.options), u = z(i.options?.ease), d = a(t, n), f = e === "screen" ? `${d},\n${Pe(t, n)}` : d;
1263
+ }, H = (e, t, n) => `flemo-${e}-${be(t)}-${n}`, U = (e, t, n, r, i, a) => {
1264
+ let o = I(r), s = I(i.value), c = z(i.options), l = B(i.options), u = R(i.options?.ease), d = a(t, n), f = e === "screen" ? `${d},\n${Pe(t, n)}` : d;
1240
1265
  if (s.length === 0 && o.length === 0) return "";
1241
- if (c <= 0 && l <= 0) return s.length === 0 ? "" : `${f} {\n${R(s)}\n animation: none;\n}`;
1242
- let p = B(e, t, n), m = [
1266
+ if (c <= 0 && l <= 0) return s.length === 0 ? "" : `${f} {\n${L(s)}\n animation: none;\n}`;
1267
+ let p = H(e, t, n), m = [
1243
1268
  `@keyframes ${p} {`,
1244
1269
  " from {",
1245
- R(o).replace(/^/gm, " "),
1270
+ L(o).replace(/^/gm, " "),
1246
1271
  " }",
1247
1272
  " to {",
1248
- R(s).replace(/^/gm, " "),
1273
+ L(s).replace(/^/gm, " "),
1249
1274
  " }",
1250
1275
  "}"
1251
1276
  ].join("\n"), h = [
@@ -1255,83 +1280,90 @@ var A = /* @__PURE__ */ new Map(), j = {
1255
1280
  l > 0 ? `${l}s` : null,
1256
1281
  "both"
1257
1282
  ].filter(Boolean).join(" "), g = Array.from(new Set([...o.map((e) => e.property), ...s.map((e) => e.property)])), _ = g.length > 0 ? ` will-change: ${g.join(", ")};\n` : "", v = n.split("-")[0];
1258
- return `${m}\n${`${f} {\n animation: ${h};\n${_}${v === "PUSHING" || v === "REPLACING" ? " contain: layout;\n pointer-events: none;\n" : ""}}`}`;
1259
- }, H = (e, t, n, r) => {
1260
- let i = L(r.value);
1261
- return i.length === 0 ? "" : `${e(t, n)} {\n${R(i)}\n}`;
1262
- }, Ie = (e, t, n = []) => {
1283
+ return `${m}\n${`${f} {\n animation: ${h};\n${_}${v === "PUSHING" || v === "REPLACING" ? " contain: layout;\n pointer-events: none;\n" : ""}}`}${e === "screen" && n.endsWith("-false") && Ie(r) && s.length > 0 ? `\n${d}[data-flemo-anim-hold="park"] {\n animation: none;\n${L(s)}\n}` : ""}`;
1284
+ }, Ie = (e) => {
1285
+ if (!e) return !1;
1286
+ if (e.opacity === 0) return !0;
1287
+ let t = (e) => typeof e == "string" && e.trim().endsWith("%") && Math.abs(parseFloat(e)) >= 100;
1288
+ return t(e.x) || t(e.y);
1289
+ }, W = (e, t, n, r) => {
1290
+ let i = I(r.value);
1291
+ return i.length === 0 ? "" : `${e(t, n)} {\n${L(i)}\n}`;
1292
+ }, Le = (e, t, n = []) => {
1263
1293
  let r = [];
1264
1294
  for (let t of e) {
1265
1295
  let e = t.name;
1266
- for (let n of M) {
1267
- let i = t.variants[n], a = j[n];
1296
+ for (let n of ve) {
1297
+ let i = t.variants[n], a = F[n];
1268
1298
  if (a === "self") {
1269
- r.push(H(Me, e, n, i));
1299
+ r.push(W(V, e, n, i));
1270
1300
  continue;
1271
1301
  }
1272
1302
  let o = a === "initial" ? t.initial : t.variants[a].value;
1273
- r.push(V("screen", e, n, o, i, Me));
1303
+ r.push(U("screen", e, n, o, i, V));
1274
1304
  }
1275
1305
  }
1276
1306
  for (let e of t) {
1277
1307
  let t = e.name;
1278
- for (let n of N) {
1279
- let i = e.variants[n], a = j[n];
1308
+ for (let n of ye) {
1309
+ let i = e.variants[n], a = F[n];
1280
1310
  if (a === "self") {
1281
- r.push(H(Ne, t, n, i));
1311
+ r.push(W(Ne, t, n, i));
1282
1312
  continue;
1283
1313
  }
1284
1314
  let o = a === "initial" ? e.initial : e.variants[a].value;
1285
- r.push(V("decorator", t, n, o, i, Ne));
1315
+ r.push(U("decorator", t, n, o, i, Ne));
1286
1316
  }
1287
1317
  }
1288
1318
  for (let e of n) {
1289
1319
  let t = e.name;
1290
- for (let n of N) {
1291
- let i = e.variants[n], a = j[n];
1320
+ for (let n of ye) {
1321
+ let i = e.variants[n], a = F[n];
1292
1322
  if (a === "self") {
1293
- r.push(H(Fe, t, n, i));
1323
+ r.push(W(Fe, t, n, i));
1294
1324
  continue;
1295
1325
  }
1296
1326
  let o = a === "initial" ? e.initial : e.variants[a].value;
1297
- r.push(V("part", t, n, o, i, Fe));
1327
+ r.push(U("part", t, n, o, i, Fe));
1298
1328
  }
1299
1329
  }
1300
- return [...r.filter((e) => e.length > 0), Le].join("\n\n");
1301
- }, Le = [
1330
+ return [...r.filter((e) => e.length > 0), Re].join("\n\n");
1331
+ }, Re = [
1302
1332
  "[data-flemo-anim-hold=\"true\"],",
1303
- "[data-flemo-anim-hold=\"true\"] [data-flemo-part-name] {",
1333
+ "[data-flemo-anim-hold=\"park\"],",
1334
+ "[data-flemo-anim-hold=\"true\"] [data-flemo-part-name],",
1335
+ "[data-flemo-anim-hold=\"park\"] [data-flemo-part-name] {",
1304
1336
  " animation-play-state: paused !important;",
1305
1337
  "}"
1306
- ].join("\n"), Re = (e, t) => {
1307
- let n = j[t];
1338
+ ].join("\n"), ze = (e, t) => {
1339
+ let n = F[t];
1308
1340
  if (n === "self") return !1;
1309
- let r = e.variants[t], i = Ae(r.options), a = je(r.options);
1341
+ let r = e.variants[t], i = z(r.options), a = B(r.options);
1310
1342
  if (i <= 0 && a <= 0) return !1;
1311
- let o = L(n === "initial" ? e.initial : e.variants[n].value), s = L(r.value);
1343
+ let o = I(n === "initial" ? e.initial : e.variants[n].value), s = I(r.value);
1312
1344
  return o.length > 0 || s.length > 0;
1313
- }, ze = "data-flemo";
1314
- function U() {
1345
+ }, Be = "data-flemo";
1346
+ function G() {
1315
1347
  if (u()) return;
1316
- let e = Ie(D.values(), k.values(), A.values()), t = document.head.querySelector(`style[${ze}]`);
1317
- t || (t = document.createElement("style"), t.setAttribute(ze, ""), document.head.appendChild(t)), t.textContent !== e && (t.textContent = e);
1348
+ let e = Le(k.values(), N.values(), P.values()), t = document.head.querySelector(`style[${Be}]`);
1349
+ t || (t = document.createElement("style"), t.setAttribute(Be, ""), document.head.appendChild(t)), t.textContent !== e && (t.textContent = e);
1318
1350
  }
1319
1351
  //#endregion
1320
1352
  //#region src/transition/registerTransitionDefinitions.ts
1321
- function Be(e, t, n = []) {
1322
- for (let t of e) D.set(t.name, t);
1323
- for (let e of t) k.set(e.name, e);
1324
- for (let e of n) A.set(e.name, e);
1325
- return U(), () => {
1326
- for (let t of e) D.delete(t.name);
1327
- for (let e of t) k.delete(e.name);
1328
- for (let e of n) A.delete(e.name);
1329
- U();
1353
+ function Ve(e, t, n = []) {
1354
+ for (let t of e) k.set(t.name, t);
1355
+ for (let e of t) N.set(e.name, e);
1356
+ for (let e of n) P.set(e.name, e);
1357
+ return G(), () => {
1358
+ for (let t of e) k.delete(t.name);
1359
+ for (let e of t) N.delete(e.name);
1360
+ for (let e of n) P.delete(e.name);
1361
+ G();
1330
1362
  };
1331
1363
  }
1332
1364
  //#endregion
1333
1365
  //#region src/transition/enteringInitialStyle.ts
1334
- function Ve(e) {
1366
+ function He(e) {
1335
1367
  let { initial: t, isActive: n, status: r } = e;
1336
1368
  if (!n || r !== "PUSHING" && r !== "REPLACING") return {};
1337
1369
  let i = {};
@@ -1339,35 +1371,35 @@ function Ve(e) {
1339
1371
  }
1340
1372
  //#endregion
1341
1373
  //#region src/transition/animateInline.ts
1342
- var He = (e) => typeof HTMLElement < "u" && e instanceof HTMLElement, W = /* @__PURE__ */ new WeakMap(), Ue = (e, t) => {
1343
- let n = W.get(e);
1344
- n || (n = /* @__PURE__ */ new Set(), W.set(e, n)), n.add(t);
1345
- }, G = (e, t) => {
1374
+ var Ue = (e) => typeof HTMLElement < "u" && e instanceof HTMLElement, K = /* @__PURE__ */ new WeakMap(), We = (e, t) => {
1375
+ let n = K.get(e);
1376
+ n || (n = /* @__PURE__ */ new Set(), K.set(e, n)), n.add(t);
1377
+ }, q = (e, t) => {
1346
1378
  if (e.style.transition = "", t) {
1347
- let n = W.get(e);
1379
+ let n = K.get(e);
1348
1380
  for (let r of t) e.style.removeProperty(r), n?.delete(r);
1349
1381
  return;
1350
1382
  }
1351
- let n = W.get(e);
1383
+ let n = K.get(e);
1352
1384
  if (n && n.size > 0) {
1353
1385
  for (let t of n) e.style.removeProperty(t);
1354
1386
  n.clear();
1355
1387
  return;
1356
1388
  }
1357
1389
  e.style.removeProperty("transform"), e.style.removeProperty("opacity");
1358
- }, K = (e, t, n = {}) => {
1359
- if (!He(e)) return Promise.resolve();
1360
- let r = e, i = L(t);
1390
+ }, J = (e, t, n = {}) => {
1391
+ if (!Ue(e)) return Promise.resolve();
1392
+ let r = e, i = I(t);
1361
1393
  if (i.length === 0) return Promise.resolve();
1362
- let a = typeof n.duration == "number" ? n.duration : 0, o = typeof n.delay == "number" && n.delay > 0 ? n.delay : 0, s = z(n.ease);
1394
+ let a = typeof n.duration == "number" ? n.duration : 0, o = typeof n.delay == "number" && n.delay > 0 ? n.delay : 0, s = R(n.ease);
1363
1395
  if (a <= 0 && o <= 0) {
1364
1396
  r.style.transition = "none";
1365
- for (let e of i) r.style.setProperty(e.property, e.value), Ue(r, e.property);
1397
+ for (let e of i) r.style.setProperty(e.property, e.value), We(r, e.property);
1366
1398
  return Promise.resolve();
1367
1399
  }
1368
1400
  let c = i.map((e) => `${e.property} ${a}s ${s} ${o}s`).join(", ");
1369
1401
  r.style.transition = c, r.offsetWidth;
1370
- for (let e of i) r.style.setProperty(e.property, e.value), Ue(r, e.property);
1402
+ for (let e of i) r.style.setProperty(e.property, e.value), We(r, e.property);
1371
1403
  return new Promise((e) => {
1372
1404
  let t = !1, n = () => {
1373
1405
  t || (t = !0, r.removeEventListener("transitionend", i), e());
@@ -1376,27 +1408,27 @@ var He = (e) => typeof HTMLElement < "u" && e instanceof HTMLElement, W = /* @__
1376
1408
  };
1377
1409
  r.addEventListener("transitionend", i), setTimeout(n, (a + o) * 1e3 + 60);
1378
1410
  });
1379
- }, q = "data-flemo-skip-animation", J = () => {};
1380
- function We(e) {
1411
+ }, Y = "data-flemo-skip-animation", X = () => {};
1412
+ function Ge(e) {
1381
1413
  return { driveScreenLifecycle: (t) => {
1382
1414
  let { getElements: n, transitionName: r, prevTransitionName: i, status: o, isActive: s } = t;
1383
- if (!s) return o === "REPLACING" && i !== r && e.setReplaceTransitionStatus("PENDING"), J;
1415
+ if (!s) return o === "REPLACING" && i !== r && e.setReplaceTransitionStatus("PENDING"), X;
1384
1416
  if (o === "COMPLETED") {
1385
1417
  e.setDragStatus("IDLE"), e.setReplaceTransitionStatus("IDLE");
1386
1418
  let { scope: t, decorator: r, bars: i } = n();
1387
- t && (G(t), t.removeAttribute(q)), r && (G(r), r.removeAttribute(q));
1388
- for (let e of i ?? []) e && (G(e), e.style.removeProperty("will-change"));
1389
- return J;
1419
+ t && (q(t), t.removeAttribute(Y)), r && (q(r), r.removeAttribute(Y));
1420
+ for (let e of i ?? []) e && (q(e), e.style.removeProperty("will-change"));
1421
+ return X;
1390
1422
  }
1391
- if (o === "IDLE") return J;
1423
+ if (o === "IDLE") return X;
1392
1424
  let { scope: c } = n();
1393
- if (!c) return J;
1425
+ if (!c) return X;
1394
1426
  let l = () => {
1395
1427
  let t = e.getTransitionTaskId();
1396
1428
  t && a.resolveTask(t);
1397
- }, u = D.get(r) ?? D.get("none"), d = `${o}-true`;
1398
- if (!(c.getAttribute("data-flemo-skip-animation") !== "true" && Re(u, d))) return queueMicrotask(l), J;
1399
- let f = B("screen", r, d), p = (e) => {
1429
+ }, u = A(r), d = `${o}-true`;
1430
+ if (!(c.getAttribute("data-flemo-skip-animation") !== "true" && ze(u, d))) return queueMicrotask(l), X;
1431
+ let f = H("screen", r, d), p = (e) => {
1400
1432
  e.target === c && e.animationName === f && (c.removeEventListener("animationend", p), l());
1401
1433
  };
1402
1434
  return c.addEventListener("animationend", p), () => {
@@ -1406,20 +1438,20 @@ function We(e) {
1406
1438
  }
1407
1439
  //#endregion
1408
1440
  //#region src/utils/findScrollable.ts
1409
- function Y(e, t) {
1410
- let { direction: n = "x", markerSelector: r = "[data-swipe-at-edge]", depthLimit: i = 24, verifyByScroll: a = !1 } = t ?? {}, o = Ge(e);
1441
+ function Z(e, t) {
1442
+ let { direction: n = "x", markerSelector: r = "[data-swipe-at-edge]", depthLimit: i = 24, verifyByScroll: a = !1 } = t ?? {}, o = Ke(e);
1411
1443
  if (!o) return {
1412
1444
  element: null,
1413
1445
  hasMarker: !1
1414
1446
  };
1415
1447
  let s = o.closest?.(r);
1416
- if (s instanceof HTMLElement && X(s, n) && (!a || Z(s, n))) return {
1448
+ if (s instanceof HTMLElement && Q(s, n) && (!a || $(s, n))) return {
1417
1449
  element: s,
1418
1450
  hasMarker: !0
1419
1451
  };
1420
1452
  let c = o, l = 0;
1421
1453
  for (; c && l < i;) {
1422
- if (X(c, n) && (!a || Z(c, n))) return {
1454
+ if (Q(c, n) && (!a || $(c, n))) return {
1423
1455
  element: c,
1424
1456
  hasMarker: !1
1425
1457
  };
@@ -1430,7 +1462,7 @@ function Y(e, t) {
1430
1462
  hasMarker: !1
1431
1463
  };
1432
1464
  }
1433
- function Ge(e) {
1465
+ function Ke(e) {
1434
1466
  if (!e) return null;
1435
1467
  let t = e, n = typeof t.composedPath == "function" ? t.composedPath() : void 0;
1436
1468
  if (n && n.length) {
@@ -1438,18 +1470,18 @@ function Ge(e) {
1438
1470
  }
1439
1471
  return e instanceof HTMLElement ? e : null;
1440
1472
  }
1441
- function X(e, t) {
1473
+ function Q(e, t) {
1442
1474
  return t === "y" ? e.scrollHeight - e.clientHeight > 1 : e.scrollWidth - e.clientWidth > 1;
1443
1475
  }
1444
- function Z(e, t) {
1445
- if (!X(e, t) || typeof window > "u") return !1;
1476
+ function $(e, t) {
1477
+ if (!Q(e, t) || typeof window > "u") return !1;
1446
1478
  let n = window.getComputedStyle(e), r = t === "y" ? n.overflowY : n.overflowX;
1447
1479
  return r === "auto" || r === "scroll" || r === "overlay";
1448
1480
  }
1449
1481
  //#endregion
1450
1482
  //#region src/core/engine/createSwipeController.ts
1451
- var Q = "data-flemo-skip-animation";
1452
- function Ke(e) {
1483
+ var qe = "data-flemo-skip-animation";
1484
+ function Je(e) {
1453
1485
  let t = null, n = null, r = {
1454
1486
  current: [],
1455
1487
  prev: []
@@ -1495,9 +1527,9 @@ function Ke(e) {
1495
1527
  y: e.clientY
1496
1528
  }, u = t;
1497
1529
  }, v = (n, i, a) => {
1498
- let o = K(n, i, a);
1499
- if (n === e.getElements().scope) for (let e of r.current) K(e, i, a);
1500
- else if (n === t) for (let e of r.prev) K(e, i, a);
1530
+ let o = J(n, i, a);
1531
+ if (n === e.getElements().scope) for (let e of r.current) J(e, i, a);
1532
+ else if (n === t) for (let e of r.prev) J(e, i, a);
1501
1533
  return o;
1502
1534
  }, y = (t) => {
1503
1535
  let n = e.getPartnerBars(), i = [], { sharedTopBar: a, sharedBottomBar: o } = e.getElements();
@@ -1511,12 +1543,12 @@ function Ke(e) {
1511
1543
  current: i,
1512
1544
  prev: s
1513
1545
  };
1514
- let c = ke(e.getTransition()).join(", ");
1546
+ let c = Me(e.getTransition()).join(", ");
1515
1547
  for (let e of i) e.style.willChange = c;
1516
1548
  for (let e of s) e.style.willChange = c;
1517
1549
  }, b = () => {
1518
- for (let e of r.current) G(e), e.style.removeProperty("will-change");
1519
- for (let e of r.prev) G(e), e.style.removeProperty("will-change");
1550
+ for (let e of r.current) q(e), e.style.removeProperty("will-change");
1551
+ for (let e of r.prev) q(e), e.style.removeProperty("will-change");
1520
1552
  r = {
1521
1553
  current: [],
1522
1554
  prev: []
@@ -1529,10 +1561,10 @@ function Ke(e) {
1529
1561
  };
1530
1562
  }, S = (e, t, n) => {
1531
1563
  let r = (r, i) => {
1532
- let a = A.get(r.getAttribute("data-flemo-part-name"));
1564
+ let a = P.get(r.getAttribute("data-flemo-part-name"));
1533
1565
  if (!a) return;
1534
1566
  let o = {
1535
- animate: K,
1567
+ animate: J,
1536
1568
  element: r,
1537
1569
  active: i
1538
1570
  };
@@ -1541,7 +1573,7 @@ function Ke(e) {
1541
1573
  for (let e of i.current) r(e, !0);
1542
1574
  for (let e of i.prev) r(e, !1);
1543
1575
  }, C = () => {
1544
- for (let e of [...i.current, ...i.prev]) G(e);
1576
+ for (let e of [...i.current, ...i.prev]) q(e);
1545
1577
  i = {
1546
1578
  current: [],
1547
1579
  prev: []
@@ -1570,7 +1602,7 @@ function Ke(e) {
1570
1602
  prevScreen: t,
1571
1603
  onStart: (e) => {
1572
1604
  m?.onSwipeStart?.(e, {
1573
- animate: K,
1605
+ animate: J,
1574
1606
  currentDecorator: f,
1575
1607
  prevDecorator: n
1576
1608
  }), S("start", e, 0);
@@ -1587,7 +1619,7 @@ function Ke(e) {
1587
1619
  prevScreen: t,
1588
1620
  onProgress: (e, t) => {
1589
1621
  c?.onSwipe?.(e, t, {
1590
- animate: K,
1622
+ animate: J,
1591
1623
  currentDecorator: o,
1592
1624
  prevDecorator: n
1593
1625
  }), S("swipe", e, t);
@@ -1606,32 +1638,32 @@ function Ke(e) {
1606
1638
  prevScreen: t,
1607
1639
  onStart: (e) => {
1608
1640
  u?.onSwipeEnd?.(e, {
1609
- animate: K,
1641
+ animate: J,
1610
1642
  currentDecorator: l,
1611
1643
  prevDecorator: n
1612
1644
  }), S("end", e, 0);
1613
1645
  }
1614
1646
  })) {
1615
- c?.setAttribute(Q, "true"), l?.setAttribute(Q, "true");
1647
+ c?.setAttribute(qe, "true"), l?.setAttribute(qe, "true");
1616
1648
  for (let e of r.current) e.style.removeProperty("will-change");
1617
- for (let e of r.prev) G(e), e.style.removeProperty("will-change");
1649
+ for (let e of r.prev) q(e), e.style.removeProperty("will-change");
1618
1650
  r = {
1619
1651
  current: [],
1620
1652
  prev: []
1621
1653
  };
1622
- for (let e of i.prev) G(e);
1654
+ for (let e of i.prev) q(e);
1623
1655
  i = {
1624
1656
  current: [],
1625
1657
  prev: []
1626
1658
  }, e.back();
1627
- } else c && G(c), t && G(t), l && G(l), n && G(n), b(), C(), e.setDragStatus("IDLE");
1659
+ } else c && q(c), t && q(t), l && q(l), n && q(n), b(), C(), e.setDragStatus("IDLE");
1628
1660
  };
1629
1661
  return {
1630
1662
  pointerDown: (t) => {
1631
- e.isReadyForDrag() && (f = Y(t.target, {
1663
+ e.isReadyForDrag() && (f = Z(t.target, {
1632
1664
  direction: "x",
1633
1665
  verifyByScroll: !0
1634
- }), p = Y(t.target, {
1666
+ }), p = Z(t.target, {
1635
1667
  direction: "y",
1636
1668
  verifyByScroll: !0
1637
1669
  }), m = t.clientX, h = t.clientY, (!f.element && !p.element || f.element || p.element) && (a = !0));
@@ -1660,7 +1692,7 @@ function Ke(e) {
1660
1692
  }
1661
1693
  //#endregion
1662
1694
  //#region src/screen/computeBarRiding.ts
1663
- function qe(e) {
1695
+ function Ye(e) {
1664
1696
  return !(e.status === "PUSHING" || e.status === "POPPING" || e.status === "REPLACING") || !e.isTopOrTopPrev ? {
1665
1697
  app: !1,
1666
1698
  nav: !1
@@ -1671,21 +1703,44 @@ function qe(e) {
1671
1703
  }
1672
1704
  //#endregion
1673
1705
  //#region src/screen/animStartAnchor.ts
1674
- function Je(e) {
1706
+ function Xe(e) {
1675
1707
  return !(e.status === "PUSHING" || e.status === "POPPING" || e.status === "REPLACING") || !e.isTopOrTopPrev ? null : `${e.status}:${e.transitionName}`;
1676
1708
  }
1677
- var Ye = 300;
1678
- function Xe(e) {
1679
- let t = 0, n = requestAnimationFrame(() => {
1680
- t = requestAnimationFrame(e);
1681
- }), r = setTimeout(e, 300);
1709
+ var Ze = 300, Qe = 20;
1710
+ function $e(e) {
1711
+ return Array.from(e.querySelectorAll("img")).filter((e) => e.complete && typeof e.decode == "function").slice(0, Qe);
1712
+ }
1713
+ function et(e) {
1714
+ if (!(!e || typeof e.querySelectorAll != "function")) for (let t of $e(e)) t.decode().catch(() => {});
1715
+ }
1716
+ function tt(e, t = {}) {
1717
+ let n = !1, r = 0, i = () => {
1718
+ let r = t.scope;
1719
+ if (!r || typeof r.querySelectorAll != "function") {
1720
+ e();
1721
+ return;
1722
+ }
1723
+ let i = $e(r);
1724
+ if (i.length === 0) {
1725
+ e();
1726
+ return;
1727
+ }
1728
+ let a = Promise.allSettled(i.map((e) => e.decode())), o = new Promise((e) => {
1729
+ setTimeout(e, 150);
1730
+ });
1731
+ Promise.race([a, o]).then(() => {
1732
+ n || e();
1733
+ });
1734
+ }, a = requestAnimationFrame(() => {
1735
+ r = requestAnimationFrame(i);
1736
+ }), o = setTimeout(e, 300);
1682
1737
  return () => {
1683
- cancelAnimationFrame(n), t && cancelAnimationFrame(t), clearTimeout(r);
1738
+ n = !0, cancelAnimationFrame(a), r && cancelAnimationFrame(r), clearTimeout(o);
1684
1739
  };
1685
1740
  }
1686
1741
  //#endregion
1687
1742
  //#region src/screen/observeBarHeight.ts
1688
- function Ze(e, t) {
1743
+ function nt(e, t) {
1689
1744
  e.offsetHeight > 0 && t(e.offsetHeight);
1690
1745
  let n = new ResizeObserver(([e]) => {
1691
1746
  e.contentRect.height > 0 && t(e.contentRect.height);
@@ -1696,14 +1751,14 @@ function Ze(e, t) {
1696
1751
  }
1697
1752
  //#endregion
1698
1753
  //#region src/screen/observeViewportScrollHeight.ts
1699
- var $ = 0;
1700
- function Qe(e) {
1754
+ var rt = 0;
1755
+ function it(e) {
1701
1756
  let t = 0, n = () => {
1702
1757
  cancelAnimationFrame(t), t = requestAnimationFrame(() => {
1703
1758
  let t = document.documentElement.scrollHeight - (window.visualViewport?.height || 0);
1704
1759
  t = t < 0 ? 0 : t;
1705
- let n = t - $;
1706
- n = n < 0 ? 0 : n, $ ||= t, e(t, n);
1760
+ let n = t - rt;
1761
+ n = n < 0 ? 0 : n, rt ||= t, e(t, n);
1707
1762
  });
1708
1763
  };
1709
1764
  return window.visualViewport?.addEventListener("resize", n), window.visualViewport?.addEventListener("scroll", n), () => {
@@ -1712,12 +1767,23 @@ function Qe(e) {
1712
1767
  }
1713
1768
  //#endregion
1714
1769
  //#region src/utils/matchesPathname.ts
1715
- function $e(e, t) {
1770
+ function at(e, t) {
1716
1771
  return i(e).regexp.test(t);
1717
1772
  }
1718
1773
  //#endregion
1774
+ //#region src/utils/isOpaqueColor.ts
1775
+ function ot(e) {
1776
+ let t = e.trim().toLowerCase();
1777
+ if (t === "transparent" || t === "") return !1;
1778
+ if (t.match(/^rgb\(\s*\d+[\s,]+\d+[\s,]+\d+\s*\)$/)) return !0;
1779
+ let n = t.match(/^rgba\(\s*\d+[\s,]+\d+[\s,]+\d+[\s,/]+([\d.]+)\s*\)$/);
1780
+ if (n) return parseFloat(n[1]) >= 1;
1781
+ let r = t.match(/\/\s*([\d.]+%?)\s*\)$/);
1782
+ return r ? (r[1].endsWith("%") ? parseFloat(r[1]) / 100 : parseFloat(r[1])) >= 1 : !!(t.startsWith("rgb(") || t.startsWith("color("));
1783
+ }
1784
+ //#endregion
1719
1785
  //#region src/utils/buildRoutePath.ts
1720
- function et(e, n) {
1786
+ function st(e, n) {
1721
1787
  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();
1722
1788
  return {
1723
1789
  pathname: `${a}${c ? `?${c}` : ""}`,
@@ -1725,4 +1791,4 @@ function et(e, n) {
1725
1791
  };
1726
1792
  }
1727
1793
  //#endregion
1728
- export { Ye as ANIM_HOLD_RELEASE_BACKSTOP_MS, q as SKIP_ANIMATION_ATTR, a as TaskManger, Je as animHoldKey, K as animateInline, B as animationName, te as appendParamsQuery, U as applyTransitionStyles, et as buildRoutePath, Z as canProgrammaticallyScroll, G as clearInlineAnimation, ke as collectAnimatedProperties, Ie as compileTransitionStyles, qe as computeBarRiding, se as computeScreenFreeze, _ as consumeSelfInducedPop, p as createBrowserHistoryDriver, he as createDecorator, o as createHistoryStore, v as createHistorySync, y as createMemoryHistoryDriver, b as createNavigateStore, w as createNavigationController, ve as createPartTransition, ge as createRawDecorator, ye as createRawPartTransition, ce as createRawTransition, ae as createRouterScope, oe as createScreenSelector, T as createScreenStore, m as createSelfPopGuard, ne as createStepController, Ke as createSwipeController, E as createTransition, We as createTransitionEngine, re as createTransitionStore, ue as cupertino, k as decoratorMap, z as easingToCss, d as ensureWindowHistoryState, Ve as enteringInitialStyle, Y as findScrollable, s as getMatchedPathPattern, c as getParams, u as isServer, fe as layout, g as markSelfInducedPop, $e as matchesPathname, pe as material, me as none, Ze as observeBarHeight, Qe as observeViewportScrollHeight, X as overflowsAxis, _e as overlay, A as partTransitionMap, ee as readStepParams, Be as registerTransitionDefinitions, Xe as scheduleAnimHoldRelease, l as seedInitialHistory, L as targetToDecls, D as transitionMap, Re as variantHasAnimation };
1794
+ export { Ze as ANIM_HOLD_RELEASE_BACKSTOP_MS, Y as SKIP_ANIMATION_ATTR, a as TaskManger, Xe as animHoldKey, J as animateInline, H as animationName, te as appendParamsQuery, G as applyTransitionStyles, st as buildRoutePath, $ as canProgrammaticallyScroll, q as clearInlineAnimation, Me as collectAnimatedProperties, Le as compileTransitionStyles, Ye as computeBarRiding, se as computeScreenFreeze, _ as consumeSelfInducedPop, p as createBrowserHistoryDriver, me as createDecorator, o as createHistoryStore, v as createHistorySync, y as createMemoryHistoryDriver, b as createNavigateStore, w as createNavigationController, ge as createPartTransition, he as createRawDecorator, _e as createRawPartTransition, ce as createRawTransition, ae as createRouterScope, oe as createScreenSelector, E as createScreenStore, m as createSelfPopGuard, ne as createStepController, Je as createSwipeController, D as createTransition, Ge as createTransitionEngine, T as createTransitionStore, ue as cupertino, N as decoratorMap, et as eagerlyDecodeImages, R as easingToCss, d as ensureWindowHistoryState, He as enteringInitialStyle, Z as findScrollable, s as getMatchedPathPattern, c as getParams, ot as isOpaqueColor, u as isServer, fe as layout, g as markSelfInducedPop, at as matchesPathname, O as material, pe as none, nt as observeBarHeight, it as observeViewportScrollHeight, Q as overflowsAxis, M as overlay, P as partTransitionMap, ee as readStepParams, Ve as registerTransitionDefinitions, A as resolveTransition, tt as scheduleAnimHoldRelease, l as seedInitialHistory, re as subscribeStepParamsRestore, I as targetToDecls, k as transitionMap, ze as variantHasAnimation };
@@ -18,3 +18,4 @@ export default function createStepController(deps: StepControllerDeps): {
18
18
  replaceStep: (params: object) => Promise<void>;
19
19
  popStep: () => Promise<void>;
20
20
  };
21
+ export declare function subscribeStepParamsRestore(driver: HistoryDriver, onParams: (params: object) => void): () => void;
@@ -0,0 +1 @@
1
+ export {};
@@ -6,4 +6,10 @@ export interface AnimHoldInput {
6
6
  }
7
7
  export declare function animHoldKey(input: AnimHoldInput): string | null;
8
8
  export declare const ANIM_HOLD_RELEASE_BACKSTOP_MS = 300;
9
- export declare function scheduleAnimHoldRelease(release: () => void): () => void;
9
+ export declare const ANIM_HOLD_DECODE_CAP_MS = 150;
10
+ export declare function collectDecodableImages(scope: HTMLElement): HTMLImageElement[];
11
+ export declare function eagerlyDecodeImages(scope: HTMLElement | null): void;
12
+ export interface AnimHoldReleaseOptions {
13
+ scope?: HTMLElement | null;
14
+ }
15
+ export declare function scheduleAnimHoldRelease(release: () => void, options?: AnimHoldReleaseOptions): () => void;
@@ -3,14 +3,20 @@ export interface SharedBarPresence {
3
3
  topBar: boolean;
4
4
  bottomBar: boolean;
5
5
  }
6
+ export interface ScreenSurface {
7
+ opaqueBackground: boolean;
8
+ }
6
9
  export interface ScreenStore {
7
10
  dragStatus: "IDLE" | "PENDING";
8
11
  replaceTransitionStatus: "IDLE" | "PENDING";
9
12
  sharedBars: Record<string, SharedBarPresence>;
13
+ screenSurfaces: Record<string, ScreenSurface>;
10
14
  setDragStatus: (dragStatus: "IDLE" | "PENDING") => void;
11
15
  setReplaceTransitionStatus: (replaceTransitionStatus: "IDLE" | "PENDING") => void;
12
16
  registerSharedBars: (id: string, presence: SharedBarPresence) => void;
13
17
  unregisterSharedBars: (id: string) => void;
18
+ registerScreenSurface: (id: string, surface: ScreenSurface) => void;
19
+ unregisterScreenSurface: (id: string) => void;
14
20
  }
15
21
  export type ScreenStoreApi = StoreApi<ScreenStore>;
16
22
  export default function createScreenStore(): ScreenStoreApi;
@@ -0,0 +1,6 @@
1
+ declare module '../partTransition/typing' {
2
+ interface RegisterPartTransition {
3
+ "coverage-branch-part": "coverage-branch-part";
4
+ }
5
+ }
6
+ export {};
@@ -0,0 +1,2 @@
1
+ import { Transition, TransitionName } from './typing';
2
+ export default function resolveTransition(transitionName: TransitionName): Transition;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export default function isOpaqueColor(cssColor: string): boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flemo/core",
3
- "version": "1.8.0",
3
+ "version": "1.10.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",