@wix/himalaya-cli 0.977.0 → 0.979.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.
@@ -1,4 +1,5 @@
1
1
  import type { DesignTokens } from "./tokens.js";
2
+ import type { PushRoute, PushPayloadAdapter } from "./push-routes.js";
2
3
  import type { NavigationConfig, SplashConfig } from "./schema.js";
3
4
  import { type LocaleConfig } from "./locale.js";
4
5
  import { type DistributionConfig } from "./distribution.js";
@@ -6,6 +7,7 @@ import type { CmsConfig } from "./cms.js";
6
7
  import { type DataResourcesConfig } from "@wix/himalaya/data-resources";
7
8
  import type { FunctionDefinition, FunctionScheduleRecord } from "@himalaya/functions";
8
9
  export type { CmsConfig, CmsCollectionSpec, CmsFieldSpec, WixFieldType } from "./cms.js";
10
+ export type { PushRoute, PushPayloadAdapter };
9
11
  export type { DataResourcesConfig, KvSpec, ResourceEnvironment, ResourceScope } from "@wix/himalaya/data-resources";
10
12
  export { WIX_FIELD_TYPES } from "./cms.js";
11
13
  /** Wix site/environment binding used by the server-function surface. */
@@ -445,6 +447,16 @@ export interface PushConfig {
445
447
  richTemplates?: RichTemplate[];
446
448
  /** Prompt for the OS notification permission on first launch. */
447
449
  requestPermissionOnLaunch?: boolean;
450
+ /** Notification route table. Derive these from the app's own contract rather than
451
+ * hand-listing them, so a route can never target a screen the provisioned app
452
+ * does not have. Honoured by iOS + Android; the web host has no push transport. */
453
+ routes?: PushRoute[];
454
+ payloadAdapter?: PushPayloadAdapter;
455
+ /** A `tier5.<service>.<action>` dispatched on EVERY notification — receipt or tap
456
+ * — so a worker can keep a badge count or refresh a feed without navigating. It
457
+ * receives `templateId`, `topic`, `metaSiteId`, `notificationId`, `link`,
458
+ * `resolvedLink` and `tapped` (all as strings, the dispatch bridge's contract). */
459
+ observerAction?: string;
448
460
  }
449
461
  export type IapProductType = "subscription" | "nonConsumable" | "consumable";
