@wix/himalaya-cli 0.1463.0 → 0.1464.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs CHANGED
@@ -39372,19 +39372,22 @@ function useResolvedScalar(v2, ctx) {
39372
39372
  function useBoundValue(ctx, binding2) {
39373
39373
  const path2 = servicePath(binding2);
39374
39374
  const active = !!ctx.provider && !!binding2;
39375
+ const provider = ctx.provider;
39375
39376
  const [state, setState] = useState(() => ({
39376
39377
  path: path2,
39377
- v: active ? ctx.provider.value(path2) : void 0
39378
+ provider,
39379
+ v: active ? provider.value(path2) : void 0
39378
39380
  }));
39379
- const current = state.path === path2 ? state.v : active ? ctx.provider.value(path2) : void 0;
39380
- if (state.path !== path2) setState({ path: path2, v: current });
39381
+ const matches = state.path === path2 && state.provider === provider;
39382
+ const current = matches ? state.v : active ? provider.value(path2) : void 0;
39383
+ if (!matches) setState({ path: path2, provider, v: current });
39381
39384
  useEffect(() => {
39382
- if (!ctx.provider || !binding2) return;
39383
- return ctx.provider.subscribe(
39385
+ if (!provider || !binding2) return;
39386
+ return provider.subscribe(
39384
39387
  path2,
39385
- (nv) => setState((prev) => prev.path === path2 && Object.is(prev.v, nv) ? prev : { path: path2, v: nv })
39388
+ (nv) => setState((prev) => prev.path === path2 && prev.provider === provider && Object.is(prev.v, nv) ? prev : { path: path2, provider, v: nv })
39386
39389
  );
39387
- }, [ctx.provider, path2, binding2]);
39390
+ }, [provider, path2, binding2]);
39388
39391
  return active ? current : void 0;
39389
39392
  }
39390
39393
  function useBoundValues(ctx, bindings) {
@@ -40880,6 +40883,76 @@ var init_richContentEditor = __esm({
40880
40883
  }
40881
40884
  });
40882
40885
 
