@wix/himalaya-cli 0.1213.0 → 0.1215.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.
@@ -47,7 +47,20 @@ export interface L10nStringFinding {
47
47
  * Bindings are skipped (they render worker state, which this cannot see — use
48
48
  * `collectBoundServicePaths` + the worker's own state for that half).
49
49
  */
50
- export declare function collectDescriptorStrings(descriptor: unknown): L10nStringFinding[];
50
+ export declare function collectDescriptorStrings(descriptor: unknown, options?: {
51
+ /**
52
+ * Values the app has DECLARED as copy (its `strings/<locale>.json` table), for which
53
+ * the "has a letter" rule of `isUserVisibleCopy` is waived — and only that rule: the
54
+ * binding/id/url/hex/length filters still apply. Exists for letterless copy — a phone
55
+ * or number format such as "+1 555 0100" has no letter, so the heuristic calls it
56
+ * noise, and the extractor dropped `reserve.phonePlaceholder` (#3320). Only exact
57
+ * table values qualify, so an arbitrary "4.8" in sample data stays out.
58
+ *
59
+ * Passed by the extractor only. The `l10n` validate pass does not pass it yet, so it
60
+ * still treats letterless copy as non-copy (as it always has).
61
+ */
62
+ copyValues?: ReadonlySet<string>;
63
+ }): L10nStringFinding[];
51
64
  /**
52
65
  * The `$service:` bindings sitting in a user-visible prop — i.e. the state paths whose
53
66
  * value is PAINTED as copy.
package/dist/cli.mjs CHANGED
@@ -7988,14 +7988,19 @@ var init_token_suggest = __esm({
7988
7988
 
7989
7989
  // ../../core/dev-server/src/l10n-strings.ts
7990
7990
  function isUserVisibleCopy(s) {
7991
+ return isCopyShaped(s) && /[A-Za-z֐-׿؀-ۿ]/.test(s);
7992
+ }
7993
+ function isCopyShaped(s) {
7991
7994
  if (typeof s !== "string" || s.length === 0 || s.length > 200) return false;
7992
7995
  if (s.startsWith("$") || s.startsWith("_")) return false;
7993
7996
  if (/^https?:\/\//.test(s)) return false;
7994
7997
  if (/^#[0-9A-Fa-f]+$/.test(s)) return false;
7995
7998
  if (!s.includes(" ") && /^[a-z0-9_\-./]+$/.test(s)) return false;
7996
- return /[A-Za-z֐-׿؀-ۿ]/.test(s);
7999
+ return true;
7997
8000
  }
7998
- function collectDescriptorStrings(descriptor) {
8001
+ function collectDescriptorStrings(descriptor, options = {}) {
8002
+ const { copyValues } = options;
8003
+ const isCopy2 = (v) => isUserVisibleCopy(v) || copyValues !== void 0 && copyValues.has(v) && isCopyShaped(v);
7999
8004
  const out2 = [];
8000
8005
  const seen = /* @__PURE__ */ new Set();
8001
8006
  const push = (f) => {
@@ -8018,7 +8023,7 @@ function collectDescriptorStrings(descriptor) {
8018
8023
  const mapped = STRING_FIELDS_BY_TYPE[type] ?? [];
8019
8024
  for (const [prop, v] of Object.entries(props)) {
8020
8025
  if (typeof v !== "string" || BINDING_SIGIL.test(v)) continue;
8021
- if (!isUserVisibleCopy(v)) continue;
8026
+ if (!isCopy2(v)) continue;
8022
8027
  const at2 = `${path2}.body.props.${prop}`;
8023
8028
  if (mapped.includes(prop) || SECONDARY_FIELDS.has(prop)) {
8024
8029
  push({ value: v, bucket: "reachable", type, prop, path: at2 });
@@ -8027,7 +8032,7 @@ function collectDescriptorStrings(descriptor) {
8027
8032
  }
8028
8033
  }
8029
8034
  const templ = props.template;
8030
- if (templ && typeof templ.template === "string" && isUserVisibleCopy(templ.template)) {
8035
+ if (templ && typeof templ.template === "string" && isCopy2(templ.template)) {
8031
8036
  push({
8032
8037
  value: templ.template,
8033
8038
  bucket: "reachable",
@@ -8039,7 +8044,7 @@ function collectDescriptorStrings(descriptor) {
8039
8044
  }
8040
8045
  for (const [k, v] of Object.entries(obj3)) {
8041
8046
  if (k === "body") continue;
8042
- if (typeof v === "string" && SECONDARY_FIELDS.has(k) && !BINDING_SIGIL.test(v) && isUserVisibleCopy(v)) {
8047
+ if (typeof v === "string" && SECONDARY_FIELDS.has(k) && !BINDING_SIGIL.test(v) && isCopy2(v)) {
8043
8048
  push({ value: v, bucket: "reachable", type, prop: k, path: `${path2}.${k}` });
8044
8049
  }
8045
8050
  }
@@ -34784,6 +34789,29 @@ function idiomPress(ctx, part) {
34784
34789
  ensurePressStyles();
34785
34790
  return `${ctx.idiom}-${kind}`;
34786
34791
  }
34792
+ function revealOnFocusStyle(C) {
34793
+ return {
34794
+ ...VISUALLY_HIDDEN,
34795
+ background: C("surfacePrimary", "#fff"),
34796
+ color: C("textPrimary", "#13171e"),
34797
+ font: "inherit",
34798
+ fontSize: pxToRem(11),
34799
+ fontWeight: 600,
34800
+ cursor: "pointer"
34801
+ };
34802
+ }
34803
+ function FormFieldLabelIdScope({ render, fieldKey, ...extras }) {
34804
+ const id = React7.useId().replace(/[^A-Za-z0-9_-]/g, "");
34805
+ const el = render(`${fieldKey ? `${fieldKey}-` : ""}auto-${id}`);
34806
+ return Object.keys(extras).length ? React7.cloneElement(el, extras) : el;
34807
+ }
34808
+ function formFieldA11y(props) {
34809
+ const labelledBy = props.__labelledBy;
34810
+ return {
34811
+ "aria-labelledby": typeof labelledBy === "string" && labelledBy ? labelledBy : void 0,
34812
+ "aria-required": props.validation?.required === true || void 0
34813
+ };
34814
+ }
34787
34815
  function ensureFocusStyles() {
34788
34816
  if (focusStylesInjected || typeof document === "undefined") return;
34789
34817
  focusStylesInjected = true;
@@ -37174,48 +37202,56 @@ function renderInner(node, ctx) {
37174
37202
  inner: props.text?.validation
37175
37203
  });
37176
37204
  const isTextKind = !["stepper", "toggle", "picker", "date"].includes(props.kind);
37177
- const inner = (
37178
- // `__formFieldId` rides down into EVERY control arm, not just the three
37179
- // that always had it: without it the control never registers in the
37180
- // enclosing Form's value bag, so its value is simply MISSING from the
37181
- // submit payload — which is what web did for stepper and toggle while
37182
- // both natives collected them (see core/schema/form-bag-vectors.json).
37183
- // `validation: fieldRule` rides down with the id, for the same reason. Each
37184
- // control registers the rule it is HANDED, and the proto puts `validation`
37185
- // on TextFieldProps and FormFieldProps only — so a non-text arm read
37186
- // `props.validation` as permanently undefined and registered no rule at
37187
- // all. A `required` picker/date/stepper/toggle therefore left
37188
- // `formIsValid` true and web's submit enabled, while iOS and Android
37189
- // computed the same merged rule through `FormState.effectiveRule` and
37190
- // disabled it. The merge itself already happened above; it just never
37191
- // reached four of the five kinds.
37192
- props.kind === "stepper" ? { type: "Stepper", props: { ...props.stepper ?? {}, __formFieldId: props.id, validation: fieldRule } } : props.kind === "toggle" ? { type: "Toggle", props: { label: "", ...props.toggle ?? {}, __formFieldId: props.id, validation: fieldRule } } : props.kind === "picker" ? { type: "Picker", props: { ...props.picker ?? {}, __formFieldId: props.id, validation: fieldRule } } : props.kind === "date" ? { type: "DatePicker", props: { ...props.date ?? {}, __formFieldId: props.id, validation: fieldRule } } : {
37193
- type: "TextField",
37194
- props: {
37195
- ...props.text ?? {},
37196
- __formFieldId: props.id,
37197
- validation: fieldRule,
37198
- errorText: props.errorMessage ?? props.text?.errorText
37205
+ const labelText2 = asBoundText(props.label, ctx);
37206
+ const ownKey = resolvedComponentId(node.id, ctx);
37207
+ const renderField = (labelDomKey) => {
37208
+ const labelId = labelText2 ? `hm-field-label-${labelDomKey.replace(/\s+/g, "_")}` : void 0;
37209
+ const labelledBy = props.kind !== "toggle" ? labelId : void 0;
37210
+ const inner = (
37211
+ // `__formFieldId` rides down into EVERY control arm, not just the three
37212
+ // that always had it: without it the control never registers in the
37213
+ // enclosing Form's value bag, so its value is simply MISSING from the
37214
+ // submit payload — which is what web did for stepper and toggle while
37215
+ // both natives collected them (see core/schema/form-bag-vectors.json).
37216
+ // `validation: fieldRule` rides down with the id, for the same reason. Each
37217
+ // control registers the rule it is HANDED, and the proto puts `validation`
37218
+ // on TextFieldProps and FormFieldProps only — so a non-text arm read
37219
+ // `props.validation` as permanently undefined and registered no rule at
37220
+ // all. A `required` picker/date/stepper/toggle therefore left
37221
+ // `formIsValid` true and web's submit enabled, while iOS and Android
37222
+ // computed the same merged rule through `FormState.effectiveRule` and
37223
+ // disabled it. The merge itself already happened above; it just never
37224
+ // reached four of the five kinds.
37225
+ props.kind === "stepper" ? { type: "Stepper", props: { ...props.stepper ?? {}, __formFieldId: props.id, validation: fieldRule, __labelledBy: labelledBy } } : props.kind === "toggle" ? { type: "Toggle", props: { label: "", ...props.toggle ?? {}, __formFieldId: props.id, validation: fieldRule } } : props.kind === "picker" ? { type: "Picker", props: { ...props.picker ?? {}, __formFieldId: props.id, validation: fieldRule, __labelledBy: labelledBy } } : props.kind === "date" ? { type: "DatePicker", props: { ...props.date ?? {}, __formFieldId: props.id, validation: fieldRule, __labelledBy: labelledBy } } : {
37226
+ type: "TextField",
37227
+ props: {
37228
+ ...props.text ?? {},
37229
+ __formFieldId: props.id,
37230
+ validation: fieldRule,
37231
+ errorText: props.errorMessage ?? props.text?.errorText,
37232
+ __labelledBy: labelledBy
37233
+ }
37199
37234
  }
37200
- }
37201
- );
37202
- const fieldLabel = asBoundText(props.label, ctx);
37203
- if (isTextKind && typeof props.label === "string" && props.label) {
37204
- inner.modifiers = { accessibilityLabel: props.label };
37205
- }
37206
- if (isTextKind && typeof props.helpText === "string" && props.helpText) {
37207
- inner.modifiers = { ...inner.modifiers ?? {}, accessibilityHint: props.helpText };
37208
- }
37209
- const showOwnError = !isTextKind && props.errorMessage;
37210
- return /* @__PURE__ */ jsxs5("div", { style: { width: "100%", ...wrap }, children: [
37211
- (fieldLabel || props.required) && /* @__PURE__ */ jsxs5("div", { style: { fontFamily: bodyFont(ctx), fontWeight: 600, fontSize: pxToRem(13), color: C("textPrimary", "#111"), marginBottom: 6 }, children: [
37212
- fieldLabel,
37213
- props.required && /* @__PURE__ */ jsx8("span", { style: { color: C("danger", "#e62214") }, children: " *" })
37214
- ] }),
37215
- renderNode(inner, ctx),
37216
- props.helpText && /* @__PURE__ */ jsx8("div", { style: { fontSize: pxToRem(12), color: C("textSecondary", "#888"), marginTop: 4 }, children: txt(props.helpText, ctx) }),
37217
- showOwnError && /* @__PURE__ */ jsx8("div", { role: "alert", style: { fontSize: pxToRem(12), color: C("danger", "#E62214"), marginTop: 4 }, children: txt(props.errorMessage, ctx) })
37218
- ] });
37235
+ );
37236
+ const fieldLabel = labelText2;
37237
+ if (isTextKind && typeof props.label === "string" && props.label) {
37238
+ inner.modifiers = { accessibilityLabel: props.label };
37239
+ }
37240
+ if (isTextKind && typeof props.helpText === "string" && props.helpText) {
37241
+ inner.modifiers = { ...inner.modifiers ?? {}, accessibilityHint: props.helpText };
37242
+ }
37243
+ const showOwnError = !isTextKind && props.errorMessage;
37244
+ return /* @__PURE__ */ jsxs5("div", { style: { width: "100%", ...wrap }, children: [
37245
+ (fieldLabel || props.required) && /* @__PURE__ */ jsxs5("div", { style: { fontFamily: bodyFont(ctx), fontWeight: 600, fontSize: pxToRem(13), color: C("textPrimary", "#111"), marginBottom: 6 }, children: [
37246
+ fieldLabel ? /* @__PURE__ */ jsx8("span", { id: labelId, children: fieldLabel }) : null,
37247
+ props.required && /* @__PURE__ */ jsx8("span", { "aria-hidden": labelledBy ? "true" : void 0, style: { color: C("danger", "#e62214") }, children: " *" })
37248
+ ] }),
37249
+ renderNode(inner, ctx),
37250
+ props.helpText && /* @__PURE__ */ jsx8("div", { style: { fontSize: pxToRem(12), color: C("textSecondary", "#888"), marginTop: 4 }, children: txt(props.helpText, ctx) }),
37251
+ showOwnError && /* @__PURE__ */ jsx8("div", { role: "alert", style: { fontSize: pxToRem(12), color: C("danger", "#E62214"), marginTop: 4 }, children: txt(props.errorMessage, ctx) })
37252
+ ] });
37253
+ };
37254
+ return ownKey ? renderField(ownKey) : /* @__PURE__ */ jsx8(FormFieldLabelIdScope, { render: renderField, fieldKey: typeof props.id === "string" && props.id ? props.id : void 0 });
37219
37255
  }
37220
37256
  case "FieldError":
37221
37257
  return /* @__PURE__ */ jsx8(FieldErrorNode, { props, ctx, wrap });
@@ -37329,7 +37365,7 @@ function renderInner(node, ctx) {
37329
37365
  }
37330
37366
  }
37331
37367
  }
37332
- var useIsomorphicLayoutEffect, ResponsiveGrid, SPLIT_EXPANDED_MIN_WIDTH, SPLIT_COLUMN_GAP, ResponsiveSplitView, ABSOLUTE_URL_RE, appearKeyframesInjected, pressStylesInjected, FOCUS_RING_CSS, focusStylesInjected, HLIST_CHILD_CSS, hListStylesInjected, listAnimateRuntimeInstalled, transitionKeyframesInjected, countUpRuntimeInjected, MEASURE_PREFIX, measureRuntimeInjected, revealRuntimeInjected, 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, resolveSwipeActions, resolveModBindings, resolvedComponentId, directServiceBindings, withRootStyle, ReactiveDirectScalars, HiddenGate, KEYBOARD_INPUT_MODES, AUTOCAPITALIZE_VALUES, ENTER_KEY_HINTS, AUTOGROW_CEILING, EditableField, MenuNode, LoadMoreSentinel, FieldErrorNode, FormView, MediaSlotProvider, MEDIA_ITEM_BINDABLE, MediaPlayerView, VideoNode, PdfViewNode, WebViewNode, InteractivePicker, InteractiveDatePicker, InteractiveSearchField, InteractiveStepper, 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, VISUALLY_HIDDEN, NAME_SKIP_SELECTOR, activatorNameObservers, ACTIVATOR_STATE_ATTRS, controlNode, ToggleNode, SliderNode, SelectionControlNode, TabsNode, SegmentedControlNode, DisclosureGroupNode, GridNode, SplitViewNode, TextNode, ImageNode, ANIMATION_LEAF, LottieNode, RiveNode, AvatarNode, IconNode, ButtonNode, OtpInputNode, ProgressBarNode, ACTIVITY_DEFAULT_NAME, ActivityIndicatorNode, NATIVELY_TABBABLE, BottomSheetNode, 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, 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, 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, WebRenderer;
37368
+ var useIsomorphicLayoutEffect, ResponsiveGrid, SPLIT_EXPANDED_MIN_WIDTH, SPLIT_COLUMN_GAP, ResponsiveSplitView, ABSOLUTE_URL_RE, appearKeyframesInjected, pressStylesInjected, REVEAL_ON_FOCUS_ATTR, FOCUS_RING_CSS, focusStylesInjected, HLIST_CHILD_CSS, hListStylesInjected, listAnimateRuntimeInstalled, transitionKeyframesInjected, countUpRuntimeInjected, MEASURE_PREFIX, measureRuntimeInjected, revealRuntimeInjected, 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, resolveSwipeActions, resolveModBindings, resolvedComponentId, directServiceBindings, withRootStyle, ReactiveDirectScalars, HiddenGate, KEYBOARD_INPUT_MODES, AUTOCAPITALIZE_VALUES, ENTER_KEY_HINTS, AUTOGROW_CEILING, EditableField, MenuNode, LoadMoreSentinel, FieldErrorNode, FormView, MediaSlotProvider, MEDIA_ITEM_BINDABLE, MediaPlayerView, VideoNode, PdfViewNode, WebViewNode, InteractivePicker, InteractiveDatePicker, InteractiveSearchField, InteractiveStepper, 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, VISUALLY_HIDDEN, NAME_SKIP_SELECTOR, activatorNameObservers, ACTIVATOR_STATE_ATTRS, controlNode, ToggleNode, SliderNode, SelectionControlNode, TabsNode, SegmentedControlNode, DisclosureGroupNode, GridNode, SplitViewNode, TextNode, ImageNode, ANIMATION_LEAF, LottieNode, RiveNode, AvatarNode, IconNode, ButtonNode, OtpInputNode, ProgressBarNode, ACTIVITY_DEFAULT_NAME, ActivityIndicatorNode, NATIVELY_TABBABLE, BottomSheetNode, 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, 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, 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, WebRenderer;
37333
37369
  var init_renderNode = __esm({
37334
37370
  "../../core/web-renderer/src/renderNode.tsx"() {
37335
37371
  "use strict";
@@ -37424,7 +37460,8 @@ var init_renderNode = __esm({
37424
37460
  ABSOLUTE_URL_RE = /^([a-zA-Z][a-zA-Z0-9+.-]*:|\/\/)/;
37425
37461
  appearKeyframesInjected = false;
37426
37462
  pressStylesInjected = false;
37427
- FOCUS_RING_CSS = ':where(button,a,[href],input,select,textarea,[role="button"],[tabindex]):focus-visible{outline:2px solid var(--himi-accent,#116DFF);outline-offset:2px;border-radius:4px}[data-himalaya-tap-group]:has(>[data-himalaya-tap-activator]:focus-visible){outline:2px solid var(--himi-accent,#116DFF);outline-offset:2px}';
37463
+ REVEAL_ON_FOCUS_ATTR = "data-hm-reveal-on-focus";
37464
+ FOCUS_RING_CSS = `:where(button,a,[href],input,select,textarea,[role="button"],[tabindex]):focus-visible{outline:2px solid var(--himi-accent,#116DFF);outline-offset:2px;border-radius:4px}[data-himalaya-tap-group]:has(>[data-himalaya-tap-activator]:focus-visible){outline:2px solid var(--himi-accent,#116DFF);outline-offset:2px}[${REVEAL_ON_FOCUS_ATTR}]:focus{width:auto!important;height:auto!important;margin:0!important;padding:2px 6px!important;clip:auto!important;clip-path:none!important;overflow:visible!important;top:2px;inset-inline-end:2px;z-index:2;border-radius:4px;outline:2px solid var(--himi-accent,#116DFF);outline-offset:1px}:has(>[${REVEAL_ON_FOCUS_ATTR}]:focus){overflow:visible!important;z-index:3}`;
37428
37465
  focusStylesInjected = false;
37429
37466
  HLIST_CHILD_CSS = "[data-himalaya-hlist]>*{flex:0 0 auto}";
37430
37467
  hListStylesInjected = false;
@@ -37889,6 +37926,8 @@ var init_renderNode = __esm({
37889
37926
  const fieldId = props.__formFieldId;
37890
37927
  const previousBinding = React7.useRef(binding2);
37891
37928
  const rule = props.validation ?? cfg.validation;
37929
+ const { "aria-labelledby": labelledBy } = formFieldA11y(props);
37930
+ const required3 = rule?.required === true || void 0;
37892
37931
  const ruleKey = React7.useMemo(() => rule ? JSON.stringify(rule) : "", [rule]);
37893
37932
  React7.useEffect(() => {
37894
37933
  if (!formBag || !fieldId) return;
@@ -38038,7 +38077,7 @@ var init_renderNode = __esm({
38038
38077
  /* @__PURE__ */ jsxs5("div", { style: composedBox, children: [
38039
38078
  props.leadingIcon && accIcon(props.leadingIcon),
38040
38079
  prefixText && /* @__PURE__ */ jsx8("span", { style: { color: muted, flex: "none" }, children: prefixText }),
38041
- multilineBox ? /* @__PURE__ */ jsx8("textarea", { "data-component-id": componentId, id: fieldDomId, "data-component-type": componentType, ...a11yFwd, ref: inputRef, value: local, onChange: onInput, onKeyDown, onFocus: onFieldFocus, onBlur: onFieldBlur, placeholder: placeholder2, rows: 2, "aria-label": ariaLabelProp ?? placeholderName, "aria-invalid": errored || void 0, "aria-describedby": [errorId, describedByProp].filter(Boolean).join(" ") || void 0, inputMode, autoCapitalize, maxLength, autoCorrect: suggestOff ? "off" : suggestOn ? "on" : void 0, spellCheck: suggestOff ? false : suggestOn ? true : void 0, autoComplete: suggestOff ? "off" : void 0, style: inputBase }) : /* @__PURE__ */ jsx8("input", { "data-component-id": componentId, id: htmlId, "data-component-type": componentType, ...a11yFwd, ref: inputRef, type: secure ? "password" : "text", value: local, onChange: onInput, onKeyDown, onFocus: onFieldFocus, onBlur: onFieldBlur, placeholder: placeholder2, "aria-label": ariaLabelProp ?? placeholderName, "aria-invalid": errored || void 0, "aria-describedby": [errorId, describedByProp].filter(Boolean).join(" ") || void 0, inputMode, autoCapitalize, maxLength, autoCorrect: suggestOff ? "off" : suggestOn ? "on" : void 0, spellCheck: suggestOff ? false : suggestOn ? true : void 0, autoComplete: suggestOff ? "off" : void 0, enterKeyHint, style: inputBase }),
38080
+ multilineBox ? /* @__PURE__ */ jsx8("textarea", { "data-component-id": componentId, id: fieldDomId, "data-component-type": componentType, ...a11yFwd, ref: inputRef, value: local, onChange: onInput, onKeyDown, onFocus: onFieldFocus, onBlur: onFieldBlur, placeholder: placeholder2, rows: 2, "aria-label": ariaLabelProp ?? placeholderName, "aria-labelledby": labelledBy, "aria-required": required3, "aria-invalid": errored || void 0, "aria-describedby": [errorId, describedByProp].filter(Boolean).join(" ") || void 0, inputMode, autoCapitalize, maxLength, autoCorrect: suggestOff ? "off" : suggestOn ? "on" : void 0, spellCheck: suggestOff ? false : suggestOn ? true : void 0, autoComplete: suggestOff ? "off" : void 0, style: inputBase }) : /* @__PURE__ */ jsx8("input", { "data-component-id": componentId, id: htmlId, "data-component-type": componentType, ...a11yFwd, ref: inputRef, type: secure ? "password" : "text", value: local, onChange: onInput, onKeyDown, onFocus: onFieldFocus, onBlur: onFieldBlur, placeholder: placeholder2, "aria-label": ariaLabelProp ?? placeholderName, "aria-labelledby": labelledBy, "aria-required": required3, "aria-invalid": errored || void 0, "aria-describedby": [errorId, describedByProp].filter(Boolean).join(" ") || void 0, inputMode, autoCapitalize, maxLength, autoCorrect: suggestOff ? "off" : suggestOn ? "on" : void 0, spellCheck: suggestOff ? false : suggestOn ? true : void 0, autoComplete: suggestOff ? "off" : void 0, enterKeyHint, style: inputBase }),
38042
38081
  suffixText && /* @__PURE__ */ jsx8("span", { style: { color: muted, flex: "none" }, children: suffixText }),
38043
38082
  props.clearButton && local && /* @__PURE__ */ jsx8("span", { onClick: () => {
38044
38083
  setLocal("");
@@ -38849,12 +38888,14 @@ var init_renderNode = __esm({
38849
38888
  ctx.onAction({ ...onChange, params: { ...onChange.params ?? {}, selectedId: id }, args: { ...onChange.args ?? {}, selectedId: id } });
38850
38889
  }
38851
38890
  };
38891
+ const pickerA11y = formFieldA11y(props);
38852
38892
  return /* @__PURE__ */ jsxs5(
38853
38893
  "select",
38854
38894
  {
38855
38895
  value: sel,
38856
38896
  onChange: (e) => emit(e.currentTarget.value),
38857
- "aria-label": String(placeholderText || "Select"),
38897
+ "aria-label": pickerA11y["aria-labelledby"] ? void 0 : String(placeholderText || "Select"),
38898
+ ...pickerA11y,
38858
38899
  style: { width: "100%", background: C("surfacePrimary", "#fff"), border: `1px solid ${C("border", "#e3e3e3")}`, borderRadius: ctx.radius("md", 8), padding: "11px 14px", boxSizing: "border-box", fontFamily: bodyFont(ctx), fontSize: pxToRem(15), color: C("textPrimary", "#111"), ...wrap },
38859
38900
  children: [
38860
38901
  props.placeholder && /* @__PURE__ */ jsx8("option", { value: "", disabled: true, children: placeholderText }),
@@ -38950,7 +38991,8 @@ var init_renderNode = __esm({
38950
38991
  onChange: (e) => emit(e.currentTarget.value),
38951
38992
  min: minUnix != null ? toInput(minUnix) : void 0,
38952
38993
  max: maxUnix != null ? toInput(maxUnix) : void 0,
38953
- "aria-label": timeMode ? "Select time" : dateTimeMode ? "Select date and time" : "Select date",
38994
+ "aria-label": formFieldA11y(props)["aria-labelledby"] ? void 0 : timeMode ? "Select time" : dateTimeMode ? "Select date and time" : "Select date",
38995
+ ...formFieldA11y(props),
38954
38996
  style: { width: "100%", boxSizing: "border-box", background: C("surfacePrimary", "#fff"), border: `1px solid ${C("border", "#e3e3e3")}`, borderRadius: ctx.radius("md", 8), padding: "12px 14px", fontFamily: bodyFont(ctx), fontSize: pxToRem(15), color: C("textPrimary", "#111"), ...wrap }
38955
38997
  }
38956
38998
  );
@@ -39095,7 +39137,9 @@ var init_renderNode = __esm({
39095
39137
  [A11Y_PART]: "node",
39096
39138
  role: "spinbutton",
39097
39139
  "aria-valuemin": typeof props.min === "number" ? min : void 0,
39098
- "aria-valuemax": typeof props.max === "number" ? max : void 0
39140
+ "aria-valuemax": typeof props.max === "number" ? max : void 0,
39141
+ // #3160 — inside a FormField the visible label names it, as it does every other field kind.
39142
+ ...formFieldA11y(props)
39099
39143
  };
39100
39144
  const root = { [A11Y_PART]: "root" };
39101
39145
  if (ctx.empty) {
@@ -41109,7 +41153,9 @@ var init_renderNode = __esm({
41109
41153
  const r = calMoveEvent(p.startMin, p.endMin, snapStep, snapStep);
41110
41154
  reportChange(p.ev, key2, r.startMinute, r.endMinute);
41111
41155
  },
41112
- style: { position: "absolute", width: 1, height: 1, padding: 0, margin: -1, overflow: "hidden", clip: "rect(0 0 0 0)", whiteSpace: "nowrap", border: 0 }
41156
+ ...{ [REVEAL_ON_FOCUS_ATTR]: "" },
41157
+ style: revealOnFocusStyle(C),
41158
+ children: /* @__PURE__ */ jsx8("span", { "aria-hidden": "true", children: moveLabel || "Move\u2026" })
41113
41159
  }
41114
41160
  ),
41115
41161
  /* @__PURE__ */ jsx8(
@@ -41123,7 +41169,9 @@ var init_renderNode = __esm({
41123
41169
  const r = calResizeEvent(p.startMin, p.endMin, snapStep, snapStep);
41124
41170
  reportChange(p.ev, key2, r.startMinute, r.endMinute);
41125
41171
  },
41126
- style: { position: "absolute", width: 1, height: 1, padding: 0, margin: -1, overflow: "hidden", clip: "rect(0 0 0 0)", whiteSpace: "nowrap", border: 0 }
41172
+ ...{ [REVEAL_ON_FOCUS_ATTR]: "" },
41173
+ style: revealOnFocusStyle(C),
41174
+ children: /* @__PURE__ */ jsx8("span", { "aria-hidden": "true", children: resizeLabel || "Change time\u2026" })
41127
41175
  }
41128
41176
  ),
41129
41177
  /* @__PURE__ */ jsx8(
@@ -62638,21 +62686,21 @@ var init_preview_assets_generated = __esm({
62638
62686
  "../../packages/serve/src/preview-assets.generated.ts"() {
62639
62687
  init_preview_assets_format();
62640
62688
  PREVIEW_ASSET_MANIFEST = [
62641
- { key: "assets/index-C7Hu2ZVY.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 1184477, sha256: "467121778a7bc69ac19ec6c77f6f2ca7ea80d7fc2915e8981ba0219b5c2fe61d" },
62642
- { key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 1184485, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
62643
- { key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 1189095, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
62644
- { key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 1677679, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
62645
- { key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 1768603, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
62646
- { key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 1859587, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
62647
- { key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 1950567, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
62648
- { key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 2041439, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
62649
- { key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 2132419, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
62650
- { key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 2241055, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
62651
- { key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 2350139, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
62652
- { key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 2459187, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
62653
- { key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 2566887, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
62654
- { key: "index.html", contentType: "text/html; charset=utf-8", offset: 2654995, length: 4947, sha256: "b6f3f19b28b680a734bcf73bfb6e3690e478affe9f3c10a3c5c5d8f3e674c9b0" },
62655
- { key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 2659942, length: 17344, sha256: "d057298d75e7373e5e2c4d11b7d1bcbea88e03af555ba63d97641c78509c58e4" }
62689
+ { key: "assets/index-C7Pn97oj.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 1185822, sha256: "4627e2da1c482ae73294a2fc4500dcaa5074cd38e53a28e60af2093c6951a221" },
62690
+ { key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 1185830, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
62691
+ { key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 1190440, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
62692
+ { key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 1679024, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
62693
+ { key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 1769948, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
62694
+ { key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 1860932, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
62695
+ { key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 1951912, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
62696
+ { key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 2042784, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
62697
+ { key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 2133764, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
62698
+ { key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 2242400, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
62699
+ { key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 2351484, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
62700
+ { key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 2460532, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
62701
+ { key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 2568232, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
62702
+ { key: "index.html", contentType: "text/html; charset=utf-8", offset: 2656340, length: 4947, sha256: "6ec471f6243aa4ca8b798a33521c421bb87f22ea06ac184690d1d3d9054b6187" },
62703
+ { key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 2661287, length: 17344, sha256: "d057298d75e7373e5e2c4d11b7d1bcbea88e03af555ba63d97641c78509c58e4" }
62656
62704
  ];
62657
62705
  }
62658
62706
  });
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.1213.0",
3
+ "version": "0.1215.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": [
@@ -67,5 +67,5 @@
67
67
  "artifactId": "himalaya-cli"
68
68
  }
69
69
  },
70
- "falconPackageHash": "85a85909eb5f201a49f5414ffcc4d36dbf9a3dcf7acca4a0b3eec160"
70
+ "falconPackageHash": "ba6e51d93c561edb1aa2de10154bdd5848f7cb971441ea81f6876de7"
71
71
  }