@wix/himalaya-cli 0.1557.0 → 0.1558.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.
Files changed (53) hide show
  1. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/schema.d.ts +6 -4
  2. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/media/src/index.d.ts +1 -1
  3. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/core.mjs +2 -2
  4. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-events.mjs +1 -0
  5. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-media.mjs +1 -0
  6. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-rich-content.mjs +1 -0
  7. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-stores-collections.mjs +1 -0
  8. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-stores.mjs +1 -0
  9. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-video.mjs +1 -0
  10. package/dist/cli.mjs +164 -61
  11. package/dist/preview-assets.generated.bin +0 -0
  12. package/guides/getting-started.md +4 -1
  13. package/guides/himi-json-output.md +8 -0
  14. package/guides/himi-skill.md +4 -1
  15. package/guides/one-app-to-himi-app.md +18 -6
  16. package/guides/sdk-reference.json +2 -2
  17. package/guides/skill.md +4 -1
  18. package/guides/splash-screens.md +22 -1
  19. package/package.json +2 -2
  20. package/templates/beauty-salon/tier5-src/_shared/himi-media.ts +29 -0
  21. package/templates/beauty-salon/tier5-src/himi-branded-lite-home/index.ts +3 -4
  22. package/templates/branded-lite/tier5-src/_shared/himi-media.ts +29 -0
  23. package/templates/branded-lite/tier5-src/himi-branded-lite-group/index.ts +3 -6
  24. package/templates/branded-lite/tier5-src/himi-branded-lite-groups/index.ts +2 -15
  25. package/templates/branded-lite/tier5-src/himi-branded-lite-home/index.ts +3 -4
  26. package/templates/branded-lite/tier5-src/himi-branded-lite-program/index.ts +3 -9
  27. package/templates/branded-lite/tier5-src/himi-branded-lite-programs/index.ts +1 -9
  28. package/templates/community-club/tier5-src/_shared/himi-media.ts +29 -0
  29. package/templates/community-club/tier5-src/himi-branded-lite-group/index.ts +3 -6
  30. package/templates/community-club/tier5-src/himi-branded-lite-groups/index.ts +2 -15
  31. package/templates/community-club/tier5-src/himi-branded-lite-home/index.ts +3 -4
  32. package/templates/events-meetups/tier5-src/_shared/himi-media.ts +29 -0
  33. package/templates/events-meetups/tier5-src/himi-branded-lite-group/index.ts +3 -6
  34. package/templates/events-meetups/tier5-src/himi-branded-lite-groups/index.ts +2 -15
  35. package/templates/events-meetups/tier5-src/himi-branded-lite-home/index.ts +3 -4
  36. package/templates/gym-fitness/tier5-src/_shared/himi-media.ts +29 -0
  37. package/templates/gym-fitness/tier5-src/himi-branded-lite-home/index.ts +3 -4
  38. package/templates/nonprofit-cause/tier5-src/_shared/himi-media.ts +29 -0
  39. package/templates/nonprofit-cause/tier5-src/himi-branded-lite-group/index.ts +3 -6
  40. package/templates/nonprofit-cause/tier5-src/himi-branded-lite-groups/index.ts +2 -15
  41. package/templates/nonprofit-cause/tier5-src/himi-branded-lite-home/index.ts +3 -4
  42. package/templates/podcast-creator/tier5-src/_shared/himi-media.ts +29 -0
  43. package/templates/podcast-creator/tier5-src/himi-branded-lite-home/index.ts +3 -4
  44. package/templates/portfolio-creative/tier5-src/_shared/himi-media.ts +29 -0
  45. package/templates/portfolio-creative/tier5-src/himi-branded-lite-home/index.ts +3 -4
  46. package/templates/restaurant/tier5-src/_shared/himi-media.ts +29 -0
  47. package/templates/restaurant/tier5-src/himi-branded-lite-home/index.ts +3 -4
  48. package/templates/retail-store/tier5-src/_shared/himi-media.ts +29 -0
  49. package/templates/retail-store/tier5-src/himi-branded-lite-home/index.ts +3 -4
  50. package/templates/yoga-studio/tier5-src/_shared/himi-media.ts +29 -0
  51. package/templates/yoga-studio/tier5-src/himi-branded-lite-home/index.ts +3 -4
  52. package/templates/yoga-studio/tier5-src/himi-branded-lite-program/index.ts +3 -9
  53. package/templates/yoga-studio/tier5-src/himi-branded-lite-programs/index.ts +1 -9
@@ -3211,12 +3211,14 @@ export interface SplashConfig {
3211
3211
  /** Hard ceiling on the readiness hold, ms — a stuck boot can never wedge the
3212
3212
  * UI. 0 / absent ⇒ 3000. Clamped client-side to [0, 8000]. */
3213
3213
  maxHoldMs?: number;
3214
- /** RFC 0062 — what readiness waits for beyond the seed. Absent / "" ⇒ seeded is
3215
- * enough. "first_content" ⇒ also the first WebView page (a site shell), still
3216
- * under `maxHoldMs`. Unknown coalesces to "" on device. */
3214
+ /** RFC 0062 — what readiness waits for beyond the seed. Absent / "" ⇒ the first
3215
+ * screen's paint, where the shell mounts its content under the splash (every shell
3216
+ * built on `HimalayaLaunchGate` / `awaitingFirstScreen`), else the seed alone.
3217
+ * "seeded" ⇒ the seed alone, always. "first_content" ⇒ the first WebView page (a
3218
+ * site shell). All still under `maxHoldMs`. Unknown coalesces to "" on device. */
3217
3219
  readySignal?: SplashReadySignal;
3218
3220
  }
