@wix/himalaya-cli 0.1463.0 → 0.1465.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
@@ -8127,6 +8127,7 @@ function resolveTranslation(value, catalog3, sourceCatalog) {
8127
8127
  var BINDING_SIGILS, BINDING_SIGIL_RE, TRANSLATION_PREFIX, TRANSLATION_KEY_RE;
8128
8128
  var init_bindings = __esm({
8129
8129
  "../../core/ts/src/bindings.ts"() {
8130
+ "use strict";
8130
8131
  BINDING_SIGILS = ["service", "flag", "item", "t"];
8131
8132
  BINDING_SIGIL_RE = new RegExp(
8132
8133
  `^\\$(?:${BINDING_SIGILS.filter((s2) => s2 !== "t").join("|")})\\b|^\\$t:`
@@ -39372,19 +39373,22 @@ function useResolvedScalar(v2, ctx) {
39372
39373
  function useBoundValue(ctx, binding2) {
39373
39374
  const path2 = servicePath(binding2);
39374
39375
  const active = !!ctx.provider && !!binding2;
39376
+ const provider = ctx.provider;
39375
39377
  const [state, setState] = useState(() => ({
39376
39378
  path: path2,
39377
- v: active ? ctx.provider.value(path2) : void 0
39379
+ provider,
39380
+ v: active ? provider.value(path2) : void 0
39378
39381
  }));
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 });
39382
+ const matches = state.path === path2 && state.provider === provider;
39383
+ const current = matches ? state.v : active ? provider.value(path2) : void 0;
39384
+ if (!matches) setState({ path: path2, provider, v: current });
39381
39385
  useEffect(() => {
39382
- if (!ctx.provider || !binding2) return;
39383
- return ctx.provider.subscribe(
39386
+ if (!provider || !binding2) return;
39387
+ return provider.subscribe(
39384
39388
  path2,
39385
- (nv) => setState((prev) => prev.path === path2 && Object.is(prev.v, nv) ? prev : { path: path2, v: nv })
39389
+ (nv) => setState((prev) => prev.path === path2 && prev.provider === provider && Object.is(prev.v, nv) ? prev : { path: path2, provider, v: nv })
39386
39390
  );
39387
- }, [ctx.provider, path2, binding2]);
39391
+ }, [provider, path2, binding2]);
39388
39392
  return active ? current : void 0;
39389
39393
  }
39390
39394
  function useBoundValues(ctx, bindings) {
@@ -40880,6 +40884,76 @@ var init_richContentEditor = __esm({
40880
40884
  }
40881
40885
  });
40882
40886
 
40887
+ // ../../core/web-renderer/src/pdfSource.ts
40888
+ function pdfEmbedPlan(url, pageOrigin = currentOrigin(), pageUrl) {
40889
+ let source = url;
40890
+ if (pageOrigin !== null && pageUrl) {
40891
+ try {
40892
+ const base = new URL(pageUrl);
40893
+ if (base.origin === pageOrigin) source = new URL(url, base).href;
40894
+ } catch {
40895
+ return null;
40896
+ }
40897
+ }
40898
+ const target = classifyEmbedUrl(source, pageOrigin);
40899
+ if (!target) return null;
40900
+ if (target.protocol === "http:" || target.protocol === "https:") {
40901
+ if (pageOrigin === null) {
40902
+ if (target.absolute) return { mode: "direct", src: target.href };
40903
+ if (target.schemeRelative) return { mode: "direct", src: target.href.replace(/^https?:/, "") };
40904
+ return null;
40905
+ }
40906
+ return { mode: target.crossOrigin ? "direct" : "retype", src: target.href };
40907
+ }
40908
+ if (target.protocol === "blob:" && pageOrigin !== null && !target.crossOrigin) {
40909
+ return { mode: "retype", src: target.href };
40910
+ }
40911
+ return null;
40912
+ }
40913
+ function splitFragment(src) {
40914
+ const i2 = src.indexOf("#");
40915
+ return i2 < 0 ? { base: src, hash: "" } : { base: src.slice(0, i2), hash: src.slice(i2) };
40916
+ }
40917
+ function fragmentPage(hash2) {
40918
+ const m2 = /(?:^#|&)page=(\d+)/.exec(hash2);
40919
+ const n2 = m2 ? Number(m2[1]) : NaN;
40920
+ return Number.isFinite(n2) && n2 >= 1 ? n2 : null;
40921
+ }
40922
+ function pdfOpenFragment(sourceHash, opts) {
40923
+ const params = /* @__PURE__ */ new Map();
40924
+ for (const part3 of sourceHash.replace(/^#/, "").split("&")) {
40925
+ if (!part3) continue;
40926
+ const eq = part3.indexOf("=");
40927
+ params.set(eq < 0 ? part3 : part3.slice(0, eq), eq < 0 ? "" : part3.slice(eq + 1));
40928
+ }
40929
+ if (opts.page != null && opts.page >= 1) params.set("page", String(Math.floor(opts.page)));
40930
+ if (opts.fitWidth) {
40931
+ params.delete("zoom");
40932
+ params.set("view", "FitH");
40933
+ } else if (opts.zoom != null) {
40934
+ params.set("zoom", String(Math.round(opts.zoom)));
40935
+ }
40936
+ if (!opts.viewerChrome) {
40937
+ params.set("toolbar", "0");
40938
+ params.set("navpanes", "0");
40939
+ }
40940
+ return params.size ? "#" + [...params].map(([k2, v2]) => v2 === "" ? k2 : `${k2}=${v2}`).join("&") : "";
40941
+ }
40942
+ function pdfZoomStep(current, direction) {
40943
+ const from = current ?? PDF_ZOOM_DEFAULT;
40944
+ return Math.min(PDF_ZOOM_MAX, Math.max(PDF_ZOOM_MIN, from + direction * PDF_ZOOM_STEP));
40945
+ }
40946
+ var PDF_ZOOM_MIN, PDF_ZOOM_MAX, PDF_ZOOM_STEP, PDF_ZOOM_DEFAULT;
40947
+ var init_pdfSource = __esm({
40948
+ "../../core/web-renderer/src/pdfSource.ts"() {
40949
+ init_webviewFrame();
40950
+ PDF_ZOOM_MIN = 50;
40951
+ PDF_ZOOM_MAX = 400;
40952
+ PDF_ZOOM_STEP = 25;
40953
+ PDF_ZOOM_DEFAULT = 100;
40954
+ }
40955
+ });
40956
+
40883
40957
  // ../../core/web-host/src/actions/presigned-upload-policy.ts
40884
40958
  function hostMatches(host) {
40885
40959
  const h2 = host.toLowerCase().split(":")[0];
@@ -41055,45 +41129,6 @@ var init_mediaFieldUpload = __esm({
41055
41129
  }
41056
41130
  });
41057
41131
 
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
41132
  // ../../core/web-renderer/src/a11y/controls.tsx
41098
41133
  import React5 from "react";
41099
41134
  import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
@@ -42833,9 +42868,142 @@ var init_richContent = __esm({
42833
42868
  }
42834
42869
  });
42835
42870
 
42871
+ // ../../core/web-renderer/src/pdfPageCount.ts
42872
+ function pdfPageCount(bytes2) {
42873
+ const text9 = pdfObjectSyntax(new TextDecoder("latin1").decode(bytes2));
42874
+ const rooted = pdfRootPageCount(text9);
42875
+ let scanned = null;
42876
+ for (const m2 of text9.matchAll(/<<((?:(?!<<|>>)[\s\S])*)>>/g)) {
42877
+ const dict = m2[1];
42878
+ if (!/\/Type\s*\/Pages(?![A-Za-z])/.test(dict)) continue;
42879
+ const c2 = /\/Count\s+(\d+)/.exec(dict);
42880
+ const n2 = c2 ? Number(c2[1]) : NaN;
42881
+ if (Number.isFinite(n2) && n2 > 0 && (scanned === null || n2 > scanned)) scanned = n2;
42882
+ }
42883
+ const count2 = rooted ?? scanned;
42884
+ if (count2 === null) return null;
42885
+ if (rooted !== null && scanned !== null && rooted !== scanned) return null;
42886
+ return count2 <= PDF_MAX_PLAUSIBLE_PAGES ? count2 : null;
42887
+ }
42888
+ function pdfObjectSyntax(text9) {
42889
+ const out2 = text9.split("");
42890
+ const blank = (from, to2) => {
42891
+ for (let k2 = from; k2 < to2; k2++) out2[k2] = " ";
42892
+ };
42893
+ let i2 = 0;
42894
+ while (i2 < text9.length) {
42895
+ const c2 = text9[i2];
42896
+ if (c2 === "%") {
42897
+ const eol = text9.slice(i2).search(/[\r\n]/);
42898
+ const end = eol < 0 ? text9.length : i2 + eol;
42899
+ blank(i2, end);
42900
+ i2 = end;
42901
+ } else if (c2 === "(") {
42902
+ let depth = 0;
42903
+ let j2 = i2;
42904
+ for (; j2 < text9.length; j2++) {
42905
+ const d2 = text9[j2];
42906
+ if (d2 === "\\") {
42907
+ j2++;
42908
+ continue;
42909
+ }
42910
+ if (d2 === "(") depth++;
42911
+ else if (d2 === ")" && --depth === 0) break;
42912
+ }
42913
+ blank(i2, j2 + 1);
42914
+ i2 = j2 + 1;
42915
+ } else if (c2 === "<" && text9[i2 + 1] !== "<") {
42916
+ const end = text9.indexOf(">", i2);
42917
+ const stop = end < 0 ? text9.length : end + 1;
42918
+ blank(i2, stop);
42919
+ i2 = stop;
42920
+ } else if (c2 === "<" && text9[i2 + 1] === "<") {
42921
+ i2 += 2;
42922
+ } else if (
42923
+ // The `stream` KEYWORD, not the tail of a name (`/my-stream`) or of `endstream`: preceded by
42924
+ // whitespace or the `>>` that closes its dictionary, and followed by CRLF or LF (PDF 32000
42925
+ // §7.3.8.1 — a CR alone is not allowed there).
42926
+ text9.startsWith("stream", i2) && /[\s>]/.test(text9[i2 - 1] ?? "") && (text9[i2 + 6] === "\n" || text9.startsWith("\r\n", i2 + 6))
42927
+ ) {
42928
+ const end = text9.indexOf("endstream", i2 + 6);
42929
+ const stop = end < 0 ? text9.length : end;
42930
+ blank(i2 + 6, stop);
42931
+ i2 = stop + "endstream".length;
42932
+ } else {
42933
+ i2++;
42934
+ }
42935
+ }
42936
+ return out2.join("");
42937
+ }
42938
+ function pdfRootPageCount(syntax) {
42939
+ const obj4 = (n3, g2) => {
42940
+ const all = [...syntax.matchAll(new RegExp(`(?:^|[^0-9])${n3}\\s+${g2}\\s+obj\\b`, "g"))];
42941
+ const at2 = all[all.length - 1];
42942
+ if (!at2) return null;
42943
+ const end = syntax.indexOf("endobj", at2.index);
42944
+ return syntax.slice(at2.index, end < 0 ? void 0 : end);
42945
+ };
42946
+ const trailers = [...syntax.matchAll(/trailer\s*<<([\s\S]*?)>>/g)];
42947
+ const root = trailers.length ? /\/Root\s+(\d+)\s+(\d+)\s+R/.exec(trailers[trailers.length - 1][1]) : null;
42948
+ if (!root) return null;
42949
+ const catalog3 = obj4(root[1], root[2]);
42950
+ const pagesRef = catalog3 ? /\/Pages\s+(\d+)\s+(\d+)\s+R/.exec(catalog3) : null;
42951
+ if (!pagesRef) return null;
42952
+ const pages2 = obj4(pagesRef[1], pagesRef[2]);
42953
+ const c2 = pages2 ? /\/Count\s+(\d+)/.exec(pages2) : null;
42954
+ const n2 = c2 ? Number(c2[1]) : NaN;
42955
+ return Number.isFinite(n2) && n2 > 0 ? n2 : null;
42956
+ }
42957
+ var PDF_MAX_PLAUSIBLE_PAGES;
42958
+ var init_pdfPageCount = __esm({
42959
+ "../../core/web-renderer/src/pdfPageCount.ts"() {
42960
+ PDF_MAX_PLAUSIBLE_PAGES = 1e5;
42961
+ }
42962
+ });
42963
+
42964
+ // ../../core/web-renderer/src/pdfFetch.ts
42965
+ var pdfFetch_exports = {};
42966
+ __export(pdfFetch_exports, {
42967
+ fetchPdfDocument: () => fetchPdfDocument,
42968
+ retypeAsPdf: () => retypeAsPdf,
42969
+ retypeAsPdfCounted: () => retypeAsPdfCounted
42970
+ });
42971
+ async function retypeAsPdf(src, fetchImpl = fetch) {
42972
+ return (await retypeAsPdfCounted(src, fetchImpl))?.url ?? null;
42973
+ }
42974
+ async function retypeAsPdfCounted(src, fetchImpl = fetch) {
42975
+ const res = await fetchImpl(src, { credentials: "same-origin" });
42976
+ if (!res.ok) return null;
42977
+ if (/html|xml/i.test(res.headers.get("content-type") ?? "")) return null;
42978
+ const body = await res.blob();
42979
+ const pageCount = await readPageCount(body);
42980
+ return { url: URL.createObjectURL(body.slice(0, body.size, "application/pdf")), pageCount };
42981
+ }
42982
+ async function readPageCount(body) {
42983
+ return pdfPageCount(new Uint8Array(await body.arrayBuffer()));
42984
+ }
42985
+ async function fetchPdfDocument(src, fetchImpl = fetch) {
42986
+ try {
42987
+ const res = await fetchImpl(src, { credentials: "omit" });
42988
+ if (!res.ok) return null;
42989
+ if (/html|xml/i.test(res.headers.get("content-type") ?? "")) return null;
42990
+ const body = await res.blob();
42991
+ const pageCount = await readPageCount(body);
42992
+ return { pageCount, blob: body.slice(0, body.size, "application/pdf") };
42993
+ } catch {
42994
+ return null;
42995
+ }
42996
+ }
42997
+ var init_pdfFetch = __esm({
42998
+ "../../core/web-renderer/src/pdfFetch.ts"() {
42999
+ init_pdfPageCount();
43000
+ }
43001
+ });
43002
+
42836
43003
  // ../../core/web-renderer/src/pdfPainter.ts
42837
- async function paintPdfDocument(document2, container, width = container.clientWidth || 600, startPage = 1, zoomPercent = 100, isCurrent = () => true) {
43004
+ async function paintPdfDocument(document2, container, width = container.clientWidth || 600, startPage = 1, zoomPercent = 100, isCurrent = () => true, onPageCount) {
42838
43005
  if (!isCurrent()) return document2.numPages;
43006
+ onPageCount?.(document2.numPages);
42839
43007
  container.replaceChildren();
42840
43008
  const pixelRatio = Math.max(1, Math.min(2, container.ownerDocument.defaultView?.devicePixelRatio || 1));
42841
43009
  const zoom = Math.max(1, zoomPercent) / 100;
@@ -123458,12 +123626,27 @@ async function destroyPdfDocumentLoad(loading) {
123458
123626
  } catch {
123459
123627
  }
123460
123628
  }
123461
- function PdfDocument({ src, nativeSrc, title, height, startPage, zoomPercent, style, loadDocument = loadPdfDocument }) {
123629
+ function PdfDocument({ src, nativeSrc, title, height, startPage, zoomPercent, style, onPageCount, onFallback, loadDocument = loadPdfDocument }) {
123462
123630
  const [pages2, setPages] = React8.useState(0);
123463
123631
  const [failedRequest, setFailedRequest] = React8.useState(null);
123464
- const request = JSON.stringify([src, startPage, zoomPercent]);
123632
+ const request = JSON.stringify([src, zoomPercent]);
123465
123633
  const failed3 = failedRequest === request;
123466
123634
  const containerRef = React8.useRef(null);
123635
+ const frameRef = React8.useRef(null);
123636
+ const startPageRef = React8.useRef(startPage);
123637
+ startPageRef.current = startPage;
123638
+ React8.useEffect(() => {
123639
+ if (failed3) onFallback?.();
123640
+ }, [failed3, onFallback]);
123641
+ React8.useEffect(() => {
123642
+ const frame2 = frameRef.current;
123643
+ const page = Math.min(pages2, Math.max(1, Math.floor(startPage ?? 1) || 1));
123644
+ const canvas = pages2 ? containerRef.current?.querySelector(`[data-pdf-page="${page}"]`) : null;
123645
+ if (!frame2 || !canvas) return;
123646
+ const box = frame2.getBoundingClientRect();
123647
+ const scale = frame2.offsetHeight > 0 && box.height > 0 ? box.height / frame2.offsetHeight : 1;
123648
+ frame2.scrollTop += (canvas.getBoundingClientRect().top - box.top) / scale;
123649
+ }, [startPage, pages2]);
123467
123650
  React8.useEffect(() => {
123468
123651
  let live3 = true;
123469
123652
  let loading;
@@ -123485,7 +123668,7 @@ function PdfDocument({ src, nativeSrc, title, height, startPage, zoomPercent, st
123485
123668
  }
123486
123669
  loading = task;
123487
123670
  const document2 = await task.promise;
123488
- const count2 = await paintPdfDocument(document2, container, container.clientWidth || 600, startPage, zoomPercent, () => live3);
123671
+ const count2 = await paintPdfDocument(document2, container, container.clientWidth || 600, startPageRef.current, zoomPercent, () => live3, onPageCount);
123489
123672
  if (live3) setPages(count2);
123490
123673
  })().catch(() => {
123491
123674
  if (live3) setFailedRequest(request);
@@ -123495,7 +123678,7 @@ function PdfDocument({ src, nativeSrc, title, height, startPage, zoomPercent, st
123495
123678
  if (loading) void destroyPdfDocumentLoad(loading);
123496
123679
  container?.replaceChildren();
123497
123680
  };
123498
- }, [src, startPage, zoomPercent, loadDocument, request]);
123681
+ }, [src, zoomPercent, onPageCount, loadDocument, request]);
123499
123682
  const frame = {
123500
123683
  width: "100%",
123501
123684
  height: height ?? 320,
@@ -123509,7 +123692,7 @@ function PdfDocument({ src, nativeSrc, title, height, startPage, zoomPercent, st
123509
123692
  if (failed3) {
123510
123693
  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
123694
  }
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: [
123695
+ 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
123696
  /* @__PURE__ */ jsx9("div", { ref: containerRef, "data-himalaya-pdf-pages": "true" }),
123514
123697
  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
123698
  pages2,
@@ -124474,22 +124657,12 @@ function sourceFragment(src) {
124474
124657
  return "";
124475
124658
  }
124476
124659
  }
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
124660
  function sourceZoomPercent(fragment) {
124483
124661
  const value = new URLSearchParams(fragment.replace(/^#/, "")).get("zoom");
124484
124662
  const match = value?.match(/^(\d+(?:\.\d+)?)(?:,|$)/);
124485
124663
  const zoom = match ? Number(match[1]) : NaN;
124486
124664
  return Number.isFinite(zoom) && zoom > 0 ? zoom : void 0;
124487
124665
  }
124488
- function fragmentWithPage(fragment, page) {
124489
- const params = new URLSearchParams(fragment.replace(/^#/, ""));
124490
- params.set("page", String(page));
124491
- return `#${params.toString()}`;
124492
- }
124493
124666
  function cloneWithKids(el2, props, kids3) {
124494
124667
  if (kids3 === el2.props.children) return React9.cloneElement(el2, props);
124495
124668
  return React9.cloneElement(el2, props, ...Array.isArray(kids3) ? kids3 : [kids3]);
@@ -126510,7 +126683,7 @@ function reportUnknownComponent(ctx, pkg, type) {
126510
126683
  function unknownComponentShowsDeveloperLabel(ctx) {
126511
126684
  return ctx.debugUnknownComponents ?? ctx.previewSurface != null;
126512
126685
  }
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;
126686
+ 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
126687
  var init_renderNode = __esm({
126515
126688
  "../../core/web-renderer/src/renderNode.tsx"() {
126516
126689
  "use strict";
@@ -126536,8 +126709,8 @@ var init_renderNode = __esm({
126536
126709
  init_motionDefaults();
126537
126710
  init_webviewFrame();
126538
126711
  init_richContentEditor();
126539
- init_mediaFieldUpload();
126540
126712
  init_pdfSource();
126713
+ init_mediaFieldUpload();
126541
126714
  init_icon_catalog_generated();
126542
126715
  init_controls();
126543
126716
  init_modalStack();
@@ -126550,6 +126723,7 @@ var init_renderNode = __esm({
126550
126723
  init_rich_content();
126551
126724
  init_rich_text_field();
126552
126725
  init_richContent();
126726
+ loadPdfFetch = () => Promise.resolve().then(() => (init_pdfFetch(), pdfFetch_exports));
126553
126727
  useIsomorphicLayoutEffect = typeof globalThis.document === "undefined" ? React9.useEffect : React9.useLayoutEffect;
126554
126728
  ResponsiveGrid = ({ base, medium, expanded, initialCols, seedWidth, spacing, extra, children }) => {
126555
126729
  const ref = React9.useRef(null);
@@ -128228,15 +128402,16 @@ var init_renderNode = __esm({
128228
128402
  if (!retypeSrc) return;
128229
128403
  let live3 = true;
128230
128404
  let made = null;
128231
- const settle = (u2) => {
128405
+ const settle = (r2) => {
128406
+ const u2 = r2?.url ?? null;
128232
128407
  made = u2;
128233
128408
  if (!live3) {
128234
128409
  if (u2) URL.revokeObjectURL(u2);
128235
128410
  return;
128236
128411
  }
128237
- setRetyped({ from: retypeSrc, url: u2 });
128412
+ setRetyped({ from: retypeSrc, url: u2, pageCount: r2?.pageCount ?? null });
128238
128413
  };
128239
- retypeAsPdf(retypeSrc).then(settle, () => settle(null));
128414
+ loadPdfFetch().then((m2) => m2.retypeAsPdfCounted(retypeSrc)).then(settle, () => settle(null));
128240
128415
  return () => {
128241
128416
  live3 = false;
128242
128417
  if (made) URL.revokeObjectURL(made);
@@ -128244,8 +128419,40 @@ var init_renderNode = __esm({
128244
128419
  };
128245
128420
  }, [retypeSrc]);
128246
128421
  const settled = retyped && retyped.from === retypeSrc ? retyped : null;
128422
+ const wantsShare = props.allowShare === true;
128423
+ const [fellBackFrom, setFellBackFrom] = React9.useState(null);
128424
+ const directFellBack = plan?.mode === "direct" && fellBackFrom === plan.src;
128425
+ const directSrc = plan?.mode === "direct" && (wantsShare || props.showPageControls !== false && directFellBack) ? plan.src : null;
128426
+ const [direct, setDirect] = React9.useState(null);
128427
+ React9.useEffect(() => {
128428
+ if (!directSrc) return;
128429
+ let live3 = true;
128430
+ let made = null;
128431
+ loadPdfFetch().then((m2) => m2.fetchPdfDocument(splitFragment(directSrc).base), () => null).then((doc) => {
128432
+ if (!live3) return;
128433
+ made = wantsShare && doc ? URL.createObjectURL(doc.blob) : null;
128434
+ setDirect({ from: directSrc, count: doc?.pageCount ?? null, blobUrl: made });
128435
+ });
128436
+ return () => {
128437
+ live3 = false;
128438
+ if (made) URL.revokeObjectURL(made);
128439
+ setDirect((cur) => cur?.from === directSrc ? null : cur);
128440
+ };
128441
+ }, [directSrc, wantsShare]);
128442
+ const directDoc = direct && direct.from === directSrc ? direct : null;
128443
+ const fallbackPageCount = plan?.mode === "retype" ? settled?.pageCount ?? null : directDoc?.count ?? null;
128444
+ const [nav, setNav] = React9.useState({ from: rawUrl, page: null, zoom: null });
128445
+ const view = nav.from === rawUrl ? nav : { from: rawUrl, page: null, zoom: null };
128247
128446
  const src = plan?.mode === "direct" ? plan.src : settled?.url ?? null;
128248
- const loading = plan?.mode === "retype" && !settled;
128447
+ const [canvasCount, setCanvasCount] = React9.useState(null);
128448
+ const onPageCount = React9.useCallback((count2) => {
128449
+ if (!Number.isInteger(count2) || count2 < 1) return;
128450
+ setCanvasCount((cur) => cur?.from === src && cur.count === count2 ? cur : { from: src, count: count2 });
128451
+ }, [src]);
128452
+ const pageCount = canvasCount?.from === src ? canvasCount.count : fallbackPageCount;
128453
+ const onFallback = React9.useCallback(() => setFellBackFrom(src), [src]);
128454
+ const loading = plan?.mode === "retype" && !settled || directSrc != null && wantsShare && !directDoc && typeof window !== "undefined";
128455
+ const loadSrc = plan?.mode === "direct" && wantsShare ? directDoc?.blobUrl ?? src : src;
128249
128456
  const ph = typeof props.height === "number" && props.height > 0 ? props.height : void 0;
128250
128457
  const frame = {
128251
128458
  width: "100%",
@@ -128279,25 +128486,83 @@ var init_renderNode = __esm({
128279
128486
  }
128280
128487
  );
128281
128488
  }
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",
128489
+ const showPageControls = props.showPageControls !== false;
128490
+ const zoomable = props.zoomable !== false;
128491
+ const allowShare = props.allowShare === true;
128492
+ const { base, hash: ownHash } = splitFragment(src);
128493
+ const sourceHash = plan?.mode === "retype" ? sourceFragment(retypeSrc) : ownHash;
128494
+ const startPage = typeof props.startPage === "number" && props.startPage >= 1 ? Math.floor(props.startPage) : null;
128495
+ const initialPage = startPage != null && pageCount != null && startPage > pageCount ? 1 : startPage;
128496
+ const page = view.page ?? initialPage;
128497
+ const requestedPage = page ?? fragmentPage(sourceHash) ?? 1;
128498
+ const shownPage = pageCount != null ? Math.min(requestedPage, pageCount) : requestedPage;
128499
+ const atEnd = pageCount != null && shownPage >= pageCount;
128500
+ const data = base + pdfOpenFragment(sourceHash, { page, zoom: zoomable ? view.zoom : null, fitWidth: !zoomable });
128501
+ const label3 = typeof props.title === "string" && props.title ? props.title : "PDF document";
128502
+ const documentStyle = showPageControls || zoomable || allowShare ? { display: "block", width: "100%", flex: "1 1 auto", minHeight: ph ? 0 : 280, border: "none" } : frame;
128503
+ 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(
128504
+ PdfDocumentCanvas,
128505
+ {
128506
+ src: loadSrc ?? src,
128507
+ nativeSrc: data,
128508
+ title: label3,
128509
+ height: showPageControls || zoomable || allowShare ? void 0 : ph,
128510
+ onPageCount,
128511
+ onFallback,
128512
+ startPage: shownPage,
128513
+ zoomPercent: zoomable ? view.zoom ?? sourceZoomPercent(sourceHash) : void 0,
128514
+ style: documentStyle
128515
+ }
128516
+ ) });
128517
+ if (!showPageControls && !zoomable && !allowShare) return object7;
128518
+ const C2 = ctx.color;
128519
+ const go2 = (p2) => setNav({ from: rawUrl, page: Math.max(1, pageCount != null ? Math.min(p2, pageCount) : p2), zoom: view.zoom });
128520
+ const zoomBy = (d2) => setNav({ from: rawUrl, page: view.page, zoom: pdfZoomStep(view.zoom ?? sourceZoomPercent(sourceHash) ?? null, d2) });
128521
+ const btn = {
128522
+ border: "none",
128523
+ background: "none",
128524
+ cursor: "pointer",
128525
+ padding: "2px 8px",
128526
+ color: accentTextColor(ctx),
128527
+ fontSize: pxToRem(16),
128528
+ lineHeight: 1
128529
+ };
128530
+ const off = { ...btn, cursor: "default", color: C2("textSecondary", "#8a8a8e"), opacity: 0.5 };
128531
+ const fileName = rawUrl.split(/[?#]/)[0].split("/").pop() || "document.pdf";
128532
+ const downloadHref = plan?.mode === "retype" ? base : directDoc?.blobUrl ?? null;
128533
+ const openHref = base + pdfOpenFragment(sourceHash, { page: shownPage, zoom: zoomable ? view.zoom : null, viewerChrome: true });
128534
+ return /* @__PURE__ */ jsxs7("div", { "data-himalaya-pdf": "reader", style: { ...frame, display: "flex", flexDirection: "column", background: C2("surfaceTertiary", "#f4f4f4") }, children: [
128535
+ object7,
128536
+ /* @__PURE__ */ jsxs7(
128537
+ "div",
128291
128538
  {
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
128539
+ "data-himalaya-pdf-controls": "",
128540
+ role: "toolbar",
128541
+ "aria-label": "Document controls",
128542
+ style: { display: "flex", alignItems: "center", gap: 4, padding: "4px 8px", fontFamily: bodyFont(ctx), fontSize: pxToRem(12), color: C2("textSecondary", "#636b78") },
128543
+ children: [
128544
+ showPageControls && /* @__PURE__ */ jsxs7(Fragment4, { children: [
128545
+ /* @__PURE__ */ jsx10("button", { type: "button", "aria-label": "Previous page", disabled: shownPage <= 1, onClick: () => go2(shownPage - 1), style: shownPage <= 1 ? off : btn, children: "\u2039" }),
128546
+ /* @__PURE__ */ jsx10("span", { "data-himalaya-pdf-page": shownPage, "aria-live": "polite", children: pageCount != null ? `Page ${shownPage} of ${pageCount}` : `Page ${shownPage}` }),
128547
+ /* @__PURE__ */ jsx10("button", { type: "button", "aria-label": "Next page", disabled: atEnd, onClick: () => go2(shownPage + 1), style: atEnd ? off : btn, children: "\u203A" })
128548
+ ] }),
128549
+ /* @__PURE__ */ jsx10("span", { style: { flex: "1 1 auto" } }),
128550
+ zoomable && /* @__PURE__ */ jsxs7(Fragment4, { children: [
128551
+ /* @__PURE__ */ jsx10("button", { type: "button", "aria-label": "Zoom out", onClick: () => zoomBy(-1), style: btn, children: "\u2212" }),
128552
+ /* @__PURE__ */ jsx10("button", { type: "button", "aria-label": "Zoom in", onClick: () => zoomBy(1), style: btn, children: "+" })
128553
+ ] }),
128554
+ allowShare && (downloadHref ? (
128555
+ // Bytes the page holds (a re-typed blob, or a CORS fetch): a real download.
128556
+ /* @__PURE__ */ jsx10("a", { href: downloadHref, download: fileName, "aria-label": "Download PDF", style: { ...btn, textDecoration: "none", fontSize: pxToRem(12) }, children: "Download" })
128557
+ ) : (
128558
+ // A cross-origin document the page cannot read: `download` would be ignored, so say what
128559
+ // actually happens — it opens in a new tab.
128560
+ /* @__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" })
128561
+ ))
128562
+ ]
128297
128563
  }
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 }) });
128564
+ )
128565
+ ] });
128301
128566
  });
128302
128567
  WebViewNode = withExtras("WebViewNode", ({ props, ctx, wrap }) => {
128303
128568
  const boundUrl = useResolvedScalar(props.url != null && isBinding(props.url) ? props.url : void 0, ctx);
@@ -131376,7 +131641,10 @@ var init_renderNode = __esm({
131376
131641
  const events = Array.isArray(rawEvents) ? rawEvents : [];
131377
131642
  const boundAnchor = useResolvedScalar(props.anchorDatePath, ctx);
131378
131643
  const anchorRaw = props.anchorDatePath != null ? boundAnchor : props.anchorDate;
131379
- const anchor = (typeof anchorRaw === "string" ? parseLocalDate(anchorRaw) : null) ?? /* @__PURE__ */ new Date();
131644
+ const [pagedAnchor, setPagedAnchor] = React9.useState(null);
131645
+ const localAnchor = pagedAnchor && Object.is(pagedAnchor.raw, anchorRaw) && pagedAnchor.path === props.anchorDatePath && pagedAnchor.mode === props.mode && pagedAnchor.provider === ctx.provider ? pagedAnchor.date : null;
131646
+ if (pagedAnchor && !localAnchor) setPagedAnchor(null);
131647
+ const anchor = localAnchor ?? (typeof anchorRaw === "string" ? parseLocalDate(anchorRaw) : null) ?? /* @__PURE__ */ new Date();
131380
131648
  const mode = props.mode === "week" ? "week" : props.mode === "3day" ? "3day" : "day";
131381
131649
  const firstWeekday = typeof props.firstWeekday === "number" ? (props.firstWeekday % 7 + 7) % 7 : 0;
131382
131650
  const startHour = typeof props.startHour === "number" ? props.startHour : 0;
@@ -131413,6 +131681,7 @@ var init_renderNode = __esm({
131413
131681
  const rangeStep = mode === "week" ? 7 : mode === "3day" ? 3 : 1;
131414
131682
  const shiftRange = (deltaDays) => {
131415
131683
  const next = new Date(anchor.getFullYear(), anchor.getMonth(), anchor.getDate() + deltaDays);
131684
+ setPagedAnchor({ date: next, raw: anchorRaw, path: props.anchorDatePath, mode: props.mode, provider: ctx.provider });
131416
131685
  dispatchCalendarAction(ctx, props.onRangeChange, { anchorDate: localDayKey(next) });
131417
131686
  };
131418
131687
  const canPage = true;
@@ -162174,32 +162443,33 @@ var init_preview_assets_generated = __esm({
162174
162443
  "../../packages/serve/src/preview-assets.generated.ts"() {
162175
162444
  init_preview_assets_format();
162176
162445
  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" }
162446
+ { key: "assets/DashboardHost-C8q83QJ2.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 2916, sha256: "144b7dc6e3662aa62ea0e8e03e9aae7762dc3dc2f63da56e8b04b1bb70db89ad" },
162447
+ { key: "assets/DevDrawer-DsUG7Nml.js", contentType: "application/javascript; charset=utf-8", offset: 2924, length: 16744, sha256: "7bcc9801a17aa2ba526fb0983ea315581e3ac2d4c45f625b719df716be0cd9c0" },
162448
+ { key: "assets/IdiomCompare-Cthh0ISj.js", contentType: "application/javascript; charset=utf-8", offset: 19668, length: 1892, sha256: "eab302721e7b8202f10d0c622d57b0dc28b3ab9ae3fe07b20a2563198ffd88d1" },
162449
+ { key: "assets/LightboxViewer-ASOCRp41.js", contentType: "application/javascript; charset=utf-8", offset: 21560, length: 8132, sha256: "46ab57a241855a13a17f94fec2a70ce9b45c1a4c3e54801c8c679328256edb33" },
162450
+ { key: "assets/PhonePreviewControl-B6cU9zp5.js", contentType: "application/javascript; charset=utf-8", offset: 29692, length: 37729, sha256: "c5550c028620913776998cf8818e8f9f794c02f5d234b7aeaf71671bf9080373" },
162451
+ { key: "assets/SchemeCompare--If17_u5.js", contentType: "application/javascript; charset=utf-8", offset: 67421, length: 1824, sha256: "66285df0006380de22ced18317a59c08ba318788d73d717a321ff1e5460c1fa0" },
162452
+ { key: "assets/index-CKaODCvf.js", contentType: "application/javascript; charset=utf-8", offset: 69245, length: 1280616, sha256: "6a91080524cebb84370c0fb3c04d74c99b2d704cb003a21f2e01912e7f47c0b2" },
162453
+ { key: "assets/pdf-B2304dXw.js", contentType: "application/javascript; charset=utf-8", offset: 1349861, length: 488199, sha256: "b284e54724b9ac6fd9b9dbddaf42c4a564d9ea1cb8ec0d78ea5b3c132c20cb41" },
162454
+ { key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset: 1838060, length: 73, sha256: "41bcfda4f3c8c0a81c785ea87c69afc8e7d0ed8c333324aee94c273d881bb6aa" },
162455
+ { key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset: 1838133, length: 1317034, sha256: "a33cfe728c584fdba4fcc1fd54bcdc2f9f2f13889ddbb5b2bd1d0f8cbe49b84e" },
162456
+ { key: "assets/pdfDocument-C5bi6q0r.js", contentType: "application/javascript; charset=utf-8", offset: 3155167, length: 3379, sha256: "ac6eff0d1c637a70fade3bd860a7dc531b1b1b4301012d3daf120b7a3ea9b7e6" },
162457
+ { key: "assets/pdfFetch-Cc8i1I1h.js", contentType: "application/javascript; charset=utf-8", offset: 3158546, length: 2266, sha256: "1d21ad008921942217c9eac0c35b1713773b9d89c71e3ab4412781f7bb88f463" },
162458
+ { key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 3160812, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
162459
+ { key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 3165422, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
162460
+ { key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 3654006, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
162461
+ { key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 3744930, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
162462
+ { key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 3835914, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
162463
+ { key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 3926894, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
162464
+ { key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 4017766, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
162465
+ { key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 4108746, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
162466
+ { key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 4217382, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
162467
+ { key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 4326466, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
162468
+ { key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 4435514, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
162469
+ { key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 4543214, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
162470
+ { key: "himi-sw.js", contentType: "application/javascript; charset=utf-8", offset: 4631322, length: 6748, sha256: "4a92459977d7cefa1a6a7e020c3a63509737f083b3f2773557c1a5771665811a" },
162471
+ { key: "index.html", contentType: "text/html; charset=utf-8", offset: 4638070, length: 4947, sha256: "8a3f524b30f25db213d2458d71a38298f4fbdcc8989bd0eee91428809bf45832" },
162472
+ { key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 4643017, length: 17786, sha256: "084107ca997628c248f1b0ba3a7494744850df39fad813546ab8bdb82a6058da" }
162203
162473
  ];
162204
162474
  }
162205
162475
  });
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.1465.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": "19e0653508dd0a35a2413578ca22c6452471d39f3797b2cd827fb652"
75
75
  }