40886
+ // ../../core/web-renderer/src/pdfSource.ts
40887
+ function pdfEmbedPlan(url, pageOrigin = currentOrigin(), pageUrl) {
40888
+ let source = url;
40889
+ if (pageOrigin !== null && pageUrl) {
40890
+ try {
40891
+ const base = new URL(pageUrl);
40892
+ if (base.origin === pageOrigin) source = new URL(url, base).href;
40893
+ } catch {
40894
+ return null;
40895
+ }
40896
+ }
40897
+ const target = classifyEmbedUrl(source, pageOrigin);
40898
+ if (!target) return null;
40899
+ if (target.protocol === "http:" || target.protocol === "https:") {
40900
+ if (pageOrigin === null) {
40901
+ if (target.absolute) return { mode: "direct", src: target.href };
40902
+ if (target.schemeRelative) return { mode: "direct", src: target.href.replace(/^https?:/, "") };
40903
+ return null;
40904
+ }
40905
+ return { mode: target.crossOrigin ? "direct" : "retype", src: target.href };
40906
+ }
40907
+ if (target.protocol === "blob:" && pageOrigin !== null && !target.crossOrigin) {
40908
+ return { mode: "retype", src: target.href };
40909
+ }
40910
+ return null;
40911
+ }
40912
+ function splitFragment(src) {
40913
+ const i2 = src.indexOf("#");
40914
+ return i2 < 0 ? { base: src, hash: "" } : { base: src.slice(0, i2), hash: src.slice(i2) };
40915
+ }
40916
+ function fragmentPage(hash2) {
40917
+ const m2 = /(?:^#|&)page=(\d+)/.exec(hash2);
40918
+ const n2 = m2 ? Number(m2[1]) : NaN;
40919
+ return Number.isFinite(n2) && n2 >= 1 ? n2 : null;
40920
+ }
40921
+ function pdfOpenFragment(sourceHash, opts) {
40922
+ const params = /* @__PURE__ */ new Map();
40923
+ for (const part3 of sourceHash.replace(/^#/, "").split("&")) {
40924
+ if (!part3) continue;
40925
+ const eq = part3.indexOf("=");
40926
+ params.set(eq < 0 ? part3 : part3.slice(0, eq), eq < 0 ? "" : part3.slice(eq + 1));
40927
+ }
40928
+ if (opts.page != null && opts.page >= 1) params.set("page", String(Math.floor(opts.page)));
40929
+ if (opts.fitWidth) {
40930
+ params.delete("zoom");
40931
+ params.set("view", "FitH");
40932
+ } else if (opts.zoom != null) {
40933
+ params.set("zoom", String(Math.round(opts.zoom)));
40934
+ }
40935
+ if (!opts.viewerChrome) {
40936
+ params.set("toolbar", "0");
40937
+ params.set("navpanes", "0");
40938
+ }
40939
+ return params.size ? "#" + [...params].map(([k2, v2]) => v2 === "" ? k2 : `${k2}=${v2}`).join("&") : "";
40940
+ }
40941
+ function pdfZoomStep(current, direction) {
40942
+ const from = current ?? PDF_ZOOM_DEFAULT;
40943
+ return Math.min(PDF_ZOOM_MAX, Math.max(PDF_ZOOM_MIN, from + direction * PDF_ZOOM_STEP));
40944
+ }
40945
+ var PDF_ZOOM_MIN, PDF_ZOOM_MAX, PDF_ZOOM_STEP, PDF_ZOOM_DEFAULT;
40946
+ var init_pdfSource = __esm({
40947
+ "../../core/web-renderer/src/pdfSource.ts"() {
40948
+ init_webviewFrame();
40949
+ PDF_ZOOM_MIN = 50;
40950
+ PDF_ZOOM_MAX = 400;
40951
+ PDF_ZOOM_STEP = 25;
40952
+ PDF_ZOOM_DEFAULT = 100;
40953
+ }
40954
+ });
40955
+
40883
40956
  // ../../core/web-host/src/actions/presigned-upload-policy.ts
40884
40957
  function hostMatches(host) {
40885
40958
  const h2 = host.toLowerCase().split(":")[0];
@@ -41055,45 +41128,6 @@ var init_mediaFieldUpload = __esm({
41055
41128
  }
41056
41129
  });
41057
41130
 
41058
- // ../../core/web-renderer/src/pdfSource.ts
41059
- function pdfEmbedPlan(url, pageOrigin = currentOrigin(), pageUrl) {
41060
- let source = url;
41061
- if (pageOrigin !== null && pageUrl) {
41062
- try {
41063
- const base = new URL(pageUrl);
41064
- if (base.origin === pageOrigin) source = new URL(url, base).href;
41065
- } catch {
41066
- return null;
41067
- }
41068
- }
41069
- const target = classifyEmbedUrl(source, pageOrigin);
41070
- if (!target) return null;
41071
- if (target.protocol === "http:" || target.protocol === "https:") {
41072
- if (pageOrigin === null) {
41073
- if (target.absolute) return { mode: "direct", src: target.href };
41074
- if (target.schemeRelative) return { mode: "direct", src: target.href.replace(/^https?:/, "") };
41075
- return null;
41076
- }
41077
- return { mode: target.crossOrigin ? "direct" : "retype", src: target.href };
41078
- }
41079
- if (target.protocol === "blob:" && pageOrigin !== null && !target.crossOrigin) {
41080
- return { mode: "retype", src: target.href };
41081
- }
41082
- return null;
41083
- }
41084
- async function retypeAsPdf(src, fetchImpl = fetch) {
41085
- const res = await fetchImpl(src, { credentials: "same-origin" });
41086
- if (!res.ok) return null;
41087
- if (/html|xml/i.test(res.headers.get("content-type") ?? "")) return null;
41088
- const body = await res.blob();
41089
- return URL.createObjectURL(body.slice(0, body.size, "application/pdf"));
41090
- }
41091
- var init_pdfSource = __esm({
41092
- "../../core/web-renderer/src/pdfSource.ts"() {
41093
- init_webviewFrame();
41094
- }
41095
- });
41096
-
41097
41131
  // ../../core/web-renderer/src/a11y/controls.tsx
41098
41132
  import React5 from "react";
41099
41133
  import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
@@ -42833,9 +42867,142 @@ var init_richContent = __esm({
42833
42867
  }
42834
42868
  });
42835
42869
 
42870
+ // ../../core/web-renderer/src/pdfPageCount.ts
42871
+ function pdfPageCount(bytes2) {
42872
+ const text9 = pdfObjectSyntax(new TextDecoder("latin1").decode(bytes2));
42873
+ const rooted = pdfRootPageCount(text9);
42874
+ let scanned = null;
42875
+ for (const m2 of text9.matchAll(/<<((?:(?!<<|>>)[\s\S])*)>>/g)) {
42876
+ const dict = m2[1];
42877
+ if (!/\/Type\s*\/Pages(?![A-Za-z])/.test(dict)) continue;
42878
+ const c2 = /\/Count\s+(\d+)/.exec(dict);
42879
+ const n2 = c2 ? Number(c2[1]) : NaN;
42880
+ if (Number.isFinite(n2) && n2 > 0 && (scanned === null || n2 > scanned)) scanned = n2;
42881
+ }
42882
+ const count2 = rooted ?? scanned;
42883
+ if (count2 === null) return null;
42884
+ if (rooted !== null && scanned !== null && rooted !== scanned) return null;
42885
+ return count2 <= PDF_MAX_PLAUSIBLE_PAGES ? count2 : null;
42886
+ }
42887
+ function pdfObjectSyntax(text9) {
42888
+ const out2 = text9.split("");
42889
+ const blank = (from, to2) => {
42890
+ for (let k2 = from; k2 < to2; k2++) out2[k2] = " ";
42891
+ };
42892
+ let i2 = 0;
42893
+ while (i2 < text9.length) {
42894
+ const c2 = text9[i2];
42895
+ if (c2 === "%") {
42896
+ const eol = text9.slice(i2).search(/[\r\n]/);
42897
+ const end = eol < 0 ? text9.length : i2 + eol;
42898
+ blank(i2, end);
42899
+ i2 = end;
42900
+ } else if (c2 === "(") {
42901
+ let depth = 0;
42902
+ let j2 = i2;
42903
+ for (; j2 < text9.length; j2++) {
42904
+ const d2 = text9[j2];
42905
+ if (d2 === "\\") {
42906
+ j2++;
42907
+ continue;
42908
+ }
42909
+ if (d2 === "(") depth++;
42910
+ else if (d2 === ")" && --depth === 0) break;
42911
+ }
42912
+ blank(i2, j2 + 1);
42913
+ i2 = j2 + 1;
42914
+ } else if (c2 === "<" && text9[i2 + 1] !== "<") {
42915
+ const end = text9.indexOf(">", i2);
42916
+ const stop = end < 0 ? text9.length : end + 1;
42917
+ blank(i2, stop);
42918
+ i2 = stop;
42919
+ } else if (c2 === "<" && text9[i2 + 1] === "<") {
42920
+ i2 += 2;
42921
+ } else if (
42922
+ // The `stream` KEYWORD, not the tail of a name (`/my-stream`) or of `endstream`: preceded by
42923
+ // whitespace or the `>>` that closes its dictionary, and followed by CRLF or LF (PDF 32000
42924
+ // §7.3.8.1 — a CR alone is not allowed there).
42925
+ text9.startsWith("stream", i2) && /[\s>]/.test(text9[i2 - 1] ?? "") && (text9[i2 + 6] === "\n" || text9.startsWith("\r\n", i2 + 6))
42926
+ ) {
42927
+ const end = text9.indexOf("endstream", i2 + 6);
42928
+ const stop = end < 0 ? text9.length : end;
42929
+ blank(i2 + 6, stop);
42930
+ i2 = stop + "endstream".length;
42931
+ } else {
42932
+ i2++;
42933
+ }
42934
+ }
42935
+ return out2.join("");
42936
+ }
42937
+ function pdfRootPageCount(syntax) {
42938
+ const obj4 = (n3, g2) => {
42939
+ const all = [...syntax.matchAll(new RegExp(`(?:^|[^0-9])${n3}\\s+${g2}\\s+obj\\b`, "g"))];
42940
+ const at2 = all[all.length - 1];
42941
+ if (!at2) return null;
42942
+ const end = syntax.indexOf("endobj", at2.index);
42943
+ return syntax.slice(at2.index, end < 0 ? void 0 : end);
42944
+ };
42945
+ const trailers = [...syntax.matchAll(/trailer\s*<<([\s\S]*?)>>/g)];
42946
+ const root = trailers.length ? /\/Root\s+(\d+)\s+(\d+)\s+R/.exec(trailers[trailers.length - 1][1]) : null;
42947
+ if (!root) return null;
42948
+ const catalog3 = obj4(root[1], root[2]);
42949
+ const pagesRef = catalog3 ? /\/Pages\s+(\d+)\s+(\d+)\s+R/.exec(catalog3) : null;
42950
+ if (!pagesRef) return null;
42951
+ const pages2 = obj4(pagesRef[1], pagesRef[2]);
42952
+ const c2 = pages2 ? /\/Count\s+(\d+)/.exec(pages2) : null;
42953
+ const n2 = c2 ? Number(c2[1]) : NaN;
42954
+ return Number.isFinite(n2) && n2 > 0 ? n2 : null;
42955
+ }
42956
+ var PDF_MAX_PLAUSIBLE_PAGES;
42957
+ var init_pdfPageCount = __esm({
42958
+ "../../core/web-renderer/src/pdfPageCount.ts"() {
42959
+ PDF_MAX_PLAUSIBLE_PAGES = 1e5;
42960
+ }
42961
+ });
42962
+
42963
+ // ../../core/web-renderer/src/pdfFetch.ts
42964
+ var pdfFetch_exports = {};
42965
+ __export(pdfFetch_exports, {
42966
+ fetchPdfDocument: () => fetchPdfDocument,
42967
+ retypeAsPdf: () => retypeAsPdf,
42968
+ retypeAsPdfCounted: () => retypeAsPdfCounted
42969
+ });
42970
+ async function retypeAsPdf(src, fetchImpl = fetch) {
42971
+ return (await retypeAsPdfCounted(src, fetchImpl))?.url ?? null;
42972
+ }
42973
+ async function retypeAsPdfCounted(src, fetchImpl = fetch) {
42974
+ const res = await fetchImpl(src, { credentials: "same-origin" });
42975
+ if (!res.ok) return null;
42976
+ if (/html|xml/i.test(res.headers.get("content-type") ?? "")) return null;
42977
+ const body = await res.blob();
42978
+ const pageCount = await readPageCount(body);
42979
+ return { url: URL.createObjectURL(body.slice(0, body.size, "application/pdf")), pageCount };
42980
+ }
42981
+ async function readPageCount(body) {
42982
+ return pdfPageCount(new Uint8Array(await body.arrayBuffer()));
42983
+ }
42984
+ async function fetchPdfDocument(src, fetchImpl = fetch) {
42985
+ try {
42986
+ const res = await fetchImpl(src, { credentials: "omit" });
42987
+ if (!res.ok) return null;
42988
+ if (/html|xml/i.test(res.headers.get("content-type") ?? "")) return null;
42989
+ const body = await res.blob();
42990
+ const pageCount = await readPageCount(body);
42991
+ return { pageCount, blob: body.slice(0, body.size, "application/pdf") };
42992
+ } catch {
42993
+ return null;
42994
+ }
42995
+ }
42996
+ var init_pdfFetch = __esm({
42997
+ "../../core/web-renderer/src/pdfFetch.ts"() {
42998
+ init_pdfPageCount();
42999
+ }
43000
+ });
43001
+
42836
43002
  // ../../core/web-renderer/src/pdfPainter.ts
42837
- async function paintPdfDocument(document2, container, width = container.clientWidth || 600, startPage = 1, zoomPercent = 100, isCurrent = () => true) {
43003
+ async function paintPdfDocument(document2, container, width = container.clientWidth || 600, startPage = 1, zoomPercent = 100, isCurrent = () => true, onPageCount) {
42838
43004
  if (!isCurrent()) return document2.numPages;
43005
+ onPageCount?.(document2.numPages);
42839
43006
  container.replaceChildren();
42840
43007
  const pixelRatio = Math.max(1, Math.min(2, container.ownerDocument.defaultView?.devicePixelRatio || 1));
42841
43008
  const zoom = Math.max(1, zoomPercent) / 100;
@@ -123458,12 +123625,27 @@ async function destroyPdfDocumentLoad(loading) {
123458
123625
  } catch {
123459
123626
  }
123460
123627
  }
123461
- function PdfDocument({ src, nativeSrc, title, height, startPage, zoomPercent, style, loadDocument = loadPdfDocument }) {
123628
+ function PdfDocument({ src, nativeSrc, title, height, startPage, zoomPercent, style, onPageCount, onFallback, loadDocument = loadPdfDocument }) {
123462
123629
  const [pages2, setPages] = React8.useState(0);
123463
123630
  const [failedRequest, setFailedRequest] = React8.useState(null);
123464
- const request = JSON.stringify([src, startPage, zoomPercent]);
123631
+ const request = JSON.stringify([src, zoomPercent]);
123465
123632
  const failed3 = failedRequest === request;
123466
123633
  const containerRef = React8.useRef(null);
123634
+ const frameRef = React8.useRef(null);
123635
+ const startPageRef = React8.useRef(startPage);
123636
+ startPageRef.current = startPage;
123637
+ React8.useEffect(() => {
123638
+ if (failed3) onFallback?.();
123639
+ }, [failed3, onFallback]);
123640
+ React8.useEffect(() => {
123641
+ const frame2 = frameRef.current;
123642
+ const page = Math.min(pages2, Math.max(1, Math.floor(startPage ?? 1) || 1));
123643
+ const canvas = pages2 ? containerRef.current?.querySelector(`[data-pdf-page="${page}"]`) : null;
123644
+ if (!frame2 || !canvas) return;
123645
+ const box = frame2.getBoundingClientRect();
123646
+ const scale = frame2.offsetHeight > 0 && box.height > 0 ? box.height / frame2.offsetHeight : 1;
123647
+ frame2.scrollTop += (canvas.getBoundingClientRect().top - box.top) / scale;
123648
+ }, [startPage, pages2]);
123467
123649
  React8.useEffect(() => {
123468
123650
  let live3 = true;
123469
123651
  let loading;
@@ -123485,7 +123667,7 @@ function PdfDocument({ src, nativeSrc, title, height, startPage, zoomPercent, st
123485
123667
  }
123486
123668
  loading = task;
123487
123669
  const document2 = await task.promise;
123488
- const count2 = await paintPdfDocument(document2, container, container.clientWidth || 600, startPage, zoomPercent, () => live3);
123670
+ const count2 = await paintPdfDocument(document2, container, container.clientWidth || 600, startPageRef.current, zoomPercent, () => live3, onPageCount);
123489
123671
  if (live3) setPages(count2);
123490
123672
  })().catch(() => {
123491
123673
  if (live3) setFailedRequest(request);
@@ -123495,7 +123677,7 @@ function PdfDocument({ src, nativeSrc, title, height, startPage, zoomPercent, st
123495
123677
  if (loading) void destroyPdfDocumentLoad(loading);
123496
123678
  container?.replaceChildren();
123497
123679
  };
123498
- }, [src, startPage, zoomPercent, loadDocument, request]);
123680
+ }, [src, zoomPercent, onPageCount, loadDocument, request]);
123499
123681
  const frame = {
123500
123682
  width: "100%",
123501
123683
  height: height ?? 320,
@@ -123509,7 +123691,7 @@ function PdfDocument({ src, nativeSrc, title, height, startPage, zoomPercent, st
123509
123691
  if (failed3) {
123510
123692
  return /* @__PURE__ */ jsx9("object", { "data-himalaya-pdf": "native-fallback", "data-himalaya-pdf-zoom": zoomPercent ?? 100, data: nativeSrc, type: "application/pdf", "aria-label": title, style: frame });
123511
123693
  }
123512
- return /* @__PURE__ */ jsxs6("div", { "data-himalaya-pdf": "canvas-document", "data-himalaya-pdf-src": src, "data-himalaya-pdf-zoom": zoomPercent ?? 100, role: "group", "aria-label": title, "aria-busy": pages2 === 0, style: frame, children: [
123694
+ return /* @__PURE__ */ jsxs6("div", { ref: frameRef, "data-himalaya-pdf": "canvas-document", "data-himalaya-pdf-src": src, "data-himalaya-pdf-zoom": zoomPercent ?? 100, "data-himalaya-pdf-start-page": startPage ?? 1, "data-himalaya-pdf-native-src": nativeSrc, role: "group", "aria-label": title, "aria-busy": pages2 === 0, style: frame, children: [
123513
123695
  /* @__PURE__ */ jsx9("div", { ref: containerRef, "data-himalaya-pdf-pages": "true" }),
123514
123696
  pages2 ? /* @__PURE__ */ jsxs6("span", { "data-himalaya-pdf-page-count": "true", style: { position: "absolute", width: 1, height: 1, padding: 0, margin: -1, overflow: "hidden", clip: "rect(0,0,0,0)", whiteSpace: "nowrap", border: 0 }, children: [
123515
123697
  pages2,
@@ -124474,22 +124656,12 @@ function sourceFragment(src) {
124474
124656
  return "";
124475
124657
  }
124476
124658
  }
124477
- function sourcePage(fragment) {
124478
- const match = /(?:^|[&#])page=(\d+)(?:&|$)/.exec(fragment.replace(/^#/, ""));
124479
- const page = match ? Number(match[1]) : NaN;
124480
- return Number.isSafeInteger(page) && page > 0 ? page : void 0;
124481
- }
124482
124659
  function sourceZoomPercent(fragment) {
124483
124660
  const value = new URLSearchParams(fragment.replace(/^#/, "")).get("zoom");
124484
124661
  const match = value?.match(/^(\d+(?:\.\d+)?)(?:,|$)/);
124485
124662
  const zoom = match ? Number(match[1]) : NaN;
124486
124663
  return Number.isFinite(zoom) && zoom > 0 ? zoom : void 0;
124487
124664
  }
124488
- function fragmentWithPage(fragment, page) {
124489
- const params = new URLSearchParams(fragment.replace(/^#/, ""));
124490
- params.set("page", String(page));
124491
- return `#${params.toString()}`;
124492
- }
124493
124665
  function cloneWithKids(el2, props, kids3) {
124494
124666
  if (kids3 === el2.props.children) return React9.cloneElement(el2, props);
124495
124667
  return React9.cloneElement(el2, props, ...Array.isArray(kids3) ? kids3 : [kids3]);
@@ -126510,7 +126682,7 @@ function reportUnknownComponent(ctx, pkg, type) {
126510
126682
  function unknownComponentShowsDeveloperLabel(ctx) {
126511
126683
  return ctx.debugUnknownComponents ?? ctx.previewSurface != null;
126512
126684
  }
126513
- var 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, 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_LONG_PRESS_MS, MenuNode, 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, ButtonNode, OtpInputNode, ProgressBarNode, ACTIVITY_DEFAULT_NAME, ActivityIndicatorNode, NATIVELY_TABBABLE, BottomSheetNode, BOTTOM_DRAWER_HOST_STACK_EVENT, ModalBottomSheetNode, BottomDrawerNode, PRESENTED_OVERLAY_ATTR, PopoverNode, ChipsInputNode, ChipNode, TableNode, GaugeRing, GaugeNode, RATING_METRICS, ratingMetrics, RatingNode, AvatarStripNode, CHART_STROKE_CYCLE, chartStrokeAt, chartBarCenter, ChartNode, donutSliceOpacity, DonutChartNode, LegendMarker, LegendNode, cellAlign, DataTableNode, voiceNoteState, voiceNoteDelivery, VOICE_NOTE_DEFAULT_BARS, clampBarCount, VoiceNoteNode, TimelineNode, 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, reportedUnknownComponents, UnknownComponentNode, WebRenderer;
126685
+ var loadPdfFetch, 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, 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_LONG_PRESS_MS, MenuNode, 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, ButtonNode, OtpInputNode, ProgressBarNode, ACTIVITY_DEFAULT_NAME, ActivityIndicatorNode, NATIVELY_TABBABLE, BottomSheetNode, BOTTOM_DRAWER_HOST_STACK_EVENT, ModalBottomSheetNode, BottomDrawerNode, PRESENTED_OVERLAY_ATTR, PopoverNode, ChipsInputNode, ChipNode, TableNode, GaugeRing, GaugeNode, RATING_METRICS, ratingMetrics, RatingNode, AvatarStripNode, CHART_STROKE_CYCLE, chartStrokeAt, chartBarCenter, ChartNode, donutSliceOpacity, DonutChartNode, LegendMarker, LegendNode, cellAlign, DataTableNode, voiceNoteState, voiceNoteDelivery, VOICE_NOTE_DEFAULT_BARS, clampBarCount, VoiceNoteNode, TimelineNode, 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, reportedUnknownComponents, UnknownComponentNode, WebRenderer;
126514
126686
  var init_renderNode = __esm({
126515
126687
  "../../core/web-renderer/src/renderNode.tsx"() {
126516
126688
  "use strict";
@@ -126536,8 +126708,8 @@ var init_renderNode = __esm({
126536
126708
  init_motionDefaults();
126537
126709
  init_webviewFrame();
126538
126710
  init_richContentEditor();
126539
- init_mediaFieldUpload();
126540
126711
  init_pdfSource();
126712
+ init_mediaFieldUpload();
126541
126713
  init_icon_catalog_generated();
126542
126714
  init_controls();
126543
126715
  init_modalStack();
@@ -126550,6 +126722,7 @@ var init_renderNode = __esm({
126550
126722
  init_rich_content();
126551
126723
  init_rich_text_field();
126552
126724
  init_richContent();
126725
+ loadPdfFetch = () => Promise.resolve().then(() => (init_pdfFetch(), pdfFetch_exports));
126553
126726
  useIsomorphicLayoutEffect = typeof globalThis.document === "undefined" ? React9.useEffect : React9.useLayoutEffect;
126554
126727
  ResponsiveGrid = ({ base, medium, expanded, initialCols, seedWidth, spacing, extra, children }) => {
126555
126728
  const ref = React9.useRef(null);
@@ -128228,15 +128401,16 @@ var init_renderNode = __esm({
128228
128401
  if (!retypeSrc) return;
128229
128402
  let live3 = true;
128230
128403
  let made = null;
128231
- const settle = (u2) => {
128404
+ const settle = (r2) => {
128405
+ const u2 = r2?.url ?? null;
128232
128406
  made = u2;
128233
128407
  if (!live3) {
128234
128408
  if (u2) URL.revokeObjectURL(u2);
128235
128409
  return;
128236
128410
  }
128237
- setRetyped({ from: retypeSrc, url: u2 });
128411
+ setRetyped({ from: retypeSrc, url: u2, pageCount: r2?.pageCount ?? null });
128238
128412
  };
128239
- retypeAsPdf(retypeSrc).then(settle, () => settle(null));
128413
+ loadPdfFetch().then((m2) => m2.retypeAsPdfCounted(retypeSrc)).then(settle, () => settle(null));
128240
128414
  return () => {
128241
128415
  live3 = false;
128242
128416
  if (made) URL.revokeObjectURL(made);
@@ -128244,8 +128418,40 @@ var init_renderNode = __esm({
128244
128418
  };
128245
128419
  }, [retypeSrc]);
128246
128420
  const settled = retyped && retyped.from === retypeSrc ? retyped : null;
128421
+ const wantsShare = props.allowShare === true;
128422
+ const [fellBackFrom, setFellBackFrom] = React9.useState(null);
128423
+ const directFellBack = plan?.mode === "direct" && fellBackFrom === plan.src;
128424
+ const directSrc = plan?.mode === "direct" && (wantsShare || props.showPageControls !== false && directFellBack) ? plan.src : null;
128425
+ const [direct, setDirect] = React9.useState(null);
128426
+ React9.useEffect(() => {
128427
+ if (!directSrc) return;
128428
+ let live3 = true;
128429
+ let made = null;
128430
+ loadPdfFetch().then((m2) => m2.fetchPdfDocument(splitFragment(directSrc).base), () => null).then((doc) => {
128431
+ if (!live3) return;
128432
+ made = wantsShare && doc ? URL.createObjectURL(doc.blob) : null;
128433
+ setDirect({ from: directSrc, count: doc?.pageCount ?? null, blobUrl: made });
128434
+ });
128435
+ return () => {
128436
+ live3 = false;
128437
+ if (made) URL.revokeObjectURL(made);
128438
+ setDirect((cur) => cur?.from === directSrc ? null : cur);
128439
+ };
128440
+ }, [directSrc, wantsShare]);
128441
+ const directDoc = direct && direct.from === directSrc ? direct : null;
128442
+ const fallbackPageCount = plan?.mode === "retype" ? settled?.pageCount ?? null : directDoc?.count ?? null;
128443
+ const [nav, setNav] = React9.useState({ from: rawUrl, page: null, zoom: null });
128444
+ const view = nav.from === rawUrl ? nav : { from: rawUrl, page: null, zoom: null };
128247
128445
  const src = plan?.mode === "direct" ? plan.src : settled?.url ?? null;
128248
- const loading = plan?.mode === "retype" && !settled;
128446
+ const [canvasCount, setCanvasCount] = React9.useState(null);
128447
+ const onPageCount = React9.useCallback((count2) => {
128448
+ if (!Number.isInteger(count2) || count2 < 1) return;
128449
+ setCanvasCount((cur) => cur?.from === src && cur.count === count2 ? cur : { from: src, count: count2 });
128450
+ }, [src]);
128451
+ const pageCount = canvasCount?.from === src ? canvasCount.count : fallbackPageCount;
128452
+ const onFallback = React9.useCallback(() => setFellBackFrom(src), [src]);
128453
+ const loading = plan?.mode === "retype" && !settled || directSrc != null && wantsShare && !directDoc && typeof window !== "undefined";
128454
+ const loadSrc = plan?.mode === "direct" && wantsShare ? directDoc?.blobUrl ?? src : src;
128249
128455
  const ph = typeof props.height === "number" && props.height > 0 ? props.height : void 0;
128250
128456
  const frame = {
128251
128457
  width: "100%",
@@ -128279,25 +128485,83 @@ var init_renderNode = __esm({
128279
128485
  }
128280
128486
  );
128281
128487
  }
128282
- const originalFragment = plan?.mode === "retype" ? sourceFragment(retypeSrc) : sourceFragment(src);
128283
- const explicitStartPage = typeof props.startPage === "number" && Number.isFinite(props.startPage) && props.startPage > 0 ? Math.floor(props.startPage) : void 0;
128284
- const startPage = explicitStartPage || sourcePage(originalFragment);
128285
- const zoomPercent = sourceZoomPercent(originalFragment);
128286
- const nativeFragment = startPage ? fragmentWithPage(originalFragment, startPage) : originalFragment;
128287
- const nativeSrc = src.split("#", 1)[0] + nativeFragment;
128288
- if (typeof window === "undefined") {
128289
- return /* @__PURE__ */ jsx10(
128290
- "object",
128488
+ const showPageControls = props.showPageControls !== false;
128489
+ const zoomable = props.zoomable !== false;
128490
+ const allowShare = props.allowShare === true;
128491
+ const { base, hash: ownHash } = splitFragment(src);
128492
+ const sourceHash = plan?.mode === "retype" ? sourceFragment(retypeSrc) : ownHash;
128493
+ const startPage = typeof props.startPage === "number" && props.startPage >= 1 ? Math.floor(props.startPage) : null;
128494
+ const initialPage = startPage != null && pageCount != null && startPage > pageCount ? 1 : startPage;
128495
+ const page = view.page ?? initialPage;
128496
+ const requestedPage = page ?? fragmentPage(sourceHash) ?? 1;
128497
+ const shownPage = pageCount != null ? Math.min(requestedPage, pageCount) : requestedPage;
128498
+ const atEnd = pageCount != null && shownPage >= pageCount;
128499
+ const data = base + pdfOpenFragment(sourceHash, { page, zoom: zoomable ? view.zoom : null, fitWidth: !zoomable });
128500
+ const label3 = typeof props.title === "string" && props.title ? props.title : "PDF document";
128501
+ const documentStyle = showPageControls || zoomable || allowShare ? { display: "block", width: "100%", flex: "1 1 auto", minHeight: ph ? 0 : 280, border: "none" } : frame;
128502
+ const object7 = typeof window === "undefined" ? /* @__PURE__ */ jsx10("object", { "data-himalaya-pdf": "static-fallback", data, type: "application/pdf", "aria-label": label3, style: documentStyle }) : /* @__PURE__ */ jsx10(React9.Suspense, { fallback: /* @__PURE__ */ jsx10("div", { "data-himalaya-pdf": "loading", role: "img", "aria-label": "loading document", "aria-busy": "true", style: documentStyle }), children: /* @__PURE__ */ jsx10(
128503
+ PdfDocumentCanvas,
128504
+ {
128505
+ src: loadSrc ?? src,
128506
+ nativeSrc: data,
128507
+ title: label3,
128508
+ height: showPageControls || zoomable || allowShare ? void 0 : ph,
128509
+ onPageCount,
128510
+ onFallback,
128511
+ startPage: shownPage,
128512
+ zoomPercent: zoomable ? view.zoom ?? sourceZoomPercent(sourceHash) : void 0,
128513
+ style: documentStyle
128514
+ }
128515
+ ) });
128516
+ if (!showPageControls && !zoomable && !allowShare) return object7;
128517
+ const C2 = ctx.color;
128518
+ const go2 = (p2) => setNav({ from: rawUrl, page: Math.max(1, pageCount != null ? Math.min(p2, pageCount) : p2), zoom: view.zoom });
128519
+ const zoomBy = (d2) => setNav({ from: rawUrl, page: view.page, zoom: pdfZoomStep(view.zoom ?? sourceZoomPercent(sourceHash) ?? null, d2) });
128520
+ const btn = {
128521
+ border: "none",
128522
+ background: "none",
128523
+ cursor: "pointer",
128524
+ padding: "2px 8px",
128525
+ color: accentTextColor(ctx),
128526
+ fontSize: pxToRem(16),
128527
+ lineHeight: 1
128528
+ };
128529
+ const off = { ...btn, cursor: "default", color: C2("textSecondary", "#8a8a8e"), opacity: 0.5 };
128530
+ const fileName = rawUrl.split(/[?#]/)[0].split("/").pop() || "document.pdf";
128531
+ const downloadHref = plan?.mode === "retype" ? base : directDoc?.blobUrl ?? null;
128532
+ const openHref = base + pdfOpenFragment(sourceHash, { page: shownPage, zoom: zoomable ? view.zoom : null, viewerChrome: true });
128533
+ return /* @__PURE__ */ jsxs7("div", { "data-himalaya-pdf": "reader", style: { ...frame, display: "flex", flexDirection: "column", background: C2("surfaceTertiary", "#f4f4f4") }, children: [
128534
+ object7,
128535
+ /* @__PURE__ */ jsxs7(
128536
+ "div",
128291
128537
  {
128292
- "data-himalaya-pdf": "static-fallback",
128293
- data: nativeSrc,
128294
- type: "application/pdf",
128295
- "aria-label": typeof props.title === "string" && props.title ? props.title : "PDF document",
128296
- style: frame
128538
+ "data-himalaya-pdf-controls": "",
128539
+ role: "toolbar",
128540
+ "aria-label": "Document controls",
128541
+ style: { display: "flex", alignItems: "center", gap: 4, padding: "4px 8px", fontFamily: bodyFont(ctx), fontSize: pxToRem(12), color: C2("textSecondary", "#636b78") },
128542
+ children: [
128543
+ showPageControls && /* @__PURE__ */ jsxs7(Fragment4, { children: [
128544
+ /* @__PURE__ */ jsx10("button", { type: "button", "aria-label": "Previous page", disabled: shownPage <= 1, onClick: () => go2(shownPage - 1), style: shownPage <= 1 ? off : btn, children: "\u2039" }),
128545
+ /* @__PURE__ */ jsx10("span", { "data-himalaya-pdf-page": shownPage, "aria-live": "polite", children: pageCount != null ? `Page ${shownPage} of ${pageCount}` : `Page ${shownPage}` }),
128546
+ /* @__PURE__ */ jsx10("button", { type: "button", "aria-label": "Next page", disabled: atEnd, onClick: () => go2(shownPage + 1), style: atEnd ? off : btn, children: "\u203A" })
128547
+ ] }),
128548
+ /* @__PURE__ */ jsx10("span", { style: { flex: "1 1 auto" } }),
128549
+ zoomable && /* @__PURE__ */ jsxs7(Fragment4, { children: [
128550
+ /* @__PURE__ */ jsx10("button", { type: "button", "aria-label": "Zoom out", onClick: () => zoomBy(-1), style: btn, children: "\u2212" }),
128551
+ /* @__PURE__ */ jsx10("button", { type: "button", "aria-label": "Zoom in", onClick: () => zoomBy(1), style: btn, children: "+" })
128552
+ ] }),
128553
+ allowShare && (downloadHref ? (
128554
+ // Bytes the page holds (a re-typed blob, or a CORS fetch): a real download.
128555
+ /* @__PURE__ */ jsx10("a", { href: downloadHref, download: fileName, "aria-label": "Download PDF", style: { ...btn, textDecoration: "none", fontSize: pxToRem(12) }, children: "Download" })
128556
+ ) : (
128557
+ // A cross-origin document the page cannot read: `download` would be ignored, so say what
128558
+ // actually happens — it opens in a new tab.
128559
+ /* @__PURE__ */ jsx10("a", { href: openHref, target: "_blank", rel: "noopener noreferrer", "aria-label": "Open PDF in a new tab", style: { ...btn, textDecoration: "none", fontSize: pxToRem(12) }, children: "Open" })
128560
+ ))
128561
+ ]
128297
128562
  }
128298
- );
128299
- }
128300
- return /* @__PURE__ */ jsx10(React9.Suspense, { fallback: /* @__PURE__ */ jsx10("div", { "data-himalaya-pdf": "loading", role: "img", "aria-label": "loading document", "aria-busy": "true", style: { ...frame, background: "#f4f4f4" } }), children: /* @__PURE__ */ jsx10(PdfDocumentCanvas, { src, nativeSrc, title: typeof props.title === "string" && props.title ? props.title : "PDF document", height: ph, startPage, zoomPercent, style: frame }) });
128563
+ )
128564
+ ] });
128301
128565
  });
128302
128566
  WebViewNode = withExtras("WebViewNode", ({ props, ctx, wrap }) => {
128303
128567
  const boundUrl = useResolvedScalar(props.url != null && isBinding(props.url) ? props.url : void 0, ctx);
@@ -131376,7 +131640,10 @@ var init_renderNode = __esm({
131376
131640
  const events = Array.isArray(rawEvents) ? rawEvents : [];
131377
131641
  const boundAnchor = useResolvedScalar(props.anchorDatePath, ctx);
131378
131642
  const anchorRaw = props.anchorDatePath != null ? boundAnchor : props.anchorDate;
131379
- const anchor = (typeof anchorRaw === "string" ? parseLocalDate(anchorRaw) : null) ?? /* @__PURE__ */ new Date();
131643
+ const [pagedAnchor, setPagedAnchor] = React9.useState(null);
131644
+ const localAnchor = pagedAnchor && Object.is(pagedAnchor.raw, anchorRaw) && pagedAnchor.path === props.anchorDatePath && pagedAnchor.mode === props.mode && pagedAnchor.provider === ctx.provider ? pagedAnchor.date : null;
131645
+ if (pagedAnchor && !localAnchor) setPagedAnchor(null);
131646
+ const anchor = localAnchor ?? (typeof anchorRaw === "string" ? parseLocalDate(anchorRaw) : null) ?? /* @__PURE__ */ new Date();
131380
131647
  const mode = props.mode === "week" ? "week" : props.mode === "3day" ? "3day" : "day";
131381
131648
  const firstWeekday = typeof props.firstWeekday === "number" ? (props.firstWeekday % 7 + 7) % 7 : 0;
131382
131649
  const startHour = typeof props.startHour === "number" ? props.startHour : 0;
@@ -131413,6 +131680,7 @@ var init_renderNode = __esm({
131413
131680
  const rangeStep = mode === "week" ? 7 : mode === "3day" ? 3 : 1;
131414
131681
  const shiftRange = (deltaDays) => {
131415
131682
  const next = new Date(anchor.getFullYear(), anchor.getMonth(), anchor.getDate() + deltaDays);
131683
+ setPagedAnchor({ date: next, raw: anchorRaw, path: props.anchorDatePath, mode: props.mode, provider: ctx.provider });
131416
131684
  dispatchCalendarAction(ctx, props.onRangeChange, { anchorDate: localDayKey(next) });
131417
131685
  };
131418
131686
  const canPage = true;
@@ -162174,32 +162442,33 @@ var init_preview_assets_generated = __esm({
162174
162442
  "../../packages/serve/src/preview-assets.generated.ts"() {
162175
162443
  init_preview_assets_format();
162176
162444
  PREVIEW_ASSET_MANIFEST = [
162177
- { key: "assets/DashboardHost-BGAmHlPi.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 2916, sha256: "40ff970585adfbb037af639b06e224c5cd76104d5a42862cfae3efe2dab1e019" },
162178
- { key: "assets/DevDrawer-SNUF7DQT.js", contentType: "application/javascript; charset=utf-8", offset: 2924, length: 16744, sha256: "b9a32541fd4df0283b0076db5617daceda3bde389702e9175de6159a0b13159b" },
162179
- { key: "assets/IdiomCompare-DmNUc181.js", contentType: "application/javascript; charset=utf-8", offset: 19668, length: 1892, sha256: "e3f04cbdb3b622395ea8e1c28959554dfd4cc8ff32338fde23a328b5c33e6a7b" },
162180
- { key: "assets/LightboxViewer-BQPhAvOM.js", contentType: "application/javascript; charset=utf-8", offset: 21560, length: 8132, sha256: "ff198447c0b34367bc1338ebec3fdc990d951ba025ed5322b1aa23f2c63baca1" },
162181
- { key: "assets/PhonePreviewControl-CVNVCE2w.js", contentType: "application/javascript; charset=utf-8", offset: 29692, length: 37729, sha256: "6bb1137399ff106e78880c62e8d702d94905836153d1de141862d5ca89696e80" },
162182
- { key: "assets/SchemeCompare-DMnACRjW.js", contentType: "application/javascript; charset=utf-8", offset: 67421, length: 1824, sha256: "8e4175ba64191e0b035610f6fcdf7ceb65984766153656955ca7cce1785e3dd6" },
162183
- { key: "assets/index-DVDJaZos.js", contentType: "application/javascript; charset=utf-8", offset: 69245, length: 1276963, sha256: "0e745271be5c8090d4e587b654ccb220e5c7e37f05262193916929762f3c0563" },
162184
- { key: "assets/pdf-B2L4NVRw.js", contentType: "application/javascript; charset=utf-8", offset: 1346208, length: 488199, sha256: "044d412bb965b9c40e717215ff498f1c73cf4cb193c289d1123ddc41abb06ed7" },
162185
- { key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset: 1834407, length: 73, sha256: "41bcfda4f3c8c0a81c785ea87c69afc8e7d0ed8c333324aee94c273d881bb6aa" },
162186
- { key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset: 1834480, length: 1317034, sha256: "a33cfe728c584fdba4fcc1fd54bcdc2f9f2f13889ddbb5b2bd1d0f8cbe49b84e" },
162187
- { key: "assets/pdfDocument-C68K3P0b.js", contentType: "application/javascript; charset=utf-8", offset: 3151514, length: 2868, sha256: "c18450ed72b06bc1c52da6c9eca1db3ee416f5f2558cfb2826bd9918e75f24c4" },
162188
- { key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 3154382, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
162189
- { key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 3158992, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
162190
- { key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 3647576, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
162191
- { key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 3738500, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
162192
- { key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 3829484, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
162193
- { key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 3920464, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
162194
- { key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 4011336, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
162195
- { key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 4102316, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
162196
- { key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 4210952, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
162197
- { key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 4320036, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
162198
- { key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 4429084, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
162199
- { key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 4536784, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
162200
- { key: "himi-sw.js", contentType: "application/javascript; charset=utf-8", offset: 4624892, length: 6748, sha256: "4a92459977d7cefa1a6a7e020c3a63509737f083b3f2773557c1a5771665811a" },
162201
- { key: "index.html", contentType: "text/html; charset=utf-8", offset: 4631640, length: 4947, sha256: "2c4aaa358cdf3c14858f56c65fcb9be5718e9cc634eed8f8e183fee2bf7f6dfa" },
162202
- { key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 4636587, length: 17786, sha256: "084107ca997628c248f1b0ba3a7494744850df39fad813546ab8bdb82a6058da" }
162445
+ { key: "assets/DashboardHost-C8q83QJ2.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 2916, sha256: "144b7dc6e3662aa62ea0e8e03e9aae7762dc3dc2f63da56e8b04b1bb70db89ad" },
162446
+ { key: "assets/DevDrawer-DsUG7Nml.js", contentType: "application/javascript; charset=utf-8", offset: 2924, length: 16744, sha256: "7bcc9801a17aa2ba526fb0983ea315581e3ac2d4c45f625b719df716be0cd9c0" },
162447
+ { key: "assets/IdiomCompare-Cthh0ISj.js", contentType: "application/javascript; charset=utf-8", offset: 19668, length: 1892, sha256: "eab302721e7b8202f10d0c622d57b0dc28b3ab9ae3fe07b20a2563198ffd88d1" },
162448
+ { key: "assets/LightboxViewer-ASOCRp41.js", contentType: "application/javascript; charset=utf-8", offset: 21560, length: 8132, sha256: "46ab57a241855a13a17f94fec2a70ce9b45c1a4c3e54801c8c679328256edb33" },
162449
+ { key: "assets/PhonePreviewControl-B6cU9zp5.js", contentType: "application/javascript; charset=utf-8", offset: 29692, length: 37729, sha256: "c5550c028620913776998cf8818e8f9f794c02f5d234b7aeaf71671bf9080373" },
162450
+ { key: "assets/SchemeCompare--If17_u5.js", contentType: "application/javascript; charset=utf-8", offset: 67421, length: 1824, sha256: "66285df0006380de22ced18317a59c08ba318788d73d717a321ff1e5460c1fa0" },
162451
+ { key: "assets/index-CKaODCvf.js", contentType: "application/javascript; charset=utf-8", offset: 69245, length: 1280616, sha256: "6a91080524cebb84370c0fb3c04d74c99b2d704cb003a21f2e01912e7f47c0b2" },
162452
+ { key: "assets/pdf-B2304dXw.js", contentType: "application/javascript; charset=utf-8", offset: 1349861, length: 488199, sha256: "b284e54724b9ac6fd9b9dbddaf42c4a564d9ea1cb8ec0d78ea5b3c132c20cb41" },
162453
+ { key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset: 1838060, length: 73, sha256: "41bcfda4f3c8c0a81c785ea87c69afc8e7d0ed8c333324aee94c273d881bb6aa" },
162454
+ { key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset: 1838133, length: 1317034, sha256: "a33cfe728c584fdba4fcc1fd54bcdc2f9f2f13889ddbb5b2bd1d0f8cbe49b84e" },
162455
+ { key: "assets/pdfDocument-C5bi6q0r.js", contentType: "application/javascript; charset=utf-8", offset: 3155167, length: 3379, sha256: "ac6eff0d1c637a70fade3bd860a7dc531b1b1b4301012d3daf120b7a3ea9b7e6" },
162456
+ { key: "assets/pdfFetch-Cc8i1I1h.js", contentType: "application/javascript; charset=utf-8", offset: 3158546, length: 2266, sha256: "1d21ad008921942217c9eac0c35b1713773b9d89c71e3ab4412781f7bb88f463" },
162457
+ { key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 3160812, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
162458
+ { key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 3165422, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
162459
+ { key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 3654006, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
162460
+ { key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 3744930, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
162461
+ { key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 3835914, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
162462
+ { key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 3926894, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
162463
+ { key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 4017766, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
162464
+ { key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 4108746, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
162465
+ { key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 4217382, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
162466
+ { key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 4326466, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
162467
+ { key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 4435514, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
162468
+ { key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 4543214, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
162469
+ { key: "himi-sw.js", contentType: "application/javascript; charset=utf-8", offset: 4631322, length: 6748, sha256: "4a92459977d7cefa1a6a7e020c3a63509737f083b3f2773557c1a5771665811a" },
162470
+ { key: "index.html", contentType: "text/html; charset=utf-8", offset: 4638070, length: 4947, sha256: "8a3f524b30f25db213d2458d71a38298f4fbdcc8989bd0eee91428809bf45832" },
162471
+ { key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 4643017, length: 17786, sha256: "084107ca997628c248f1b0ba3a7494744850df39fad813546ab8bdb82a6058da" }
162203
162472
  ];
162204
162473
  }
162205
162474
  });
Binary file
@@ -21,8 +21,7 @@
21
21
  "Video",
22
22
  "PdfView",
23
23
  "MediaPlayer",
24
- "TimeGrid",
25
- "Agenda"
24
+ "TimeGrid"
26
25
  ],
27
26
  "components": [
28
27
  {
@@ -1277,31 +1276,18 @@
1277
1276
  "category": "Cross-cutting & media",
1278
1277
  "propsType": "PdfViewProps",
1279
1278
  "bindings": [],
1280
- "notImplemented": [
1281
- {
1282
- "props": [
1283
- "showPageControls",
1284
- "startPage"
1285
- ],
1286
- "platforms": [
1287
- "android"
1288
- ],
1289
- "severity": "styling",
1290
- "note": "No page controls. `startPage` is ignored."
1291
- },
1292
- {
1293
- "props": [
1294
- "showPageControls",
1295
- "zoomable",
1296
- "allowShare"
1297
- ],
1298
- "platforms": [
1299
- "web"
1300
- ],
1301
- "severity": "styling",
1302
- "note": "No page controls. The browser PDF viewer ignores `zoomable` and `allowShare`."
1303
- }
1304
- ],
1279
+ "notImplemented": {
1280
+ "props": [
1281
+ "showPageControls",
1282
+ "zoomable",
1283
+ "allowShare"
1284
+ ],
1285
+ "platforms": [
1286
+ "web"
1287
+ ],
1288
+ "severity": "styling",
1289
+ "note": "Interactive PDF.js canvas rendering honours the reader’s page, zoom and export controls. Static previews and PDF.js loading/rendering failures use a native browser-viewer fallback. In that fallback, hiding page or zoom controls is only a viewer hint and cannot reliably hide browser chrome; allowShare hides the reader’s export controls but cannot prevent browser save/print. These props are UI controls, not document access restrictions."
1290
+ },
1305
1291
  "propsSource": "export interface PdfViewProps {\n url?: string;\n height?: number;\n showPageControls?: boolean;\n /** 1-based; 0/absent ⇒ page 1. */\n startPage?: number;\n zoomable?: boolean;\n allowShare?: boolean;\n}"
1306
1292
  },
1307
1293
  {
@@ -1399,20 +1385,19 @@
1399
1385
  "category": "Rich vector & celebration (motion grammar Batch 4)",
1400
1386
  "propsType": "TimeGridProps",
1401
1387
  "bindings": [
1388
+ "anchorDatePath",
1402
1389
  "eventsPath",
1403
1390
  "resourcesPath"
1404
1391
  ],
1405
1392
  "notImplemented": {
1406
1393
  "props": [
1407
- "anchorDatePath",
1408
- "onRangeChange",
1409
1394
  "onCreate"
1410
1395
  ],
1411
1396
  "platforms": [
1412
1397
  "android"
1413
1398
  ],
1414
1399
  "severity": "category",
1415
- "note": "`anchorDatePath` does not bind, and `onRangeChange` and `onCreate` never fire."
1400
+ "note": "`onCreate` never fires."
1416
1401
  },
1417
1402
  "propsSource": "export interface TimeGridProps {\n mode?: \"day\" | \"3day\" | \"week\";\n anchorDate?: string;\n anchorDatePath?: string;\n events?: CalendarEvent[];\n eventsPath?: string;\n startHour?: number;\n endHour?: number;\n firstWeekday?: number;\n showNowLine?: boolean;\n onSelectEvent?: Action;\n onRangeChange?: Action;\n /** Per-event body, `$item.*`-substituted per event. Absent ⇒ the built-in block. */\n eventTemplate?: Component;\n /** RESOURCE lanes: staff, rooms, chairs, courts. Overlap packing already splits\n * concurrent events into ANONYMOUS sub-columns; lanes make a column MEAN\n * something. Single-day modes only — a week of resource columns is a 2-D grid\n * that does not fit a phone, so `mode: \"week\"` ignores them. */\n resources?: TimeGridResource[];\n resourcesPath?: string;\n /** EDITING. Opt-in, default off, so no existing read-only\n * grid can regress into one that moves bookings when a user meant to scroll. */\n editable?: boolean;\n /** Snap grid in minutes (default 15). A drag landing on 10:07 is almost never\n * what anyone meant, and no scheduling system accepts it. */\n snapMinutes?: number;\n /** Moved or resized → args{id, start, end}. The component REPORTS; the worker\n * decides. An edit that must be rejected has to be able to fail. */\n onEventChange?: Action;\n /** Empty space long-pressed → args{start, end} for one `snapMinutes` slot. */\n onCreate?: Action;\n /** Labels for the non-drag equivalents. Drag is unreachable by VoiceOver,\n * TalkBack and keyboard, so these are how editing stays operable at all. */\n moveActionLabel?: string;\n resizeActionLabel?: string;\n}"
1418
1403
  },
@@ -1424,16 +1409,6 @@
1424
1409
  "eventsPath",
1425
1410
  "scrollToDatePath"
1426
1411
  ],
1427
- "notImplemented": {
1428
- "props": [
1429
- "stickyHeaders"
1430
- ],
1431
- "platforms": [
1432
- "android"
1433
- ],
1434
- "severity": "styling",
1435
- "note": "Day headers do not pin."
1436
- },
1437
1412
  "propsSource": "export interface AgendaProps {\n events?: CalendarEvent[];\n eventsPath?: string;\n scrollToDate?: string;\n /** Worker-driven jump target (a literal `scrollToDate` is frozen in the descriptor). */\n scrollToDatePath?: string;\n stickyHeaders?: boolean;\n emptyText?: string;\n onSelectEvent?: Action;\n /** Per-event row body, `$item.*`-substituted per event. Closes the gap that made\n * `agendaList()` (the LazyList-backed PRESET, which takes a `rowTemplate`) more\n * expressive than this component. Absent ⇒ the built-in row. */\n eventTemplate?: Component;\n /** Newest-first. Absent/false ⇒ ascending. Applies to the day GROUPS and to the\n * events within each group. Without it a list whose default sort is \"Newest\"\n * (an owner's orders, recent activity) could not become an Agenda without\n * silently inverting itself — every arm sorted ascending unconditionally. */\n descending?: boolean;\n}"
1438
1413
  }
1439
1414
  ],
@@ -111,17 +111,17 @@ See also **[Modifiers](#modifiers)** (the `modifiers` block) and **[Actions](#ac
111
111
  | `Lottie` | Rich vector & celebration (motion grammar Batch 4) | — |
112
112
  | `Rive` | Rich vector & celebration (motion grammar Batch 4) | — |
113
113
  | `MonthCalendar` | Rich vector & celebration (motion grammar Batch 4) | `selectedDatePath`, `decorationsPath`, `yearPath`, `monthPath`, `selectedStartDatePath`, `selectedEndDatePath` |
114
- | `TimeGrid` | Rich vector & celebration (motion grammar Batch 4) | `eventsPath`, `resourcesPath` |
114
+ | `TimeGrid` | Rich vector & celebration (motion grammar Batch 4) | `anchorDatePath`, `eventsPath`, `resourcesPath` |
115
115
  | `Agenda` | Rich vector & celebration (motion grammar Batch 4) | `eventsPath`, `scrollToDatePath` |
116
116
 
117
117
  ## Not implemented (decoded but never read)
118
118
 
119
119
  These props are accepted by the schema and pass validation, but the named platform's renderer never reads them — they silently do nothing (no warning, no log). Prefer a prop NOT listed here, or drive the behaviour from a worker.
120
120
 
121
- **Scope: 19 of 86 components, all of them android / web / ios-only** — every other component/platform pair reads every prop it decodes. The list splits in two, and the halves mean different things:
121
+ **Scope: 18 of 86 components, all of them android / web / ios-only** — every other component/platform pair reads every prop it decodes. The list splits in two, and the halves mean different things:
122
122
 
123
123
  - **`category` (7: `Menu`, `Tooltip`, `Popover`, `ChipsInput`, `OtpInput`, `MediaPlayer`, `TimeGrid`)** — the prop changes the component's *kind*. These genuinely are **not implemented**: an overlay renders always-visible inline, so the component does not do the job its name implies. Check the row's note for a working alternative.
124
- - **`styling` (12: `Text`, `Icon`, `Carousel`, `Pager`, `Snackbar`, `WebView`, `Slider`, `SelectionControl`, `ActivityIndicator`, `Video`, `PdfView`, `Agenda`)** — the component itself **works**; only the listed prop is inert. `Slider` on iOS is a working slider whose `debounceMs` does not throttle — not a broken `Slider`. Use the component; just do not depend on that one prop.
124
+ - **`styling` (11: `Text`, `Icon`, `Carousel`, `Pager`, `Snackbar`, `WebView`, `Slider`, `SelectionControl`, `ActivityIndicator`, `Video`, `PdfView`)** — the component itself **works**; only the listed prop is inert. `Slider` on iOS is a working slider whose `debounceMs` does not throttle — not a broken `Slider`. Use the component; just do not depend on that one prop.
125
125
 
126
126
  | Component | Unread props | Platform | Kind | Note |
127
127
  |---|---|---|---|---|
@@ -141,13 +141,11 @@ These props are accepted by the schema and pass validation, but the named platfo
141
141
  | `ChipsInput` | `onAdd` | ios, android | category | `onAdd` never dispatches. |
142
142
  | `OtpInput` | `onComplete`, `onChange` | ios, android, web | category | Neither `onChange` nor `onComplete` dispatches. |
143
143
  | `Video` | `poster` | ios | styling | `poster` is not shown. |
144
- | `PdfView` | `showPageControls`, `startPage` | android | styling | No page controls. `startPage` is ignored. |
145
- | `PdfView` | `showPageControls`, `zoomable`, `allowShare` | web | styling | No page controls. The browser PDF viewer ignores `zoomable` and `allowShare`. |
144
+ | `PdfView` | `showPageControls`, `zoomable`, `allowShare` | web | styling | Interactive PDF.js canvas rendering honours the reader’s page, zoom and export controls. Static previews and PDF.js loading/rendering failures use a native browser-viewer fallback. In that fallback, hiding page or zoom controls is only a viewer hint and cannot reliably hide browser chrome; allowShare hides the reader’s export controls but cannot prevent browser save/print. These props are UI controls, not document access restrictions. |
146
145
  | `MediaPlayer` | `autoplayVisibilityThreshold`, `preload`, `playbackRates`, `showQueue`, `showChapters`, `showTranscript` | ios | category | `autoplayVisibilityThreshold` is ignored (whenVisible = once on appear). `preload` is ignored. `playbackRates` is ignored, and the queue/chapters/transcript panels never render. |
147
146
  | `MediaPlayer` | `externalPlayback`, `appearance`, `allowCellular`, `preload`, `playbackRates`, `showQueue`, `showChapters`, `showTranscript` | android | category | `externalPlayback` is forced off. `appearance` is ignored. `allowCellular` is ignored. `preload` is ignored. `playbackRates` is ignored, and the queue/chapters/transcript panels never render. |
148
147
  | `MediaPlayer` | `allowCellular`, `forwardSkipSeconds`, `backwardSkipSeconds`, `playbackRates`, `showQueue`, `showChapters`, `showTranscript` | web | category | `allowCellular` is ignored. Skip buttons ignore `forwardSkipSeconds`/`backwardSkipSeconds`. `playbackRates` is ignored, and the queue/chapters/transcript panels never render. |
149
- | `TimeGrid` | `anchorDatePath`, `onRangeChange`, `onCreate` | android | category | `anchorDatePath` does not bind, and `onRangeChange` and `onCreate` never fire. |
150
- | `Agenda` | `stickyHeaders` | android | styling | Day headers do not pin. |
148
+ | `TimeGrid` | `onCreate` | android | category | `onCreate` never fires. |
151
149
 
152
150
  ## Token slots: `TokenRef` object vs bare `TokenName` string
153
151
 
@@ -2090,9 +2088,7 @@ export interface PdfViewProps {
2090
2088
  }
2091
2089
  ```
2092
2090
 
2093
- > ⚠️ **Implemented, but these props are inert on android:** `showPageControls`, `startPage` — No page controls. `startPage` is ignored.
2094
-
2095
- > ⚠️ **Implemented, but these props are inert on web:** `showPageControls`, `zoomable`, `allowShare` — No page controls. The browser PDF viewer ignores `zoomable` and `allowShare`.
2091
+ > ⚠️ **Implemented, but these props are inert on web:** `showPageControls`, `zoomable`, `allowShare` — Interactive PDF.js canvas rendering honours the reader’s page, zoom and export controls. Static previews and PDF.js loading/rendering failures use a native browser-viewer fallback. In that fallback, hiding page or zoom controls is only a viewer hint and cannot reliably hide browser chrome; allowShare hides the reader’s export controls but cannot prevent browser save/print. These props are UI controls, not document access restrictions.
2096
2092
 
2097
2093
  #### MediaPlayer
2098
2094
 
@@ -2265,7 +2261,7 @@ export interface TimeGridProps {
2265
2261
  }
2266
2262
  ```
2267
2263
 
2268
- > ⚠️ **Not implemented on android:** `anchorDatePath`, `onRangeChange`, `onCreate` — `anchorDatePath` does not bind, and `onRangeChange` and `onCreate` never fire.
2264
+ > ⚠️ **Not implemented on android:** `onCreate` — `onCreate` never fires.
2269
2265
 
2270
2266
  #### Agenda
2271
2267
 
@@ -2291,8 +2287,6 @@ export interface AgendaProps {
2291
2287
  }
2292
2288
  ```
2293
2289
 
2294
- > ⚠️ **Implemented, but these props are inert on android:** `stickyHeaders` — Day headers do not pin.
2295
-
2296
2290
  ## Screen descriptor shape
2297
2291
 
2298
2292
  ```ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.1463.0",
3
+ "version": "0.1464.0",
4
4
  "type": "module",
5
5
  "description": "himi — the Himalaya authoring CLI. Build a Tier-5 content package on your own machine, push it to the production serve as a draft, preview it on web + Himi Player, and read worker logs back — the remote dev loop. Wraps @himalaya/serve-cli for transport.",
6
6
  "keywords": [
@@ -71,5 +71,5 @@
71
71
  "artifactId": "himalaya-cli"
72
72
  }
73
73
  },
74
- "falconPackageHash": "9e2f90a3f37647faaa0fcf412da0acd63f2014b9191f12a94959c6ff"
74
+ "falconPackageHash": "3919cfeb6cc26ef641fd143cfe0395aad1e15aea098655650caa396b"
75
75
  }