450
462
  export interface IapProduct {
@@ -30,7 +30,6 @@ export interface AppearanceDirective {
30
30
  region?: string;
31
31
  colorScheme?: "light" | "dark";
32
32
  layoutDirection?: "ltr" | "rtl";
33
- fontScale?: number;
34
33
  }
35
34
  export interface DeterminismDirective {
36
35
  freezeClock?: string;
@@ -0,0 +1,74 @@
1
+ /**
2
+ * How a payload link is stripped down to the residual path+query `routes` match
3
+ * against. An UNKNOWN value passes the link through unchanged rather than failing, so
4
+ * an older binary served a newer adapter degrades instead of dropping every
5
+ * notification (invariants 6/8).
6
+ */
7
+ export type PushPayloadAdapter = "" | "wix-ping";
8
+ /**
9
+ * One notification-routing rule. Mirrors `PushRoute` in core.proto / Schema.swift /
10
+ * Schema.kt, and is re-exported from `define-app` as part of the authoring surface —
11
+ * defined HERE, once, next to the matcher that consumes it.
12
+ *
13
+ * Routes translate a FOREIGN link space (the Wix mobile links Ping delivers) into this
14
+ * app's own, in front of the existing resolver — never beside it. No match leaves the
15
+ * link untouched, which is why an app declaring no routes behaves exactly as it did
16
+ * before they existed.
17
+ */
18
+ export interface PushRoute {
19
+ /** WIX-link-space pattern over the residual path+query, in the same grammar as
20
+ * `deepLinkPatterns`: `"orders/?orderId=:orderId"`. */
21
+ match: string;
22
+ /** The himi link to resolve instead, with `{name}` placeholders filled from the
23
+ * captured params: `"<scheme>://screen/himi_order?id={orderId}"`. May instead name
24
+ * a `tier5.*` action, which dispatches to a worker rather than navigating. */
25
+ link: string;
26
+ /** Optional EXTRA conditions on the Ping payload. Omitted ⇒ unconstrained, so one
27
+ * link space can fan out by template or topic. */
28
+ templateId?: string;
29
+ topic?: string;
30
+ }
31
+ /** The payload facts a route may additionally condition on. */
32
+ export interface PushPayloadContext {
33
+ templateId?: string;
34
+ topic?: string;
35
+ }
36
+ /** What an adapter made of a payload link. */
37
+ export interface AdaptedLink {
38
+ /** Residual path+query the routes match against, with no leading slash. */
39
+ residual: string;
40
+ /** The site the payload named, when it named one. */
41
+ metaSiteId?: string;
42
+ /** False when the adapter did not recognize the link and passed it through. */
43
+ adapted: boolean;
44
+ }
45
+ /**
46
+ * Strip a payload link down to the residual path+query a route matches against.
47
+ *
48
+ * `adapter` is `""` (pass through) or `"wix-ping"`. An UNKNOWN adapter passes the
49
+ * link through unchanged rather than failing, so an older binary served a config
50
+ * naming an adapter it has never heard of degrades to today's behavior instead of
51
+ * dropping every notification (invariants 6/8).
52
+ */
53
+ export declare function adaptPayloadLink(link: string, adapter?: string): AdaptedLink;
54
+ /**
55
+ * The himi link the first matching route produces, or null when nothing matches.
56
+ *
57
+ * Null means "resolve the input unchanged" to the caller — never "give up" — which
58
+ * is what keeps an app that declares no routes behaving exactly as it did before.
59
+ * Rules are tried in declaration order, so a more specific rule goes first.
60
+ */
61
+ export declare function matchPushRoute(residual: string, routes: readonly PushRoute[] | undefined, payload?: PushPayloadContext): string | null;
62
+ /**
63
+ * Adapt + match in one step: the himi link to resolve instead of `link`, the params
64
+ * the route captured, and the site the payload named. `link` is null when no route
65
+ * matched.
66
+ */
67
+ export declare function resolvePushRoute(link: string, config: {
68
+ routes?: readonly PushRoute[];
69
+ payloadAdapter?: string;
70
+ } | undefined, payload?: PushPayloadContext): {
71
+ link: string | null;
72
+ params: Record<string, string>;
73
+ metaSiteId?: string;
74
+ };
@@ -9715,8 +9715,7 @@ var LAUNCH_MANIFEST_SCHEMA = {
9715
9715
  locale: { type: "string" },
9716
9716
  region: { type: "string" },
9717
9717
  colorScheme: { type: "string", enum: ["light", "dark"] },
9718
- layoutDirection: { type: "string", enum: ["ltr", "rtl"] },
9719
- fontScale: { type: "number" }
9718
+ layoutDirection: { type: "string", enum: ["ltr", "rtl"] }
9720
9719
  }),
9721
9720
  determinism: directiveObject({
9722
9721
  freezeClock: { type: "string" },
@@ -7766,8 +7766,7 @@ var LAUNCH_MANIFEST_SCHEMA = {
7766
7766
  locale: { type: "string" },
7767
7767
  region: { type: "string" },
7768
7768
  colorScheme: { type: "string", enum: ["light", "dark"] },
7769
- layoutDirection: { type: "string", enum: ["ltr", "rtl"] },
7770
- fontScale: { type: "number" }
7769
+ layoutDirection: { type: "string", enum: ["ltr", "rtl"] }
7771
7770
  }),
7772
7771
  determinism: directiveObject({
7773
7772
  freezeClock: { type: "string" },
package/dist/cli.mjs CHANGED
@@ -17754,8 +17754,10 @@ function makeTokenResolvers(tokens, scheme) {
17754
17754
  };
17755
17755
  const font = (style = "body") => {
17756
17756
  const t = tokens.typography?.[style] ?? tokens.fonts?.[style] ?? tokens.typography?.body ?? tokens.fonts?.body;
17757
+ const size = t?.size ?? 14;
17757
17758
  return {
17758
- size: t?.size ?? 14,
17759
+ size,
17760
+ remSize: pxToRem(size),
17759
17761
  weight: t?.weight ?? 400,
17760
17762
  line: t?.line ?? 1.4,
17761
17763
  family: t?.family,
@@ -17869,9 +17871,11 @@ function makeTokenResolvers(tokens, scheme) {
17869
17871
  scheme
17870
17872
  };
17871
17873
  }
17872
- var DEFAULT_FONT_STACK, SERIF_FAMILY_RE;
17874
+ var REM_ROOT_PX, pxToRem, DEFAULT_FONT_STACK, SERIF_FAMILY_RE;
17873
17875
  var init_tokens2 = __esm({
17874
17876
  "../../core/web-renderer/src/tokens.ts"() {
17877
+ REM_ROOT_PX = 16;
17878
+ pxToRem = (px) => `${px / REM_ROOT_PX}rem`;
17875
17879
  DEFAULT_FONT_STACK = '"Wix Madefor Text", system-ui';
17876
17880
  SERIF_FAMILY_RE = /\b(georgia|times|garamond|palatino|baskerville|didot|charter|bodoni|caslon|cambria|constantia|rockwell|playfair|merriweather|lora|literata|spectral|serif)\b/i;
17877
17881
  }
@@ -23789,7 +23793,7 @@ function renderInner(node, ctx) {
23789
23793
  return /* @__PURE__ */ jsx6("div", { style: { fontFamily: bodyFont(ctx), lineHeight: 1.5, overflowWrap: "break-word", color: C(resolveScalarStatic(props.color, ctx) ?? "textPrimary", "#13171e"), ...wrap }, children: runs.map((r, i) => {
23790
23794
  const marks = Array.isArray(r.marks) ? r.marks : [];
23791
23795
  const f = ctx.font(r.style);
23792
- return /* @__PURE__ */ jsx6("span", { style: { fontSize: f.size, fontWeight: marks.includes("bold") ? 700 : f.weight, fontStyle: marks.includes("italic") ? "italic" : void 0, textDecoration: marks.includes("underline") ? "underline" : void 0, ...f.family ? { fontFamily: fontStack(f.family) } : {}, ...r.color ? { color: C(r.color) } : {}, ...marks.includes("code") ? { fontFamily: "ui-monospace, monospace", background: C("surfaceTertiary", "#eee"), padding: "1px 5px", borderRadius: 4 } : {} }, children: txt(r.text, ctx) }, i);
23796
+ return /* @__PURE__ */ jsx6("span", { style: { fontSize: f.remSize, fontWeight: marks.includes("bold") ? 700 : f.weight, fontStyle: marks.includes("italic") ? "italic" : void 0, textDecoration: marks.includes("underline") ? "underline" : void 0, ...f.family ? { fontFamily: fontStack(f.family) } : {}, ...r.color ? { color: C(r.color) } : {}, ...marks.includes("code") ? { fontFamily: "ui-monospace, monospace", background: C("surfaceTertiary", "#eee"), padding: "1px 5px", borderRadius: 4 } : {} }, children: txt(r.text, ctx) }, i);
23793
23797
  }) });
23794
23798
  }
23795
23799
  case "Image":
@@ -23830,8 +23834,8 @@ function renderInner(node, ctx) {
23830
23834
  props.leading && /* @__PURE__ */ jsx6("div", { style: { flex: "none", display: "flex" }, children: renderNode(props.leading, ctx) }),
23831
23835
  /* @__PURE__ */ jsxs3("div", { style: { flex: 1, minWidth: 0, display: "flex", flexDirection: "column", gap: 2 }, children: [
23832
23836
  props.overline != null && /* @__PURE__ */ jsx6("span", { style: { fontFamily: bodyFont(ctx), fontSize: 11, fontWeight: 600, letterSpacing: 0.4, textTransform: "uppercase", color: C(props.overlineColor ?? "textSecondary", "#888"), ...ell }, children: txt(props.overline, ctx) }),
23833
- /* @__PURE__ */ jsx6("span", { style: { fontFamily: fontStack(titleF.family), fontSize: titleF.size, fontWeight: titleF.weight, color: C(props.titleColor ?? "textPrimary", "#13171e"), ...ell }, children: txt(props.title, ctx) ?? (ctx.empty ? "" : "") }),
23834
- props.subtitle != null && /* @__PURE__ */ jsx6("span", { style: { fontFamily: fontStack(subF.family), fontSize: subF.size, color: C(props.subtitleColor ?? "textSecondary", "#888"), ...ell }, children: txt(props.subtitle, ctx) })
23837
+ /* @__PURE__ */ jsx6("span", { style: { fontFamily: fontStack(titleF.family), fontSize: titleF.remSize, fontWeight: titleF.weight, color: C(props.titleColor ?? "textPrimary", "#13171e"), ...ell }, children: txt(props.title, ctx) ?? (ctx.empty ? "" : "") }),
23838
+ props.subtitle != null && /* @__PURE__ */ jsx6("span", { style: { fontFamily: fontStack(subF.family), fontSize: subF.remSize, color: C(props.subtitleColor ?? "textSecondary", "#888"), ...ell }, children: txt(props.subtitle, ctx) })
23835
23839
  ] }),
23836
23840
  props.trailing ? (
23837
23841
  // #1010 — the row's `onTap` lives on the outer flex div, and the trailing
@@ -23897,7 +23901,7 @@ function renderInner(node, ctx) {
23897
23901
  case "Label": {
23898
23902
  const f = ctx.font(props.style ?? "body");
23899
23903
  const col = C(resolveScalarStatic(props.color, ctx) ?? "textPrimary", "#13171e");
23900
- return /* @__PURE__ */ jsxs3("span", { style: { display: "inline-flex", alignItems: "center", gap: 6, fontFamily: fontStack(f.family), fontSize: f.size, fontWeight: f.weight, color: col, ...wrap }, children: [
23904
+ return /* @__PURE__ */ jsxs3("span", { style: { display: "inline-flex", alignItems: "center", gap: 6, fontFamily: fontStack(f.family), fontSize: f.remSize, fontWeight: f.weight, color: col, ...wrap }, children: [
23901
23905
  props.icon && /* @__PURE__ */ jsx6("span", { style: { display: "inline-grid", placeItems: "center", width: f.size, height: f.size }, children: iconSvg(props.icon, { size: f.size, color: col }) }),
23902
23906
  txt(props.text, ctx)
23903
23907
  ] });
@@ -23926,7 +23930,7 @@ function renderInner(node, ctx) {
23926
23930
  ensureMarqueeKeyframes();
23927
23931
  const f = ctx.font(props.style ?? "body");
23928
23932
  const dur = props.durationMs ?? 8e3;
23929
- return /* @__PURE__ */ jsx6("div", { style: { width: "100%", overflow: "hidden", whiteSpace: "nowrap", ...wrap }, children: /* @__PURE__ */ jsx6("span", { style: { display: "inline-block", paddingLeft: "100%", fontFamily: fontStack(f.family), fontSize: f.size, color: C(resolveScalarStatic(props.color, ctx) ?? "textPrimary", "#13171e"), animation: ctx.empty ? void 0 : `himalaya-marquee ${dur}ms linear infinite` }, children: txt(props.text, ctx) }) });
23933
+ return /* @__PURE__ */ jsx6("div", { style: { width: "100%", overflow: "hidden", whiteSpace: "nowrap", ...wrap }, children: /* @__PURE__ */ jsx6("span", { style: { display: "inline-block", paddingLeft: "100%", fontFamily: fontStack(f.family), fontSize: f.remSize, color: C(resolveScalarStatic(props.color, ctx) ?? "textPrimary", "#13171e"), animation: ctx.empty ? void 0 : `himalaya-marquee ${dur}ms linear infinite` }, children: txt(props.text, ctx) }) });
23930
23934
  }
23931
23935
  case "Timeline":
23932
23936
  return /* @__PURE__ */ jsx6(TimelineNode, { props, ctx, wrap });
@@ -25778,8 +25782,8 @@ var init_renderNode = __esm({
25778
25782
  const content = countContent != null ? countContent : icuPattern != null ? /* @__PURE__ */ jsx6(InterpolatedTextView, { pattern: icuPattern, params: props.template?.params ?? {}, ctx }) : mdSource != null ? /* @__PURE__ */ jsx6("span", { dangerouslySetInnerHTML: mdInline(mdSource) }) : txt(props.text, ctx);
25779
25783
  const tAlign = props.textAlign === "center" ? "center" : props.textAlign === "trailing" ? "right" : props.textAlign === "justify" ? "justify" : props.textAlign === "leading" ? "left" : void 0;
25780
25784
  const tDecor = props.decoration === "strikethrough" ? "line-through" : props.decoration === "underline" ? "underline" : void 0;
25781
- const ln = typeof props.lineSpacing === "number" ? `${(f.line ?? 1.4) * f.size + props.lineSpacing}px` : f.line;
25782
- return /* @__PURE__ */ jsx6("div", { ...countAttrs, style: { fontFamily: fontStack(f.family), fontSize: f.size, fontWeight: f.weight, lineHeight: ln, letterSpacing: f.letterSpacing, color: C(resolveScalarStatic(props.color, ctx) ?? "textPrimary", "#13171e"), whiteSpace: "pre-wrap", overflowWrap: "anywhere", wordBreak: "break-word", minWidth: 0, ...tAlign ? { textAlign: tAlign } : {}, ...tDecor ? { textDecoration: tDecor } : {}, ...props.maxLines ? { display: "-webkit-box", WebkitLineClamp: props.maxLines, WebkitBoxOrient: "vertical", overflow: "hidden" } : {}, ...wrap }, children: content == null || content === "" ? collapse ? null : "\xA0" : content });
25785
+ const ln = typeof props.lineSpacing === "number" ? pxToRem((f.line ?? 1.4) * f.size + props.lineSpacing) : f.line;
25786
+ return /* @__PURE__ */ jsx6("div", { ...countAttrs, style: { fontFamily: fontStack(f.family), fontSize: f.remSize, fontWeight: f.weight, lineHeight: ln, letterSpacing: f.letterSpacing, color: C(resolveScalarStatic(props.color, ctx) ?? "textPrimary", "#13171e"), whiteSpace: "pre-wrap", overflowWrap: "anywhere", wordBreak: "break-word", minWidth: 0, ...tAlign ? { textAlign: tAlign } : {}, ...tDecor ? { textDecoration: tDecor } : {}, ...props.maxLines ? { display: "-webkit-box", WebkitLineClamp: props.maxLines, WebkitBoxOrient: "vertical", overflow: "hidden" } : {}, ...wrap }, children: content == null || content === "" ? collapse ? null : "\xA0" : content });
25783
25787
  });
25784
25788
  ImageNode = withExtras("ImageNode", ({ props, ctx, wrap }) => {
25785
25789
  const C = ctx.color;
@@ -25923,7 +25927,7 @@ var init_renderNode = __esm({
25923
25927
  borderRadius: props.iconOnly ? "50%" : pillRadius,
25924
25928
  fontFamily: fontStack(f.family),
25925
25929
  fontWeight: f.weight,
25926
- fontSize: f.size,
25930
+ fontSize: f.remSize,
25927
25931
  background: primary ? accent : "transparent",
25928
25932
  color: fg,
25929
25933
  border: outlined ? `1px solid ${accent}` : "none",
@@ -26073,7 +26077,7 @@ var init_renderNode = __esm({
26073
26077
  const capF = ctx.font("caption");
26074
26078
  return /* @__PURE__ */ jsx6("div", { style: { display: "inline-flex", flexDirection: "column", alignItems: "center", gap: 4, ...wrap }, children: /* @__PURE__ */ jsxs3("div", { style: { position: "relative", width: 72, height: 72 }, children: [
26075
26079
  /* @__PURE__ */ jsx6("div", { style: { width: 72, height: 72, borderRadius: "50%", background: `conic-gradient(${tint} ${pct * 360}deg, ${track} 0deg)`, WebkitMask: ringMask, mask: ringMask, ...gaugeAnim } }),
26076
- /* @__PURE__ */ jsx6("div", { style: { position: "absolute", inset: 0, display: "grid", placeItems: "center", fontFamily: fontStack(capF.family), fontSize: capF.size, fontWeight: capF.weight, color: C("textPrimary", "#13171e") }, children: txt(props.label, ctx) || `${Math.round(pct * 100)}%` })
26080
+ /* @__PURE__ */ jsx6("div", { style: { position: "absolute", inset: 0, display: "grid", placeItems: "center", fontFamily: fontStack(capF.family), fontSize: capF.remSize, fontWeight: capF.weight, color: C("textPrimary", "#13171e") }, children: txt(props.label, ctx) || `${Math.round(pct * 100)}%` })
26077
26081
  ] }) });
26078
26082
  });
26079
26083
  RatingNode = withExtras("RatingNode", ({ props, ctx, wrap }) => {
@@ -28801,8 +28805,7 @@ var init_launch_manifest = __esm({
28801
28805
  locale: { type: "string" },
28802
28806
  region: { type: "string" },
28803
28807
  colorScheme: { type: "string", enum: ["light", "dark"] },
28804
- layoutDirection: { type: "string", enum: ["ltr", "rtl"] },
28805
- fontScale: { type: "number" }
28808
+ layoutDirection: { type: "string", enum: ["ltr", "rtl"] }
28806
28809
  }),
28807
28810
  determinism: directiveObject({
28808
28811
  freezeClock: { type: "string" },
@@ -37481,6 +37484,7 @@ async function navIssues(dir, strict) {
37481
37484
  }
37482
37485
  }
37483
37486
  const nav = cfg.navigation;
37487
+ pushRouteIssues(cfg.push, nav, warn);
37484
37488
  if (nav === void 0 || nav === null) return issues;
37485
37489
  if (!isPlainObject(nav)) {
37486
37490
  error("nav-not-an-object", `navigation must be an object (got ${Array.isArray(nav) ? "array" : typeof nav}).`);
@@ -37548,6 +37552,31 @@ async function navIssues(dir, strict) {
37548
37552
  }
37549
37553
  return issues;
37550
37554
  }
37555
+ function pushRouteIssues(push, nav, warn) {
37556
+ if (!isPlainObject(push) || push.payloadAdapter !== "wix-ping") return;
37557
+ const routes = Array.isArray(push.routes) ? push.routes.filter(isPlainObject) : [];
37558
+ if (routes.length === 0) {
37559
+ warn(
37560
+ "push-routes-missing",
37561
+ `push.payloadAdapter is "wix-ping" but push.routes is empty \u2014 Wix business-event links cannot map to app screens. Direct Himi screen links still work. Declare a route per business-event link the site sends, e.g. { match: "my-account/:site/stores/orders/:orderId", link: "<scheme>://screen/<order screen>?id={orderId}" }.`
37562
+ );
37563
+ return;
37564
+ }
37565
+ const linkables = isPlainObject(nav) ? nav.linkableScreens : void 0;
37566
+ if (!Array.isArray(linkables)) return;
37567
+ const declared = new Set(
37568
+ linkables.filter(isPlainObject).map((s) => String(s.screenId ?? ""))
37569
+ );
37570
+ for (const route of routes) {
37571
+ const screenId = /:\/\/screen\/([^?]+)/.exec(String(route.link ?? ""))?.[1];
37572
+ if (screenId && !declared.has(screenId)) {
37573
+ warn(
37574
+ "push-route-unknown-screen",
37575
+ `push.routes: "${String(route.match)}" opens "${screenId}", which navigation.linkableScreens does not declare \u2014 the device cannot resolve it, so the notification opens nothing.`
37576
+ );
37577
+ }
37578
+ }
37579
+ }
37551
37580
  var NAVIGATION_KEYS, NAV_KINDS, ITEMS_BLOCKS, SERVED_ONLY_NAV_KEYS, MISPLACED_TOP_LEVEL_KEYS, isPlainObject, itemCount;
37552
37581
  var init_nav_lint = __esm({
37553
37582
  "src/nav-lint.ts"() {
@@ -43594,19 +43623,19 @@ var init_preview_assets_generated = __esm({
43594
43623
  "../../packages/serve/src/preview-assets.generated.ts"() {
43595
43624
  init_preview_assets_format();
43596
43625
  PREVIEW_ASSET_MANIFEST = [
43597
- { key: "assets/index-QajXLF48.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 987074, sha256: "46a30017dbf3793f00e3ad24c865ca7708174a0c676a87257fb37f3f6a4179fa" },
43598
- { key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 987082, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
43599
- { key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 1078006, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
43600
- { key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 1168990, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
43601
- { key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 1259970, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
43602
- { key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 1350842, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
43603
- { key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 1441822, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
43604
- { key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 1550458, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
43605
- { key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 1659542, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
43606
- { key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 1768590, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
43607
- { key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 1876290, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
43608
- { key: "index.html", contentType: "text/html; charset=utf-8", offset: 1964398, length: 4448, sha256: "e2f66c98bc1767a88a1d28cf5af1078a100e4505d14370f06066534651ea5912" },
43609
- { key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 1968846, length: 13784, sha256: "cfb9465254fab84f0e084bb4542c282758ea29774b5f172840cc0b9e4194ef89" }
43626
+ { key: "assets/index-EUz_f6yu.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 987137, sha256: "7b526f22885a0dfed16aa63cc802e4d17c3565e78ba5a8a873bcb111ffe1a076" },
43627
+ { key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 987145, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
43628
+ { key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 1078069, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
43629
+ { key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 1169053, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
43630
+ { key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 1260033, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
43631
+ { key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 1350905, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
43632
+ { key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 1441885, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
43633
+ { key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 1550521, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
43634
+ { key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 1659605, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
43635
+ { key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 1768653, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
43636
+ { key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 1876353, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
43637
+ { key: "index.html", contentType: "text/html; charset=utf-8", offset: 1964461, length: 4448, sha256: "78be80518ed0f28fbf085b806c0d4ef5ec796da109a3f2f257f4ee31e1c01214" },
43638
+ { key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 1968909, length: 13784, sha256: "cfb9465254fab84f0e084bb4542c282758ea29774b5f172840cc0b9e4194ef89" }
43610
43639
  ];
43611
43640
  }
43612
43641
  });
Binary file
@@ -363,7 +363,10 @@ nicety. Don't animate everything: if every element moves, nothing reads as impor
363
363
  - **Contrast** comes from the token roles — pair `textPrimary`/`textSecondary` with the right surface,
364
364
  and provide the `highContrast` scheme value for load-bearing colors.
365
365
  - **Reduced motion** — §6.
366
- - **Dynamic type** — size text via typography tokens (which scale) rather than fixed sizes.
366
+ - **Dynamic type** — size text via typography tokens rather than fixed sizes. Every token path now
367
+ honours the OS text-size setting: iOS scales through `UIFontMetrics` (system and variable-font arms
368
+ included, not only branded `Font.custom`), Android emits `sp`, and web emits `rem`. A raw pixel size
369
+ bypasses all three and will not grow when the user enlarges text.
367
370
  - **RTL** — §2.
368
371
 
369
372
  ---
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.977.0",
3
+ "version": "0.979.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": [
@@ -64,5 +64,5 @@
64
64
  "artifactId": "himalaya-cli"
65
65
  }
66
66
  },
67
- "falconPackageHash": "ff53cabc3043d8cb9aecd23811c5b17520f9b183d514b1000a73b61c"
67
+ "falconPackageHash": "16761478845899a9ba0931eb0a135cf4d6e5d8909a3ad2899152b122"
68
68
  }