@flemo/core 1.9.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.
package/dist/index.d.ts CHANGED
@@ -10,7 +10,7 @@ export { markSelfInducedPop, consumeSelfInducedPop, createSelfPopGuard, type Sel
10
10
  export { default as createNavigationController, type NavigationControllerDeps, type DistanceOptions, type NavigateOptions, type PopOptions } from './navigate/createNavigationController';
11
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';
@@ -39,7 +39,7 @@ export { SKIP_ANIMATION_ATTR, type TransitionEngine, type TransitionEngineDeps,
39
39
  export { default as createSwipeController } from './core/engine/createSwipeController';
40
40
  export { type SwipeController, type SwipeControllerConfig, type SwipeControllerElements, type SharedBarPresenceLike } from './core/engine/createSwipeController';
41
41
  export { default as computeBarRiding, type BarRidingInput } from './screen/computeBarRiding';
42
- 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';
43
43
  export { default as observeBarHeight } from './screen/observeBarHeight';
44
44
  export { default as observeViewportScrollHeight } from './screen/observeViewportScrollHeight';
45
45
  export type { RegisterTransition, TransitionName, TransitionVariant, TransitionVariantValue, TransitionOptions, BaseTransition, Transition, SwipeInfo, SwipeAnimate } from './transition/typing';
@@ -49,5 +49,6 @@ export { default as isServer } from './utils/isServer';
49
49
  export { default as getParams } from './utils/getParams';
50
50
  export { default as getMatchedPathPattern } from './utils/getMatchedPathPattern';
51
51
  export { default as matchesPathname } from './utils/matchesPathname';
52
+ export { default as isOpaqueColor } from './utils/isOpaqueColor';
52
53
  export { default as buildRoutePath } from './utils/buildRoutePath';
53
54
  export { default as findScrollable, overflowsAxis, canProgrammaticallyScroll } from './utils/findScrollable';
package/dist/index.mjs CHANGED
@@ -643,7 +643,7 @@ function re(e, t) {
643
643
  }
644
644
  //#endregion
645
645
  //#region src/transition/store.ts
646
- function ie(t = "cupertino") {
646
+ function T(t = "cupertino") {
647
647
  return e((e) => ({
648
648
  defaultTransitionName: t,
649
649
  setDefaultTransitionName: (t) => e({ defaultTransitionName: t })
@@ -651,11 +651,12 @@ function ie(t = "cupertino") {
651
651
  }
652
652
  //#endregion
653
653
  //#region src/screen/store.ts
654
- function ae() {
654
+ function E() {
655
655
  return e((e) => ({
656
656
  dragStatus: "IDLE",
657
657
  replaceTransitionStatus: "IDLE",
658
658
  sharedBars: {},
659
+ screenSurfaces: {},
659
660
  setDragStatus: (t) => e({ dragStatus: t }),
660
661
  setReplaceTransitionStatus: (t) => e({ replaceTransitionStatus: t }),
661
662
  registerSharedBars: (t, n) => e((e) => ({ sharedBars: {
@@ -665,16 +666,27 @@ function ae() {
665
666
  unregisterSharedBars: (t) => e((e) => {
666
667
  let n = { ...e.sharedBars };
667
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 };
668
680
  })
669
681
  }));
670
682
  }
671
683
  //#endregion
672
684
  //#region src/core/createRouterScope.ts
673
- var oe = {
685
+ var ie = {
674
686
  mark: () => {},
675
687
  consume: () => !1
676
688
  };
677
- function se(e) {
689
+ function ae(e) {
678
690
  let { routePaths: t, pathname: n, search: r, defaultTransitionName: i, memory: a, browserDriver: s } = e, c = l(t, n, r, i);
679
691
  if (e.hostedScope) return e.hostedScope.history.getState().index === -1 && e.hostedScope.history.setState({
680
692
  index: 0,
@@ -690,12 +702,12 @@ function se(e) {
690
702
  layoutId: c.layoutId
691
703
  },
692
704
  url: c.pathname
693
- }) : s, d = a ? oe : m();
705
+ }) : s, d = a ? ie : m();
694
706
  return {
695
707
  history: o([c], 0),
696
708
  navigate: b(),
697
- transition: ie(i),
698
- screen: ae(),
709
+ transition: T(i),
710
+ screen: E(),
699
711
  driver: u,
700
712
  markSelfInduced: d.mark,
701
713
  consume: d.consume
@@ -703,7 +715,7 @@ function se(e) {
703
715
  }
704
716
  //#endregion
705
717
  //#region src/screen/createScreenSelector.ts
706
- function ce(e, t) {
718
+ function oe(e, t) {
707
719
  return e.map((n, r) => ({
708
720
  ...n,
709
721
  isActive: r === t,
@@ -716,13 +728,13 @@ function ce(e, t) {
716
728
  }
717
729
  //#endregion
718
730
  //#region src/screen/computeScreenFreeze.ts
719
- function le(e) {
731
+ function se(e) {
720
732
  let t = e.status === "COMPLETED" && e.dragStatus === "IDLE";
721
733
  return !e.isActive && t || e.isPrev && e.index - 2 <= e.zIndex && e.replaceTransitionStatus === "IDLE" || e.isPrev && e.index - 2 > e.zIndex;
722
734
  }
723
735
  //#endregion
724
736
  //#region src/transition/createTransition.ts
725
- function T({ 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 }) {
726
738
  return {
727
739
  name: e,
728
740
  initial: t,
@@ -743,7 +755,7 @@ function T({ name: e, initial: t, idle: n, enter: r, enterBack: i, exit: a, exit
743
755
  }
744
756
  //#endregion
745
757
  //#region src/transition/createRawTransition.ts
746
- function ue({ name: e, initial: t, idle: n, pushOnEnter: r, pushOnExit: i, replaceOnEnter: a, replaceOnExit: o, popOnEnter: s, popOnExit: c, completedOnExit: l, completedOnEnter: u, options: d }) {
758
+ function ce({ name: e, initial: t, idle: n, pushOnEnter: r, pushOnExit: i, replaceOnEnter: a, replaceOnExit: o, popOnEnter: s, popOnExit: c, completedOnExit: l, completedOnEnter: u, options: d }) {
747
759
  return {
748
760
  name: e,
749
761
  initial: t,
@@ -764,10 +776,10 @@ function ue({ name: e, initial: t, idle: n, pushOnEnter: r, pushOnExit: i, repla
764
776
  }
765
777
  //#endregion
766
778
  //#region src/transition/cupertino.ts
767
- var de = (e, t, n) => {
779
+ var le = (e, t, n) => {
768
780
  let [r, i] = t, [a, o] = n;
769
781
  return i === r ? a : a + (e - r) / (i - r) * (o - a);
770
- }, fe = T({
782
+ }, ue = D({
771
783
  name: "cupertino",
772
784
  initial: { x: "100%" },
773
785
  idle: {
@@ -827,7 +839,7 @@ var de = (e, t, n) => {
827
839
  swipeDirection: "x",
828
840
  onSwipeStart: async () => !0,
829
841
  onSwipe: (e, t, { animate: n, currentScreen: r, prevScreen: i, onProgress: a }) => {
830
- let { offset: o } = t, s = o.x, c = de(s, [0, window.innerWidth], [0, 100]);
842
+ let { offset: o } = t, s = o.x, c = le(s, [0, window.innerWidth], [0, 100]);
831
843
  return a?.(!0, c), n(r, { x: Math.max(0, s) }, { duration: 0 }), n(i, { x: `${-30 + c * .3}%` }, { duration: 0 }), c;
832
844
  },
833
845
  onSwipeEnd: async (e, t, { animate: n, currentScreen: r, prevScreen: i, onStart: a }) => {
@@ -851,10 +863,10 @@ var de = (e, t, n) => {
851
863
  })]), c;
852
864
  }
853
865
  }
854
- }), pe = (e, t, n) => {
866
+ }), de = (e, t, n) => {
855
867
  let [r, i] = t, [a, o] = n;
856
868
  return i === r ? a : a + (e - r) / (i - r) * (o - a);
857
- }, me = T({
869
+ }, fe = D({
858
870
  name: "layout",
859
871
  initial: { opacity: .97 },
860
872
  idle: {
@@ -882,7 +894,7 @@ var de = (e, t, n) => {
882
894
  swipeDirection: "y",
883
895
  onSwipeStart: async () => !0,
884
896
  onSwipe: (e, t, { animate: n, currentScreen: r, onProgress: i }) => {
885
- let { offset: a } = t, o = a.y, s = Math.max(0, Math.min(56, o)), c = pe(s, [0, 56], [1, .96]), l = Math.max(0, o - 56), u = Math.min(1, l / 160), d = Math.sqrt(u) * 12, f = Math.max(0, s + d), p = Math.min(56, f);
897
+ let { offset: a } = t, o = a.y, s = Math.max(0, Math.min(56, o)), c = de(s, [0, 56], [1, .96]), l = Math.max(0, o - 56), u = Math.min(1, l / 160), d = Math.sqrt(u) * 12, f = Math.max(0, s + d), p = Math.min(56, f);
886
898
  return i?.(!0, 100), n(r, {
887
899
  y: f,
888
900
  opacity: c
@@ -899,7 +911,7 @@ var de = (e, t, n) => {
899
911
  }, { duration: .3 })]), c;
900
912
  }
901
913
  }
902
- }), he = T({
914
+ }), O = D({
903
915
  name: "material",
904
916
  initial: { y: "100%" },
905
917
  idle: {
@@ -1007,7 +1019,7 @@ var de = (e, t, n) => {
1007
1019
  })]), c;
1008
1020
  }
1009
1021
  }
1010
- }), E = T({
1022
+ }), pe = D({
1011
1023
  name: "none",
1012
1024
  initial: {},
1013
1025
  idle: {
@@ -1030,20 +1042,20 @@ var de = (e, t, n) => {
1030
1042
  value: {},
1031
1043
  options: { duration: 0 }
1032
1044
  }
1033
- }), D = new Map([
1034
- ["none", E],
1035
- ["cupertino", fe],
1036
- ["material", he],
1037
- ["layout", me]
1045
+ }), k = new Map([
1046
+ ["none", pe],
1047
+ ["cupertino", ue],
1048
+ ["material", O],
1049
+ ["layout", fe]
1038
1050
  ]);
1039
1051
  //#endregion
1040
1052
  //#region src/transition/resolveTransition.ts
1041
- function ge(e) {
1042
- return D.get(e) ?? D.get("none");
1053
+ function A(e) {
1054
+ return k.get(e) ?? k.get("none");
1043
1055
  }
1044
1056
  //#endregion
1045
1057
  //#region src/transition/decorator/createDecorator.ts
1046
- function _e({ 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 }) {
1047
1059
  return {
1048
1060
  name: e,
1049
1061
  initial: t,
@@ -1064,7 +1076,7 @@ function _e({ name: e, initial: t, idle: n, enter: r, exit: i, options: a }) {
1064
1076
  }
1065
1077
  //#endregion
1066
1078
  //#region src/transition/decorator/createRawDecorator.ts
1067
- function ve({ 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 }) {
1068
1080
  return {
1069
1081
  name: e,
1070
1082
  initial: t,
@@ -1085,30 +1097,30 @@ function ve({ name: e, initial: t, idle: n, pushOnEnter: r, pushOnExit: i, repla
1085
1097
  }
1086
1098
  //#endregion
1087
1099
  //#region src/transition/decorator/overlay.ts
1088
- var O = "rgba(0, 0, 0, 0.3)", ye = _e({
1100
+ var j = "rgba(0, 0, 0, 0.3)", M = me({
1089
1101
  name: "overlay",
1090
1102
  initial: {
1091
1103
  opacity: 0,
1092
- backgroundColor: O
1104
+ backgroundColor: j
1093
1105
  },
1094
1106
  idle: {
1095
1107
  value: {
1096
1108
  opacity: 0,
1097
- backgroundColor: O
1109
+ backgroundColor: j
1098
1110
  },
1099
1111
  options: { duration: 0 }
1100
1112
  },
1101
1113
  enter: {
1102
1114
  value: {
1103
1115
  opacity: 1,
1104
- backgroundColor: O
1116
+ backgroundColor: j
1105
1117
  },
1106
1118
  options: { duration: .7 }
1107
1119
  },
1108
1120
  exit: {
1109
1121
  value: {
1110
1122
  opacity: 0,
1111
- backgroundColor: O
1123
+ backgroundColor: j
1112
1124
  },
1113
1125
  options: { duration: .6 }
1114
1126
  },
@@ -1117,10 +1129,10 @@ var O = "rgba(0, 0, 0, 0.3)", ye = _e({
1117
1129
  onSwipe: (e, t, { animate: n, prevDecorator: r }) => n(r, { opacity: Math.max(0, 1 - t / 100) }, { duration: 0 }),
1118
1130
  onSwipeEnd: (e, { animate: t, prevDecorator: n }) => t(n, { opacity: +!e }, { duration: .3 })
1119
1131
  }
1120
- }), k = new Map([["overlay", ye]]);
1132
+ }), N = new Map([["overlay", M]]);
1121
1133
  //#endregion
1122
1134
  //#region src/transition/partTransition/createPartTransition.ts
1123
- function be({ 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 }) {
1124
1136
  return {
1125
1137
  name: e,
1126
1138
  initial: t,
@@ -1141,7 +1153,7 @@ function be({ name: e, initial: t, idle: n, enter: r, exit: i, options: a }) {
1141
1153
  }
1142
1154
  //#endregion
1143
1155
  //#region src/transition/partTransition/createRawPartTransition.ts
1144
- function xe({ 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 }) {
1145
1157
  return {
1146
1158
  name: e,
1147
1159
  initial: t,
@@ -1162,7 +1174,7 @@ function xe({ name: e, initial: t, idle: n, pushOnEnter: r, pushOnExit: i, repla
1162
1174
  }
1163
1175
  //#endregion
1164
1176
  //#region src/transition/partTransition/partTransition.ts
1165
- var A = /* @__PURE__ */ new Map(), j = {
1177
+ var P = /* @__PURE__ */ new Map(), F = {
1166
1178
  "IDLE-true": "self",
1167
1179
  "IDLE-false": "self",
1168
1180
  "PUSHING-true": "initial",
@@ -1173,7 +1185,7 @@ var A = /* @__PURE__ */ new Map(), j = {
1173
1185
  "POPPING-false": "PUSHING-false",
1174
1186
  "COMPLETED-true": "self",
1175
1187
  "COMPLETED-false": "self"
1176
- }, Se = Object.keys(j), M = Se, Ce = (e) => e.replace(/[^a-zA-Z0-9_-]/g, "_"), N = (e) => typeof e == "object" && !!e && !Array.isArray(e), we = 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(".")), Te = (e, t) => t.startsWith("--") || we.has(t) ? `${e}` : t === "rotate" || t === "rotateX" || t === "rotateY" || t === "rotateZ" ? `${e}deg` : `${e}px`, P = (e, t) => typeof t == "number" ? Te(t, e) : typeof t == "string" ? t : "", F = (e) => e.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`), I = 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([
1177
1189
  "x",
1178
1190
  "y",
1179
1191
  "z",
@@ -1184,7 +1196,7 @@ var A = /* @__PURE__ */ new Map(), j = {
1184
1196
  "rotateX",
1185
1197
  "rotateY",
1186
1198
  "rotateZ"
1187
- ]), Ee = /^-?0(\.0+)?(px|%|em|rem|vh|vw|vmin|vmax)?$/, De = /^-?0(\.0+)?(deg|rad|grad|turn)?$/, Oe = /^1(\.0+)?$/, ke = (e, t) => e === "scale" || e === "scaleX" || e === "scaleY" ? t === 1 ? !0 : typeof t == "string" ? Oe.test(t.trim()) : !1 : e === "rotate" || e === "rotateX" || e === "rotateY" || e === "rotateZ" ? t === 0 ? !0 : typeof t == "string" ? De.test(t.trim()) : !1 : t === 0 ? !0 : typeof t == "string" ? Ee.test(t.trim()) : !1, Ae = (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) => {
1188
1200
  switch (e) {
1189
1201
  case "x": return `translateX(${t})`;
1190
1202
  case "y": return `translateY(${t})`;
@@ -1198,23 +1210,23 @@ var A = /* @__PURE__ */ new Map(), j = {
1198
1210
  case "rotateY": return `rotateY(${t})`;
1199
1211
  default: return "";
1200
1212
  }
1201
- }, L = (e) => {
1213
+ }, Me = (e) => {
1202
1214
  let t = /* @__PURE__ */ new Set(), n = !1, r = (e) => {
1203
- if (N(e)) for (let r of Object.keys(e)) {
1215
+ if (xe(e)) for (let r of Object.keys(e)) {
1204
1216
  let i = e[r];
1205
- P(r, i) !== "" && (I.has(r) ? n = !0 : t.add(F(r)));
1217
+ we(r, i) !== "" && (Ee.has(r) ? n = !0 : t.add(Te(r)));
1206
1218
  }
1207
1219
  };
1208
1220
  r(e.initial);
1209
1221
  for (let t of Object.values(e.variants)) r(t.value);
1210
1222
  return n && t.add("transform"), Array.from(t);
1211
- }, R = (e) => {
1212
- if (!N(e)) return [];
1223
+ }, I = (e) => {
1224
+ if (!xe(e)) return [];
1213
1225
  let t = [], n = !0, r = [];
1214
1226
  for (let i of Object.keys(e)) {
1215
- let a = e[i], o = P(i, a);
1216
- o !== "" && (I.has(i) ? (t.push(Ae(i, o)), ke(i, a) || (n = !1)) : r.push({
1217
- property: F(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),
1218
1230
  value: o
1219
1231
  }));
1220
1232
  }
@@ -1222,7 +1234,7 @@ var A = /* @__PURE__ */ new Map(), j = {
1222
1234
  property: "transform",
1223
1235
  value: n ? "none" : t.join(" ")
1224
1236
  }), r;
1225
- }, z = (e) => e.map((e) => ` ${e.property}: ${e.value};`).join("\n"), B = (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" ? {
1226
1238
  linear: "linear",
1227
1239
  easeIn: "ease-in",
1228
1240
  easeOut: "ease-out",
@@ -1232,33 +1244,33 @@ var A = /* @__PURE__ */ new Map(), j = {
1232
1244
  backIn: "cubic-bezier(0.31, 0.01, 0.66, -0.59)",
1233
1245
  backOut: "cubic-bezier(0.33, 1.53, 0.69, 0.99)",
1234
1246
  anticipate: "cubic-bezier(0.36, 0, 0.66, -0.56)"
1235
- }[e] ?? "ease" : "ease", je = (e) => {
1247
+ }[e] ?? "ease" : "ease", z = (e) => {
1236
1248
  if (!e) return 0;
1237
1249
  let t = e.duration;
1238
1250
  return typeof t == "number" && t >= 0 ? t : 0;
1239
- }, Me = (e) => e && typeof e.delay == "number" && e.delay > 0 ? e.delay : 0, Ne = (e, t) => {
1251
+ }, B = (e) => e && typeof e.delay == "number" && e.delay > 0 ? e.delay : 0, V = (e, t) => {
1240
1252
  let [n, r] = t.split("-");
1241
1253
  return `[data-flemo-screen][data-flemo-transition="${e}"][data-flemo-status="${n}"][data-flemo-active="${r}"]`;
1242
- }, Pe = (e, t) => {
1254
+ }, Ne = (e, t) => {
1243
1255
  let [n, r] = t.split("-");
1244
1256
  return `[data-flemo-decorator][data-flemo-decorator-name="${e}"][data-flemo-status="${n}"][data-flemo-active="${r}"]`;
1245
- }, Fe = (e, t) => {
1257
+ }, Pe = (e, t) => {
1246
1258
  let [n, r] = t.split("-");
1247
1259
  return `[data-flemo-bar][data-flemo-bar-transition="${e}"][data-flemo-bar-status="${n}"][data-flemo-bar-active="${r}"][data-flemo-bar-riding="true"]`;
1248
- }, Ie = (e, t) => {
1260
+ }, Fe = (e, t) => {
1249
1261
  let [n, r] = t.split("-");
1250
1262
  return `[data-flemo-part-name="${e}"][data-flemo-status="${n}"][data-flemo-active="${r}"]`;
1251
- }, V = (e, t, n) => `flemo-${e}-${Ce(t)}-${n}`, H = (e, t, n, r, i, a) => {
1252
- let o = R(r), s = R(i.value), c = je(i.options), l = Me(i.options), u = B(i.options?.ease), d = a(t, n), f = e === "screen" ? `${d},\n${Fe(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;
1253
1265
  if (s.length === 0 && o.length === 0) return "";
1254
- if (c <= 0 && l <= 0) return s.length === 0 ? "" : `${f} {\n${z(s)}\n animation: none;\n}`;
1255
- let p = V(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 = [
1256
1268
  `@keyframes ${p} {`,
1257
1269
  " from {",
1258
- z(o).replace(/^/gm, " "),
1270
+ L(o).replace(/^/gm, " "),
1259
1271
  " }",
1260
1272
  " to {",
1261
- z(s).replace(/^/gm, " "),
1273
+ L(s).replace(/^/gm, " "),
1262
1274
  " }",
1263
1275
  "}"
1264
1276
  ].join("\n"), h = [
@@ -1268,78 +1280,85 @@ var A = /* @__PURE__ */ new Map(), j = {
1268
1280
  l > 0 ? `${l}s` : null,
1269
1281
  "both"
1270
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];
1271
- return `${m}\n${`${f} {\n animation: ${h};\n${_}${v === "PUSHING" || v === "REPLACING" ? " contain: layout;\n pointer-events: none;\n" : ""}}`}`;
1272
- }, U = (e, t, n, r) => {
1273
- let i = R(r.value);
1274
- return i.length === 0 ? "" : `${e(t, n)} {\n${z(i)}\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}`;
1275
1292
  }, Le = (e, t, n = []) => {
1276
1293
  let r = [];
1277
1294
  for (let t of e) {
1278
1295
  let e = t.name;
1279
- for (let n of Se) {
1280
- let i = t.variants[n], a = j[n];
1296
+ for (let n of ve) {
1297
+ let i = t.variants[n], a = F[n];
1281
1298
  if (a === "self") {
1282
- r.push(U(Ne, e, n, i));
1299
+ r.push(W(V, e, n, i));
1283
1300
  continue;
1284
1301
  }
1285
1302
  let o = a === "initial" ? t.initial : t.variants[a].value;
1286
- r.push(H("screen", e, n, o, i, Ne));
1303
+ r.push(U("screen", e, n, o, i, V));
1287
1304
  }
1288
1305
  }
1289
1306
  for (let e of t) {
1290
1307
  let t = e.name;
1291
- for (let n of M) {
1292
- let i = e.variants[n], a = j[n];
1308
+ for (let n of ye) {
1309
+ let i = e.variants[n], a = F[n];
1293
1310
  if (a === "self") {
1294
- r.push(U(Pe, t, n, i));
1311
+ r.push(W(Ne, t, n, i));
1295
1312
  continue;
1296
1313
  }
1297
1314
  let o = a === "initial" ? e.initial : e.variants[a].value;
1298
- r.push(H("decorator", t, n, o, i, Pe));
1315
+ r.push(U("decorator", t, n, o, i, Ne));
1299
1316
  }
1300
1317
  }
1301
1318
  for (let e of n) {
1302
1319
  let t = e.name;
1303
- for (let n of M) {
1304
- let i = e.variants[n], a = j[n];
1320
+ for (let n of ye) {
1321
+ let i = e.variants[n], a = F[n];
1305
1322
  if (a === "self") {
1306
- r.push(U(Ie, t, n, i));
1323
+ r.push(W(Fe, t, n, i));
1307
1324
  continue;
1308
1325
  }
1309
1326
  let o = a === "initial" ? e.initial : e.variants[a].value;
1310
- r.push(H("part", t, n, o, i, Ie));
1327
+ r.push(U("part", t, n, o, i, Fe));
1311
1328
  }
1312
1329
  }
1313
1330
  return [...r.filter((e) => e.length > 0), Re].join("\n\n");
1314
1331
  }, Re = [
1315
1332
  "[data-flemo-anim-hold=\"true\"],",
1316
- "[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] {",
1317
1336
  " animation-play-state: paused !important;",
1318
1337
  "}"
1319
1338
  ].join("\n"), ze = (e, t) => {
1320
- let n = j[t];
1339
+ let n = F[t];
1321
1340
  if (n === "self") return !1;
1322
- let r = e.variants[t], i = je(r.options), a = Me(r.options);
1341
+ let r = e.variants[t], i = z(r.options), a = B(r.options);
1323
1342
  if (i <= 0 && a <= 0) return !1;
1324
- let o = R(n === "initial" ? e.initial : e.variants[n].value), s = R(r.value);
1343
+ let o = I(n === "initial" ? e.initial : e.variants[n].value), s = I(r.value);
1325
1344
  return o.length > 0 || s.length > 0;
1326
1345
  }, Be = "data-flemo";
1327
- function W() {
1346
+ function G() {
1328
1347
  if (u()) return;
1329
- let e = Le(D.values(), k.values(), A.values()), t = document.head.querySelector(`style[${Be}]`);
1348
+ let e = Le(k.values(), N.values(), P.values()), t = document.head.querySelector(`style[${Be}]`);
1330
1349
  t || (t = document.createElement("style"), t.setAttribute(Be, ""), document.head.appendChild(t)), t.textContent !== e && (t.textContent = e);
1331
1350
  }
1332
1351
  //#endregion
1333
1352
  //#region src/transition/registerTransitionDefinitions.ts
1334
1353
  function Ve(e, t, n = []) {
1335
- for (let t of e) D.set(t.name, t);
1336
- for (let e of t) k.set(e.name, e);
1337
- for (let e of n) A.set(e.name, e);
1338
- return W(), () => {
1339
- for (let t of e) D.delete(t.name);
1340
- for (let e of t) k.delete(e.name);
1341
- for (let e of n) A.delete(e.name);
1342
- W();
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();
1343
1362
  };
1344
1363
  }
1345
1364
  //#endregion
@@ -1352,27 +1371,27 @@ function He(e) {
1352
1371
  }
1353
1372
  //#endregion
1354
1373
  //#region src/transition/animateInline.ts
1355
- var Ue = (e) => typeof HTMLElement < "u" && e instanceof HTMLElement, G = /* @__PURE__ */ new WeakMap(), We = (e, t) => {
1356
- let n = G.get(e);
1357
- n || (n = /* @__PURE__ */ new Set(), G.set(e, n)), n.add(t);
1358
- }, K = (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) => {
1359
1378
  if (e.style.transition = "", t) {
1360
- let n = G.get(e);
1379
+ let n = K.get(e);
1361
1380
  for (let r of t) e.style.removeProperty(r), n?.delete(r);
1362
1381
  return;
1363
1382
  }
1364
- let n = G.get(e);
1383
+ let n = K.get(e);
1365
1384
  if (n && n.size > 0) {
1366
1385
  for (let t of n) e.style.removeProperty(t);
1367
1386
  n.clear();
1368
1387
  return;
1369
1388
  }
1370
1389
  e.style.removeProperty("transform"), e.style.removeProperty("opacity");
1371
- }, q = (e, t, n = {}) => {
1390
+ }, J = (e, t, n = {}) => {
1372
1391
  if (!Ue(e)) return Promise.resolve();
1373
- let r = e, i = R(t);
1392
+ let r = e, i = I(t);
1374
1393
  if (i.length === 0) return Promise.resolve();
1375
- let a = typeof n.duration == "number" ? n.duration : 0, o = typeof n.delay == "number" && n.delay > 0 ? n.delay : 0, s = B(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);
1376
1395
  if (a <= 0 && o <= 0) {
1377
1396
  r.style.transition = "none";
1378
1397
  for (let e of i) r.style.setProperty(e.property, e.value), We(r, e.property);
@@ -1389,27 +1408,27 @@ var Ue = (e) => typeof HTMLElement < "u" && e instanceof HTMLElement, G = /* @__
1389
1408
  };
1390
1409
  r.addEventListener("transitionend", i), setTimeout(n, (a + o) * 1e3 + 60);
1391
1410
  });
1392
- }, J = "data-flemo-skip-animation", Y = () => {};
1411
+ }, Y = "data-flemo-skip-animation", X = () => {};
1393
1412
  function Ge(e) {
1394
1413
  return { driveScreenLifecycle: (t) => {
1395
1414
  let { getElements: n, transitionName: r, prevTransitionName: i, status: o, isActive: s } = t;
1396
- if (!s) return o === "REPLACING" && i !== r && e.setReplaceTransitionStatus("PENDING"), Y;
1415
+ if (!s) return o === "REPLACING" && i !== r && e.setReplaceTransitionStatus("PENDING"), X;
1397
1416
  if (o === "COMPLETED") {
1398
1417
  e.setDragStatus("IDLE"), e.setReplaceTransitionStatus("IDLE");
1399
1418
  let { scope: t, decorator: r, bars: i } = n();
1400
- t && (K(t), t.removeAttribute(J)), r && (K(r), r.removeAttribute(J));
1401
- for (let e of i ?? []) e && (K(e), e.style.removeProperty("will-change"));
1402
- return Y;
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;
1403
1422
  }
1404
- if (o === "IDLE") return Y;
1423
+ if (o === "IDLE") return X;
1405
1424
  let { scope: c } = n();
1406
- if (!c) return Y;
1425
+ if (!c) return X;
1407
1426
  let l = () => {
1408
1427
  let t = e.getTransitionTaskId();
1409
1428
  t && a.resolveTask(t);
1410
- }, u = ge(r), d = `${o}-true`;
1411
- if (!(c.getAttribute("data-flemo-skip-animation") !== "true" && ze(u, d))) return queueMicrotask(l), Y;
1412
- let f = V("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) => {
1413
1432
  e.target === c && e.animationName === f && (c.removeEventListener("animationend", p), l());
1414
1433
  };
1415
1434
  return c.addEventListener("animationend", p), () => {
@@ -1419,20 +1438,20 @@ function Ge(e) {
1419
1438
  }
1420
1439
  //#endregion
1421
1440
  //#region src/utils/findScrollable.ts
1422
- function X(e, t) {
1441
+ function Z(e, t) {
1423
1442
  let { direction: n = "x", markerSelector: r = "[data-swipe-at-edge]", depthLimit: i = 24, verifyByScroll: a = !1 } = t ?? {}, o = Ke(e);
1424
1443
  if (!o) return {
1425
1444
  element: null,
1426
1445
  hasMarker: !1
1427
1446
  };
1428
1447
  let s = o.closest?.(r);
1429
- if (s instanceof HTMLElement && Z(s, n) && (!a || Q(s, n))) return {
1448
+ if (s instanceof HTMLElement && Q(s, n) && (!a || $(s, n))) return {
1430
1449
  element: s,
1431
1450
  hasMarker: !0
1432
1451
  };
1433
1452
  let c = o, l = 0;
1434
1453
  for (; c && l < i;) {
1435
- if (Z(c, n) && (!a || Q(c, n))) return {
1454
+ if (Q(c, n) && (!a || $(c, n))) return {
1436
1455
  element: c,
1437
1456
  hasMarker: !1
1438
1457
  };
@@ -1451,11 +1470,11 @@ function Ke(e) {
1451
1470
  }
1452
1471
  return e instanceof HTMLElement ? e : null;
1453
1472
  }
1454
- function Z(e, t) {
1473
+ function Q(e, t) {
1455
1474
  return t === "y" ? e.scrollHeight - e.clientHeight > 1 : e.scrollWidth - e.clientWidth > 1;
1456
1475
  }
1457
- function Q(e, t) {
1458
- if (!Z(e, t) || typeof window > "u") return !1;
1476
+ function $(e, t) {
1477
+ if (!Q(e, t) || typeof window > "u") return !1;
1459
1478
  let n = window.getComputedStyle(e), r = t === "y" ? n.overflowY : n.overflowX;
1460
1479
  return r === "auto" || r === "scroll" || r === "overlay";
1461
1480
  }
@@ -1508,9 +1527,9 @@ function Je(e) {
1508
1527
  y: e.clientY
1509
1528
  }, u = t;
1510
1529
  }, v = (n, i, a) => {
1511
- let o = q(n, i, a);
1512
- if (n === e.getElements().scope) for (let e of r.current) q(e, i, a);
1513
- else if (n === t) for (let e of r.prev) q(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);
1514
1533
  return o;
1515
1534
  }, y = (t) => {
1516
1535
  let n = e.getPartnerBars(), i = [], { sharedTopBar: a, sharedBottomBar: o } = e.getElements();
@@ -1524,12 +1543,12 @@ function Je(e) {
1524
1543
  current: i,
1525
1544
  prev: s
1526
1545
  };
1527
- let c = L(e.getTransition()).join(", ");
1546
+ let c = Me(e.getTransition()).join(", ");
1528
1547
  for (let e of i) e.style.willChange = c;
1529
1548
  for (let e of s) e.style.willChange = c;
1530
1549
  }, b = () => {
1531
- for (let e of r.current) K(e), e.style.removeProperty("will-change");
1532
- for (let e of r.prev) K(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");
1533
1552
  r = {
1534
1553
  current: [],
1535
1554
  prev: []
@@ -1542,10 +1561,10 @@ function Je(e) {
1542
1561
  };
1543
1562
  }, S = (e, t, n) => {
1544
1563
  let r = (r, i) => {
1545
- let a = A.get(r.getAttribute("data-flemo-part-name"));
1564
+ let a = P.get(r.getAttribute("data-flemo-part-name"));
1546
1565
  if (!a) return;
1547
1566
  let o = {
1548
- animate: q,
1567
+ animate: J,
1549
1568
  element: r,
1550
1569
  active: i
1551
1570
  };
@@ -1554,7 +1573,7 @@ function Je(e) {
1554
1573
  for (let e of i.current) r(e, !0);
1555
1574
  for (let e of i.prev) r(e, !1);
1556
1575
  }, C = () => {
1557
- for (let e of [...i.current, ...i.prev]) K(e);
1576
+ for (let e of [...i.current, ...i.prev]) q(e);
1558
1577
  i = {
1559
1578
  current: [],
1560
1579
  prev: []
@@ -1583,7 +1602,7 @@ function Je(e) {
1583
1602
  prevScreen: t,
1584
1603
  onStart: (e) => {
1585
1604
  m?.onSwipeStart?.(e, {
1586
- animate: q,
1605
+ animate: J,
1587
1606
  currentDecorator: f,
1588
1607
  prevDecorator: n
1589
1608
  }), S("start", e, 0);
@@ -1600,7 +1619,7 @@ function Je(e) {
1600
1619
  prevScreen: t,
1601
1620
  onProgress: (e, t) => {
1602
1621
  c?.onSwipe?.(e, t, {
1603
- animate: q,
1622
+ animate: J,
1604
1623
  currentDecorator: o,
1605
1624
  prevDecorator: n
1606
1625
  }), S("swipe", e, t);
@@ -1619,7 +1638,7 @@ function Je(e) {
1619
1638
  prevScreen: t,
1620
1639
  onStart: (e) => {
1621
1640
  u?.onSwipeEnd?.(e, {
1622
- animate: q,
1641
+ animate: J,
1623
1642
  currentDecorator: l,
1624
1643
  prevDecorator: n
1625
1644
  }), S("end", e, 0);
@@ -1627,24 +1646,24 @@ function Je(e) {
1627
1646
  })) {
1628
1647
  c?.setAttribute(qe, "true"), l?.setAttribute(qe, "true");
1629
1648
  for (let e of r.current) e.style.removeProperty("will-change");
1630
- for (let e of r.prev) K(e), e.style.removeProperty("will-change");
1649
+ for (let e of r.prev) q(e), e.style.removeProperty("will-change");
1631
1650
  r = {
1632
1651
  current: [],
1633
1652
  prev: []
1634
1653
  };
1635
- for (let e of i.prev) K(e);
1654
+ for (let e of i.prev) q(e);
1636
1655
  i = {
1637
1656
  current: [],
1638
1657
  prev: []
1639
1658
  }, e.back();
1640
- } else c && K(c), t && K(t), l && K(l), n && K(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");
1641
1660
  };
1642
1661
  return {
1643
1662
  pointerDown: (t) => {
1644
- e.isReadyForDrag() && (f = X(t.target, {
1663
+ e.isReadyForDrag() && (f = Z(t.target, {
1645
1664
  direction: "x",
1646
1665
  verifyByScroll: !0
1647
- }), p = X(t.target, {
1666
+ }), p = Z(t.target, {
1648
1667
  direction: "y",
1649
1668
  verifyByScroll: !0
1650
1669
  }), m = t.clientX, h = t.clientY, (!f.element && !p.element || f.element || p.element) && (a = !0));
@@ -1687,18 +1706,41 @@ function Ye(e) {
1687
1706
  function Xe(e) {
1688
1707
  return !(e.status === "PUSHING" || e.status === "POPPING" || e.status === "REPLACING") || !e.isTopOrTopPrev ? null : `${e.status}:${e.transitionName}`;
1689
1708
  }
1690
- var Ze = 300;
1691
- function Qe(e) {
1692
- let t = 0, n = requestAnimationFrame(() => {
1693
- t = requestAnimationFrame(e);
1694
- }), 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);
1695
1737
  return () => {
1696
- cancelAnimationFrame(n), t && cancelAnimationFrame(t), clearTimeout(r);
1738
+ n = !0, cancelAnimationFrame(a), r && cancelAnimationFrame(r), clearTimeout(o);
1697
1739
  };
1698
1740
  }
1699
1741
  //#endregion
1700
1742
  //#region src/screen/observeBarHeight.ts
1701
- function $e(e, t) {
1743
+ function nt(e, t) {
1702
1744
  e.offsetHeight > 0 && t(e.offsetHeight);
1703
1745
  let n = new ResizeObserver(([e]) => {
1704
1746
  e.contentRect.height > 0 && t(e.contentRect.height);
@@ -1709,14 +1751,14 @@ function $e(e, t) {
1709
1751
  }
1710
1752
  //#endregion
1711
1753
  //#region src/screen/observeViewportScrollHeight.ts
1712
- var $ = 0;
1713
- function et(e) {
1754
+ var rt = 0;
1755
+ function it(e) {
1714
1756
  let t = 0, n = () => {
1715
1757
  cancelAnimationFrame(t), t = requestAnimationFrame(() => {
1716
1758
  let t = document.documentElement.scrollHeight - (window.visualViewport?.height || 0);
1717
1759
  t = t < 0 ? 0 : t;
1718
- let n = t - $;
1719
- 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);
1720
1762
  });
1721
1763
  };
1722
1764
  return window.visualViewport?.addEventListener("resize", n), window.visualViewport?.addEventListener("scroll", n), () => {
@@ -1725,12 +1767,23 @@ function et(e) {
1725
1767
  }
1726
1768
  //#endregion
1727
1769
  //#region src/utils/matchesPathname.ts
1728
- function tt(e, t) {
1770
+ function at(e, t) {
1729
1771
  return i(e).regexp.test(t);
1730
1772
  }
1731
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
1732
1785
  //#region src/utils/buildRoutePath.ts
1733
- function nt(e, n) {
1786
+ function st(e, n) {
1734
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();
1735
1788
  return {
1736
1789
  pathname: `${a}${c ? `?${c}` : ""}`,
@@ -1738,4 +1791,4 @@ function nt(e, n) {
1738
1791
  };
1739
1792
  }
1740
1793
  //#endregion
1741
- export { Ze as ANIM_HOLD_RELEASE_BACKSTOP_MS, J as SKIP_ANIMATION_ATTR, a as TaskManger, Xe as animHoldKey, q as animateInline, V as animationName, te as appendParamsQuery, W as applyTransitionStyles, nt as buildRoutePath, Q as canProgrammaticallyScroll, K as clearInlineAnimation, L as collectAnimatedProperties, Le as compileTransitionStyles, Ye as computeBarRiding, le as computeScreenFreeze, _ as consumeSelfInducedPop, p as createBrowserHistoryDriver, _e as createDecorator, o as createHistoryStore, v as createHistorySync, y as createMemoryHistoryDriver, b as createNavigateStore, w as createNavigationController, be as createPartTransition, ve as createRawDecorator, xe as createRawPartTransition, ue as createRawTransition, se as createRouterScope, ce as createScreenSelector, ae as createScreenStore, m as createSelfPopGuard, ne as createStepController, Je as createSwipeController, T as createTransition, Ge as createTransitionEngine, ie as createTransitionStore, fe as cupertino, k as decoratorMap, B as easingToCss, d as ensureWindowHistoryState, He as enteringInitialStyle, X as findScrollable, s as getMatchedPathPattern, c as getParams, u as isServer, me as layout, g as markSelfInducedPop, tt as matchesPathname, he as material, E as none, $e as observeBarHeight, et as observeViewportScrollHeight, Z as overflowsAxis, ye as overlay, A as partTransitionMap, ee as readStepParams, Ve as registerTransitionDefinitions, ge as resolveTransition, Qe as scheduleAnimHoldRelease, l as seedInitialHistory, re as subscribeStepParamsRestore, R as targetToDecls, D as transitionMap, ze 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 };
@@ -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 @@
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.9.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",