@wix/himalaya-cli 0.1214.0 → 0.1216.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
@@ -6868,6 +6868,7 @@ function resolveTranslation(value, catalog, sourceCatalog) {
6868
6868
  var BINDING_SIGILS, BINDING_SIGIL_RE, TRANSLATION_PREFIX, TRANSLATION_KEY_RE;
6869
6869
  var init_bindings = __esm({
6870
6870
  "../../core/ts/src/bindings.ts"() {
6871
+ "use strict";
6871
6872
  BINDING_SIGILS = ["service", "flag", "item", "t"];
6872
6873
  BINDING_SIGIL_RE = new RegExp(
6873
6874
  `^\\$(?:${BINDING_SIGILS.filter((s) => s !== "t").join("|")})\\b|^\\$t:`
@@ -25391,6 +25392,7 @@ function shouldRevealError(args) {
25391
25392
  var EMAIL_RE, URL_HOST_RE, INTEGER_RE, NUMBER_RE;
25392
25393
  var init_validation = __esm({
25393
25394
  "../../core/ts/src/validation.ts"() {
25395
+ "use strict";
25394
25396
  EMAIL_RE = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*\.[A-Za-z]{2,}$/;
25395
25397
  URL_HOST_RE = /^[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(:[0-9]+)?$/;
25396
25398
  INTEGER_RE = /^[+-]?[0-9]+$/;
@@ -26050,6 +26052,7 @@ function validateWorkerSubtree(raw, slotId, policy, actionCatalog) {
26050
26052
  var WORKER_SUBTREE_CEILINGS, ID_PART, ACTION_ID;
26051
26053
  var init_worker_subtree = __esm({
26052
26054
  "../../core/ts/src/worker-subtree.ts"() {
26055
+ "use strict";
26053
26056
  init_worker_subtree_safe_types_generated();
26054
26057
  WORKER_SUBTREE_CEILINGS = Object.freeze({
26055
26058
  maxEncodedBytes: 65536,
@@ -34787,6 +34790,29 @@ function idiomPress(ctx, part) {
34787
34790
  ensurePressStyles();
34788
34791
  return `${ctx.idiom}-${kind}`;
34789
34792
  }
34793
+ function revealOnFocusStyle(C) {
34794
+ return {
34795
+ ...VISUALLY_HIDDEN,
34796
+ background: C("surfacePrimary", "#fff"),
34797
+ color: C("textPrimary", "#13171e"),
34798
+ font: "inherit",
34799
+ fontSize: pxToRem(11),
34800
+ fontWeight: 600,
34801
+ cursor: "pointer"
34802
+ };
34803
+ }
34804
+ function FormFieldLabelIdScope({ render, fieldKey, ...extras }) {
34805
+ const id = React7.useId().replace(/[^A-Za-z0-9_-]/g, "");
34806
+ const el = render(`${fieldKey ? `${fieldKey}-` : ""}auto-${id}`);
34807
+ return Object.keys(extras).length ? React7.cloneElement(el, extras) : el;
34808
+ }
34809
+ function formFieldA11y(props) {
34810
+ const labelledBy = props.__labelledBy;
34811
+ return {
34812
+ "aria-labelledby": typeof labelledBy === "string" && labelledBy ? labelledBy : void 0,
34813
+ "aria-required": props.validation?.required === true || void 0
34814
+ };
34815
+ }
34790
34816
  function ensureFocusStyles() {
34791
34817
  if (focusStylesInjected || typeof document === "undefined") return;
34792
34818
  focusStylesInjected = true;
@@ -37177,48 +37203,56 @@ function renderInner(node, ctx) {
37177
37203
  inner: props.text?.validation
37178
37204
  });
37179
37205
  const isTextKind = !["stepper", "toggle", "picker", "date"].includes(props.kind);
37180
- const inner = (
37181
- // `__formFieldId` rides down into EVERY control arm, not just the three
37182
- // that always had it: without it the control never registers in the
37183
- // enclosing Form's value bag, so its value is simply MISSING from the
37184
- // submit payload — which is what web did for stepper and toggle while
37185
- // both natives collected them (see core/schema/form-bag-vectors.json).
37186
- // `validation: fieldRule` rides down with the id, for the same reason. Each
37187
- // control registers the rule it is HANDED, and the proto puts `validation`
37188
- // on TextFieldProps and FormFieldProps only — so a non-text arm read
37189
- // `props.validation` as permanently undefined and registered no rule at
37190
- // all. A `required` picker/date/stepper/toggle therefore left
37191
- // `formIsValid` true and web's submit enabled, while iOS and Android
37192
- // computed the same merged rule through `FormState.effectiveRule` and
37193
- // disabled it. The merge itself already happened above; it just never
37194
- // reached four of the five kinds.
37195
- 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 } } : {
37196
- type: "TextField",
37197
- props: {
37198
- ...props.text ?? {},
37199
- __formFieldId: props.id,
37200
- validation: fieldRule,
37201
- errorText: props.errorMessage ?? props.text?.errorText
37206
+ const labelText2 = asBoundText(props.label, ctx);
37207
+ const ownKey = resolvedComponentId(node.id, ctx);
37208
+ const renderField = (labelDomKey) => {
37209
+ const labelId = labelText2 ? `hm-field-label-${labelDomKey.replace(/\s+/g, "_")}` : void 0;
37210
+ const labelledBy = props.kind !== "toggle" ? labelId : void 0;
37211
+ const inner = (
37212
+ // `__formFieldId` rides down into EVERY control arm, not just the three
37213
+ // that always had it: without it the control never registers in the
37214
+ // enclosing Form's value bag, so its value is simply MISSING from the
37215
+ // submit payload — which is what web did for stepper and toggle while
37216
+ // both natives collected them (see core/schema/form-bag-vectors.json).
37217
+ // `validation: fieldRule` rides down with the id, for the same reason. Each
37218
+ // control registers the rule it is HANDED, and the proto puts `validation`
37219
+ // on TextFieldProps and FormFieldProps only — so a non-text arm read
37220
+ // `props.validation` as permanently undefined and registered no rule at
37221
+ // all. A `required` picker/date/stepper/toggle therefore left
37222
+ // `formIsValid` true and web's submit enabled, while iOS and Android
37223
+ // computed the same merged rule through `FormState.effectiveRule` and
37224
+ // disabled it. The merge itself already happened above; it just never
37225
+ // reached four of the five kinds.
37226
+ 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 } } : {
37227
+ type: "TextField",
37228
+ props: {
37229
+ ...props.text ?? {},
37230
+ __formFieldId: props.id,
37231
+ validation: fieldRule,
37232
+ errorText: props.errorMessage ?? props.text?.errorText,
37233
+ __labelledBy: labelledBy
37234
+ }
37202
37235
  }
37203
- }
37204
- );
37205
- const fieldLabel = asBoundText(props.label, ctx);
37206
- if (isTextKind && typeof props.label === "string" && props.label) {
37207
- inner.modifiers = { accessibilityLabel: props.label };
37208
- }
37209
- if (isTextKind && typeof props.helpText === "string" && props.helpText) {
37210
- inner.modifiers = { ...inner.modifiers ?? {}, accessibilityHint: props.helpText };
37211
- }
37212
- const showOwnError = !isTextKind && props.errorMessage;
37213
- return /* @__PURE__ */ jsxs5("div", { style: { width: "100%", ...wrap }, children: [
37214
- (fieldLabel || props.required) && /* @__PURE__ */ jsxs5("div", { style: { fontFamily: bodyFont(ctx), fontWeight: 600, fontSize: pxToRem(13), color: C("textPrimary", "#111"), marginBottom: 6 }, children: [
37215
- fieldLabel,
37216
- props.required && /* @__PURE__ */ jsx8("span", { style: { color: C("danger", "#e62214") }, children: " *" })
37217
- ] }),
37218
- renderNode(inner, ctx),
37219
- props.helpText && /* @__PURE__ */ jsx8("div", { style: { fontSize: pxToRem(12), color: C("textSecondary", "#888"), marginTop: 4 }, children: txt(props.helpText, ctx) }),
37220
- showOwnError && /* @__PURE__ */ jsx8("div", { role: "alert", style: { fontSize: pxToRem(12), color: C("danger", "#E62214"), marginTop: 4 }, children: txt(props.errorMessage, ctx) })
37221
- ] });
37236
+ );
37237
+ const fieldLabel = labelText2;
37238
+ if (isTextKind && typeof props.label === "string" && props.label) {
37239
+ inner.modifiers = { accessibilityLabel: props.label };
37240
+ }
37241
+ if (isTextKind && typeof props.helpText === "string" && props.helpText) {
37242
+ inner.modifiers = { ...inner.modifiers ?? {}, accessibilityHint: props.helpText };
37243
+ }
37244
+ const showOwnError = !isTextKind && props.errorMessage;
37245
+ return /* @__PURE__ */ jsxs5("div", { style: { width: "100%", ...wrap }, children: [
37246
+ (fieldLabel || props.required) && /* @__PURE__ */ jsxs5("div", { style: { fontFamily: bodyFont(ctx), fontWeight: 600, fontSize: pxToRem(13), color: C("textPrimary", "#111"), marginBottom: 6 }, children: [
37247
+ fieldLabel ? /* @__PURE__ */ jsx8("span", { id: labelId, children: fieldLabel }) : null,
37248
+ props.required && /* @__PURE__ */ jsx8("span", { "aria-hidden": labelledBy ? "true" : void 0, style: { color: C("danger", "#e62214") }, children: " *" })
37249
+ ] }),
37250
+ renderNode(inner, ctx),
37251
+ props.helpText && /* @__PURE__ */ jsx8("div", { style: { fontSize: pxToRem(12), color: C("textSecondary", "#888"), marginTop: 4 }, children: txt(props.helpText, ctx) }),
37252
+ showOwnError && /* @__PURE__ */ jsx8("div", { role: "alert", style: { fontSize: pxToRem(12), color: C("danger", "#E62214"), marginTop: 4 }, children: txt(props.errorMessage, ctx) })
37253
+ ] });
37254
+ };
37255
+ return ownKey ? renderField(ownKey) : /* @__PURE__ */ jsx8(FormFieldLabelIdScope, { render: renderField, fieldKey: typeof props.id === "string" && props.id ? props.id : void 0 });
37222
37256
  }
37223
37257
  case "FieldError":
37224
37258
  return /* @__PURE__ */ jsx8(FieldErrorNode, { props, ctx, wrap });
@@ -37332,7 +37366,7 @@ function renderInner(node, ctx) {
37332
37366
  }
37333
37367
  }
37334
37368
  }
37335
- 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;
37369
+ 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;
37336
37370
  var init_renderNode = __esm({
37337
37371
  "../../core/web-renderer/src/renderNode.tsx"() {
37338
37372
  "use strict";
@@ -37427,7 +37461,8 @@ var init_renderNode = __esm({
37427
37461
  ABSOLUTE_URL_RE = /^([a-zA-Z][a-zA-Z0-9+.-]*:|\/\/)/;
37428
37462
  appearKeyframesInjected = false;
37429
37463
  pressStylesInjected = false;
37430
- 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}';
37464
+ REVEAL_ON_FOCUS_ATTR = "data-hm-reveal-on-focus";
37465
+ 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}`;
37431
37466
  focusStylesInjected = false;
37432
37467
  HLIST_CHILD_CSS = "[data-himalaya-hlist]>*{flex:0 0 auto}";
37433
37468
  hListStylesInjected = false;
@@ -37892,6 +37927,8 @@ var init_renderNode = __esm({
37892
37927
  const fieldId = props.__formFieldId;
37893
37928
  const previousBinding = React7.useRef(binding2);
37894
37929
  const rule = props.validation ?? cfg.validation;
37930
+ const { "aria-labelledby": labelledBy } = formFieldA11y(props);
37931
+ const required3 = rule?.required === true || void 0;
37895
37932
  const ruleKey = React7.useMemo(() => rule ? JSON.stringify(rule) : "", [rule]);
37896
37933
  React7.useEffect(() => {
37897
37934
  if (!formBag || !fieldId) return;
@@ -38041,7 +38078,7 @@ var init_renderNode = __esm({
38041
38078
  /* @__PURE__ */ jsxs5("div", { style: composedBox, children: [
38042
38079
  props.leadingIcon && accIcon(props.leadingIcon),
38043
38080
  prefixText && /* @__PURE__ */ jsx8("span", { style: { color: muted, flex: "none" }, children: prefixText }),
38044
- 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 }),
38081
+ 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 }),
38045
38082
  suffixText && /* @__PURE__ */ jsx8("span", { style: { color: muted, flex: "none" }, children: suffixText }),
38046
38083
  props.clearButton && local && /* @__PURE__ */ jsx8("span", { onClick: () => {
38047
38084
  setLocal("");
@@ -38852,12 +38889,14 @@ var init_renderNode = __esm({
38852
38889
  ctx.onAction({ ...onChange, params: { ...onChange.params ?? {}, selectedId: id }, args: { ...onChange.args ?? {}, selectedId: id } });
38853
38890
  }
38854
38891
  };
38892
+ const pickerA11y = formFieldA11y(props);
38855
38893
  return /* @__PURE__ */ jsxs5(
38856
38894
  "select",
38857
38895
  {
38858
38896
  value: sel,
38859
38897
  onChange: (e) => emit(e.currentTarget.value),
38860
- "aria-label": String(placeholderText || "Select"),
38898
+ "aria-label": pickerA11y["aria-labelledby"] ? void 0 : String(placeholderText || "Select"),
38899
+ ...pickerA11y,
38861
38900
  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 },
38862
38901
  children: [
38863
38902
  props.placeholder && /* @__PURE__ */ jsx8("option", { value: "", disabled: true, children: placeholderText }),
@@ -38953,7 +38992,8 @@ var init_renderNode = __esm({
38953
38992
  onChange: (e) => emit(e.currentTarget.value),
38954
38993
  min: minUnix != null ? toInput(minUnix) : void 0,
38955
38994
  max: maxUnix != null ? toInput(maxUnix) : void 0,
38956
- "aria-label": timeMode ? "Select time" : dateTimeMode ? "Select date and time" : "Select date",
38995
+ "aria-label": formFieldA11y(props)["aria-labelledby"] ? void 0 : timeMode ? "Select time" : dateTimeMode ? "Select date and time" : "Select date",
38996
+ ...formFieldA11y(props),
38957
38997
  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 }
38958
38998
  }
38959
38999
  );
@@ -39098,7 +39138,9 @@ var init_renderNode = __esm({
39098
39138
  [A11Y_PART]: "node",
39099
39139
  role: "spinbutton",
39100
39140
  "aria-valuemin": typeof props.min === "number" ? min : void 0,
39101
- "aria-valuemax": typeof props.max === "number" ? max : void 0
39141
+ "aria-valuemax": typeof props.max === "number" ? max : void 0,
39142
+ // #3160 — inside a FormField the visible label names it, as it does every other field kind.
39143
+ ...formFieldA11y(props)
39102
39144
  };
39103
39145
  const root = { [A11Y_PART]: "root" };
39104
39146
  if (ctx.empty) {
@@ -41112,7 +41154,9 @@ var init_renderNode = __esm({
41112
41154
  const r = calMoveEvent(p.startMin, p.endMin, snapStep, snapStep);
41113
41155
  reportChange(p.ev, key2, r.startMinute, r.endMinute);
41114
41156
  },
41115
- style: { position: "absolute", width: 1, height: 1, padding: 0, margin: -1, overflow: "hidden", clip: "rect(0 0 0 0)", whiteSpace: "nowrap", border: 0 }
41157
+ ...{ [REVEAL_ON_FOCUS_ATTR]: "" },
41158
+ style: revealOnFocusStyle(C),
41159
+ children: /* @__PURE__ */ jsx8("span", { "aria-hidden": "true", children: moveLabel || "Move\u2026" })
41116
41160
  }
41117
41161
  ),
41118
41162
  /* @__PURE__ */ jsx8(
@@ -41126,7 +41170,9 @@ var init_renderNode = __esm({
41126
41170
  const r = calResizeEvent(p.startMin, p.endMin, snapStep, snapStep);
41127
41171
  reportChange(p.ev, key2, r.startMinute, r.endMinute);
41128
41172
  },
41129
- style: { position: "absolute", width: 1, height: 1, padding: 0, margin: -1, overflow: "hidden", clip: "rect(0 0 0 0)", whiteSpace: "nowrap", border: 0 }
41173
+ ...{ [REVEAL_ON_FOCUS_ATTR]: "" },
41174
+ style: revealOnFocusStyle(C),
41175
+ children: /* @__PURE__ */ jsx8("span", { "aria-hidden": "true", children: resizeLabel || "Change time\u2026" })
41130
41176
  }
41131
41177
  ),
41132
41178
  /* @__PURE__ */ jsx8(
@@ -62641,21 +62687,21 @@ var init_preview_assets_generated = __esm({
62641
62687
  "../../packages/serve/src/preview-assets.generated.ts"() {
62642
62688
  init_preview_assets_format();
62643
62689
  PREVIEW_ASSET_MANIFEST = [
62644
- { key: "assets/index-C7Hu2ZVY.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 1184477, sha256: "467121778a7bc69ac19ec6c77f6f2ca7ea80d7fc2915e8981ba0219b5c2fe61d" },
62645
- { key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 1184485, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
62646
- { key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 1189095, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
62647
- { key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 1677679, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
62648
- { key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 1768603, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
62649
- { key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 1859587, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
62650
- { key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 1950567, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
62651
- { key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 2041439, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
62652
- { key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 2132419, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
62653
- { key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 2241055, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
62654
- { key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 2350139, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
62655
- { key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 2459187, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
62656
- { key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 2566887, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
62657
- { key: "index.html", contentType: "text/html; charset=utf-8", offset: 2654995, length: 4947, sha256: "b6f3f19b28b680a734bcf73bfb6e3690e478affe9f3c10a3c5c5d8f3e674c9b0" },
62658
- { key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 2659942, length: 17344, sha256: "d057298d75e7373e5e2c4d11b7d1bcbea88e03af555ba63d97641c78509c58e4" }
62690
+ { key: "assets/index-C7Pn97oj.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 1185822, sha256: "4627e2da1c482ae73294a2fc4500dcaa5074cd38e53a28e60af2093c6951a221" },
62691
+ { key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 1185830, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
62692
+ { key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 1190440, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
62693
+ { key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 1679024, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
62694
+ { key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 1769948, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
62695
+ { key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 1860932, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
62696
+ { key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 1951912, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
62697
+ { key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 2042784, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
62698
+ { key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 2133764, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
62699
+ { key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 2242400, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
62700
+ { key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 2351484, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
62701
+ { key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 2460532, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
62702
+ { key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 2568232, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
62703
+ { key: "index.html", contentType: "text/html; charset=utf-8", offset: 2656340, length: 4947, sha256: "6ec471f6243aa4ca8b798a33521c421bb87f22ea06ac184690d1d3d9054b6187" },
62704
+ { key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 2661287, length: 17344, sha256: "d057298d75e7373e5e2c4d11b7d1bcbea88e03af555ba63d97641c78509c58e4" }
62659
62705
  ];
62660
62706
  }
62661
62707
  });
@@ -66864,10 +66910,17 @@ var init_push_send = __esm({
66864
66910
  }
66865
66911
  });
66866
66912
 
66913
+ // ../../core/ts/src/push-routes.ts
66914
+ var init_push_routes = __esm({
66915
+ "../../core/ts/src/push-routes.ts"() {
66916
+ }
66917
+ });
66918
+
66867
66919
  // ../../core/serve-control/src/push-send-service.ts
66868
66920
  var PUSH_SEND_ERROR_CODES, PushSendError;
66869
66921
  var init_push_send_service = __esm({
66870
66922
  "../../core/serve-control/src/push-send-service.ts"() {
66923
+ init_push_routes();
66871
66924
  PUSH_SEND_ERROR_CODES = [
66872
66925
  "unauthorized",
66873
66926
  "token_revoked",
@@ -67250,7 +67303,7 @@ var init_notify_ping = __esm({
67250
67303
  member_not_found: "Use the login email of an approved member of this site.",
67251
67304
  member_ambiguous: "More than one member has this login email; resolve it in the site's Members.",
67252
67305
  member_not_active: "The member must be approved before they can be notified.",
67253
- link_not_routable: "Link to a screen this app's published release ships, e.g. <scheme>://screen/<screenId>?id=\u2026.",
67306
+ link_not_routable: "Link to a screen this app's published release ships, e.g. <scheme>://screen/<screenId>?id=\u2026, or a Wix link one of its push.routes translates.",
67254
67307
  forbidden_site: "The Wix account from wix login must own this site.",
67255
67308
  site_token_invalid: "Run wix login as the site owner; the site token must belong to the app owner's account.",
67256
67309
  ping_permission_denied: "Himi Serve is not permitted to send through Ping; this is a platform issue, not your setup."
Binary file
@@ -246,11 +246,22 @@ Before anything is sent, the server checks:
246
246
  - that push setup is `ready` for this app on this site;
247
247
  - that the link opens a screen the app's live release ships, using the app's exact scheme and
248
248
  either a linkable `screen/<id>` or a deep-link pattern (a device on a different rollout ring
249
- may have a different set of screens);
249
+ may have a different set of screens). A **Wix link** (`wix:/…`, `https://www.wix.app/…`,
250
+ `https://manage.wix.app/…`, `https://m-<msid>.branded.wix.app/…`) passes when one of the app's
251
+ `push.routes` translates it to such a screen and it names no other site — the same translation
252
+ a tap runs on the device. A link a route conditioned on a Ping `templateId` or `topic` matches is
253
+ refused, because the device picks that route from payload fields the check cannot see. That is how to test a route with the link Wix itself would send;
250
254
  - that exactly one approved member has that login email.
251
255
 
252
256
  `--dry-run` runs every check and sends nothing. The link is forwarded exactly as given, query
253
- string included. A private screen is allowed; the app's login gate still applies when tapped.
257
+ string included — a Wix link reaches the device as the Wix link, and the app translates it on tap:
258
+
259
+ ```sh
260
+ himi notify send --provider ping --target wix --content ./liftgear \
261
+ --member-email member@example.com --title 'Your order shipped' \
262
+ --link 'wix:/my-account/<siteId>/stores/orders/<orderId>' --dry-run
263
+ ```
264
+ A private screen is allowed; the app's login gate still applies when tapped.
254
265
 
255
266
  To notify **every approved member** of the site, use `--all-members` in place of
256
267
  `--member-email`:
@@ -300,7 +311,7 @@ link, is a new notification.
300
311
  | --- | --- |
301
312
  | `push_not_ready` | Run `himi notify setup` for this app and site first. |
302
313
  | `member_not_found` / `member_ambiguous` / `member_not_active` | Use the login email of one approved site member. |
303
- | `link_not_routable` | The link's scheme or screen is not in the published release. |
314
+ | `link_not_routable` | The link's scheme or screen is not in the published release, or a Wix link matches none of the app's `push.routes` (or names another site). |
304
315
  | `forbidden_site` / `site_token_invalid` | Both Wix logins must belong to the site owner. |
305
316
  | `rate_limited` | Wait `retry-after` seconds; test sends are limited per owner. |
306
317
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.1214.0",
3
+ "version": "0.1216.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": "4665b1c60527def192c75337a09421d697bbdd3949d74c93be76a087"
70
+ "falconPackageHash": "b59f6f13e876d3566fc27ba839e7d391bb70c2b677bd77062010d173"
71
71
  }