@wyxos/vibe 5.17.2 → 5.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -28,7 +28,7 @@ function R(e) {
28
28
  width: e.width
29
29
  };
30
30
  }
31
- function ee(e, t) {
31
+ function z(e, t) {
32
32
  if (t === "preview" && e.preview) {
33
33
  let t = I(e.type, e.src) === "audio" ? I(e.preview.type, e.preview.src) : e.preview.type ?? e.type;
34
34
  return {
@@ -41,30 +41,30 @@ function ee(e, t) {
41
41
  type: e.mobile.type ?? e.type
42
42
  } : R(e);
43
43
  }
44
- function z(e) {
44
+ function B(e) {
45
45
  let t = e.preview;
46
46
  return !t?.src || t.src === e.src || I(t.type, t.src) !== "image" ? null : {
47
47
  ...t,
48
48
  type: "image"
49
49
  };
50
50
  }
51
- function te(e, t) {
51
+ function ee(e, t) {
52
52
  return I(e.type, e.src) === "audio" ? t === "mobile" && e.mobile && I(e.mobile.type, e.mobile.src) === "audio" ? {
53
53
  ...e.mobile,
54
54
  type: "audio"
55
55
  } : {
56
56
  ...R(e),
57
57
  type: "audio"
58
- } : ee(e, t);
58
+ } : z(e, t);
59
59
  }
60
- function B(e) {
60
+ function V(e) {
61
61
  return [e, ...e.items];
62
62
  }
63
- function V(e, t) {
63
+ function H(e, t) {
64
64
  return Math.min(e.items.length, Math.max(0, t));
65
65
  }
66
- function H(e, t) {
67
- return B(e)[V(e, t)] ?? e;
66
+ function te(e, t) {
67
+ return V(e)[H(e, t)] ?? e;
68
68
  }
69
69
  function U(e, t) {
70
70
  return `${String(e)}:${t}`;
@@ -597,12 +597,12 @@ var Me = ["aria-hidden"], Ne = [
597
597
  function R(e) {
598
598
  !o.value || e.pointerId !== d || (e.currentTarget.releasePointerCapture?.(e.pointerId), d = null, o.value = !1, C && (C = !1, M("content")), k());
599
599
  }
600
- function ee(e) {
600
+ function z(e) {
601
601
  if (!E.value) return;
602
602
  let n = t.scrollElement?.clientHeight ?? 0, r = t.scrollElement?.scrollTop ?? 0, i = e.key === "ArrowUp" ? r - Fe : e.key === "ArrowDown" ? r + Fe : e.key === "PageUp" ? r - n : e.key === "PageDown" ? r + n : e.key === "Home" ? 0 : e.key === "End" ? a.value.maximumScrollPosition : null;
603
603
  i !== null && (e.preventDefault(), A(), P(i));
604
604
  }
605
- function z(e) {
605
+ function B(e) {
606
606
  if (S?.disconnect(), !(typeof ResizeObserver > "u")) {
607
607
  S = new ResizeObserver(() => M("content"));
608
608
  for (let t of e.children) S.observe(t);
@@ -611,8 +611,8 @@ var Me = ["aria-hidden"], Ne = [
611
611
  return O(() => t.scrollElement, (e, t) => {
612
612
  t?.removeEventListener("scroll", N), x?.disconnect(), x = null, S?.disconnect(), S = null, T?.disconnect(), T = null, e?.addEventListener("scroll", N, { passive: !0 }), e && typeof ResizeObserver < "u" && (T = new ResizeObserver(() => {
613
613
  A(), M("resize");
614
- }), T.observe(e), z(e)), e && typeof MutationObserver < "u" && (x = new MutationObserver(() => {
615
- z(e), M("content");
614
+ }), T.observe(e), B(e)), e && typeof MutationObserver < "u" && (x = new MutationObserver(() => {
615
+ B(e), M("content");
616
616
  }), x.observe(e, { childList: !0 })), m(() => M("resize"));
617
617
  }, { immediate: !0 }), O(() => t.contentSize, () => {
618
618
  m(() => M("content"));
@@ -640,7 +640,7 @@ var Me = ["aria-hidden"], Ne = [
640
640
  role: "scrollbar",
641
641
  style: _(D.value),
642
642
  tabindex: E.value ? 0 : -1,
643
- onKeydown: ee,
643
+ onKeydown: z,
644
644
  onPointercancel: R,
645
645
  onPointerdown: I,
646
646
  onPointermove: L,
@@ -779,7 +779,7 @@ var nt = /* @__PURE__ */ d({
779
779
  total: {}
780
780
  },
781
781
  setup(e) {
782
- let t = e, n = r(() => V(t.item, t.mediaIndex)), i = r(() => B(t.item)), o = r(() => H(t.item, n.value)), c = r(() => ({
782
+ let t = e, n = r(() => H(t.item, t.mediaIndex)), i = r(() => V(t.item)), o = r(() => te(t.item, n.value)), c = r(() => ({
783
783
  height: `${t.region.height}px`,
784
784
  paddingBlock: t.style?.paddingY === void 0 ? void 0 : `${t.style.paddingY}px`,
785
785
  paddingInline: t.style?.paddingX === void 0 ? void 0 : `${t.style.paddingX}px`
@@ -1000,7 +1000,7 @@ var nt = /* @__PURE__ */ d({
1000
1000
  function xt(e) {
1001
1001
  let t = w("next"), n = null, r = 0, i = !1, a = null, o = null;
1002
1002
  function s(n, r) {
1003
- let i = B(e.item()).length, a = (n + i) % i;
1003
+ let i = V(e.item()).length, a = (n + i) % i;
1004
1004
  a !== e.mediaIndex() && (t.value = n < e.mediaIndex() ? "previous" : "next", e.onChange(a), r?.detail && r.detail > 0 && r.currentTarget?.blur());
1005
1005
  }
1006
1006
  function c() {
@@ -1013,7 +1013,7 @@ function xt(e) {
1013
1013
  return t === 1 ? e * 16 : t === 2 ? e * n : e;
1014
1014
  }
1015
1015
  function d(t) {
1016
- if (B(e.item()).length <= 1) return;
1016
+ if (V(e.item()).length <= 1) return;
1017
1017
  let n = t.currentTarget, a = u(t.deltaX, t.deltaMode, n?.clientWidth || 1);
1018
1018
  if (a === 0 || (t.preventDefault(), l(), i) || (r += a, Math.abs(r) < bt)) return;
1019
1019
  let o = Math.sign(r);
@@ -1042,9 +1042,9 @@ function Et(e, t) {
1042
1042
  return `${t ? "timed" : "image"}:${e}`;
1043
1043
  }
1044
1044
  function Dt(e, t, n) {
1045
- let r = B(e);
1045
+ let r = V(e);
1046
1046
  if (r.length < 2) return [];
1047
- let i = V(e, t), a = [];
1047
+ let i = H(e, t), a = [];
1048
1048
  for (let e = 1; e < r.length; e += 1) {
1049
1049
  let t = i + e, n = i - e;
1050
1050
  t < r.length && a.push(t), n >= 0 && a.push(n);
@@ -1053,7 +1053,7 @@ function Dt(e, t, n) {
1053
1053
  return a.flatMap((e) => {
1054
1054
  let t = r[e];
1055
1055
  if (!t) return [];
1056
- let i = I(t.type, t.src) === "audio" ? z(t) : ee(t, n);
1056
+ let i = I(t.type, t.src) === "audio" ? B(t) : z(t, n);
1057
1057
  if (!i) return [];
1058
1058
  let a = L(i.type, i.src), s = Et(i.src, a);
1059
1059
  return o.has(s) ? [] : (o.add(s), [{
@@ -1470,7 +1470,7 @@ var Ut = [
1470
1470
  function f(e = !1, t = "pointer") {
1471
1471
  e && d("activate", t);
1472
1472
  }
1473
- let p = r(() => B(l.item)), g = r(() => V(l.item, l.mediaIndex)), v = r(() => H(l.item, g.value)), y = r(() => ee(v.value, l.mediaSource ?? "preview")), x = r(() => I(v.value.type, v.value.src)), S = r(() => x.value === "audio"), C = r(() => te(v.value, l.mediaSource ?? "preview")), T = r(() => S.value ? C.value : y.value), D = r(() => T.value.src), M = r(() => I(T.value.type, T.value.src)), N = r(() => y.value.width), P = r(() => y.value.height), F = r(() => z(v.value)), L = r(() => `${l.item.postId}:${g.value}:${F.value?.src ?? ""}`), R = w(!1), U = r(() => R.value ? null : F.value), { effectivePreviewState: W, failSourceAttempt: G, imageElement: ne, markSourceReady: K, noteSourceActivity: q, retrySource: re, retrying: ie, sourceGeneration: ae, mediaElement: J } = Ft({
1473
+ let p = r(() => V(l.item)), g = r(() => H(l.item, l.mediaIndex)), v = r(() => te(l.item, g.value)), y = r(() => z(v.value, l.mediaSource ?? "preview")), x = r(() => I(v.value.type, v.value.src)), S = r(() => x.value === "audio"), C = r(() => ee(v.value, l.mediaSource ?? "preview")), T = r(() => S.value ? C.value : y.value), D = r(() => T.value.src), M = r(() => I(T.value.type, T.value.src)), N = r(() => y.value.width), P = r(() => y.value.height), F = r(() => B(v.value)), L = r(() => `${l.item.postId}:${g.value}:${F.value?.src ?? ""}`), R = w(!1), U = r(() => R.value ? null : F.value), { effectivePreviewState: W, failSourceAttempt: G, imageElement: ne, markSourceReady: K, noteSourceActivity: q, retrySource: re, retrying: ie, sourceGeneration: ae, mediaElement: J } = Ft({
1474
1474
  identity: () => `${l.item.postId}:${g.value}:${l.mediaSource ?? "preview"}:${D.value}:${M.value ?? ""}`,
1475
1475
  mediaIndex: () => g.value,
1476
1476
  onError: (e, t) => {
@@ -1951,39 +1951,39 @@ var cn = { class: "masonry-feed-shell" }, ln = ["aria-hidden", "inert"], un = {
1951
1951
  additionalHeight: (d.cardHeader?.height ?? 0) + (d.cardFooter?.height ?? 0),
1952
1952
  gap: x.value,
1953
1953
  minColumnWidth: De(d.masonry)
1954
- })), ee = [];
1955
- function z() {
1954
+ })), z = [];
1955
+ function B() {
1956
1956
  let e = N - k.value + C.value + Oe(d.masonry, C.value), t = M.value.reduce((e, t) => {
1957
- let n = ee[t];
1957
+ let n = z[t];
1958
1958
  return n ? Math.max(e, n.y + n.height) : e;
1959
1959
  }, 0);
1960
1960
  return Math.max(e, t);
1961
1961
  }
1962
- function te() {
1962
+ function ee() {
1963
1963
  return M.value.reduce((e, t) => Math.max(e, t), -1);
1964
1964
  }
1965
- let B = sn({
1965
+ let V = sn({
1966
1966
  additionalHeight: r(() => R.value.additionalHeight),
1967
1967
  gap: x,
1968
1968
  items: () => d.items,
1969
1969
  minColumnWidth: r(() => R.value.minColumnWidth),
1970
- packThroughIndex: te,
1971
- packUntilBottom: z,
1970
+ packThroughIndex: ee,
1971
+ packUntilBottom: B,
1972
1972
  width: y
1973
- }), V = B.layout, H = B.viewportIndex, W = r(() => d.leavingPostIds.size === 0 ? null : ye(d.items, y.value, R.value, V.value, (e) => d.leavingPostIds.has(d.items[e].postId), {
1974
- throughIndex: te(),
1975
- untilBottom: z()
1973
+ }), H = V.layout, te = V.viewportIndex, W = r(() => d.leavingPostIds.size === 0 ? null : ye(d.items, y.value, R.value, H.value, (e) => d.leavingPostIds.has(d.items[e].postId), {
1974
+ throughIndex: ee(),
1975
+ untilBottom: B()
1976
1976
  })), G = r(() => {
1977
1977
  let e = W.value;
1978
1978
  return e ? {
1979
1979
  columns: e.columns,
1980
1980
  height: e.height,
1981
1981
  items: e.items
1982
- } : V.value;
1982
+ } : H.value;
1983
1983
  }), ne = r(() => {
1984
1984
  let e = W.value;
1985
- return e ? we(e.items, e.retainedIndices, H.value, e.fromIndex) : null;
1986
- }), K = r(() => (V.value, Math.max(T.value, B.reservedHeight(), d.leavingPostIds.size === 0 ? G.value.height : V.value.height))), q = r(() => ({ height: `${K.value}px` })), re = r(() => !d.infiniteScroll || C.value > 0 && k.value + G.value.height <= C.value + 1), ie = r(() => new Set(j.value)), ae = r(() => M.value.flatMap((e) => {
1985
+ return e ? we(e.items, e.retainedIndices, te.value, e.fromIndex) : null;
1986
+ }), K = r(() => (H.value, Math.max(T.value, V.reservedHeight(), d.leavingPostIds.size === 0 ? G.value.height : H.value.height))), q = r(() => ({ height: `${K.value}px` })), re = r(() => !d.infiniteScroll || C.value > 0 && k.value + G.value.height <= C.value + 1), ie = r(() => new Set(j.value)), ae = r(() => M.value.flatMap((e) => {
1987
1987
  let t = d.items[e], n = G.value.items[e];
1988
1988
  return !t || !n || n.width <= 0 || n.height <= 0 ? [] : [{
1989
1989
  fetchPriority: ie.value.has(e) ? "high" : "low",
@@ -2001,11 +2001,11 @@ var cn = { class: "masonry-feed-shell" }, ln = ["aria-hidden", "inert"], un = {
2001
2001
  let t = {
2002
2002
  scrollTop: N - k.value,
2003
2003
  viewportHeight: C.value
2004
- }, n = ne.value, r = Ee(n ?? H.value, {
2004
+ }, n = ne.value, r = Ee(n ?? te.value, {
2005
2005
  ...t,
2006
2006
  overscan: e
2007
2007
  }).indices;
2008
- return J(r, d.leavingPostIds.size === 0 ? [] : Ee(H.value, {
2008
+ return J(r, d.leavingPostIds.size === 0 ? [] : Ee(te.value, {
2009
2009
  ...t,
2010
2010
  overscan: e
2011
2011
  }).indices.filter((e) => {
@@ -2046,7 +2046,7 @@ var cn = { class: "masonry-feed-shell" }, ln = ["aria-hidden", "inert"], un = {
2046
2046
  let t = G.value.items[e], n = d.items[e]?.postId;
2047
2047
  if (!t || t.width <= 0 || t.height <= 0) return {};
2048
2048
  let r = n !== void 0 && d.enteringPostIds.has(n), i = n !== void 0 && d.leavingPostIds.has(n), a = r || i ? de({
2049
- containerHeight: Math.max(T.value, V.value.height),
2049
+ containerHeight: Math.max(T.value, H.value.height),
2050
2050
  gap: x.value
2051
2051
  }) : 0, o = n === void 0 ? 0 : i ? d.removalDelays.get(n) ?? 0 : r ? d.entryDelays.get(n) ?? 0 : 0;
2052
2052
  return {
@@ -2071,7 +2071,7 @@ var cn = { class: "masonry-feed-shell" }, ln = ["aria-hidden", "inert"], un = {
2071
2071
  }
2072
2072
  function Q(e) {
2073
2073
  let t = e.currentTarget;
2074
- t && (N = t.scrollTop, B.ensurePackedThrough(z()), Y(), Date.now() >= l && !d.loadMoreLocked && d.infiniteScroll && ue(t, d.masonry?.loadMoreThresholdPx) && f("loadMore"));
2074
+ t && (N = t.scrollTop, V.ensurePackedThrough(B()), Y(), Date.now() >= l && !d.loadMoreLocked && d.infiniteScroll && ue(t, d.masonry?.loadMoreThresholdPx) && f("loadMore"));
2075
2075
  }
2076
2076
  function me() {
2077
2077
  let e = p.value;
@@ -2093,9 +2093,9 @@ var cn = { class: "masonry-feed-shell" }, ln = ["aria-hidden", "inert"], un = {
2093
2093
  }), O(p, (e) => {
2094
2094
  F?.disconnect(), F = null, e && (Z(), !(typeof ResizeObserver > "u") && (F = new ResizeObserver(Z), F.observe(e)));
2095
2095
  }), O(G, (e) => {
2096
- ee = e.items;
2096
+ z = e.items;
2097
2097
  }, { flush: "sync" }), O([
2098
- V,
2098
+ H,
2099
2099
  G,
2100
2100
  () => d.masonry
2101
2101
  ], le, { flush: "post" }), v(() => {
@@ -2294,10 +2294,10 @@ var _n = ["aria-label"], vn = /* @__PURE__ */ d({
2294
2294
  }), F = r(() => u.items[x.value]?.postId), I = r(() => u.items[x.value]), R = r(() => {
2295
2295
  let e = F.value;
2296
2296
  return e === void 0 ? 0 : u.mediaIndices.get(e) ?? 0;
2297
- }), ee = r(() => {
2297
+ }), z = r(() => {
2298
2298
  let e = F.value;
2299
2299
  return e === void 0 ? "loading" : u.previewStates.get(U(e, R.value)) ?? "loading";
2300
- }), z = r(() => I.value ? H(I.value, R.value) : null), V = r(() => z.value ? te(z.value, u.mediaSource ?? "preview") : null), W = r(() => ee.value === "ready" && !!(V.value && L(V.value.type, V.value.src))), G = r(() => [
2300
+ }), B = r(() => I.value ? te(I.value, R.value) : null), H = r(() => B.value ? ee(B.value, u.mediaSource ?? "preview") : null), W = r(() => z.value === "ready" && !!(H.value && L(H.value.type, H.value.src))), G = r(() => [
2301
2301
  F.value,
2302
2302
  R.value,
2303
2303
  u.items.length,
@@ -2306,9 +2306,9 @@ var _n = ["aria-label"], vn = /* @__PURE__ */ d({
2306
2306
  u.reelAutoAdvance.includePostItems,
2307
2307
  u.reelAutoAdvance.intervalMs
2308
2308
  ].join(":")), ne = r(() => {
2309
- let e = I.value, t = !!(e && u.reelAutoAdvance.includePostItems && R.value < B(e).length - 1), n = u.reelAutoAdvance.intervalMs / 1e3;
2309
+ let e = I.value, t = !!(e && u.reelAutoAdvance.includePostItems && R.value < V(e).length - 1), n = u.reelAutoAdvance.intervalMs / 1e3;
2310
2310
  return `Auto advance to the next ${t ? "post item" : "post"} in ${n}s`;
2311
- }), K = r(() => u.reelAutoAdvance.enabled && u.reelForward.status === "idle" && I.value !== void 0 && ee.value !== "loading" && !W.value), q = r(() => !u.infiniteScroll || u.items.length <= 1), re = r(() => u.reelForward.status === "end" && u.hasNext && !u.infiniteScroll && !u.loadMoreLocked), ie = r(() => u.reelForward.status === "loading" ? "Loading the next media…" : u.reelForward.status === "error" ? "Unable to load the next media." : re.value ? "Load the next page to continue." : "You reached the end of this feed.");
2311
+ }), K = r(() => u.reelAutoAdvance.enabled && u.reelForward.status === "idle" && I.value !== void 0 && z.value !== "loading" && !W.value), q = r(() => !u.infiniteScroll || u.items.length <= 1), re = r(() => u.reelForward.status === "end" && u.hasNext && !u.infiniteScroll && !u.loadMoreLocked), ie = r(() => u.reelForward.status === "loading" ? "Loading the next media…" : u.reelForward.status === "error" ? "Unable to load the next media." : re.value ? "Load the next page to continue." : "You reached the end of this feed.");
2312
2312
  function ae(e) {
2313
2313
  return { gridRow: `${e + 1}` };
2314
2314
  }
@@ -2353,7 +2353,7 @@ var _n = ["aria-label"], vn = /* @__PURE__ */ d({
2353
2353
  function Z(e) {
2354
2354
  let t = I.value;
2355
2355
  if (!t) return !1;
2356
- let n = B(t).length;
2356
+ let n = V(t).length;
2357
2357
  if (n <= 1) return !1;
2358
2358
  let r = (R.value + e + n) % n;
2359
2359
  return d("mediaChange", t.postId, r), !0;
@@ -2389,7 +2389,7 @@ var _n = ["aria-label"], vn = /* @__PURE__ */ d({
2389
2389
  if (!u.reelAutoAdvance.enabled) return;
2390
2390
  let e = I.value;
2391
2391
  if (!e) return;
2392
- if (u.reelAutoAdvance.includePostItems && R.value < B(e).length - 1) {
2392
+ if (u.reelAutoAdvance.includePostItems && R.value < V(e).length - 1) {
2393
2393
  d("mediaChange", e.postId, R.value + 1);
2394
2394
  return;
2395
2395
  }
@@ -2651,9 +2651,9 @@ var _n = ["aria-label"], vn = /* @__PURE__ */ d({
2651
2651
  item: e,
2652
2652
  layout: "reel",
2653
2653
  loadedCount: l.items.length,
2654
- mediaCount: B(e).length,
2654
+ mediaCount: V(e).length,
2655
2655
  mediaIndex: D.value,
2656
- mediaItem: H(e, D.value),
2656
+ mediaItem: te(e, D.value),
2657
2657
  mediaSource: l.mediaSource ?? "preview",
2658
2658
  origin: l.origin,
2659
2659
  total: l.total
@@ -2680,13 +2680,13 @@ var _n = ["aria-label"], vn = /* @__PURE__ */ d({
2680
2680
  function R(e) {
2681
2681
  return p.value?.transitionActivePost(e) ?? Promise.resolve(!1);
2682
2682
  }
2683
- function ee(e, t) {
2683
+ function z(e, t) {
2684
2684
  d("error", e, t);
2685
2685
  }
2686
- function z(e, t) {
2686
+ function B(e, t) {
2687
2687
  d("mediaChange", e, t);
2688
2688
  }
2689
- function te(e, t) {
2689
+ function ee(e, t) {
2690
2690
  d("ready", e, t);
2691
2691
  }
2692
2692
  return O(() => ({
@@ -2743,11 +2743,11 @@ var _n = ["aria-label"], vn = /* @__PURE__ */ d({
2743
2743
  state: e.state,
2744
2744
  total: e.total,
2745
2745
  onActiveChange: r[0] ||= (e) => d("activeChange", e),
2746
- onError: ee,
2746
+ onError: z,
2747
2747
  onMediaError: r[1] ||= (e, t) => d("mediaError", e, t),
2748
2748
  onLoadMore: r[2] ||= (e) => d("loadMore"),
2749
- onMediaChange: z,
2750
- onReady: te,
2749
+ onMediaChange: B,
2750
+ onReady: ee,
2751
2751
  onRetryEnd: r[3] ||= (e) => d("retryEnd"),
2752
2752
  onRetryForward: r[4] ||= (e) => d("retryForward"),
2753
2753
  onReelAudioChange: r[5] ||= (e) => d("reelAudioChange", e)
@@ -2808,7 +2808,7 @@ var Fn = /* @__PURE__ */ jn(Mn, [["render", Pn]]);
2808
2808
  function In(e, t, n, r, i) {
2809
2809
  let a = e.items.findIndex((e) => e.postId === t), o = e.items[a];
2810
2810
  if (!o) return null;
2811
- let s = V(o, n), c = H(o, s);
2811
+ let s = H(o, n), c = te(o, s);
2812
2812
  return {
2813
2813
  item: o,
2814
2814
  layout: r,
@@ -2979,7 +2979,7 @@ function Un(e, t) {
2979
2979
  let n = w("waiting"), i = typeof matchMedia == "function" ? matchMedia("(prefers-reduced-motion: reduce)") : null, a = !1, o = null, s = r(() => {
2980
2980
  let t = e.items.find((t) => t.postId === e.activeReelPostId);
2981
2981
  if (!t) return null;
2982
- let n = e.mediaIndices.get(t.postId) ?? 0, r = H(t, n);
2982
+ let n = e.mediaIndices.get(t.postId) ?? 0, r = te(t, n);
2983
2983
  return JSON.stringify([
2984
2984
  t.postId,
2985
2985
  n,
@@ -3047,13 +3047,13 @@ var Wn = ["data-reel-entry"], Gn = 35, Kn = 420, qn = /* @__PURE__ */ d({
3047
3047
  "retryForward"
3048
3048
  ],
3049
3049
  setup(t, { expose: i, emit: c }) {
3050
- let l = t, d = c, f = w(null), p = w(null), h = w(null), g = w(null), _ = w(!1), y = w(/* @__PURE__ */ new Set()), x = w(/* @__PURE__ */ new Map()), S = w(/* @__PURE__ */ new Set()), C = w(/* @__PURE__ */ new Map()), T = r(() => Object.freeze([...l.state.items])), D = r(() => ne(l.state, T.value)), { markMediaError: A, markMasonryFullyVisible: j, markMasonryVisible: M, markPreviewError: N, markPreviewReady: P, markReelError: F, markReelReady: I, originalStates: L, previewStates: R, reelStates: ee, resetMediaLifecycle: z } = Rn(l.state, {
3050
+ let l = t, d = c, f = w(null), p = w(null), h = w(null), g = w(null), _ = w(!1), y = w(/* @__PURE__ */ new Set()), x = w(/* @__PURE__ */ new Map()), S = w(/* @__PURE__ */ new Set()), C = w(/* @__PURE__ */ new Map()), T = r(() => Object.freeze([...l.state.items])), D = r(() => ne(l.state, T.value)), { markMediaError: A, markMasonryFullyVisible: j, markMasonryVisible: M, markPreviewError: N, markPreviewReady: P, markReelError: F, markReelReady: I, originalStates: L, previewStates: R, reelStates: z, resetMediaLifecycle: B } = Rn(l.state, {
3051
3051
  error: (e) => d("mediaError", e),
3052
3052
  fullyVisible: (e) => d("mediaFullyVisible", e),
3053
3053
  ready: (e) => d("mediaReady", e),
3054
3054
  reelChange: (e) => d("reelMediaChange", e),
3055
3055
  visible: (e) => d("mediaVisible", e)
3056
- }), { phase: te, finishSlide: H, finishFade: U, markSettled: W } = Un(l.state, h), G = new Set(l.state.items.map((e) => e.postId)), K = null, q = null, re = !1;
3056
+ }), { phase: ee, finishSlide: te, finishFade: U, markSettled: W } = Un(l.state, h), G = new Set(l.state.items.map((e) => e.postId)), K = null, q = null, re = !1;
3057
3057
  function ie() {
3058
3058
  return typeof window.matchMedia == "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
3059
3059
  }
@@ -3067,7 +3067,7 @@ var Wn = ["data-reel-entry"], Gn = 35, Kn = 420, qn = /* @__PURE__ */ d({
3067
3067
  function J(e, t) {
3068
3068
  let n = l.state.items.find((t) => t.postId === e);
3069
3069
  if (!n) return;
3070
- let r = V(n, t);
3070
+ let r = H(n, t);
3071
3071
  (l.state.mediaIndices.get(e) ?? 0) !== r && (l.state.mediaIndices = new Map(l.state.mediaIndices).set(e, r));
3072
3072
  }
3073
3073
  async function oe() {
@@ -3083,7 +3083,7 @@ var Wn = ["data-reel-entry"], Gn = 35, Kn = 420, qn = /* @__PURE__ */ d({
3083
3083
  if (!(l.state.layout === "reel" || l.state.reelOrigin === "masonry") || l.state.isLoading) return "reel-inactive";
3084
3084
  let t = l.state.items.find((t) => t.postId === e.postId);
3085
3085
  if (!t) return "not-found";
3086
- let n = B(t).findIndex((t) => t.mediaId === e.mediaId);
3086
+ let n = V(t).findIndex((t) => t.mediaId === e.mediaId);
3087
3087
  return n < 0 ? "not-found" : p.value?.navigateToItem?.(e.postId, n) ? "navigated" : "reel-inactive";
3088
3088
  }
3089
3089
  function Y() {
@@ -3163,7 +3163,8 @@ var Wn = ["data-reel-entry"], Gn = 35, Kn = 420, qn = /* @__PURE__ */ d({
3163
3163
  loadIfNearBottom: oe,
3164
3164
  moveActiveReelPost: ce,
3165
3165
  navigateToReelItem: ue,
3166
- resetMediaLifecycle: z,
3166
+ openReel: (e) => X(e, "keyboard"),
3167
+ resetMediaLifecycle: B,
3167
3168
  startItemRemoval: Z,
3168
3169
  transitionActiveReelMedia: (e) => p.value?.transitionActiveMedia?.(e) ?? Promise.resolve(!1),
3169
3170
  transitionActiveReelPost: (e) => p.value?.transitionActivePost?.(e) ?? Promise.resolve(!1)
@@ -3196,7 +3197,7 @@ var Wn = ["data-reel-entry"], Gn = 35, Kn = 420, qn = /* @__PURE__ */ d({
3196
3197
  "info-sheet-overlay": t.state.reelInfoSheetOverlay,
3197
3198
  "next-page-error": !!t.state.nextPageError,
3198
3199
  origin: "reel",
3199
- "preview-states": E(ee),
3200
+ "preview-states": E(z),
3200
3201
  "reel-auto-advance": t.state.reelAutoAdvance,
3201
3202
  "reel-audio-state": t.reelAudioState,
3202
3203
  "reel-forward": t.state.reelForward,
@@ -3261,7 +3262,7 @@ var Wn = ["data-reel-entry"], Gn = 35, Kn = 420, qn = /* @__PURE__ */ d({
3261
3262
  onVisible: E(M)
3262
3263
  }, null, 8, /* @__PURE__ */ "can-retry-end.entering-post-ids.entry-delays.leaving-post-ids.removal-delays.card-footer.card-header.feed-footer.feed-footer-actions.media-card.masonry.has-next.infinite-scroll.is-loading-more.items.load-more-locked.media-indices.next-page-error.preview-states.suspended.state.total.onError.onFullyVisible.onReady.onVisible".split(".")), u(n, {
3263
3264
  name: "vibe-reel-viewer",
3264
- onAfterEnter: E(H),
3265
+ onAfterEnter: E(te),
3265
3266
  onAfterLeave: he
3266
3267
  }, {
3267
3268
  default: k(() => [t.state.reelOrigin === "masonry" ? (b(), s("section", {
@@ -3269,7 +3270,7 @@ var Wn = ["data-reel-entry"], Gn = 35, Kn = 420, qn = /* @__PURE__ */ d({
3269
3270
  ref_key: "reelOverlay",
3270
3271
  ref: h,
3271
3272
  class: "vibe-reel-overlay",
3272
- "data-reel-entry": E(te),
3273
+ "data-reel-entry": E(ee),
3273
3274
  role: "dialog",
3274
3275
  "aria-label": "Media viewer",
3275
3276
  "aria-modal": "true",
@@ -3279,7 +3280,7 @@ var Wn = ["data-reel-entry"], Gn = 35, Kn = 420, qn = /* @__PURE__ */ d({
3279
3280
  }, [u(An, {
3280
3281
  ref_key: "reelRenderer",
3281
3282
  ref: p,
3282
- "entry-pending": E(te) !== "ready",
3283
+ "entry-pending": E(ee) !== "ready",
3283
3284
  "can-retry-end": t.canRetryEnd,
3284
3285
  "card-footer": t.cardFooter,
3285
3286
  "card-header": t.cardHeader,
@@ -3321,7 +3322,7 @@ var Wn = ["data-reel-entry"], Gn = 35, Kn = 420, qn = /* @__PURE__ */ d({
3321
3322
  onRetryEnd: i[18] ||= (e) => d("retryEnd"),
3322
3323
  onRetryForward: i[19] ||= (e) => d("retryForward"),
3323
3324
  onReelAudioChange: i[20] ||= (e) => d("reelAudioChange", e)
3324
- }, null, 8, /* @__PURE__ */ "entry-pending.can-retry-end.card-footer.card-header.feed-footer.feed-footer-actions.forward-index.forward-item.media-card.has-next.infinite-scroll.initial-post-id.info-sheet.info-sheet-enabled.info-sheet-overlay.is-loading-more.items.load-more-locked.media-indices.next-page-error.preview-states.reel-auto-advance.reel-audio-state.reel-forward.state.total".split(".")), E(te) === "waiting" ? (b(), a(Fn, { key: 0 })) : o("", !0)], 40, Wn)) : o("", !0)]),
3325
+ }, null, 8, /* @__PURE__ */ "entry-pending.can-retry-end.card-footer.card-header.feed-footer.feed-footer-actions.forward-index.forward-item.media-card.has-next.infinite-scroll.initial-post-id.info-sheet.info-sheet-enabled.info-sheet-overlay.is-loading-more.items.load-more-locked.media-indices.next-page-error.preview-states.reel-auto-advance.reel-audio-state.reel-forward.state.total".split(".")), E(ee) === "waiting" ? (b(), a(Fn, { key: 0 })) : o("", !0)], 40, Wn)) : o("", !0)]),
3325
3326
  _: 1
3326
3327
  }, 8, ["onAfterEnter"])], 64))], 512));
3327
3328
  }
@@ -4457,7 +4458,7 @@ var si = class {
4457
4458
  let e = this.options.surface()?.getAutoScrollElement();
4458
4459
  e && (e.scrollTop = 0);
4459
4460
  }
4460
- e.mediaIndices = new Map(a.map((t) => [t.postId, V(t, e.mediaIndices.get(t.postId) ?? 0)])), e.activeReelPostId !== null && !o.has(String(e.activeReelPostId)) && (e.activeReelPostId = null, e.reelOrigin = null), e.items = a, e.next = n.next, e.total = n.total ?? null, e.error = null, e.nextPageError = null, this.options.commit({
4461
+ e.mediaIndices = new Map(a.map((t) => [t.postId, H(t, e.mediaIndices.get(t.postId) ?? 0)])), e.activeReelPostId !== null && !o.has(String(e.activeReelPostId)) && (e.activeReelPostId = null, e.reelOrigin = null), e.items = a, e.next = n.next, e.total = n.total ?? null, e.error = null, e.nextPageError = null, this.options.commit({
4461
4462
  ...n,
4462
4463
  items: a
4463
4464
  });
@@ -4648,7 +4649,7 @@ var gi = class {
4648
4649
  hi(e);
4649
4650
  let t = this.state.items.findIndex(({ postId: t }) => t === e.postId), n = this.state.items[t];
4650
4651
  if (!n) return null;
4651
- let r = [...B(n)], i = r[e.mediaIndex];
4652
+ let r = [...V(n)], i = r[e.mediaIndex];
4652
4653
  if (!i) return null;
4653
4654
  let a = Object.freeze({
4654
4655
  media: i,
@@ -4687,7 +4688,7 @@ var gi = class {
4687
4688
  return this.state.layout === "reel" || this.state.reelOrigin === "masonry";
4688
4689
  }
4689
4690
  restoreIntoPost(e, t) {
4690
- let n = this.state.items[e], r = [...B(n)], i = Math.min(t.mediaIndex, r.length);
4691
+ let n = this.state.items[e], r = [...V(n)], i = Math.min(t.mediaIndex, r.length);
4691
4692
  if (r.splice(i, 0, t.media), this.state.items[e] = mi(n, r), this.state.activeReelPostId !== t.postId) return;
4692
4693
  let a = this.state.mediaIndices.get(t.postId) ?? 0;
4693
4694
  a >= i && this.state.mediaIndices.set(t.postId, a + 1);
@@ -4695,7 +4696,7 @@ var gi = class {
4695
4696
  updateMediaIndexAfterRemoval(e, t, n) {
4696
4697
  let r = this.state.items.find((t) => t.postId === e);
4697
4698
  if (!r) return;
4698
- let i = B(r).length, a = this.state.mediaIndices.get(e) ?? 0, o = a;
4699
+ let i = V(r).length, a = this.state.mediaIndices.get(e) ?? 0, o = a;
4699
4700
  n ? o = t < i ? t : 0 : t < a && (o = a - 1), this.state.mediaIndices.set(e, Math.min(o, i - 1));
4700
4701
  }
4701
4702
  };
@@ -4927,7 +4928,7 @@ var bi = 20, xi = class {
4927
4928
  if (!n) return;
4928
4929
  let r = t.mediaIndices.get(e.postId) ?? 0;
4929
4930
  if (e.mediaIndex === r) {
4930
- if (B(n).length > 1) {
4931
+ if (V(n).length > 1) {
4931
4932
  await this.options.transitionMedia(1);
4932
4933
  return;
4933
4934
  }
@@ -5091,31 +5092,36 @@ var ji = class {
5091
5092
  }
5092
5093
  };
5093
5094
  //#endregion
5095
+ //#region src/core/reelViewer.ts
5096
+ function Pi(e, t, n) {
5097
+ e.layout !== "masonry" || !e.items.some((e) => e.postId === n) || (e.activeReelPostId = n, e.reelOrigin = "masonry", t.syncReel(n));
5098
+ }
5099
+ //#endregion
5094
5100
  //#region src/core/updateItems.ts
5095
- function Pi(e) {
5101
+ function Fi(e) {
5096
5102
  return String(e);
5097
5103
  }
5098
- function Fi(e, t) {
5099
- let n = B(t).length;
5104
+ function Ii(e, t) {
5105
+ let n = V(t).length;
5100
5106
  (e.mediaIndices.get(t.postId) ?? 0) >= n && e.mediaIndices.set(t.postId, Math.max(0, n - 1));
5101
5107
  }
5102
- function Ii(e, t) {
5108
+ function Li(e, t) {
5103
5109
  let n = /* @__PURE__ */ new Map();
5104
- if (t.forEach((e) => n.set(Pi(e.postId), e)), n.size === 0) return [];
5110
+ if (t.forEach((e) => n.set(Fi(e.postId), e)), n.size === 0) return [];
5105
5111
  let r = [], i = e.items.map((t) => {
5106
- let i = n.get(Pi(t.postId));
5112
+ let i = n.get(Fi(t.postId));
5107
5113
  if (!i) return t;
5108
5114
  let a = {
5109
5115
  ...i,
5110
5116
  postId: t.postId
5111
5117
  };
5112
- return Fi(e, a), e.reelForwardItem && Pi(e.reelForwardItem.postId) === Pi(t.postId) && (e.reelForwardItem = a), r.push(t.postId), a;
5118
+ return Ii(e, a), e.reelForwardItem && Fi(e.reelForwardItem.postId) === Fi(t.postId) && (e.reelForwardItem = a), r.push(t.postId), a;
5113
5119
  });
5114
5120
  return r.length > 0 && (e.items = i), r;
5115
5121
  }
5116
5122
  //#endregion
5117
5123
  //#region src/core/createVibe.ts
5118
- var Li = class {
5124
+ var Ri = class {
5119
5125
  app = null;
5120
5126
  autoScroll;
5121
5127
  autofillController;
@@ -5218,7 +5224,7 @@ var Li = class {
5218
5224
  onLoadMore: () => {
5219
5225
  this.loadNext();
5220
5226
  },
5221
- onOpenReel: (e) => this.openMasonryReel(e),
5227
+ onOpenReel: (e) => Pi(this.state, this.routing, e),
5222
5228
  onReelInfoSheetChange: (e) => this.setReelInfoSheet(e),
5223
5229
  onReelAudioChange: (e) => this.reelAudio.set(e, !0),
5224
5230
  onRetryEnd: () => {
@@ -5262,7 +5268,7 @@ var Li = class {
5262
5268
  return this.itemRemoval.restoreRemoval(e);
5263
5269
  }
5264
5270
  updateItems(e) {
5265
- return Ii(this.state, e);
5271
+ return Li(this.state, e);
5266
5272
  }
5267
5273
  retryReelForward() {
5268
5274
  return this.reelForward.retry();
@@ -5442,12 +5448,12 @@ var Li = class {
5442
5448
  setLayout(e) {
5443
5449
  this.responsiveLayout.setLayout(e);
5444
5450
  }
5451
+ openReel(e) {
5452
+ this.state.layout !== "masonry" || !this.state.items.some((t) => t.postId === e) || this.surface?.openReel(e);
5453
+ }
5445
5454
  closeMasonryReel() {
5446
5455
  this.state.reelOrigin === "masonry" && (this.state.activeReelPostId = null, this.state.reelOrigin = null, this.routing.syncFeed());
5447
5456
  }
5448
- openMasonryReel(e) {
5449
- this.state.layout === "masonry" && this.state.items.some((t) => t.postId === e) && (this.state.activeReelPostId = e, this.state.reelOrigin = "masonry", this.routing.syncReel(e));
5450
- }
5451
5457
  setActiveReelPost(e) {
5452
5458
  this.state.layout !== "reel" && this.state.reelOrigin !== "masonry" || (this.state.activeReelPostId = e, this.routing.syncReel(e));
5453
5459
  }
@@ -5502,6 +5508,6 @@ var Li = class {
5502
5508
  setCurrentCursor(e) {
5503
5509
  this.lastLoadedCursor = this.state.current = e;
5504
5510
  }
5505
- }, Ri = (e) => new Li(e);
5511
+ }, zi = (e) => new Ri(e);
5506
5512
  //#endregion
5507
- export { Ri as createVibe };
5513
+ export { zi as createVibe };
@@ -0,0 +1,49 @@
1
+ import type { VibeAutofillSessionSnapshot, VibeBackendAutofillUpdate, VibeBackendFillUpdate, VibeFillSessionSnapshot, VibeFillTarget, VibeItem, VibeItemId, VibeItemPlacement, VibeLayoutMode, VibeMediaRemoval, VibeMediaTarget, VibePage, VibeReelAudioState, VibeReelAutoAdvanceOptions, VibeReelItemTarget, VibeReelNavigationResult, VibeRemoval, VibeState } from './types';
2
+ export interface VibeInstance {
3
+ appendPage: (page: VibePage) => void;
4
+ applyAutofillUpdate: (update: VibeBackendAutofillUpdate) => boolean;
5
+ applyFillUpdate: (update: VibeBackendFillUpdate) => boolean;
6
+ cancelAutofill: () => Promise<void>;
7
+ cancelFill: () => Promise<void>;
8
+ cancelLoading: () => Promise<void>;
9
+ destroy: () => void;
10
+ fill: (target: VibeFillTarget) => Promise<void>;
11
+ getState: () => VibeState;
12
+ getReelAudioState: () => VibeReelAudioState;
13
+ loadNext: () => Promise<void>;
14
+ mount: () => Promise<void>;
15
+ navigateToReelItem: (target: VibeReelItemTarget) => VibeReelNavigationResult;
16
+ /** Open a loaded post as a closable viewer without switching the feed layout. */
17
+ openReel: (postId: VibeItemId) => void;
18
+ nextReelMediaItem: () => boolean;
19
+ nextReelPost: () => boolean;
20
+ pauseAutoScroll: () => void;
21
+ previousReelMediaItem: () => boolean;
22
+ previousReelPost: () => boolean;
23
+ replenishAfterRemoval: () => Promise<void>;
24
+ refresh: () => Promise<void>;
25
+ reload: () => Promise<void>;
26
+ replacePage: (page: VibePage, options?: import('./core/pageReplacement').VibePageReplacementOptions) => Promise<void>;
27
+ removeMedia: (target: VibeMediaTarget) => VibeMediaRemoval | null;
28
+ removeMediaAnimated?: (target: VibeMediaTarget) => Promise<VibeMediaRemoval | null>;
29
+ removeItems: (postIds: readonly VibeItemId[], options?: import('./core/itemRemovalOptions').VibeItemRemovalOptions) => Promise<VibeRemoval>;
30
+ resumeAutoScroll: () => void;
31
+ restoreAutofillSession: (snapshot: VibeAutofillSessionSnapshot) => boolean;
32
+ restoreFillSession: (snapshot: VibeFillSessionSnapshot) => boolean;
33
+ restoreItems: (placements: readonly VibeItemPlacement[]) => void;
34
+ restoreMediaRemoval: (removal: VibeMediaRemoval) => boolean;
35
+ restoreRemoval: (removal: VibeRemoval) => boolean;
36
+ retryReelForward: () => Promise<void>;
37
+ retryFill: () => Promise<void>;
38
+ setAutoScroll: (enabled: boolean, speedPxPerSecond?: number) => void;
39
+ setAutoScrollSpeed: (speedPxPerSecond: number) => void;
40
+ setInfiniteScroll: (enabled: boolean) => void;
41
+ setLayout: (layout: VibeLayoutMode) => void;
42
+ setLoadMoreLocked: (locked: boolean) => void;
43
+ setTotal: (total: number | null) => void;
44
+ setReelAutoAdvance: (update: boolean | VibeReelAutoAdvanceOptions) => void;
45
+ setReelAudioState: (state: VibeReelAudioState) => void;
46
+ setReelInfoSheet: (enabled: boolean) => void;
47
+ undoLastRemoval: () => VibeRemoval | null;
48
+ updateItems: (items: readonly VibeItem[]) => VibeItemId[];
49
+ }
package/lib/types.d.ts CHANGED
@@ -391,49 +391,4 @@ export interface VibeState {
391
391
  reelOrigin: 'masonry' | null;
392
392
  total: number | null;
393
393
  }
394
- export interface VibeInstance {
395
- appendPage: (page: VibePage) => void;
396
- applyAutofillUpdate: (update: VibeBackendAutofillUpdate) => boolean;
397
- applyFillUpdate: (update: VibeBackendFillUpdate) => boolean;
398
- cancelAutofill: () => Promise<void>;
399
- cancelFill: () => Promise<void>;
400
- cancelLoading: () => Promise<void>;
401
- destroy: () => void;
402
- fill: (target: VibeFillTarget) => Promise<void>;
403
- getState: () => VibeState;
404
- getReelAudioState: () => VibeReelAudioState;
405
- loadNext: () => Promise<void>;
406
- mount: () => Promise<void>;
407
- navigateToReelItem: (target: VibeReelItemTarget) => VibeReelNavigationResult;
408
- nextReelMediaItem: () => boolean;
409
- nextReelPost: () => boolean;
410
- pauseAutoScroll: () => void;
411
- previousReelMediaItem: () => boolean;
412
- previousReelPost: () => boolean;
413
- replenishAfterRemoval: () => Promise<void>;
414
- refresh: () => Promise<void>;
415
- reload: () => Promise<void>;
416
- replacePage: (page: VibePage, options?: import('./core/pageReplacement').VibePageReplacementOptions) => Promise<void>;
417
- removeMedia: (target: VibeMediaTarget) => VibeMediaRemoval | null;
418
- removeMediaAnimated?: (target: VibeMediaTarget) => Promise<VibeMediaRemoval | null>;
419
- removeItems: (postIds: readonly VibeItemId[], options?: import('./core/itemRemovalOptions').VibeItemRemovalOptions) => Promise<VibeRemoval>;
420
- resumeAutoScroll: () => void;
421
- restoreAutofillSession: (snapshot: VibeAutofillSessionSnapshot) => boolean;
422
- restoreFillSession: (snapshot: VibeFillSessionSnapshot) => boolean;
423
- restoreItems: (placements: readonly VibeItemPlacement[]) => void;
424
- restoreMediaRemoval: (removal: VibeMediaRemoval) => boolean;
425
- restoreRemoval: (removal: VibeRemoval) => boolean;
426
- retryReelForward: () => Promise<void>;
427
- retryFill: () => Promise<void>;
428
- setAutoScroll: (enabled: boolean, speedPxPerSecond?: number) => void;
429
- setAutoScrollSpeed: (speedPxPerSecond: number) => void;
430
- setInfiniteScroll: (enabled: boolean) => void;
431
- setLayout: (layout: VibeLayoutMode) => void;
432
- setLoadMoreLocked: (locked: boolean) => void;
433
- setTotal: (total: number | null) => void;
434
- setReelAutoAdvance: (update: boolean | VibeReelAutoAdvanceOptions) => void;
435
- setReelAudioState: (state: VibeReelAudioState) => void;
436
- setReelInfoSheet: (enabled: boolean) => void;
437
- undoLastRemoval: () => VibeRemoval | null;
438
- updateItems: (items: readonly VibeItem[]) => VibeItemId[];
439
- }
394
+ export type { VibeInstance } from './instance';