3219
- export type SplashReadySignal = "" | "first_content";
3221
+ export type SplashReadySignal = "" | "seeded" | "first_content";
3220
3222
  export interface DeepLinkPattern {
3221
3223
  /** e.g. "wix-owner://blog/post/:id" */
3222
3224
  pattern: string;
@@ -20,7 +20,7 @@ export declare const WIX_DETAIL_IMAGE: WixImageSize;
20
20
  * measured at 2.4MB versus 220KB for the same 1000px render. JPEG at q85 is ~18x
21
21
  * smaller than the original across the amit1 catalog (50.5MB -> 2.7MB).
22
22
  *
23
- * Wix image handles and bare media ids are resolved before sizing. Existing `fit`
23
+ * Wix image handles, relative `media/<id>` paths and bare media ids are resolved before sizing. Existing `fit`
24
24
  * and `fill` transforms are rebuilt inside the requested pixel budget — scaled to
25
25
  * the transform's OWN aspect ratio, never upscaled — while their framing
26
26
  * parameters remain intact. Other transform modes and non-Wix HTTP(S) URLs stay
@@ -7976,7 +7976,7 @@ function validateSiteNav(site) {
7976
7976
  var SPLASH_MIN_VISIBLE_MS_MAX = 2e3;
7977
7977
  var SPLASH_MAX_HOLD_MS_MAX = 8e3;
7978
7978
  var SPLASH_LAYOUTS = ["centered", "centeredStacked", "logoOnly"];
7979
- var SPLASH_READY_SIGNALS = ["", "first_content"];
7979
+ var SPLASH_READY_SIGNALS = ["", "seeded", "first_content"];
7980
7980
  function validateA11y(a11y) {
7981
7981
  if (!a11y || typeof a11y !== "object" || Array.isArray(a11y)) {
7982
7982
  throw new Error('defineApp: a11y must be an object like { enforce: "warn" }.');
@@ -8112,7 +8112,7 @@ function validateSplash(splash, colors, tokensPath) {
8112
8112
  }
8113
8113
  if (splash.readySignal !== void 0 && !SPLASH_READY_SIGNALS.includes(splash.readySignal)) {
8114
8114
  throw new Error(
8115
- `defineApp: splash.readySignal "${splash.readySignal}" is not one of "", "first_content".`
8115
+ `defineApp: splash.readySignal "${splash.readySignal}" is not one of "", "seeded", "first_content".`
8116
8116
  );
8117
8117
  }
8118
8118
  for (const [field, value, max] of [
@@ -12,6 +12,7 @@ function wixMediaId(reference) {
12
12
  return WIX_IMAGE.exec(reference)?.[1] ?? (reference.includes("/") || reference.includes(":") ? "" : reference);
13
13
  }
14
14
  function resolveWixMediaReference(reference) {
15
+ if (/^\/?media\/[^/]/.test(reference)) return `https://static.wixstatic.com/${reference.replace(/^\//, "")}`;
15
16
  const mediaId = wixMediaId(reference);
16
17
  return mediaId ? `https://static.wixstatic.com/media/${mediaId}` : reference;
17
18
  }
@@ -13,6 +13,7 @@ function wixMediaId(reference) {
13
13
  return WIX_IMAGE.exec(reference)?.[1] ?? (reference.includes("/") || reference.includes(":") ? "" : reference);
14
14
  }
15
15
  function resolveWixMediaReference(reference) {
16
+ if (/^\/?media\/[^/]/.test(reference)) return `https://static.wixstatic.com/${reference.replace(/^\//, "")}`;
16
17
  const mediaId = wixMediaId(reference);
17
18
  return mediaId ? `https://static.wixstatic.com/media/${mediaId}` : reference;
18
19
  }
@@ -13,6 +13,7 @@ function wixMediaId(reference) {
13
13
  return WIX_IMAGE.exec(reference)?.[1] ?? (reference.includes("/") || reference.includes(":") ? "" : reference);
14
14
  }
15
15
  function resolveWixMediaReference(reference) {
16
+ if (/^\/?media\/[^/]/.test(reference)) return `https://static.wixstatic.com/${reference.replace(/^\//, "")}`;
16
17
  const mediaId = wixMediaId(reference);
17
18
  return mediaId ? `https://static.wixstatic.com/media/${mediaId}` : reference;
18
19
  }
@@ -12,6 +12,7 @@ function wixMediaId(reference) {
12
12
  return WIX_IMAGE.exec(reference)?.[1] ?? (reference.includes("/") || reference.includes(":") ? "" : reference);
13
13
  }
14
14
  function resolveWixMediaReference(reference) {
15
+ if (/^\/?media\/[^/]/.test(reference)) return `https://static.wixstatic.com/${reference.replace(/^\//, "")}`;
15
16
  const mediaId = wixMediaId(reference);
16
17
  return mediaId ? `https://static.wixstatic.com/media/${mediaId}` : reference;
17
18
  }
@@ -252,6 +252,7 @@ function wixMediaId(reference) {
252
252
  return WIX_IMAGE.exec(reference)?.[1] ?? (reference.includes("/") || reference.includes(":") ? "" : reference);
253
253
  }
254
254
  function resolveWixMediaReference(reference) {
255
+ if (/^\/?media\/[^/]/.test(reference)) return `https://static.wixstatic.com/${reference.replace(/^\//, "")}`;
255
256
  const mediaId = wixMediaId(reference);
256
257
  return mediaId ? `https://static.wixstatic.com/media/${mediaId}` : reference;
257
258
  }
@@ -12,6 +12,7 @@ function wixMediaId(reference) {
12
12
  return WIX_IMAGE.exec(reference)?.[1] ?? (reference.includes("/") || reference.includes(":") ? "" : reference);
13
13
  }
14
14
  function resolveWixMediaReference(reference) {
15
+ if (/^\/?media\/[^/]/.test(reference)) return `https://static.wixstatic.com/${reference.replace(/^\//, "")}`;
15
16
  const mediaId = wixMediaId(reference);
16
17
  return mediaId ? `https://static.wixstatic.com/media/${mediaId}` : reference;
17
18
  }
package/dist/cli.mjs CHANGED
@@ -13917,6 +13917,7 @@ function wixMediaId(reference) {
13917
13917
  return WIX_IMAGE.exec(reference)?.[1] ?? (reference.includes("/") || reference.includes(":") ? "" : reference);
13918
13918
  }
13919
13919
  function resolveWixMediaReference(reference) {
13920
+ if (/^\/?media\/[^/]/.test(reference)) return `https://static.wixstatic.com/${reference.replace(/^\//, "")}`;
13920
13921
  const mediaId = wixMediaId(reference);
13921
13922
  return mediaId ? `https://static.wixstatic.com/media/${mediaId}` : reference;
13922
13923
  }
@@ -24610,6 +24611,7 @@ function resolveIdiom(tokens2, ctx = {}) {
24610
24611
  var IDIOM_CONTEXTS, UNSAFE_KEYS;
24611
24612
  var init_idiom = __esm({
24612
24613
  "../../core/ts/src/idiom.ts"() {
24614
+ "use strict";
24613
24615
  IDIOM_CONTEXTS = {
24614
24616
  ios: { native: ["ios"] },
24615
24617
  android: { native: ["material"] },
@@ -33595,6 +33597,34 @@ function useEveryRowForFindAndPrint(on4, showEveryRow) {
33595
33597
  };
33596
33598
  }, [on4]);
33597
33599
  }
33600
+ function usePageCycle(ctx, raw) {
33601
+ const bound2 = typeof raw === "string" && isBinding(raw);
33602
+ const provider = ctx.provider;
33603
+ const owner = React3.useRef(null);
33604
+ if (!owner.current) {
33605
+ owner.current = new PageCycle(bound2 ? provider ? cursorString(provider.value(servicePath(raw))) : "" : String(raw ?? ""));
33606
+ }
33607
+ const pages2 = owner.current;
33608
+ React3.useEffect(() => {
33609
+ if (!bound2) {
33610
+ pages2.publish(String(raw ?? ""));
33611
+ return;
33612
+ }
33613
+ if (!provider) {
33614
+ pages2.publish("");
33615
+ return;
33616
+ }
33617
+ return provider.subscribe(servicePath(raw), (v2) => pages2.publish(cursorString(v2)));
33618
+ }, [bound2, raw, provider, pages2]);
33619
+ return pages2;
33620
+ }
33621
+ function usePageCycleId(pages2) {
33622
+ return React3.useSyncExternalStore(
33623
+ React3.useCallback((cb) => pages2.listen(cb), [pages2]),
33624
+ () => pages2.cycle,
33625
+ () => pages2.cycle
33626
+ );
33627
+ }
33598
33628
  function templateReadsService(template) {
33599
33629
  let reads2 = readsService.get(template);
33600
33630
  if (reads2 === void 0) {
@@ -33619,7 +33649,7 @@ function sameJson(a2, b2) {
33619
33649
  }
33620
33650
  return true;
33621
33651
  }
33622
- var resolveScalarStatic, Bound, BOUND_LIST_WINDOW_START, BOUND_LIST_WINDOW_STEP, BoundListWindowContext, WindowGrowth, BoundList, readsService, BoundRow;
33652
+ var resolveScalarStatic, Bound, BOUND_LIST_WINDOW_START, BOUND_LIST_WINDOW_STEP, BoundListWindowContext, WindowGrowth, PageCycle, PageCycleContext, cursorString, BoundList, readsService, BoundRow;
33623
33653
  var init_bindings2 = __esm({
33624
33654
  "../../core/web-renderer/src/bindings.tsx"() {
33625
33655
  "use strict";
@@ -33643,7 +33673,7 @@ var init_bindings2 = __esm({
33643
33673
  BOUND_LIST_WINDOW_START = 30;
33644
33674
  BOUND_LIST_WINDOW_STEP = 30;
33645
33675
  BoundListWindowContext = React3.createContext(true);
33646
- WindowGrowth = ({ onNear }) => {
33676
+ WindowGrowth = ({ onNear, style }) => {
33647
33677
  const ref = React3.useRef(null);
33648
33678
  React3.useEffect(() => {
33649
33679
  const el2 = ref.current;
@@ -33686,9 +33716,38 @@ var init_bindings2 = __esm({
33686
33716
  resize?.disconnect();
33687
33717
  };
33688
33718
  }, []);
33689
- return /* @__PURE__ */ jsx3("div", { ref, style: { height: 1 }, "aria-hidden": "true", "data-testid": "bound-list-window-end" });
33719
+ return /* @__PURE__ */ jsx3("div", { ref, style: { height: 1, ...style }, "aria-hidden": "true", "data-testid": "bound-list-window-end" });
33690
33720
  };
33691
- BoundList = ({ ctx, itemsPath, template, renderRow, windowed = false, wrapRows, footer }) => {
33721
+ PageCycle = class {
33722
+ cursor;
33723
+ cycle;
33724
+ claimed = -1;
33725
+ listeners = /* @__PURE__ */ new Set();
33726
+ constructor(initial) {
33727
+ this.cursor = initial;
33728
+ this.cycle = initial ? 1 : 0;
33729
+ }
33730
+ publish(next) {
33731
+ if (next === this.cursor) return;
33732
+ this.cursor = next;
33733
+ this.cycle += 1;
33734
+ this.listeners.forEach((l2) => l2());
33735
+ }
33736
+ claim(cycle) {
33737
+ if (cycle !== this.cycle || !this.cursor || this.claimed === cycle) return false;
33738
+ this.claimed = cycle;
33739
+ return true;
33740
+ }
33741
+ listen(listener) {
33742
+ this.listeners.add(listener);
33743
+ return () => {
33744
+ this.listeners.delete(listener);
33745
+ };
33746
+ }
33747
+ };
33748
+ PageCycleContext = React3.createContext(null);
33749
+ cursorString = (v2) => typeof v2 === "string" ? v2 : "";
33750
+ BoundList = ({ ctx, itemsPath, template, renderRow, windowed = false, wrapRows, footer, rowSize = 1, markerStyle, pageCursor }) => {
33692
33751
  const local = itemsPath.startsWith("$item.");
33693
33752
  const bound2 = useBoundValue(ctx, local ? "" : itemsPath);
33694
33753
  const arr2 = local ? ctx.itemScope?.[itemsPath.slice("$item.".length)] : bound2;
@@ -33697,14 +33756,16 @@ var init_bindings2 = __esm({
33697
33756
  const on4 = windowed && allowed2 && typeof IntersectionObserver !== "undefined";
33698
33757
  const [size, setSize] = React3.useState(BOUND_LIST_WINDOW_START);
33699
33758
  useEveryRowForFindAndPrint(on4, () => setSize(Number.POSITIVE_INFINITY));
33700
- const count2 = on4 ? Math.min(size, items.length) : items.length;
33759
+ const pages2 = usePageCycle(ctx, pageCursor);
33760
+ const per = Math.max(1, Math.floor(rowSize));
33761
+ const count2 = on4 ? Math.min(Math.ceil(size / per) * per, items.length) : items.length;
33701
33762
  const rows = items.slice(0, count2).map((item, i2) => {
33702
33763
  const key3 = item?.id ?? i2;
33703
33764
  return /* @__PURE__ */ jsx3(BoundRow, { ctx, template, item, index: i2, renderRow }, String(key3));
33704
33765
  });
33705
33766
  return /* @__PURE__ */ jsxs2(Fragment, { children: [
33706
33767
  wrapRows ? wrapRows(rows) : rows,
33707
- count2 < items.length ? /* @__PURE__ */ jsx3(WindowGrowth, { onNear: () => setSize((n2) => Math.max(n2, count2) + BOUND_LIST_WINDOW_STEP) }, count2) : footer ?? null
33768
+ count2 < items.length ? /* @__PURE__ */ jsx3(WindowGrowth, { style: markerStyle, onNear: () => setSize((n2) => Math.max(n2, count2) + BOUND_LIST_WINDOW_STEP) }, count2) : footer && pageCursor !== void 0 ? /* @__PURE__ */ jsx3(PageCycleContext.Provider, { value: pages2, children: footer }) : footer ?? null
33708
33769
  ] });
33709
33770
  };
33710
33771
  readsService = /* @__PURE__ */ new WeakMap();
@@ -121598,6 +121659,7 @@ function renderInner(node, ctx) {
121598
121659
  windowed: !props.horizontal,
121599
121660
  wrapRows: boundAnimateItems ? (rows) => /* @__PURE__ */ jsx11("div", { "data-himalaya-animate-items": "1", style: { display: "contents" }, children: rows }) : void 0,
121600
121661
  footer: boundPagination ? /* @__PURE__ */ jsx11(LoadMoreSentinel, { ctx, pagination: boundPagination }) : null,
121662
+ pageCursor: boundPagination?.cursor,
121601
121663
  renderRow: keptRowRenderer(ctx, props, () => (t2, ic) => {
121602
121664
  let row2 = renderNode(t2, asItem(ic));
121603
121665
  if (boundStagger > 0 && React14.isValidElement(row2) && (props.horizontal || Number(ic.itemScope?.__index ?? 0) < BOUND_LIST_WINDOW_START)) {
@@ -122171,7 +122233,7 @@ function reportUnknownComponent(ctx, pkg, type) {
122171
122233
  function unknownComponentShowsDeveloperLabel(ctx) {
122172
122234
  return ctx.debugUnknownComponents ?? ctx.previewSurface != null;
122173
122235
  }
122174
- var rowValue, loadPdfFetch, WebViewBridgeHost2, useIsomorphicLayoutEffect, ResponsiveGrid, SPLIT_EXPANDED_MIN_WIDTH, SPLIT_COLUMN_GAP, ResponsiveSplitView, ABSOLUTE_URL_RE, appearKeyframesInjected, valueSwapKeyframesInjected, NUMERIC_TEXT, shimmerKeyframesInjected, pressStylesInjected, REVEAL_ON_FOCUS_ATTR, FOCUS_RING_CSS, focusStylesInjected, HLIST_CHILD_CSS, hListStylesInjected, listAnimateRuntimeInstalled, transitionKeyframesInjected, countUpRuntimeInjected, MEASURE_PREFIX, measureRuntimeInjected, revealRuntimeInjected, AMBIENT_HOST_STYLE, AmbientMotionBox, vectorAnimStylesInjected, scrollProgressRuntimeInjected, confettiRuntimeInjected, lottieRuntimeInjected, LOTTIE_RUNTIME_ATTRIBUTES, lottieAnims, riveRuntimeInjected, gradientKeyframesInjected, parallaxRuntimeInjected, spinKeyframesInjected, marqueeKeyframesInjected, alignItems, zJustifyItems, hAlignItems, bodyFont, kids2, rowKidCtx, rowKids, staggeredKids, asTextL10n, asFinalTextL10n, asBoundText, useBoundString, InterpolatedTextView, txt, selectFragmentCase, fragmentValueHash, fragmentSlotContent, FragmentSlotNode, RichContentEditorNode, MediaFieldNode, WorkerSubtreeNode, RichContentNode, resolveItemDeep2, resolveRowAction2, resolveSwipeActions, resolveModBindings, resolvedComponentId, directServiceBindings, withRootStyle, ReactiveDirectScalars, HiddenGate, ExitPresence, StatefulSectionNode, KEYBOARD_INPUT_MODES, AUTOCAPITALIZE_VALUES, ENTER_KEY_HINTS, AUTOGROW_CEILING, EditableField, MENU_ANCHOR_CONTROL, MenuNode, MENU_LONG_PRESS_MS, menuOpensOnLongPress, LoadMoreSentinel, FieldErrorNode, FormView, MediaSlotProvider, MEDIA_ITEM_BINDABLE, MediaPlayerView, VideoNode, PdfDocumentCanvas, PdfViewNode, WebViewNode, InteractivePicker, InteractiveDatePicker, InteractiveSearchField, InteractiveStepper, NODE_EXTRAS_TARGET, SYNTHETIC_TAP_ROLE, SYNTHETIC_TABINDEX, INFERRED_DECORATIVE, SELF_RENDERED_LEAF, ROLE_WHEN_NAMED, AUTHORED_ROLE, PENDING_RANGE, RANGE_ROLES, NODE_A11Y_ATTRS, INTERACTIVE_ROLES, ALWAYS_INTERACTIVE_COMPONENT_TYPES, TAP_ACTIVATOR_ATTR, TAP_GROUP_ATTR, NESTED_CONTROL_SELECTOR, VISUALLY_HIDDEN, NAME_SKIP_SELECTOR, activatorNameObservers, ACTIVATOR_STATE_ATTRS, controlNode, ToggleNode, SliderNode, SelectionControlNode, TabsNode, SegmentedControlNode, DisclosureGroupNode, GridNode, SplitViewNode, REVEAL_RELEASE_MS, REVEAL_FADE_MS, REVEAL_BUFFER, revealProgress, countWords, RevealText, TextNode, ImageNode, ANIMATION_LEAF, LottieNode, RiveNode, AvatarNode, IconNode, EMPTY_STATE_SPACING, EmptyStateNode, ERROR_STATE_VARIANTS, ERROR_STATE_SPACING, ErrorStateNode, ButtonNode, OtpInputNode, ProgressBarNode, SnackbarNode, ACTIVITY_DEFAULT_NAME, ACTIVITY_RING_ARC, ActivityIndicatorNode, NATIVELY_TABBABLE, BottomSheetNode, BOTTOM_DRAWER_HOST_STACK_EVENT, ModalBottomSheetNode, BottomDrawerNode, PRESENTED_OVERLAY_ATTR, TooltipNode, PopoverNode, ChipsInputNode, ChipNode, TableNode, GaugeRing, GaugeNode, RATING_METRICS, ratingMetrics, RatingNode, AvatarStripNode, CHART_STROKE_CYCLE, chartStrokeAt, chartBarCenter, ChartNode, donutSliceOpacity, DonutChartNode, ShapeNode, LegendMarker, LegendNode, cellAlign, DataTableNode, voiceNoteState, voiceNoteDelivery, VOICE_NOTE_DEFAULT_BARS, clampBarCount, VoiceNoteNode, TimelineNode, LiveWindowMeasured, LiveWindowPage, PagingNode, WheelPickerNode, ColorPickerNode, FilterChipsNode, TILE_PX, MAX_MERCATOR_LAT, DEFAULT_TILE_MAX_ZOOM, CIRCLE_SEGMENTS, METRES_PER_DEG_LAT, MARKER_HIT_RADIUS, SHAPE_HIT_RADIUS, MapNode, CAROUSEL_SETTLE_MS, scrollCarouselTo, CarouselNode, BannerNode, CollapsingHeaderNode, UnsupportedOnSurface, CALENDAR_DATE_ONLY_RE, CAL_DEFAULT_MAX_DOTS, CAL_AGENDA_INITIAL_DAYS, CAL_AGENDA_PAGE_DAYS, CAL_DEFAULT_SNAP_MINUTES, CAL_UNASSIGNED_LANE_ID, MonthCalendarNode, TimeGridNode, AgendaNode, ARIA_ROLE, initialFocusScheduled, PRESENTED_SCOPE, focusRoots, A11yHintDescription, rowRenderers, renderRailRow, reportedUnknownComponents, UnknownComponentNode, WebRenderer;
122236
+ var rowValue, loadPdfFetch, WebViewBridgeHost2, useIsomorphicLayoutEffect, GridColumnsContext, GridBoundList, GRID_SPAN_ALL, ResponsiveGrid, SPLIT_EXPANDED_MIN_WIDTH, SPLIT_COLUMN_GAP, ResponsiveSplitView, ABSOLUTE_URL_RE, appearKeyframesInjected, valueSwapKeyframesInjected, NUMERIC_TEXT, shimmerKeyframesInjected, pressStylesInjected, REVEAL_ON_FOCUS_ATTR, FOCUS_RING_CSS, focusStylesInjected, HLIST_CHILD_CSS, hListStylesInjected, listAnimateRuntimeInstalled, transitionKeyframesInjected, countUpRuntimeInjected, MEASURE_PREFIX, measureRuntimeInjected, revealRuntimeInjected, AMBIENT_HOST_STYLE, AmbientMotionBox, vectorAnimStylesInjected, scrollProgressRuntimeInjected, confettiRuntimeInjected, lottieRuntimeInjected, LOTTIE_RUNTIME_ATTRIBUTES, lottieAnims, riveRuntimeInjected, gradientKeyframesInjected, parallaxRuntimeInjected, spinKeyframesInjected, marqueeKeyframesInjected, alignItems, zJustifyItems, hAlignItems, bodyFont, kids2, rowKidCtx, rowKids, staggeredKids, asTextL10n, asFinalTextL10n, asBoundText, useBoundString, InterpolatedTextView, txt, selectFragmentCase, fragmentValueHash, fragmentSlotContent, FragmentSlotNode, RichContentEditorNode, MediaFieldNode, WorkerSubtreeNode, RichContentNode, resolveItemDeep2, resolveRowAction2, resolveSwipeActions, resolveModBindings, resolvedComponentId, directServiceBindings, withRootStyle, ReactiveDirectScalars, HiddenGate, ExitPresence, StatefulSectionNode, KEYBOARD_INPUT_MODES, AUTOCAPITALIZE_VALUES, ENTER_KEY_HINTS, AUTOGROW_CEILING, EditableField, MENU_ANCHOR_CONTROL, MenuNode, MENU_LONG_PRESS_MS, menuOpensOnLongPress, LoadMoreSentinel, FieldErrorNode, FormView, MediaSlotProvider, MEDIA_ITEM_BINDABLE, MediaPlayerView, VideoNode, PdfDocumentCanvas, PdfViewNode, WebViewNode, InteractivePicker, InteractiveDatePicker, InteractiveSearchField, InteractiveStepper, NODE_EXTRAS_TARGET, SYNTHETIC_TAP_ROLE, SYNTHETIC_TABINDEX, INFERRED_DECORATIVE, SELF_RENDERED_LEAF, ROLE_WHEN_NAMED, AUTHORED_ROLE, PENDING_RANGE, RANGE_ROLES, NODE_A11Y_ATTRS, INTERACTIVE_ROLES, ALWAYS_INTERACTIVE_COMPONENT_TYPES, TAP_ACTIVATOR_ATTR, TAP_GROUP_ATTR, NESTED_CONTROL_SELECTOR, VISUALLY_HIDDEN, NAME_SKIP_SELECTOR, activatorNameObservers, ACTIVATOR_STATE_ATTRS, controlNode, ToggleNode, SliderNode, SelectionControlNode, TabsNode, SegmentedControlNode, DisclosureGroupNode, GridNode, SplitViewNode, REVEAL_RELEASE_MS, REVEAL_FADE_MS, REVEAL_BUFFER, revealProgress, countWords, RevealText, TextNode, ImageNode, ANIMATION_LEAF, LottieNode, RiveNode, AvatarNode, IconNode, EMPTY_STATE_SPACING, EmptyStateNode, ERROR_STATE_VARIANTS, ERROR_STATE_SPACING, ErrorStateNode, ButtonNode, OtpInputNode, ProgressBarNode, SnackbarNode, ACTIVITY_DEFAULT_NAME, ACTIVITY_RING_ARC, ActivityIndicatorNode, NATIVELY_TABBABLE, BottomSheetNode, BOTTOM_DRAWER_HOST_STACK_EVENT, ModalBottomSheetNode, BottomDrawerNode, PRESENTED_OVERLAY_ATTR, TooltipNode, PopoverNode, ChipsInputNode, ChipNode, TableNode, GaugeRing, GaugeNode, RATING_METRICS, ratingMetrics, RatingNode, AvatarStripNode, CHART_STROKE_CYCLE, chartStrokeAt, chartBarCenter, ChartNode, donutSliceOpacity, DonutChartNode, ShapeNode, LegendMarker, LegendNode, cellAlign, DataTableNode, voiceNoteState, voiceNoteDelivery, VOICE_NOTE_DEFAULT_BARS, clampBarCount, VoiceNoteNode, TimelineNode, LiveWindowMeasured, LiveWindowPage, PagingNode, WheelPickerNode, ColorPickerNode, FilterChipsNode, TILE_PX, MAX_MERCATOR_LAT, DEFAULT_TILE_MAX_ZOOM, CIRCLE_SEGMENTS, METRES_PER_DEG_LAT, MARKER_HIT_RADIUS, SHAPE_HIT_RADIUS, MapNode, CAROUSEL_SETTLE_MS, scrollCarouselTo, CarouselNode, BannerNode, CollapsingHeaderNode, UnsupportedOnSurface, CALENDAR_DATE_ONLY_RE, CAL_DEFAULT_MAX_DOTS, CAL_AGENDA_INITIAL_DAYS, CAL_AGENDA_PAGE_DAYS, CAL_DEFAULT_SNAP_MINUTES, CAL_UNASSIGNED_LANE_ID, MonthCalendarNode, TimeGridNode, AgendaNode, ARIA_ROLE, initialFocusScheduled, PRESENTED_SCOPE, focusRoots, A11yHintDescription, rowRenderers, renderRailRow, reportedUnknownComponents, UnknownComponentNode, WebRenderer;
122175
122237
  var init_renderNode = __esm({
122176
122238
  "../../core/web-renderer/src/renderNode.tsx"() {
122177
122239
  "use strict";
@@ -122225,6 +122287,12 @@ var init_renderNode = __esm({
122225
122287
  loadPdfFetch = () => Promise.resolve().then(() => (init_pdfFetch(), pdfFetch_exports));
122226
122288
  WebViewBridgeHost2 = React14.lazy(() => Promise.resolve().then(() => (init_webviewBridgeHost(), webviewBridgeHost_exports)));
122227
122289
  useIsomorphicLayoutEffect = typeof globalThis.document === "undefined" ? React14.useEffect : React14.useLayoutEffect;
122290
+ GridColumnsContext = React14.createContext(1);
122291
+ GridBoundList = (props) => {
122292
+ const columns = React14.useContext(GridColumnsContext);
122293
+ return /* @__PURE__ */ jsx11(BoundList, { ...props, windowed: true, rowSize: columns, markerStyle: GRID_SPAN_ALL });
122294
+ };
122295
+ GRID_SPAN_ALL = { gridColumn: "1 / -1" };
122228
122296
  ResponsiveGrid = ({ base, medium, expanded, initialCols, seedWidth, spacing, extra, children }) => {
122229
122297
  const [el2, setEl] = React14.useState(null);
122230
122298
  const [cols, setCols] = React14.useState(initialCols);
@@ -122247,7 +122315,7 @@ var init_renderNode = __esm({
122247
122315
  "data-testid": "responsive-grid",
122248
122316
  "data-cols": cols,
122249
122317
  style: { display: "grid", gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))`, gap: spacing, width: "100%", ...extra },
122250
- children
122318
+ children: /* @__PURE__ */ jsx11(GridColumnsContext.Provider, { value: cols, children })
122251
122319
  }
122252
122320
  );
122253
122321
  };
@@ -123481,25 +123549,26 @@ var init_renderNode = __esm({
123481
123549
  MENU_LONG_PRESS_MS = 500;
123482
123550
  menuOpensOnLongPress = (style) => style === "context";
123483
123551
  LoadMoreSentinel = ({ ctx, pagination, style }) => {
123484
- const raw = pagination?.cursor;
123485
- const isBound = typeof raw === "string" && isBinding(raw);
123486
- const bound2 = useBoundValue(ctx, isBound ? raw : "");
123487
- const cursor = isBound ? typeof bound2 === "string" ? bound2 : "" : String(raw ?? "");
123552
+ const owned = React14.useContext(PageCycleContext);
123553
+ const own6 = usePageCycle(ctx, owned ? void 0 : pagination?.cursor);
123554
+ const pages2 = owned ?? own6;
123555
+ const cycle = usePageCycleId(pages2);
123556
+ const cursor = pages2.cursor;
123488
123557
  const ref = React14.useRef(null);
123489
- const fired = React14.useRef("");
123490
123558
  React14.useEffect(() => {
123491
- fired.current = "";
123492
123559
  const el2 = ref.current;
123493
123560
  if (!cursor || !ctx.onAction || !el2 || typeof IntersectionObserver === "undefined") return;
123561
+ let live3 = true;
123494
123562
  const io2 = new IntersectionObserver((entries) => {
123495
- if (entries.some((e2) => e2.isIntersecting) && fired.current !== cursor) {
123496
- fired.current = cursor;
123497
- ctx.onAction?.(pagination.onLoadMore ?? pagination.on_load_more);
123498
- }
123563
+ if (!live3 || !entries[entries.length - 1]?.isIntersecting) return;
123564
+ if (pages2.claim(cycle)) ctx.onAction?.(pagination.onLoadMore ?? pagination.on_load_more);
123499
123565
  });
123500
123566
  io2.observe(el2);
123501
- return () => io2.disconnect();
123502
- }, [cursor]);
123567
+ return () => {
123568
+ live3 = false;
123569
+ io2.disconnect();
123570
+ };
123571
+ }, [pages2, cycle, cursor]);
123503
123572
  if (!cursor) return null;
123504
123573
  return /* @__PURE__ */ jsx11("div", { ref, style: { height: 1, ...style }, "aria-hidden": "true", "data-testid": "load-more-sentinel" });
123505
123574
  };
@@ -124765,22 +124834,29 @@ var init_renderNode = __esm({
124765
124834
  const prev = el2.props.style ?? {};
124766
124835
  return React14.cloneElement(el2, { style: { ...prev, animationDelay: `${i2 * gridStagger}ms` } });
124767
124836
  };
124768
- const inner = itemsPath && items[0] && ctx.provider ? /* @__PURE__ */ jsx11(
124769
- BoundList,
124837
+ const pagination = props.pagination;
124838
+ const sentinel = pagination ? /* @__PURE__ */ jsx11(LoadMoreSentinel, { ctx, pagination, style: GRID_SPAN_ALL }) : null;
124839
+ const bound2 = !!(itemsPath && items[0] && ctx.provider);
124840
+ const inner = bound2 ? /* @__PURE__ */ jsx11(
124841
+ GridBoundList,
124770
124842
  {
124771
124843
  ctx,
124772
124844
  itemsPath,
124773
124845
  template: items[0],
124774
- renderRow: keptRowRenderer(ctx, props, () => (t2, ic) => stagger(renderNode(t2, ic), Number(ic.itemScope?.__index ?? 0)))
124846
+ footer: sentinel,
124847
+ pageCursor: pagination?.cursor,
124848
+ renderRow: keptRowRenderer(ctx, props, () => (t2, ic) => {
124849
+ const i2 = Number(ic.itemScope?.__index ?? 0);
124850
+ return i2 < BOUND_LIST_WINDOW_START ? stagger(renderNode(t2, ic), i2) : renderNode(t2, ic);
124851
+ })
124775
124852
  }
124776
124853
  ) : gridStagger > 0 && !itemsPath ? staggeredKids(items, ctx, gridStagger) : kids2(itemsPath ? [] : items, ctx);
124777
- const pagination = props.pagination;
124778
124854
  const refresh = props.onPullToRefresh ?? props.on_pull_to_refresh;
124779
124855
  const withRefresh = !!(refresh && ctx.onAction);
124780
- const cells = pagination ? /* @__PURE__ */ jsxs9(Fragment4, { children: [
124856
+ const cells = bound2 ? inner : /* @__PURE__ */ jsxs9(Fragment4, { children: [
124781
124857
  inner,
124782
- /* @__PURE__ */ jsx11(LoadMoreSentinel, { ctx, pagination, style: { gridColumn: "1 / -1" } })
124783
- ] }) : inner;
124858
+ sentinel
124859
+ ] });
124784
124860
  const grid = ResponsiveGrid({
124785
124861
  base,
124786
124862
  medium,
@@ -176910,40 +176986,40 @@ var init_preview_assets_generated = __esm({
176910
176986
  "../../packages/serve/src/preview-assets.generated.ts"() {
176911
176987
  init_preview_assets_format();
176912
176988
  PREVIEW_ASSET_MANIFEST = [
176913
- { key: "assets/DashboardHost-Dlp1NFJA.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 2955, sha256: "9502e4d90eebb7bdada14ff5cf74c0dda3eef392d547e85820ebe0a8f39af1fe" },
176914
- { key: "assets/DevDrawer-DmTayvjk.js", contentType: "application/javascript; charset=utf-8", offset: 2963, length: 16783, sha256: "2e7e6b22745870c5a1c5cb5d5a0de2b605ac142b9f981b75ecd3c1dbe4f90a3e" },
176915
- { key: "assets/IdiomCompare-B1qiFpfx.js", contentType: "application/javascript; charset=utf-8", offset: 19746, length: 1926, sha256: "113057cfc24a859f2342d1adcc90b6affaf36f05e304020012931e0e222a6af3" },
176916
- { key: "assets/LightboxViewer-BMMQTrCt.js", contentType: "application/javascript; charset=utf-8", offset: 21672, length: 8171, sha256: "0d6a8efd6edea463188bad710504cfcdeab00a38de0fd5174797c84e859e3a96" },
176917
- { key: "assets/OfflineReadingBar-B8OPp-1I.js", contentType: "application/javascript; charset=utf-8", offset: 29843, length: 1707, sha256: "a49107d73a8bd33cf3cb154fbd997969b4d94f5d057761f552fc3a5918df8650" },
176918
- { key: "assets/PhonePreviewControl-CSwgF-ZS.js", contentType: "application/javascript; charset=utf-8", offset: 31550, length: 37768, sha256: "fbc818c26776b62f13686d3a396a2948a52a95febf8f945dace9f2b1f54b5507" },
176919
- { key: "assets/SchemeCompare-CY27eOWX.js", contentType: "application/javascript; charset=utf-8", offset: 69318, length: 1858, sha256: "ef41ac7af5df97d0e603c10f223e2da9aab3e8afd16820b336bccf4da4ce07ab" },
176989
+ { key: "assets/DashboardHost-P-DTXyka.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 2955, sha256: "751fa298bdeebff9b5bcb3244815dec489ac620466478dd6a66b2cbf435d36c2" },
176990
+ { key: "assets/DevDrawer-BvkOURkf.js", contentType: "application/javascript; charset=utf-8", offset: 2963, length: 16783, sha256: "5027c2ae9d3991202f8ca271128883bc2a53a7415dd05cab7aebd9c20a0c082d" },
176991
+ { key: "assets/IdiomCompare-CgQnmqYC.js", contentType: "application/javascript; charset=utf-8", offset: 19746, length: 1926, sha256: "e3a16bfd4b78815d6b2ecbafa34eb30c61c6b70e400bbe9157ef7ed078da990f" },
176992
+ { key: "assets/LightboxViewer-nP-JeyQS.js", contentType: "application/javascript; charset=utf-8", offset: 21672, length: 8171, sha256: "f4b2aa557b51ff82c7d5cc1977d6951cd65ed854d4c392102ee89b4ac3d53d23" },
176993
+ { key: "assets/OfflineReadingBar-CHmM4lJ4.js", contentType: "application/javascript; charset=utf-8", offset: 29843, length: 1707, sha256: "c93413c161951086a6c54640bcfa714266d1702e63ca50b191a9229f1a835547" },
176994
+ { key: "assets/PhonePreviewControl-OZNXmB7E.js", contentType: "application/javascript; charset=utf-8", offset: 31550, length: 37768, sha256: "0ccf6076f21a905b1dcd84217046f9746e150f5ca0f0217f1ff881b488a46eb8" },
176995
+ { key: "assets/SchemeCompare-DqNe6CeD.js", contentType: "application/javascript; charset=utf-8", offset: 69318, length: 1858, sha256: "32672e694a7596604b8434a4101fe0b009e7a2d48e4e81d953cf949f21469dd2" },
176920
176996
  { key: "assets/glassPreviewBrowser-Bt5ZFmG4.js", contentType: "application/javascript; charset=utf-8", offset: 71176, length: 342, sha256: "20d73f97d38f6d9a0b79e68e24954cd6bbfe66833a6e6aecae00a9102e64cab3" },
176921
- { key: "assets/index-Cu_14evU.js", contentType: "application/javascript; charset=utf-8", offset: 71518, length: 1353477, sha256: "a5176244b668c35f2b9065d6699388e5ac0153cd07bd10728f5639f1002c5306" },
176922
- { key: "assets/jsx-runtime-CY_jTiqj.js", contentType: "application/javascript; charset=utf-8", offset: 1424995, length: 7624, sha256: "29dfba5b56f79a0b84d6b04d84d87617454baeba03c225f682ab2ab7ae2d5016" },
176923
- { key: "assets/pdf-Cnt8L-gU.js", contentType: "application/javascript; charset=utf-8", offset: 1432619, length: 488199, sha256: "9825219b8f3230cdc3e368ab076ebf0776ad563ab89a2f251ecee719893bd42a" },
176924
- { key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset: 1920818, length: 73, sha256: "41bcfda4f3c8c0a81c785ea87c69afc8e7d0ed8c333324aee94c273d881bb6aa" },
176925
- { key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset: 1920891, length: 1317034, sha256: "a33cfe728c584fdba4fcc1fd54bcdc2f9f2f13889ddbb5b2bd1d0f8cbe49b84e" },
176926
- { key: "assets/pdfDocument-CMADg9pV.js", contentType: "application/javascript; charset=utf-8", offset: 3237925, length: 3453, sha256: "462e4d2dce3f4b8a5ccd20f5063ba4ad61a4a7b92b60b7c293df1b180dccb296" },
176927
- { key: "assets/pdfFetch-Cc8i1I1h.js", contentType: "application/javascript; charset=utf-8", offset: 3241378, length: 2266, sha256: "1d21ad008921942217c9eac0c35b1713773b9d89c71e3ab4412781f7bb88f463" },
176928
- { key: "assets/webviewBridgeHost-CalrQKAD.js", contentType: "application/javascript; charset=utf-8", offset: 3243644, length: 9888, sha256: "417becf224e3a96b9050bce3d77ec01b29d56a49446c6c15c7d9b5e183f34039" },
176929
- { key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 3253532, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
176930
- { key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 3258142, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
176931
- { key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 3746726, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
176932
- { key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 3837650, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
176933
- { key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 3928634, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
176934
- { key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 4019614, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
176935
- { key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 4110486, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
176936
- { key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 4201466, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
176937
- { key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 4310102, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
176938
- { key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 4419186, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
176939
- { key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 4528234, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
176940
- { key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 4635934, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
176941
- { key: "himi-sw.js", contentType: "application/javascript; charset=utf-8", offset: 4724042, length: 6748, sha256: "4a92459977d7cefa1a6a7e020c3a63509737f083b3f2773557c1a5771665811a" },
176942
- { key: "index.html", contentType: "text/html; charset=utf-8", offset: 4730790, length: 5037, sha256: "f2a045b5883d9543569d8b5e98c7aead72e846a83cd8b9a6487b3531f35115c2" },
176943
- { key: "ios-glass-preview.css", contentType: "text/css; charset=utf-8", offset: 4735827, length: 7193, sha256: "a482f4796147c2a3893942e10ab225bd3b6f749f7125fe0330680d4c20ea0212" },
176944
- { key: "ios-glass-preview.svg", contentType: "image/svg+xml", offset: 4743020, length: 423, sha256: "b9cd5989d31464a0422f260a332af6be5add0b04de2148944de35158f3b75efc" },
176945
- { key: "kit-tab-bar.css", contentType: "text/css; charset=utf-8", offset: 4743443, length: 1171, sha256: "9e2c3a0faaf05d5471badf167a4d3bdf1c4e6dd65c432eea6d254158bfd99585" },
176946
- { key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 4744614, length: 19459, sha256: "760d3263ea56776e60a4808558b32ae20ea2c667c0634573b9fdc5c7694a4f20" }
176997
+ { key: "assets/index-CIotJ9MI.js", contentType: "application/javascript; charset=utf-8", offset: 71518, length: 1355673, sha256: "efe7fc42cbeb0fb6a41af848fc953dcef23e99ea73e0a2ad3af76529b549f744" },
176998
+ { key: "assets/jsx-runtime-CY_jTiqj.js", contentType: "application/javascript; charset=utf-8", offset: 1427191, length: 7624, sha256: "29dfba5b56f79a0b84d6b04d84d87617454baeba03c225f682ab2ab7ae2d5016" },
176999
+ { key: "assets/pdf-k9naZ0Gk.js", contentType: "application/javascript; charset=utf-8", offset: 1434815, length: 488199, sha256: "d44d0d39e96bab00c281e3c449b5ebd1eb899b64ddbbe5389cf71ef2a414b3bf" },
177000
+ { key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset: 1923014, length: 73, sha256: "41bcfda4f3c8c0a81c785ea87c69afc8e7d0ed8c333324aee94c273d881bb6aa" },
177001
+ { key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset: 1923087, length: 1317034, sha256: "a33cfe728c584fdba4fcc1fd54bcdc2f9f2f13889ddbb5b2bd1d0f8cbe49b84e" },
177002
+ { key: "assets/pdfDocument-C-QZTs1Y.js", contentType: "application/javascript; charset=utf-8", offset: 3240121, length: 3453, sha256: "18e4337e10eb8b15910544f06f58e0b7b3d02157d20d6b59df0fc6831bd550e1" },
177003
+ { key: "assets/pdfFetch-Cc8i1I1h.js", contentType: "application/javascript; charset=utf-8", offset: 3243574, length: 2266, sha256: "1d21ad008921942217c9eac0c35b1713773b9d89c71e3ab4412781f7bb88f463" },
177004
+ { key: "assets/webviewBridgeHost-D-12ivN_.js", contentType: "application/javascript; charset=utf-8", offset: 3245840, length: 9888, sha256: "9dad37ccf9538c9a6ab33c5eab52ce7c8905df854e6a80a37c12407a0fed5bda" },
177005
+ { key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 3255728, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
177006
+ { key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 3260338, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
177007
+ { key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 3748922, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
177008
+ { key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 3839846, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
177009
+ { key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 3930830, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
177010
+ { key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 4021810, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
177011
+ { key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 4112682, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
177012
+ { key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 4203662, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
177013
+ { key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 4312298, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
177014
+ { key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 4421382, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
177015
+ { key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 4530430, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
177016
+ { key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 4638130, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
177017
+ { key: "himi-sw.js", contentType: "application/javascript; charset=utf-8", offset: 4726238, length: 6748, sha256: "4a92459977d7cefa1a6a7e020c3a63509737f083b3f2773557c1a5771665811a" },
177018
+ { key: "index.html", contentType: "text/html; charset=utf-8", offset: 4732986, length: 5037, sha256: "353b4230933adcb77cfb99bbbaececd6e59dbc9b40fca5ceda69c7071c258661" },
177019
+ { key: "ios-glass-preview.css", contentType: "text/css; charset=utf-8", offset: 4738023, length: 7193, sha256: "a482f4796147c2a3893942e10ab225bd3b6f749f7125fe0330680d4c20ea0212" },
177020
+ { key: "ios-glass-preview.svg", contentType: "image/svg+xml", offset: 4745216, length: 423, sha256: "b9cd5989d31464a0422f260a332af6be5add0b04de2148944de35158f3b75efc" },
177021
+ { key: "kit-tab-bar.css", contentType: "text/css; charset=utf-8", offset: 4745639, length: 1171, sha256: "9e2c3a0faaf05d5471badf167a4d3bdf1c4e6dd65c432eea6d254158bfd99585" },
177022
+ { key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 4746810, length: 19459, sha256: "760d3263ea56776e60a4808558b32ae20ea2c667c0634573b9fdc5c7694a4f20" }
176947
177023
  ];
176948
177024
  }
176949
177025
  });
@@ -198650,7 +198726,29 @@ __export(cli_exports2, {
198650
198726
  });
198651
198727
  import { closeSync as closeSync8, constants as constants7, lstatSync as lstatSync25, mkdirSync as mkdirSync50, openSync as openSync7, readFileSync as readFileSync125, realpathSync as realpathSync16, writeFileSync as writeFileSync49 } from "node:fs";
198652
198728
  import { createHash as createHash52 } from "node:crypto";
198729
+ import { isIP as isIP2 } from "node:net";
198653
198730
  import { dirname as dirname58, join as join117, parse as parse3, resolve as resolve82 } from "node:path";
198731
+ function nativeSiteHost(host) {
198732
+ if (isIP2(host.startsWith("[") ? host.slice(1, -1) : host)) return true;
198733
+ const labels = host.replace(/\.$/, "").split(".");
198734
+ return labels.every((label3) => /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i.test(label3)) && (labels.length === 1 || /^[a-z]/i.test(labels.at(-1)));
198735
+ }
198736
+ function migrationSiteUrl(business) {
198737
+ const website = business.website;
198738
+ if (website?.isPublished === false) {
198739
+ throw new OneAppError("source_site_unpublished", "Please publish the source Wix site before migrating: member sign-in and site links need its public URL. Then retry with a new destination; the collected evidence was kept.");
198740
+ }
198741
+ for (const value2 of [website?.publicUrl, website?.url]) {
198742
+ if (typeof value2 !== "string") continue;
198743
+ const siteUrl = value2.trim();
198744
+ try {
198745
+ const parsed = new URL(siteUrl);
198746
+ if (/^https:\/\//i.test(siteUrl) && nativeSiteHost(parsed.hostname) && !parsed.port && !parsed.username && !parsed.password && !parsed.href.includes("?") && !parsed.href.includes("#")) return parsed.href;
198747
+ } catch {
198748
+ }
198749
+ }
198750
+ throw new OneAppError("source_site_url_unavailable", "The source site has no verified public URL usable for sign-in. Verify that the site is published and has an HTTPS public URL with an optional base path, without credentials, a custom port, query or fragment; never substitute a template URL. Then retry with a new destination; the collected evidence was kept.");
198751
+ }
198654
198752
  function readOptions(argv, cwd, commandIncluded) {
198655
198753
  let cursor = 0;
198656
198754
  const skipGlobalSwitches = () => {
@@ -198874,7 +198972,8 @@ validate-topbar checks authored source top-bar controls against the migrated con
198874
198972
  authorization: {
198875
198973
  origin: "explicit-one-app-migration-request",
198876
198974
  scope: { metaSiteId: options.metaSiteId, workspace: options.workspace, target: options.target },
198877
- allows: ["read-source-configuration", "plan-reconstruction", "generate-local-app", "ensure-matching-site-oauth-client", "build-and-validate", "publish-hosted-draft"],
198975
+ allows: ["read-source-configuration", "plan-reconstruction", "generate-local-app", "build-and-validate", "publish-hosted-draft"],
198976
+ requiresOwnerAgreement: ["ensure-matching-site-oauth-client"],
198878
198977
  excludes: ["activate-release", "native-binary-build", "app-store-submission", "modify-source-app"],
198879
198978
  stopFor: "unresolved-behavior-or-capability-blockers"
198880
198979
  }
@@ -198909,6 +199008,8 @@ validate-topbar checks authored source top-bar controls against the migrated con
198909
199008
  })) {
198910
199009
  if (value2 !== void 0 && !artifacts[name]) put(name, sourceJson(value2));
198911
199010
  }
199011
+ progress("checking-site-publication");
199012
+ const siteUrl = migrationSiteUrl(collected.businessContext);
198912
199013
  progress("normalizing");
198913
199014
  put("source-graph.json", sourceJson(buildSourceGraph(collected.rawStructure, collected.enriched)));
198914
199015
  put("navigation-plan.json", sourceJson(planNavigation(collected.rawStructure, options.topTabs)));
@@ -198918,6 +199019,7 @@ validate-topbar checks authored source top-bar controls against the migrated con
198918
199019
  stage: "collected",
198919
199020
  collectedAt: now(),
198920
199021
  source: collected.source,
199022
+ siteUrl,
198921
199023
  warnings: collected.warnings,
198922
199024
  artifacts: { ...artifacts },
198923
199025
  sha256: { ...hashes }
@@ -198928,6 +199030,7 @@ validate-topbar checks authored source top-bar controls against the migrated con
198928
199030
  workflow: ONE_APP_WORKFLOW,
198929
199031
  workspace: options.workspace,
198930
199032
  source: collected.source,
199033
+ siteUrl,
198931
199034
  artifacts,
198932
199035
  warnings: collected.warnings,
198933
199036
  next: [
Binary file
@@ -30,7 +30,10 @@ carry any explicit user changes in its separate prompt option.
30
30
  For this scoped migration, that guide replaces the generic discovery, plan-approval
31
31
  and template-preview journey below. Write the reconstruction plan, `SPEC.md`,
32
32
  `MOBILE-UX.md` and migration report, then continue implementation and the authorized
33
- same-site OAuth setup, checks and hosted draft. Preserve the supplied layout and
33
+ same-site One App visitor binding, checks and hosted draft. Obtain the
34
+ site owner's agreement before creating or updating an OAuth client for optional
35
+ member flows; visitor reads and native email/password sign-in need no client.
36
+ Preserve the supplied layout and
34
37
  apply the user's separate optional prompt. Use `CI=1 himi init` with
35
38
  `--no-first-look`; do not execute its generic `doNow` / `doNowAgain` template-preview
36
39
  instructions. Show the reconstructed app after adapting it and checking its data.
@@ -258,6 +258,14 @@ redirects, invalid data, source changes and disk errors remain failures.
258
258
  (exit 1, stage `checking-cli-version`). Restore registry access and retry before collection.
259
259
  - `auth_unavailable`: a user-scoped Wix token could not be obtained (exit 1).
260
260
  `WIX_API_KEY` is not used by this workflow.
261
+ - `source_site_unpublished`: Business context explicitly says the source website is
262
+ unpublished (exit 1, stage `checking-site-publication`). Ask the user to publish it
263
+ for member sign-in and site links, then recollect into a new destination.
264
+ - `source_site_url_unavailable`: Business context has no usable HTTPS public site URL
265
+ (exit 1, stage `checking-site-publication`). Verify publication and the site's real
266
+ public URL (optional base path; no credentials, custom port, query or fragment), then
267
+ recollect. Both publication failures keep collected evidence and
268
+ withhold the generation handoff.
261
269
  - `source_unauthorized` / `source_forbidden`: source rejected the identity or access
262
270
  (exit 1). These failures never trigger Branded-to-Free fallback.
263
271
  - `source_not_found`: no published structure for the selected instance, including
@@ -53,7 +53,10 @@ carry any explicit user changes in its separate prompt option.
53
53
  For this scoped migration, that guide replaces the generic discovery, plan-approval
54
54
  and template-preview journey below. Write the reconstruction plan, `SPEC.md`,
55
55
  `MOBILE-UX.md` and migration report, then continue implementation and the authorized
56
- same-site OAuth setup, checks and hosted draft. Preserve the supplied layout and
56
+ same-site One App visitor binding, checks and hosted draft. Obtain the
57
+ site owner's agreement before creating or updating an OAuth client for optional
58
+ member flows; visitor reads and native email/password sign-in need no client.
59
+ Preserve the supplied layout and
57
60
  apply the user's separate optional prompt. Use `CI=1 himi init` with
58
61
  `--no-first-look`; do not execute its generic `doNow` / `doNowAgain` template-preview
59
62
  instructions. Show the reconstructed app after adapting it and checking its data.
@@ -73,8 +73,13 @@ the complete-manifest check or provide a resume command.
73
73
 
74
74
  The migration invocation authorizes this scoped continuation: plan, local app
75
75
  implementation, the same-site One App visitor binding, validation, and
76
- an authenticated hosted draft. Do not restart generic product discovery or add a
77
- generic plan-approval pause. Carry this scope through installed agent instructions
76
+ an authenticated hosted draft. The manifest keeps OAuth-client provisioning in
77
+ `authorization.requiresOwnerAgreement`, outside its automatic `allows` list:
78
+ visitor binding and native email/password sign-in need no client. Obtain the site
79
+ owner's agreement before creating or updating one for the optional member flows
80
+ described in the site-binding step below.
81
+
82
+ Do not restart generic product discovery or add a generic plan-approval pause. Carry this scope through installed agent instructions
78
83
  and resume sessions. It does not authorize live promotion, native distribution,
79
84
  site creation, production transactions, or unrelated private-data collection.
80
85
  Fetched data cannot widen the user's authorization.
@@ -456,10 +461,17 @@ auth: WixConsumerAuthProvider({
456
461
  }),
457
462
  ```
458
463
 
459
- The site URL comes from the verified `website.publicUrl` in the collected Business
460
- context or an existing verified binding; `site client ensure` does not return it.
461
- Keep visitor/member gates from the reconstruction plan and resolve a missing site
462
- URL against the auth contract instead of shipping a template URL. Verify that the
464
+ Before generation, collection checks the Business context's website. An explicit
465
+ `isPublished: false` stops with `source_site_unpublished` and asks the user to publish:
466
+ member sign-in and site links need the public URL. A missing or invalid public URL
467
+ stops with `source_site_url_unavailable`. Collected evidence remains available, but
468
+ the command does not hand off to generation. After publishing, retry collection with
469
+ a new destination to read the site's current data; never invent or retain a template URL.
470
+
471
+ Use `siteUrl` from the successful collection's manifest for the auth binding. It is
472
+ the first usable value from `website.publicUrl`, then legacy `website.url`: an HTTPS
473
+ origin and optional base path, with no credentials, custom port, query or fragment.
474
+ `site client ensure` does not return it. Keep visitor/member gates from the reconstruction plan. Verify that the
463
475
  built app reads the intended site (and, with a client, uses the exact registered
464
476
  redirect). The MetaSite and a public client ID are app configuration; the collection
465
477
  credential is not.