@getrheo/rheo-skill 2.2.0 → 2.4.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.
@@ -4198,7 +4198,10 @@ var ThemedColorModesSchema = external_exports.object({
4198
4198
  var ThemedColorSchema = external_exports.union([external_exports.string().min(1), ThemedColorModesSchema]);
4199
4199
  var LAYOUT_FRACTION_PRESETS = ["1/2", "1/3", "2/3", "1/4", "3/4"];
4200
4200
  var WIDTH_PRESETS = ["auto", "full", ...LAYOUT_FRACTION_PRESETS];
4201
- var WidthValueSchema = external_exports.union([external_exports.enum(WIDTH_PRESETS), external_exports.number().int().min(0).max(2e3)]);
4201
+ var WidthValueSchema = external_exports.preprocess(
4202
+ (value) => value === "fill" ? "full" : value,
4203
+ external_exports.union([external_exports.enum(WIDTH_PRESETS), external_exports.number().int().min(0).max(2e3)])
4204
+ );
4202
4205
  var HEIGHT_PRESETS = ["auto", "full", "fill", ...LAYOUT_FRACTION_PRESETS];
4203
4206
  var CommonLayoutHeightSchema = external_exports.union([
4204
4207
  external_exports.enum(HEIGHT_PRESETS),
@@ -4231,6 +4234,8 @@ var CommonStyleSchema = external_exports.object({
4231
4234
  border: BorderSchema.optional(),
4232
4235
  shadow: DropShadowSchema.optional(),
4233
4236
  opacity: external_exports.number().min(0).max(1).optional(),
4237
+ /** Multiplier (0–1) applied to the resolved background color alpha only; children stay fully opaque unless `opacity` is set. */
4238
+ backgroundOpacity: external_exports.number().min(0).max(1).optional(),
4234
4239
  width: WidthValueSchema.optional(),
4235
4240
  /** Omit for normal flow; `'absolute'` removes the layer from flex flow (non-root only). */
4236
4241
  position: external_exports.literal("absolute").optional(),
@@ -4241,6 +4246,11 @@ var CommonStyleSchema = external_exports.object({
4241
4246
  rotate: external_exports.number().min(-360).max(360).optional(),
4242
4247
  /** Cross-axis size: `auto` (hug), `full`/`fill` (parent height), fractions, or fixed px. */
4243
4248
  height: CommonLayoutHeightSchema.optional(),
4249
+ /** Optional size clamps (px); applied on the flex shell / wrapper like width/height. */
4250
+ minWidth: NonNegativePxSchema.max(2e3).optional(),
4251
+ maxWidth: NonNegativePxSchema.max(2e3).optional(),
4252
+ minHeight: NonNegativePxSchema.max(2e3).optional(),
4253
+ maxHeight: NonNegativePxSchema.max(2e3).optional(),
4244
4254
  /** Stroke thickness in px for layers that render a stroke primitive (e.g. loader ring). */
4245
4255
  strokeWidth: external_exports.number().int().min(0).max(64).optional()
4246
4256
  }).partial();
@@ -4254,9 +4264,10 @@ var TextStyleSchema = CommonStyleSchema.extend({
4254
4264
  fontWeight: external_exports.number().int().min(100).max(900).optional(),
4255
4265
  color: ThemedColorSchema.optional(),
4256
4266
  align: external_exports.enum(["left", "center", "right"]).optional(),
4267
+ /** Unitless line-height multiplier (CSS `line-height` without units). */
4257
4268
  lineHeight: external_exports.number().min(0.8).max(3).optional(),
4258
- /** Multiplier (0–1) applied to the resolved background color alpha only; text stays fully opaque unless `opacity` is set. */
4259
- backgroundOpacity: external_exports.number().min(0).max(1).optional()
4269
+ /** Extra spacing between characters as a multiple of `fontSize` (CSS `em`; negative values tighten). */
4270
+ letterSpacing: external_exports.number().min(-0.5).max(1).optional()
4260
4271
  });
4261
4272
  var ImageStyleSchema = CommonStyleSchema.extend({
4262
4273
  fit: external_exports.enum(["cover", "contain", "fill"]).optional(),
@@ -4331,6 +4342,41 @@ var ButtonLayoutBreakpointsSchema = external_exports.object({
4331
4342
  xl: ButtonLayoutBreakpointPatchSchema.optional(),
4332
4343
  "2xl": ButtonLayoutBreakpointPatchSchema.optional()
4333
4344
  }).partial().optional();
4345
+ var AuthLayoutBreakpointPatchSchema = external_exports.object({
4346
+ gap: NonNegativePxSchema.optional(),
4347
+ align: external_exports.enum(["start", "center", "end", "stretch"]).optional()
4348
+ }).partial();
4349
+ var AuthLayoutBreakpointsSchema = external_exports.object({
4350
+ sm: AuthLayoutBreakpointPatchSchema.optional(),
4351
+ md: AuthLayoutBreakpointPatchSchema.optional(),
4352
+ lg: AuthLayoutBreakpointPatchSchema.optional(),
4353
+ xl: AuthLayoutBreakpointPatchSchema.optional(),
4354
+ "2xl": AuthLayoutBreakpointPatchSchema.optional()
4355
+ }).partial().optional();
4356
+ var ChoiceLayoutBreakpointPatchSchema = external_exports.object({
4357
+ direction: external_exports.enum(["vertical", "horizontal"]).optional(),
4358
+ gap: NonNegativePxSchema.optional(),
4359
+ columns: external_exports.number().int().min(1).max(6).optional()
4360
+ }).partial();
4361
+ var ChoiceLayoutBreakpointsSchema = external_exports.object({
4362
+ sm: ChoiceLayoutBreakpointPatchSchema.optional(),
4363
+ md: ChoiceLayoutBreakpointPatchSchema.optional(),
4364
+ lg: ChoiceLayoutBreakpointPatchSchema.optional(),
4365
+ xl: ChoiceLayoutBreakpointPatchSchema.optional(),
4366
+ "2xl": ChoiceLayoutBreakpointPatchSchema.optional()
4367
+ }).partial().optional();
4368
+ var CarouselLayoutBreakpointPatchSchema = external_exports.object({
4369
+ pageAlignment: external_exports.enum(["top", "center", "bottom"]).optional(),
4370
+ pageSpacing: NonNegativePxSchema.optional(),
4371
+ pagePeek: NonNegativePxSchema.optional()
4372
+ }).partial();
4373
+ var CarouselLayoutBreakpointsSchema = external_exports.object({
4374
+ sm: CarouselLayoutBreakpointPatchSchema.optional(),
4375
+ md: CarouselLayoutBreakpointPatchSchema.optional(),
4376
+ lg: CarouselLayoutBreakpointPatchSchema.optional(),
4377
+ xl: CarouselLayoutBreakpointPatchSchema.optional(),
4378
+ "2xl": CarouselLayoutBreakpointPatchSchema.optional()
4379
+ }).partial().optional();
4334
4380
  var DecisionNodeJumpIdSchema = external_exports.string().min(1).max(64).regex(/^dec_[a-z0-9_]+$/i);
4335
4381
  var ExternalSurfaceJumpIdSchema = external_exports.string().min(1).max(64).regex(/^surf_[a-z0-9_]+$/i);
4336
4382
  var FlowGraphNodeJumpTargetSchema = ScreenIdSchema.or(DecisionNodeJumpIdSchema).or(
@@ -4375,6 +4421,8 @@ var OsPermissionOutcomesSchema = external_exports.object({
4375
4421
  }).strict();
4376
4422
  var APP_REVIEW_OUTCOMES = ["not_shown", "dismissed"];
4377
4423
  var AppReviewOutcomeSchema = external_exports.enum(APP_REVIEW_OUTCOMES);
4424
+ var CAROUSEL_ADVANCE_ON_LAST = ["noop", "complete"];
4425
+ var CarouselAdvanceOnLastSchema = external_exports.enum(CAROUSEL_ADVANCE_ON_LAST);
4378
4426
  var ButtonActionSchema = external_exports.discriminatedUnion("kind", [
4379
4427
  external_exports.object({ kind: external_exports.literal("none") }),
4380
4428
  external_exports.object({ kind: external_exports.literal("continue") }),
@@ -4394,9 +4442,14 @@ var ButtonActionSchema = external_exports.discriminatedUnion("kind", [
4394
4442
  kind: external_exports.literal("play_media"),
4395
4443
  targetLayerIds: external_exports.array(external_exports.string().min(1)).min(1)
4396
4444
  }),
4397
- external_exports.object({ kind: external_exports.literal("request_app_review") })
4445
+ external_exports.object({ kind: external_exports.literal("request_app_review") }),
4446
+ external_exports.object({
4447
+ kind: external_exports.literal("advance_carousel"),
4448
+ targetLayerId: external_exports.string().min(1),
4449
+ onLast: CarouselAdvanceOnLastSchema.optional()
4450
+ })
4398
4451
  ]);
4399
- var TEXT_INPUT_TYPES = ["plain", "email", "phone", "url", "multiline"];
4452
+ var TEXT_INPUT_TYPES = ["plain", "email", "phone", "url", "number", "multiline"];
4400
4453
  var TextInputTypeSchema = external_exports.enum(TEXT_INPUT_TYPES);
4401
4454
  var COUNTER_DISPLAY_KINDS = ["number", "time"];
4402
4455
  var COUNTER_TIME_FORMATS = ["mm_ss", "hh_mm_ss", "dd_hh_mm_ss"];
@@ -4461,7 +4514,8 @@ var ProgressLayerSchema = external_exports.object({
4461
4514
  kind: external_exports.literal("progress"),
4462
4515
  trackColor: ThemedColorSchema.optional(),
4463
4516
  fillColor: ThemedColorSchema.optional(),
4464
- style: CommonStyleSchema.optional()
4517
+ style: CommonStyleSchema.optional(),
4518
+ styleBreakpoints: CommonStyleBreakpointsSchema
4465
4519
  });
4466
4520
  var LoaderOnCompleteSchema = external_exports.discriminatedUnion("mode", [
4467
4521
  external_exports.object({ mode: external_exports.literal("none") }),
@@ -4481,7 +4535,8 @@ var LoaderLayerSchema = external_exports.object({
4481
4535
  fillColor: ThemedColorSchema.optional(),
4482
4536
  /** Horizontal alignment of the bar or ring within the layer box (default start). */
4483
4537
  align: external_exports.enum(["start", "center", "end"]).optional(),
4484
- style: CommonStyleSchema.optional()
4538
+ style: CommonStyleSchema.optional(),
4539
+ styleBreakpoints: CommonStyleBreakpointsSchema
4485
4540
  }).superRefine((data, ctx) => {
4486
4541
  if (data.variant !== "circular") return;
4487
4542
  const w = data.style?.width;
@@ -4518,27 +4573,39 @@ var CheckboxLayerSchema = external_exports.object({
4518
4573
  styleBreakpoints: CommonStyleBreakpointsSchema
4519
4574
  });
4520
4575
  var lazyLayer2 = () => layerSchemaStore.schema;
4521
- var StackLayerSchema = external_exports.object({
4522
- ...baseLayerShape,
4523
- kind: external_exports.literal("stack"),
4524
- style: CommonStyleSchema.optional(),
4525
- styleBreakpoints: CommonStyleBreakpointsSchema,
4526
- stackLayoutBreakpoints: StackLayoutBreakpointsSchema,
4527
- selectedStyle: CommonStyleSchema.optional(),
4528
- direction: external_exports.enum(["vertical", "horizontal"]),
4529
- gap: external_exports.number().int().min(0).optional(),
4530
- align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
4531
- justify: external_exports.enum(["start", "center", "end"]).optional(),
4532
- distribution: external_exports.enum(["start", "center", "end", "between", "around"]).optional(),
4533
- wrap: external_exports.boolean().optional(),
4534
- children: external_exports.lazy(() => external_exports.array(lazyLayer2()))
4535
- });
4576
+ var migrateStackJustifyForParse = (raw) => {
4577
+ if (!raw || typeof raw !== "object") return raw;
4578
+ const o = { ...raw };
4579
+ if (o.justify != null && o.distribution == null) o.distribution = o.justify;
4580
+ delete o.justify;
4581
+ return o;
4582
+ };
4583
+ var StackLayerSchema = external_exports.preprocess(
4584
+ migrateStackJustifyForParse,
4585
+ external_exports.object({
4586
+ ...baseLayerShape,
4587
+ kind: external_exports.literal("stack"),
4588
+ style: CommonStyleSchema.optional(),
4589
+ styleBreakpoints: CommonStyleBreakpointsSchema,
4590
+ stackLayoutBreakpoints: StackLayoutBreakpointsSchema,
4591
+ selectedStyle: CommonStyleSchema.optional(),
4592
+ selectedStyleBreakpoints: CommonStyleBreakpointsSchema,
4593
+ direction: external_exports.enum(["vertical", "horizontal"]),
4594
+ gap: external_exports.number().int().min(0).optional(),
4595
+ align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
4596
+ distribution: external_exports.enum(["start", "center", "end", "between", "around"]).optional(),
4597
+ wrap: external_exports.boolean().optional(),
4598
+ children: external_exports.lazy(() => external_exports.array(lazyLayer2()))
4599
+ })
4600
+ );
4536
4601
  var TextLayerSchema = external_exports.object({
4537
4602
  ...baseLayerShape,
4538
4603
  kind: external_exports.literal("text"),
4539
4604
  text: LocalizedTextSchema,
4540
4605
  style: TextStyleSchema.optional(),
4541
- styleBreakpoints: TextStyleBreakpointsSchema
4606
+ styleBreakpoints: TextStyleBreakpointsSchema,
4607
+ /** Merged on top of resolved `style` when this layer is inside a selected choice option. */
4608
+ selectedStyle: TextStyleSchema.optional()
4542
4609
  });
4543
4610
  var migrateLegacyHyperlinkForParse = (raw) => {
4544
4611
  if (!raw || typeof raw !== "object") return raw;
@@ -4577,7 +4644,8 @@ var HyperlinkLayerSchemaInner = external_exports.object({
4577
4644
  distribution: external_exports.enum(["start", "center", "end", "between", "around"]).optional(),
4578
4645
  wrap: external_exports.boolean().optional(),
4579
4646
  style: CommonStyleSchema.optional(),
4580
- styleBreakpoints: CommonStyleBreakpointsSchema
4647
+ styleBreakpoints: CommonStyleBreakpointsSchema,
4648
+ hyperlinkLayoutBreakpoints: StackLayoutBreakpointsSchema
4581
4649
  }).superRefine((data, ctx) => {
4582
4650
  const p = parseHyperlinkHref(data.href.trim());
4583
4651
  if (!p.ok) {
@@ -4598,7 +4666,8 @@ var ImageLayerSchema = external_exports.object({
4598
4666
  media: MediaReferenceSchema.optional(),
4599
4667
  alt: external_exports.string().max(280).optional(),
4600
4668
  style: ImageStyleSchema.optional(),
4601
- styleBreakpoints: ImageStyleBreakpointsSchema
4669
+ styleBreakpoints: ImageStyleBreakpointsSchema,
4670
+ selectedStyle: ImageStyleSchema.optional()
4602
4671
  });
4603
4672
  var LottieLayerSchema = external_exports.object({
4604
4673
  ...baseLayerShape,
@@ -4609,7 +4678,8 @@ var LottieLayerSchema = external_exports.object({
4609
4678
  triggerLayerId: external_exports.string().min(1).optional(),
4610
4679
  onComplete: LoaderOnCompleteSchema.optional(),
4611
4680
  style: ImageStyleSchema.optional(),
4612
- styleBreakpoints: ImageStyleBreakpointsSchema
4681
+ styleBreakpoints: ImageStyleBreakpointsSchema,
4682
+ selectedStyle: ImageStyleSchema.optional()
4613
4683
  });
4614
4684
  var VideoLayerSchema = external_exports.object({
4615
4685
  ...baseLayerShape,
@@ -4621,7 +4691,8 @@ var VideoLayerSchema = external_exports.object({
4621
4691
  onComplete: LoaderOnCompleteSchema.optional(),
4622
4692
  audioEnabled: external_exports.boolean().optional(),
4623
4693
  style: ImageStyleSchema.optional(),
4624
- styleBreakpoints: ImageStyleBreakpointsSchema
4694
+ styleBreakpoints: ImageStyleBreakpointsSchema,
4695
+ selectedStyle: ImageStyleSchema.optional()
4625
4696
  });
4626
4697
  var IconLayerSchema = external_exports.object({
4627
4698
  ...baseLayerShape,
@@ -4629,7 +4700,8 @@ var IconLayerSchema = external_exports.object({
4629
4700
  family: external_exports.enum(ICON_FAMILIES),
4630
4701
  iconName: external_exports.string().min(1).max(128),
4631
4702
  style: IconStyleSchema.optional(),
4632
- styleBreakpoints: IconStyleBreakpointsSchema
4703
+ styleBreakpoints: IconStyleBreakpointsSchema,
4704
+ selectedStyle: IconStyleSchema.optional()
4633
4705
  });
4634
4706
  var lazyLayer3 = () => layerSchemaStore.schema;
4635
4707
  var OAuthProviderPresetLayerSchema = external_exports.object({
@@ -4783,6 +4855,7 @@ var OAuthLoginLayerSchemaValidated = external_exports.object({
4783
4855
  ),
4784
4856
  gap: external_exports.number().int().min(0).optional(),
4785
4857
  align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
4858
+ authLayoutBreakpoints: AuthLayoutBreakpointsSchema,
4786
4859
  style: CommonStyleSchema.optional(),
4787
4860
  styleBreakpoints: CommonStyleBreakpointsSchema
4788
4861
  });
@@ -4934,6 +5007,7 @@ var EmailPasswordAuthLayerSchemaValidated = external_exports.object({
4934
5007
  ),
4935
5008
  gap: external_exports.number().int().min(0).optional(),
4936
5009
  align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
5010
+ authLayoutBreakpoints: AuthLayoutBreakpointsSchema,
4937
5011
  style: CommonStyleSchema.optional(),
4938
5012
  styleBreakpoints: CommonStyleBreakpointsSchema
4939
5013
  }).superRefine(refineEmailPasswordAuthChildren);
@@ -4967,7 +5041,8 @@ var SingleChoiceLayerSchema = external_exports.object({
4967
5041
  gap: external_exports.number().int().min(0).optional(),
4968
5042
  columns: external_exports.number().int().min(1).max(12).optional(),
4969
5043
  style: CommonStyleSchema.optional(),
4970
- styleBreakpoints: CommonStyleBreakpointsSchema
5044
+ styleBreakpoints: CommonStyleBreakpointsSchema,
5045
+ choiceLayoutBreakpoints: ChoiceLayoutBreakpointsSchema
4971
5046
  });
4972
5047
  var MultipleChoiceLayerSchema = external_exports.object({
4973
5048
  ...baseLayerShape,
@@ -4984,8 +5059,19 @@ var MultipleChoiceLayerSchema = external_exports.object({
4984
5059
  gap: external_exports.number().int().min(0).optional(),
4985
5060
  columns: external_exports.number().int().min(1).max(12).optional(),
4986
5061
  style: CommonStyleSchema.optional(),
4987
- styleBreakpoints: CommonStyleBreakpointsSchema
5062
+ styleBreakpoints: CommonStyleBreakpointsSchema,
5063
+ choiceLayoutBreakpoints: ChoiceLayoutBreakpointsSchema
4988
5064
  });
5065
+ var TextInputFieldStyleSchema = external_exports.object({
5066
+ fontFamily: external_exports.string().min(1).max(128).optional(),
5067
+ fontSize: external_exports.number().int().min(8).max(96).optional(),
5068
+ fontWeight: external_exports.number().int().min(100).max(900).optional(),
5069
+ color: ThemedColorSchema.optional(),
5070
+ align: external_exports.enum(["left", "center", "right"]).optional(),
5071
+ lineHeight: external_exports.number().min(0.8).max(3).optional(),
5072
+ letterSpacing: external_exports.number().min(-0.5).max(1).optional(),
5073
+ opacity: external_exports.number().min(0).max(1).optional()
5074
+ }).partial();
4989
5075
  var TextInputLayerSchema = external_exports.object({
4990
5076
  ...baseLayerShape,
4991
5077
  kind: external_exports.literal("text_input"),
@@ -4997,7 +5083,10 @@ var TextInputLayerSchema = external_exports.object({
4997
5083
  maxLength: external_exports.number().int().positive().max(2e3).optional(),
4998
5084
  classification: FieldClassificationSchema,
4999
5085
  children: external_exports.lazy(() => external_exports.array(lazyLayer5())).optional(),
5000
- style: CommonStyleSchema.optional()
5086
+ /** Typography for the native input's typed text. */
5087
+ fieldStyle: TextInputFieldStyleSchema.optional(),
5088
+ style: CommonStyleSchema.optional(),
5089
+ styleBreakpoints: CommonStyleBreakpointsSchema
5001
5090
  });
5002
5091
  var ScaleInputLabelStyleSchema = external_exports.object({
5003
5092
  fontFamily: external_exports.string().min(1).max(128).optional(),
@@ -5006,6 +5095,7 @@ var ScaleInputLabelStyleSchema = external_exports.object({
5006
5095
  color: ThemedColorSchema.optional(),
5007
5096
  align: external_exports.enum(["left", "center", "right"]).optional(),
5008
5097
  lineHeight: external_exports.number().min(0.8).max(3).optional(),
5098
+ letterSpacing: external_exports.number().min(-0.5).max(1).optional(),
5009
5099
  opacity: external_exports.number().min(0).max(1).optional()
5010
5100
  }).partial();
5011
5101
  var ScaleInputLayerSchema = external_exports.object({
@@ -5028,7 +5118,40 @@ var ScaleInputLayerSchema = external_exports.object({
5028
5118
  thumbSize: external_exports.number().int().min(8).max(48).optional(),
5029
5119
  thumbColor: ThemedColorSchema.optional(),
5030
5120
  children: external_exports.lazy(() => external_exports.array(lazyLayer5())).optional(),
5031
- style: CommonStyleSchema.optional()
5121
+ style: CommonStyleSchema.optional(),
5122
+ styleBreakpoints: CommonStyleBreakpointsSchema
5123
+ });
5124
+ var WheelPickerOptionSchema = external_exports.object({
5125
+ optionId: external_exports.string().min(1).max(64),
5126
+ label: LocalizedTextSchema
5127
+ });
5128
+ var WheelPickerItemStyleSchema = external_exports.object({
5129
+ fontFamily: external_exports.string().min(1).max(128).optional(),
5130
+ fontSize: external_exports.number().int().min(8).max(96).optional(),
5131
+ fontWeight: external_exports.number().int().min(100).max(900).optional(),
5132
+ color: ThemedColorSchema.optional(),
5133
+ opacity: external_exports.number().min(0).max(1).optional()
5134
+ }).partial();
5135
+ var WheelPickerLayerSchema = external_exports.object({
5136
+ ...baseLayerShape,
5137
+ kind: external_exports.literal("wheel_picker"),
5138
+ fieldKey: FieldKeySchema,
5139
+ mode: external_exports.enum(["options", "date"]).optional(),
5140
+ options: external_exports.array(WheelPickerOptionSchema).min(2).optional(),
5141
+ defaultOptionId: external_exports.string().optional(),
5142
+ datePart: external_exports.enum(["year", "month", "day"]).optional(),
5143
+ minYear: external_exports.number().int().min(1e3).max(9999).optional(),
5144
+ maxYear: external_exports.number().int().min(1e3).max(9999).optional(),
5145
+ defaultValue: external_exports.string().optional(),
5146
+ placeholder: LocalizedTextSchema.optional(),
5147
+ itemHeight: external_exports.number().int().min(28).max(72).optional(),
5148
+ visibleItemCount: external_exports.number().int().min(3).max(9).optional(),
5149
+ selectionBackgroundColor: ThemedColorSchema.optional(),
5150
+ itemStyle: WheelPickerItemStyleSchema.optional(),
5151
+ selectedItemStyle: WheelPickerItemStyleSchema.optional(),
5152
+ children: external_exports.lazy(() => external_exports.array(lazyLayer5())).optional(),
5153
+ style: CommonStyleSchema.optional(),
5154
+ styleBreakpoints: CommonStyleBreakpointsSchema
5032
5155
  });
5033
5156
  var CarouselIndicatorsStyleSchema = external_exports.object({
5034
5157
  width: external_exports.number().int().min(1).max(64).optional(),
@@ -5064,7 +5187,85 @@ var CarouselLayerSchema = external_exports.object({
5064
5187
  autoAdvanceMs: external_exports.number().int().min(500).max(6e4).optional(),
5065
5188
  pageControl: CarouselPageControlSchema.optional(),
5066
5189
  style: CommonStyleSchema.optional(),
5067
- styleBreakpoints: CommonStyleBreakpointsSchema
5190
+ styleBreakpoints: CommonStyleBreakpointsSchema,
5191
+ carouselLayoutBreakpoints: CarouselLayoutBreakpointsSchema
5192
+ });
5193
+ var DecisionBuiltinNameSchema = external_exports.enum(["locale", "platform"]);
5194
+ var DecisionVariableRefSchema = external_exports.discriminatedUnion("kind", [
5195
+ external_exports.object({ kind: external_exports.literal("builtin"), name: DecisionBuiltinNameSchema }),
5196
+ external_exports.object({ kind: external_exports.literal("sdk"), key: external_exports.string().min(1).max(128) }),
5197
+ external_exports.object({ kind: external_exports.literal("field"), fieldKey: external_exports.string().min(1).max(128) })
5198
+ ]);
5199
+ var DecisionStringPredicateSchema = external_exports.discriminatedUnion("op", [
5200
+ external_exports.object({ op: external_exports.literal("eq"), value: external_exports.string() }),
5201
+ external_exports.object({ op: external_exports.literal("neq"), value: external_exports.string() }),
5202
+ external_exports.object({ op: external_exports.literal("contains"), value: external_exports.string() })
5203
+ ]);
5204
+ var DecisionNumberPredicateSchema = external_exports.discriminatedUnion("op", [
5205
+ external_exports.object({ op: external_exports.literal("eq"), value: external_exports.number() }),
5206
+ external_exports.object({ op: external_exports.literal("neq"), value: external_exports.number() }),
5207
+ external_exports.object({ op: external_exports.literal("lt"), value: external_exports.number() }),
5208
+ external_exports.object({ op: external_exports.literal("lte"), value: external_exports.number() }),
5209
+ external_exports.object({ op: external_exports.literal("gt"), value: external_exports.number() }),
5210
+ external_exports.object({ op: external_exports.literal("gte"), value: external_exports.number() })
5211
+ ]);
5212
+ var DecisionChoicePredicateSchema = external_exports.discriminatedUnion("op", [
5213
+ external_exports.object({ op: external_exports.literal("eq"), optionId: external_exports.string().min(1) }),
5214
+ external_exports.object({ op: external_exports.literal("one_of"), optionIds: external_exports.array(external_exports.string().min(1)).min(1) })
5215
+ ]);
5216
+ var DecisionMultiPredicateSchema = external_exports.discriminatedUnion("op", [
5217
+ external_exports.object({
5218
+ op: external_exports.literal("intersects"),
5219
+ optionIds: external_exports.array(external_exports.string().min(1)).min(1)
5220
+ }),
5221
+ external_exports.object({
5222
+ op: external_exports.literal("contains_all"),
5223
+ optionIds: external_exports.array(external_exports.string().min(1)).min(1)
5224
+ }),
5225
+ external_exports.object({
5226
+ op: external_exports.literal("subset_of"),
5227
+ optionIds: external_exports.array(external_exports.string().min(1)).min(1)
5228
+ })
5229
+ ]);
5230
+ var DecisionBooleanPredicateSchema = external_exports.discriminatedUnion("op", [
5231
+ external_exports.object({ op: external_exports.literal("eq"), value: external_exports.boolean() }),
5232
+ external_exports.object({ op: external_exports.literal("neq"), value: external_exports.boolean() })
5233
+ ]);
5234
+ var DecisionPredicatePayloadSchema = external_exports.discriminatedUnion("type", [
5235
+ external_exports.object({ type: external_exports.literal("string"), pred: DecisionStringPredicateSchema }),
5236
+ external_exports.object({ type: external_exports.literal("number"), pred: DecisionNumberPredicateSchema }),
5237
+ external_exports.object({ type: external_exports.literal("boolean"), pred: DecisionBooleanPredicateSchema }),
5238
+ external_exports.object({ type: external_exports.literal("choice"), pred: DecisionChoicePredicateSchema }),
5239
+ external_exports.object({ type: external_exports.literal("multi"), pred: DecisionMultiPredicateSchema })
5240
+ ]);
5241
+ var DecisionExprSchema = external_exports.lazy(
5242
+ () => external_exports.discriminatedUnion("kind", [
5243
+ external_exports.object({ kind: external_exports.literal("empty") }),
5244
+ external_exports.object({
5245
+ kind: external_exports.literal("group"),
5246
+ op: external_exports.enum(["and", "or"]),
5247
+ children: external_exports.array(DecisionExprSchema).min(1)
5248
+ }),
5249
+ external_exports.object({
5250
+ kind: external_exports.literal("predicate"),
5251
+ variable: DecisionVariableRefSchema,
5252
+ predicate: DecisionPredicatePayloadSchema
5253
+ })
5254
+ ])
5255
+ );
5256
+ var CONDITIONAL_MAX_CASES = 16;
5257
+ var ConditionalCaseSchema = external_exports.object({
5258
+ id: external_exports.string().min(1).max(80),
5259
+ name: external_exports.string().min(1).max(80).optional(),
5260
+ expression: DecisionExprSchema,
5261
+ rootLayerId: LayerIdSchema
5262
+ });
5263
+ var ConditionalLayerSchema = external_exports.object({
5264
+ ...baseLayerShape,
5265
+ kind: external_exports.literal("conditional"),
5266
+ cases: external_exports.array(ConditionalCaseSchema).min(1).max(CONDITIONAL_MAX_CASES),
5267
+ elseRootLayerId: LayerIdSchema,
5268
+ children: external_exports.lazy(() => external_exports.array(StackLayerSchema).min(2))
5068
5269
  });
5069
5270
  layerSchemaStore.schema = external_exports.lazy(
5070
5271
  () => external_exports.union([
@@ -5085,17 +5286,19 @@ layerSchemaStore.schema = external_exports.lazy(
5085
5286
  MultipleChoiceLayerSchema,
5086
5287
  TextInputLayerSchema,
5087
5288
  ScaleInputLayerSchema,
5289
+ WheelPickerLayerSchema,
5088
5290
  OAuthLoginLayerSchema,
5089
5291
  OAuthProviderPresetLayerSchema,
5090
5292
  OAuthProviderCustomLayerSchema,
5091
5293
  EmailPasswordAuthLayerSchema,
5092
5294
  EmailPasswordFieldLayerSchema,
5093
5295
  EmailPasswordSubmitLayerSchema,
5094
- CarouselLayerSchema
5296
+ CarouselLayerSchema,
5297
+ ConditionalLayerSchema
5095
5298
  ])
5096
5299
  );
5097
5300
  var LayerSchema = layerSchemaStore.schema;
5098
- var isInputLayer = (l) => l.kind === "single_choice" || l.kind === "multiple_choice" || l.kind === "text_input" || l.kind === "scale_input";
5301
+ var isInputLayer = (l) => l.kind === "single_choice" || l.kind === "multiple_choice" || l.kind === "text_input" || l.kind === "scale_input" || l.kind === "wheel_picker";
5099
5302
 
5100
5303
  // ../../node_modules/@getrheo/contracts/dist/localized.js
5101
5304
  var LocaleCode2 = external_exports.string().regex(/^[a-z]{2}(-[A-Z]{2})?$/, 'locale must be like "en" or "en-US"');
@@ -5248,7 +5451,10 @@ var ThemedColorModesSchema2 = external_exports.object({
5248
5451
  var ThemedColorSchema2 = external_exports.union([external_exports.string().min(1), ThemedColorModesSchema2]);
5249
5452
  var LAYOUT_FRACTION_PRESETS2 = ["1/2", "1/3", "2/3", "1/4", "3/4"];
5250
5453
  var WIDTH_PRESETS2 = ["auto", "full", ...LAYOUT_FRACTION_PRESETS2];
5251
- var WidthValueSchema2 = external_exports.union([external_exports.enum(WIDTH_PRESETS2), external_exports.number().int().min(0).max(2e3)]);
5454
+ var WidthValueSchema2 = external_exports.preprocess(
5455
+ (value) => value === "fill" ? "full" : value,
5456
+ external_exports.union([external_exports.enum(WIDTH_PRESETS2), external_exports.number().int().min(0).max(2e3)])
5457
+ );
5252
5458
  var HEIGHT_PRESETS2 = ["auto", "full", "fill", ...LAYOUT_FRACTION_PRESETS2];
5253
5459
  var CommonLayoutHeightSchema2 = external_exports.union([
5254
5460
  external_exports.enum(HEIGHT_PRESETS2),
@@ -5281,6 +5487,8 @@ var CommonStyleSchema2 = external_exports.object({
5281
5487
  border: BorderSchema2.optional(),
5282
5488
  shadow: DropShadowSchema2.optional(),
5283
5489
  opacity: external_exports.number().min(0).max(1).optional(),
5490
+ /** Multiplier (0–1) applied to the resolved background color alpha only; children stay fully opaque unless `opacity` is set. */
5491
+ backgroundOpacity: external_exports.number().min(0).max(1).optional(),
5284
5492
  width: WidthValueSchema2.optional(),
5285
5493
  /** Omit for normal flow; `'absolute'` removes the layer from flex flow (non-root only). */
5286
5494
  position: external_exports.literal("absolute").optional(),
@@ -5291,6 +5499,11 @@ var CommonStyleSchema2 = external_exports.object({
5291
5499
  rotate: external_exports.number().min(-360).max(360).optional(),
5292
5500
  /** Cross-axis size: `auto` (hug), `full`/`fill` (parent height), fractions, or fixed px. */
5293
5501
  height: CommonLayoutHeightSchema2.optional(),
5502
+ /** Optional size clamps (px); applied on the flex shell / wrapper like width/height. */
5503
+ minWidth: NonNegativePxSchema2.max(2e3).optional(),
5504
+ maxWidth: NonNegativePxSchema2.max(2e3).optional(),
5505
+ minHeight: NonNegativePxSchema2.max(2e3).optional(),
5506
+ maxHeight: NonNegativePxSchema2.max(2e3).optional(),
5294
5507
  /** Stroke thickness in px for layers that render a stroke primitive (e.g. loader ring). */
5295
5508
  strokeWidth: external_exports.number().int().min(0).max(64).optional()
5296
5509
  }).partial();
@@ -5304,9 +5517,10 @@ var TextStyleSchema2 = CommonStyleSchema2.extend({
5304
5517
  fontWeight: external_exports.number().int().min(100).max(900).optional(),
5305
5518
  color: ThemedColorSchema2.optional(),
5306
5519
  align: external_exports.enum(["left", "center", "right"]).optional(),
5520
+ /** Unitless line-height multiplier (CSS `line-height` without units). */
5307
5521
  lineHeight: external_exports.number().min(0.8).max(3).optional(),
5308
- /** Multiplier (0–1) applied to the resolved background color alpha only; text stays fully opaque unless `opacity` is set. */
5309
- backgroundOpacity: external_exports.number().min(0).max(1).optional()
5522
+ /** Extra spacing between characters as a multiple of `fontSize` (CSS `em`; negative values tighten). */
5523
+ letterSpacing: external_exports.number().min(-0.5).max(1).optional()
5310
5524
  });
5311
5525
  var ImageStyleSchema2 = CommonStyleSchema2.extend({
5312
5526
  fit: external_exports.enum(["cover", "contain", "fill"]).optional(),
@@ -5381,6 +5595,41 @@ var ButtonLayoutBreakpointsSchema2 = external_exports.object({
5381
5595
  xl: ButtonLayoutBreakpointPatchSchema2.optional(),
5382
5596
  "2xl": ButtonLayoutBreakpointPatchSchema2.optional()
5383
5597
  }).partial().optional();
5598
+ var AuthLayoutBreakpointPatchSchema2 = external_exports.object({
5599
+ gap: NonNegativePxSchema2.optional(),
5600
+ align: external_exports.enum(["start", "center", "end", "stretch"]).optional()
5601
+ }).partial();
5602
+ var AuthLayoutBreakpointsSchema2 = external_exports.object({
5603
+ sm: AuthLayoutBreakpointPatchSchema2.optional(),
5604
+ md: AuthLayoutBreakpointPatchSchema2.optional(),
5605
+ lg: AuthLayoutBreakpointPatchSchema2.optional(),
5606
+ xl: AuthLayoutBreakpointPatchSchema2.optional(),
5607
+ "2xl": AuthLayoutBreakpointPatchSchema2.optional()
5608
+ }).partial().optional();
5609
+ var ChoiceLayoutBreakpointPatchSchema2 = external_exports.object({
5610
+ direction: external_exports.enum(["vertical", "horizontal"]).optional(),
5611
+ gap: NonNegativePxSchema2.optional(),
5612
+ columns: external_exports.number().int().min(1).max(6).optional()
5613
+ }).partial();
5614
+ var ChoiceLayoutBreakpointsSchema2 = external_exports.object({
5615
+ sm: ChoiceLayoutBreakpointPatchSchema2.optional(),
5616
+ md: ChoiceLayoutBreakpointPatchSchema2.optional(),
5617
+ lg: ChoiceLayoutBreakpointPatchSchema2.optional(),
5618
+ xl: ChoiceLayoutBreakpointPatchSchema2.optional(),
5619
+ "2xl": ChoiceLayoutBreakpointPatchSchema2.optional()
5620
+ }).partial().optional();
5621
+ var CarouselLayoutBreakpointPatchSchema2 = external_exports.object({
5622
+ pageAlignment: external_exports.enum(["top", "center", "bottom"]).optional(),
5623
+ pageSpacing: NonNegativePxSchema2.optional(),
5624
+ pagePeek: NonNegativePxSchema2.optional()
5625
+ }).partial();
5626
+ var CarouselLayoutBreakpointsSchema2 = external_exports.object({
5627
+ sm: CarouselLayoutBreakpointPatchSchema2.optional(),
5628
+ md: CarouselLayoutBreakpointPatchSchema2.optional(),
5629
+ lg: CarouselLayoutBreakpointPatchSchema2.optional(),
5630
+ xl: CarouselLayoutBreakpointPatchSchema2.optional(),
5631
+ "2xl": CarouselLayoutBreakpointPatchSchema2.optional()
5632
+ }).partial().optional();
5384
5633
  var DecisionNodeJumpIdSchema2 = external_exports.string().min(1).max(64).regex(/^dec_[a-z0-9_]+$/i);
5385
5634
  var ExternalSurfaceJumpIdSchema2 = external_exports.string().min(1).max(64).regex(/^surf_[a-z0-9_]+$/i);
5386
5635
  var FlowGraphNodeJumpTargetSchema2 = ScreenIdSchema2.or(DecisionNodeJumpIdSchema2).or(
@@ -5425,6 +5674,8 @@ var OsPermissionOutcomesSchema2 = external_exports.object({
5425
5674
  }).strict();
5426
5675
  var APP_REVIEW_OUTCOMES2 = ["not_shown", "dismissed"];
5427
5676
  external_exports.enum(APP_REVIEW_OUTCOMES2);
5677
+ var CAROUSEL_ADVANCE_ON_LAST2 = ["noop", "complete"];
5678
+ var CarouselAdvanceOnLastSchema2 = external_exports.enum(CAROUSEL_ADVANCE_ON_LAST2);
5428
5679
  var ButtonActionSchema2 = external_exports.discriminatedUnion("kind", [
5429
5680
  external_exports.object({ kind: external_exports.literal("none") }),
5430
5681
  external_exports.object({ kind: external_exports.literal("continue") }),
@@ -5444,9 +5695,14 @@ var ButtonActionSchema2 = external_exports.discriminatedUnion("kind", [
5444
5695
  kind: external_exports.literal("play_media"),
5445
5696
  targetLayerIds: external_exports.array(external_exports.string().min(1)).min(1)
5446
5697
  }),
5447
- external_exports.object({ kind: external_exports.literal("request_app_review") })
5698
+ external_exports.object({ kind: external_exports.literal("request_app_review") }),
5699
+ external_exports.object({
5700
+ kind: external_exports.literal("advance_carousel"),
5701
+ targetLayerId: external_exports.string().min(1),
5702
+ onLast: CarouselAdvanceOnLastSchema2.optional()
5703
+ })
5448
5704
  ]);
5449
- var TEXT_INPUT_TYPES2 = ["plain", "email", "phone", "url", "multiline"];
5705
+ var TEXT_INPUT_TYPES2 = ["plain", "email", "phone", "url", "number", "multiline"];
5450
5706
  var TextInputTypeSchema2 = external_exports.enum(TEXT_INPUT_TYPES2);
5451
5707
  var COUNTER_DISPLAY_KINDS2 = ["number", "time"];
5452
5708
  var COUNTER_TIME_FORMATS2 = ["mm_ss", "hh_mm_ss", "dd_hh_mm_ss"];
@@ -5511,7 +5767,8 @@ var ProgressLayerSchema2 = external_exports.object({
5511
5767
  kind: external_exports.literal("progress"),
5512
5768
  trackColor: ThemedColorSchema2.optional(),
5513
5769
  fillColor: ThemedColorSchema2.optional(),
5514
- style: CommonStyleSchema2.optional()
5770
+ style: CommonStyleSchema2.optional(),
5771
+ styleBreakpoints: CommonStyleBreakpointsSchema2
5515
5772
  });
5516
5773
  var LoaderOnCompleteSchema2 = external_exports.discriminatedUnion("mode", [
5517
5774
  external_exports.object({ mode: external_exports.literal("none") }),
@@ -5531,7 +5788,8 @@ var LoaderLayerSchema2 = external_exports.object({
5531
5788
  fillColor: ThemedColorSchema2.optional(),
5532
5789
  /** Horizontal alignment of the bar or ring within the layer box (default start). */
5533
5790
  align: external_exports.enum(["start", "center", "end"]).optional(),
5534
- style: CommonStyleSchema2.optional()
5791
+ style: CommonStyleSchema2.optional(),
5792
+ styleBreakpoints: CommonStyleBreakpointsSchema2
5535
5793
  }).superRefine((data, ctx) => {
5536
5794
  if (data.variant !== "circular") return;
5537
5795
  const w = data.style?.width;
@@ -5568,27 +5826,39 @@ var CheckboxLayerSchema2 = external_exports.object({
5568
5826
  styleBreakpoints: CommonStyleBreakpointsSchema2
5569
5827
  });
5570
5828
  var lazyLayer22 = () => layerSchemaStore2.schema;
5571
- var StackLayerSchema2 = external_exports.object({
5572
- ...baseLayerShape2,
5573
- kind: external_exports.literal("stack"),
5574
- style: CommonStyleSchema2.optional(),
5575
- styleBreakpoints: CommonStyleBreakpointsSchema2,
5576
- stackLayoutBreakpoints: StackLayoutBreakpointsSchema2,
5577
- selectedStyle: CommonStyleSchema2.optional(),
5578
- direction: external_exports.enum(["vertical", "horizontal"]),
5579
- gap: external_exports.number().int().min(0).optional(),
5580
- align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
5581
- justify: external_exports.enum(["start", "center", "end"]).optional(),
5582
- distribution: external_exports.enum(["start", "center", "end", "between", "around"]).optional(),
5583
- wrap: external_exports.boolean().optional(),
5584
- children: external_exports.lazy(() => external_exports.array(lazyLayer22()))
5585
- });
5829
+ var migrateStackJustifyForParse2 = (raw) => {
5830
+ if (!raw || typeof raw !== "object") return raw;
5831
+ const o = { ...raw };
5832
+ if (o.justify != null && o.distribution == null) o.distribution = o.justify;
5833
+ delete o.justify;
5834
+ return o;
5835
+ };
5836
+ var StackLayerSchema2 = external_exports.preprocess(
5837
+ migrateStackJustifyForParse2,
5838
+ external_exports.object({
5839
+ ...baseLayerShape2,
5840
+ kind: external_exports.literal("stack"),
5841
+ style: CommonStyleSchema2.optional(),
5842
+ styleBreakpoints: CommonStyleBreakpointsSchema2,
5843
+ stackLayoutBreakpoints: StackLayoutBreakpointsSchema2,
5844
+ selectedStyle: CommonStyleSchema2.optional(),
5845
+ selectedStyleBreakpoints: CommonStyleBreakpointsSchema2,
5846
+ direction: external_exports.enum(["vertical", "horizontal"]),
5847
+ gap: external_exports.number().int().min(0).optional(),
5848
+ align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
5849
+ distribution: external_exports.enum(["start", "center", "end", "between", "around"]).optional(),
5850
+ wrap: external_exports.boolean().optional(),
5851
+ children: external_exports.lazy(() => external_exports.array(lazyLayer22()))
5852
+ })
5853
+ );
5586
5854
  var TextLayerSchema2 = external_exports.object({
5587
5855
  ...baseLayerShape2,
5588
5856
  kind: external_exports.literal("text"),
5589
5857
  text: LocalizedTextSchema3,
5590
5858
  style: TextStyleSchema2.optional(),
5591
- styleBreakpoints: TextStyleBreakpointsSchema2
5859
+ styleBreakpoints: TextStyleBreakpointsSchema2,
5860
+ /** Merged on top of resolved `style` when this layer is inside a selected choice option. */
5861
+ selectedStyle: TextStyleSchema2.optional()
5592
5862
  });
5593
5863
  var migrateLegacyHyperlinkForParse2 = (raw) => {
5594
5864
  if (!raw || typeof raw !== "object") return raw;
@@ -5627,7 +5897,8 @@ var HyperlinkLayerSchemaInner2 = external_exports.object({
5627
5897
  distribution: external_exports.enum(["start", "center", "end", "between", "around"]).optional(),
5628
5898
  wrap: external_exports.boolean().optional(),
5629
5899
  style: CommonStyleSchema2.optional(),
5630
- styleBreakpoints: CommonStyleBreakpointsSchema2
5900
+ styleBreakpoints: CommonStyleBreakpointsSchema2,
5901
+ hyperlinkLayoutBreakpoints: StackLayoutBreakpointsSchema2
5631
5902
  }).superRefine((data, ctx) => {
5632
5903
  const p = parseHyperlinkHref2(data.href.trim());
5633
5904
  if (!p.ok) {
@@ -5648,7 +5919,8 @@ var ImageLayerSchema2 = external_exports.object({
5648
5919
  media: MediaReferenceSchema2.optional(),
5649
5920
  alt: external_exports.string().max(280).optional(),
5650
5921
  style: ImageStyleSchema2.optional(),
5651
- styleBreakpoints: ImageStyleBreakpointsSchema2
5922
+ styleBreakpoints: ImageStyleBreakpointsSchema2,
5923
+ selectedStyle: ImageStyleSchema2.optional()
5652
5924
  });
5653
5925
  var LottieLayerSchema2 = external_exports.object({
5654
5926
  ...baseLayerShape2,
@@ -5659,7 +5931,8 @@ var LottieLayerSchema2 = external_exports.object({
5659
5931
  triggerLayerId: external_exports.string().min(1).optional(),
5660
5932
  onComplete: LoaderOnCompleteSchema2.optional(),
5661
5933
  style: ImageStyleSchema2.optional(),
5662
- styleBreakpoints: ImageStyleBreakpointsSchema2
5934
+ styleBreakpoints: ImageStyleBreakpointsSchema2,
5935
+ selectedStyle: ImageStyleSchema2.optional()
5663
5936
  });
5664
5937
  var VideoLayerSchema2 = external_exports.object({
5665
5938
  ...baseLayerShape2,
@@ -5671,7 +5944,8 @@ var VideoLayerSchema2 = external_exports.object({
5671
5944
  onComplete: LoaderOnCompleteSchema2.optional(),
5672
5945
  audioEnabled: external_exports.boolean().optional(),
5673
5946
  style: ImageStyleSchema2.optional(),
5674
- styleBreakpoints: ImageStyleBreakpointsSchema2
5947
+ styleBreakpoints: ImageStyleBreakpointsSchema2,
5948
+ selectedStyle: ImageStyleSchema2.optional()
5675
5949
  });
5676
5950
  var IconLayerSchema2 = external_exports.object({
5677
5951
  ...baseLayerShape2,
@@ -5679,7 +5953,8 @@ var IconLayerSchema2 = external_exports.object({
5679
5953
  family: external_exports.enum(ICON_FAMILIES2),
5680
5954
  iconName: external_exports.string().min(1).max(128),
5681
5955
  style: IconStyleSchema2.optional(),
5682
- styleBreakpoints: IconStyleBreakpointsSchema2
5956
+ styleBreakpoints: IconStyleBreakpointsSchema2,
5957
+ selectedStyle: IconStyleSchema2.optional()
5683
5958
  });
5684
5959
  var lazyLayer32 = () => layerSchemaStore2.schema;
5685
5960
  var OAuthProviderPresetLayerSchema2 = external_exports.object({
@@ -5833,6 +6108,7 @@ var OAuthLoginLayerSchemaValidated2 = external_exports.object({
5833
6108
  ),
5834
6109
  gap: external_exports.number().int().min(0).optional(),
5835
6110
  align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
6111
+ authLayoutBreakpoints: AuthLayoutBreakpointsSchema2,
5836
6112
  style: CommonStyleSchema2.optional(),
5837
6113
  styleBreakpoints: CommonStyleBreakpointsSchema2
5838
6114
  });
@@ -5984,6 +6260,7 @@ var EmailPasswordAuthLayerSchemaValidated2 = external_exports.object({
5984
6260
  ),
5985
6261
  gap: external_exports.number().int().min(0).optional(),
5986
6262
  align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
6263
+ authLayoutBreakpoints: AuthLayoutBreakpointsSchema2,
5987
6264
  style: CommonStyleSchema2.optional(),
5988
6265
  styleBreakpoints: CommonStyleBreakpointsSchema2
5989
6266
  }).superRefine(refineEmailPasswordAuthChildren2);
@@ -6017,7 +6294,8 @@ var SingleChoiceLayerSchema2 = external_exports.object({
6017
6294
  gap: external_exports.number().int().min(0).optional(),
6018
6295
  columns: external_exports.number().int().min(1).max(12).optional(),
6019
6296
  style: CommonStyleSchema2.optional(),
6020
- styleBreakpoints: CommonStyleBreakpointsSchema2
6297
+ styleBreakpoints: CommonStyleBreakpointsSchema2,
6298
+ choiceLayoutBreakpoints: ChoiceLayoutBreakpointsSchema2
6021
6299
  });
6022
6300
  var MultipleChoiceLayerSchema2 = external_exports.object({
6023
6301
  ...baseLayerShape2,
@@ -6034,8 +6312,19 @@ var MultipleChoiceLayerSchema2 = external_exports.object({
6034
6312
  gap: external_exports.number().int().min(0).optional(),
6035
6313
  columns: external_exports.number().int().min(1).max(12).optional(),
6036
6314
  style: CommonStyleSchema2.optional(),
6037
- styleBreakpoints: CommonStyleBreakpointsSchema2
6315
+ styleBreakpoints: CommonStyleBreakpointsSchema2,
6316
+ choiceLayoutBreakpoints: ChoiceLayoutBreakpointsSchema2
6038
6317
  });
6318
+ var TextInputFieldStyleSchema2 = external_exports.object({
6319
+ fontFamily: external_exports.string().min(1).max(128).optional(),
6320
+ fontSize: external_exports.number().int().min(8).max(96).optional(),
6321
+ fontWeight: external_exports.number().int().min(100).max(900).optional(),
6322
+ color: ThemedColorSchema2.optional(),
6323
+ align: external_exports.enum(["left", "center", "right"]).optional(),
6324
+ lineHeight: external_exports.number().min(0.8).max(3).optional(),
6325
+ letterSpacing: external_exports.number().min(-0.5).max(1).optional(),
6326
+ opacity: external_exports.number().min(0).max(1).optional()
6327
+ }).partial();
6039
6328
  var TextInputLayerSchema2 = external_exports.object({
6040
6329
  ...baseLayerShape2,
6041
6330
  kind: external_exports.literal("text_input"),
@@ -6047,7 +6336,10 @@ var TextInputLayerSchema2 = external_exports.object({
6047
6336
  maxLength: external_exports.number().int().positive().max(2e3).optional(),
6048
6337
  classification: FieldClassificationSchema2,
6049
6338
  children: external_exports.lazy(() => external_exports.array(lazyLayer52())).optional(),
6050
- style: CommonStyleSchema2.optional()
6339
+ /** Typography for the native input's typed text. */
6340
+ fieldStyle: TextInputFieldStyleSchema2.optional(),
6341
+ style: CommonStyleSchema2.optional(),
6342
+ styleBreakpoints: CommonStyleBreakpointsSchema2
6051
6343
  });
6052
6344
  var ScaleInputLabelStyleSchema2 = external_exports.object({
6053
6345
  fontFamily: external_exports.string().min(1).max(128).optional(),
@@ -6056,6 +6348,7 @@ var ScaleInputLabelStyleSchema2 = external_exports.object({
6056
6348
  color: ThemedColorSchema2.optional(),
6057
6349
  align: external_exports.enum(["left", "center", "right"]).optional(),
6058
6350
  lineHeight: external_exports.number().min(0.8).max(3).optional(),
6351
+ letterSpacing: external_exports.number().min(-0.5).max(1).optional(),
6059
6352
  opacity: external_exports.number().min(0).max(1).optional()
6060
6353
  }).partial();
6061
6354
  var ScaleInputLayerSchema2 = external_exports.object({
@@ -6078,7 +6371,40 @@ var ScaleInputLayerSchema2 = external_exports.object({
6078
6371
  thumbSize: external_exports.number().int().min(8).max(48).optional(),
6079
6372
  thumbColor: ThemedColorSchema2.optional(),
6080
6373
  children: external_exports.lazy(() => external_exports.array(lazyLayer52())).optional(),
6081
- style: CommonStyleSchema2.optional()
6374
+ style: CommonStyleSchema2.optional(),
6375
+ styleBreakpoints: CommonStyleBreakpointsSchema2
6376
+ });
6377
+ var WheelPickerOptionSchema2 = external_exports.object({
6378
+ optionId: external_exports.string().min(1).max(64),
6379
+ label: LocalizedTextSchema3
6380
+ });
6381
+ var WheelPickerItemStyleSchema2 = external_exports.object({
6382
+ fontFamily: external_exports.string().min(1).max(128).optional(),
6383
+ fontSize: external_exports.number().int().min(8).max(96).optional(),
6384
+ fontWeight: external_exports.number().int().min(100).max(900).optional(),
6385
+ color: ThemedColorSchema2.optional(),
6386
+ opacity: external_exports.number().min(0).max(1).optional()
6387
+ }).partial();
6388
+ var WheelPickerLayerSchema2 = external_exports.object({
6389
+ ...baseLayerShape2,
6390
+ kind: external_exports.literal("wheel_picker"),
6391
+ fieldKey: FieldKeySchema2,
6392
+ mode: external_exports.enum(["options", "date"]).optional(),
6393
+ options: external_exports.array(WheelPickerOptionSchema2).min(2).optional(),
6394
+ defaultOptionId: external_exports.string().optional(),
6395
+ datePart: external_exports.enum(["year", "month", "day"]).optional(),
6396
+ minYear: external_exports.number().int().min(1e3).max(9999).optional(),
6397
+ maxYear: external_exports.number().int().min(1e3).max(9999).optional(),
6398
+ defaultValue: external_exports.string().optional(),
6399
+ placeholder: LocalizedTextSchema3.optional(),
6400
+ itemHeight: external_exports.number().int().min(28).max(72).optional(),
6401
+ visibleItemCount: external_exports.number().int().min(3).max(9).optional(),
6402
+ selectionBackgroundColor: ThemedColorSchema2.optional(),
6403
+ itemStyle: WheelPickerItemStyleSchema2.optional(),
6404
+ selectedItemStyle: WheelPickerItemStyleSchema2.optional(),
6405
+ children: external_exports.lazy(() => external_exports.array(lazyLayer52())).optional(),
6406
+ style: CommonStyleSchema2.optional(),
6407
+ styleBreakpoints: CommonStyleBreakpointsSchema2
6082
6408
  });
6083
6409
  var CarouselIndicatorsStyleSchema2 = external_exports.object({
6084
6410
  width: external_exports.number().int().min(1).max(64).optional(),
@@ -6114,53 +6440,21 @@ var CarouselLayerSchema2 = external_exports.object({
6114
6440
  autoAdvanceMs: external_exports.number().int().min(500).max(6e4).optional(),
6115
6441
  pageControl: CarouselPageControlSchema2.optional(),
6116
6442
  style: CommonStyleSchema2.optional(),
6117
- styleBreakpoints: CommonStyleBreakpointsSchema2
6443
+ styleBreakpoints: CommonStyleBreakpointsSchema2,
6444
+ carouselLayoutBreakpoints: CarouselLayoutBreakpointsSchema2
6118
6445
  });
6119
- layerSchemaStore2.schema = external_exports.lazy(
6120
- () => external_exports.union([
6121
- StackLayerSchema2,
6122
- TextLayerSchema2,
6123
- HyperlinkLayerSchema2,
6124
- ImageLayerSchema2,
6125
- LottieLayerSchema2,
6126
- VideoLayerSchema2,
6127
- IconLayerSchema2,
6128
- ButtonLayerSchema2,
6129
- BackButtonLayerSchema2,
6130
- ProgressLayerSchema2,
6131
- LoaderLayerSchema2,
6132
- CounterLayerSchema2,
6133
- CheckboxLayerSchema2,
6134
- SingleChoiceLayerSchema2,
6135
- MultipleChoiceLayerSchema2,
6136
- TextInputLayerSchema2,
6137
- ScaleInputLayerSchema2,
6138
- OAuthLoginLayerSchema2,
6139
- OAuthProviderPresetLayerSchema2,
6140
- OAuthProviderCustomLayerSchema2,
6141
- EmailPasswordAuthLayerSchema2,
6142
- EmailPasswordFieldLayerSchema2,
6143
- EmailPasswordSubmitLayerSchema2,
6144
- CarouselLayerSchema2
6145
- ])
6146
- );
6147
- var DecisionNodeIdSchema = external_exports.string().min(1).max(64).regex(/^dec_[a-z0-9_]+$/i, "decision node id must look like dec_<id>");
6148
- var ExternalSurfaceJumpIdSchema22 = external_exports.string().min(1).max(64).regex(/^surf_[a-z0-9_]+$/i, "external surface node id must look like surf_<id>");
6149
- var EXTERNAL_SURFACE_NO_NEXT = "__onb_surface_no_next__";
6150
- var ExternalSurfaceTerminalTargetSchema = external_exports.literal(EXTERNAL_SURFACE_NO_NEXT);
6151
- var FlowJumpTargetSchema = ScreenIdSchema2.or(DecisionNodeIdSchema).or(ExternalSurfaceJumpIdSchema22).or(ExternalSurfaceTerminalTargetSchema).nullable();
6152
- var DecisionBuiltinNameSchema = external_exports.enum(["locale", "platform"]);
6153
- var DecisionVariableRefSchema = external_exports.discriminatedUnion("kind", [
6154
- external_exports.object({ kind: external_exports.literal("builtin"), name: DecisionBuiltinNameSchema }),
6446
+ var DecisionBuiltinNameSchema2 = external_exports.enum(["locale", "platform"]);
6447
+ var DecisionVariableRefSchema2 = external_exports.discriminatedUnion("kind", [
6448
+ external_exports.object({ kind: external_exports.literal("builtin"), name: DecisionBuiltinNameSchema2 }),
6155
6449
  external_exports.object({ kind: external_exports.literal("sdk"), key: external_exports.string().min(1).max(128) }),
6156
6450
  external_exports.object({ kind: external_exports.literal("field"), fieldKey: external_exports.string().min(1).max(128) })
6157
6451
  ]);
6158
- var DecisionStringPredicateSchema = external_exports.discriminatedUnion("op", [
6452
+ var DecisionStringPredicateSchema2 = external_exports.discriminatedUnion("op", [
6159
6453
  external_exports.object({ op: external_exports.literal("eq"), value: external_exports.string() }),
6160
6454
  external_exports.object({ op: external_exports.literal("neq"), value: external_exports.string() }),
6161
6455
  external_exports.object({ op: external_exports.literal("contains"), value: external_exports.string() })
6162
6456
  ]);
6163
- var DecisionNumberPredicateSchema = external_exports.discriminatedUnion("op", [
6457
+ var DecisionNumberPredicateSchema2 = external_exports.discriminatedUnion("op", [
6164
6458
  external_exports.object({ op: external_exports.literal("eq"), value: external_exports.number() }),
6165
6459
  external_exports.object({ op: external_exports.literal("neq"), value: external_exports.number() }),
6166
6460
  external_exports.object({ op: external_exports.literal("lt"), value: external_exports.number() }),
@@ -6168,11 +6462,11 @@ var DecisionNumberPredicateSchema = external_exports.discriminatedUnion("op", [
6168
6462
  external_exports.object({ op: external_exports.literal("gt"), value: external_exports.number() }),
6169
6463
  external_exports.object({ op: external_exports.literal("gte"), value: external_exports.number() })
6170
6464
  ]);
6171
- var DecisionChoicePredicateSchema = external_exports.discriminatedUnion("op", [
6465
+ var DecisionChoicePredicateSchema2 = external_exports.discriminatedUnion("op", [
6172
6466
  external_exports.object({ op: external_exports.literal("eq"), optionId: external_exports.string().min(1) }),
6173
6467
  external_exports.object({ op: external_exports.literal("one_of"), optionIds: external_exports.array(external_exports.string().min(1)).min(1) })
6174
6468
  ]);
6175
- var DecisionMultiPredicateSchema = external_exports.discriminatedUnion("op", [
6469
+ var DecisionMultiPredicateSchema2 = external_exports.discriminatedUnion("op", [
6176
6470
  external_exports.object({
6177
6471
  op: external_exports.literal("intersects"),
6178
6472
  optionIds: external_exports.array(external_exports.string().min(1)).min(1)
@@ -6186,45 +6480,32 @@ var DecisionMultiPredicateSchema = external_exports.discriminatedUnion("op", [
6186
6480
  optionIds: external_exports.array(external_exports.string().min(1)).min(1)
6187
6481
  })
6188
6482
  ]);
6189
- var DecisionBooleanPredicateSchema = external_exports.discriminatedUnion("op", [
6483
+ var DecisionBooleanPredicateSchema2 = external_exports.discriminatedUnion("op", [
6190
6484
  external_exports.object({ op: external_exports.literal("eq"), value: external_exports.boolean() }),
6191
6485
  external_exports.object({ op: external_exports.literal("neq"), value: external_exports.boolean() })
6192
6486
  ]);
6193
- var DecisionPredicatePayloadSchema = external_exports.discriminatedUnion("type", [
6194
- external_exports.object({ type: external_exports.literal("string"), pred: DecisionStringPredicateSchema }),
6195
- external_exports.object({ type: external_exports.literal("number"), pred: DecisionNumberPredicateSchema }),
6196
- external_exports.object({ type: external_exports.literal("boolean"), pred: DecisionBooleanPredicateSchema }),
6197
- external_exports.object({ type: external_exports.literal("choice"), pred: DecisionChoicePredicateSchema }),
6198
- external_exports.object({ type: external_exports.literal("multi"), pred: DecisionMultiPredicateSchema })
6487
+ var DecisionPredicatePayloadSchema2 = external_exports.discriminatedUnion("type", [
6488
+ external_exports.object({ type: external_exports.literal("string"), pred: DecisionStringPredicateSchema2 }),
6489
+ external_exports.object({ type: external_exports.literal("number"), pred: DecisionNumberPredicateSchema2 }),
6490
+ external_exports.object({ type: external_exports.literal("boolean"), pred: DecisionBooleanPredicateSchema2 }),
6491
+ external_exports.object({ type: external_exports.literal("choice"), pred: DecisionChoicePredicateSchema2 }),
6492
+ external_exports.object({ type: external_exports.literal("multi"), pred: DecisionMultiPredicateSchema2 })
6199
6493
  ]);
6200
- var DecisionExprSchema = external_exports.lazy(
6494
+ var DecisionExprSchema2 = external_exports.lazy(
6201
6495
  () => external_exports.discriminatedUnion("kind", [
6202
6496
  external_exports.object({ kind: external_exports.literal("empty") }),
6203
6497
  external_exports.object({
6204
6498
  kind: external_exports.literal("group"),
6205
6499
  op: external_exports.enum(["and", "or"]),
6206
- children: external_exports.array(DecisionExprSchema).min(1)
6500
+ children: external_exports.array(DecisionExprSchema2).min(1)
6207
6501
  }),
6208
6502
  external_exports.object({
6209
6503
  kind: external_exports.literal("predicate"),
6210
- variable: DecisionVariableRefSchema,
6211
- predicate: DecisionPredicatePayloadSchema
6504
+ variable: DecisionVariableRefSchema2,
6505
+ predicate: DecisionPredicatePayloadSchema2
6212
6506
  })
6213
6507
  ])
6214
6508
  );
6215
- var DecisionCaseSchema = external_exports.object({
6216
- id: external_exports.string().min(1).max(80),
6217
- /** Display label in the editor (e.g. “Engaged users”). */
6218
- name: external_exports.string().min(1).max(80).optional(),
6219
- expression: DecisionExprSchema,
6220
- next: FlowJumpTargetSchema
6221
- });
6222
- var DecisionNodeSchema = external_exports.object({
6223
- id: DecisionNodeIdSchema,
6224
- name: external_exports.string().min(1).max(80).optional(),
6225
- cases: external_exports.array(DecisionCaseSchema).min(1).max(16),
6226
- elseNext: FlowJumpTargetSchema
6227
- });
6228
6509
  var collectDecisionFieldKeys = (expr) => {
6229
6510
  const out = [];
6230
6511
  const walk = (e) => {
@@ -6238,6 +6519,73 @@ var collectDecisionFieldKeys = (expr) => {
6238
6519
  walk(expr);
6239
6520
  return out;
6240
6521
  };
6522
+ var decisionExprHasPredicate = (expr) => {
6523
+ if (expr.kind === "empty") return false;
6524
+ if (expr.kind === "predicate") return true;
6525
+ return expr.children.some(decisionExprHasPredicate);
6526
+ };
6527
+ var CONDITIONAL_MAX_CASES2 = 16;
6528
+ var ConditionalCaseSchema2 = external_exports.object({
6529
+ id: external_exports.string().min(1).max(80),
6530
+ name: external_exports.string().min(1).max(80).optional(),
6531
+ expression: DecisionExprSchema2,
6532
+ rootLayerId: LayerIdSchema2
6533
+ });
6534
+ var ConditionalLayerSchema2 = external_exports.object({
6535
+ ...baseLayerShape2,
6536
+ kind: external_exports.literal("conditional"),
6537
+ cases: external_exports.array(ConditionalCaseSchema2).min(1).max(CONDITIONAL_MAX_CASES2),
6538
+ elseRootLayerId: LayerIdSchema2,
6539
+ children: external_exports.lazy(() => external_exports.array(StackLayerSchema2).min(2))
6540
+ });
6541
+ layerSchemaStore2.schema = external_exports.lazy(
6542
+ () => external_exports.union([
6543
+ StackLayerSchema2,
6544
+ TextLayerSchema2,
6545
+ HyperlinkLayerSchema2,
6546
+ ImageLayerSchema2,
6547
+ LottieLayerSchema2,
6548
+ VideoLayerSchema2,
6549
+ IconLayerSchema2,
6550
+ ButtonLayerSchema2,
6551
+ BackButtonLayerSchema2,
6552
+ ProgressLayerSchema2,
6553
+ LoaderLayerSchema2,
6554
+ CounterLayerSchema2,
6555
+ CheckboxLayerSchema2,
6556
+ SingleChoiceLayerSchema2,
6557
+ MultipleChoiceLayerSchema2,
6558
+ TextInputLayerSchema2,
6559
+ ScaleInputLayerSchema2,
6560
+ WheelPickerLayerSchema2,
6561
+ OAuthLoginLayerSchema2,
6562
+ OAuthProviderPresetLayerSchema2,
6563
+ OAuthProviderCustomLayerSchema2,
6564
+ EmailPasswordAuthLayerSchema2,
6565
+ EmailPasswordFieldLayerSchema2,
6566
+ EmailPasswordSubmitLayerSchema2,
6567
+ CarouselLayerSchema2,
6568
+ ConditionalLayerSchema2
6569
+ ])
6570
+ );
6571
+ var DecisionNodeIdSchema = external_exports.string().min(1).max(64).regex(/^dec_[a-z0-9_]+$/i, "decision node id must look like dec_<id>");
6572
+ var ExternalSurfaceJumpIdSchema22 = external_exports.string().min(1).max(64).regex(/^surf_[a-z0-9_]+$/i, "external surface node id must look like surf_<id>");
6573
+ var EXTERNAL_SURFACE_NO_NEXT = "__onb_surface_no_next__";
6574
+ var ExternalSurfaceTerminalTargetSchema = external_exports.literal(EXTERNAL_SURFACE_NO_NEXT);
6575
+ var FlowJumpTargetSchema = ScreenIdSchema2.or(DecisionNodeIdSchema).or(ExternalSurfaceJumpIdSchema22).or(ExternalSurfaceTerminalTargetSchema).nullable();
6576
+ var DecisionCaseSchema = external_exports.object({
6577
+ id: external_exports.string().min(1).max(80),
6578
+ /** Display label in the editor (e.g. “Engaged users”). */
6579
+ name: external_exports.string().min(1).max(80).optional(),
6580
+ expression: DecisionExprSchema2,
6581
+ next: FlowJumpTargetSchema
6582
+ });
6583
+ var DecisionNodeSchema = external_exports.object({
6584
+ id: DecisionNodeIdSchema,
6585
+ name: external_exports.string().min(1).max(80).optional(),
6586
+ cases: external_exports.array(DecisionCaseSchema).min(1).max(16),
6587
+ elseNext: FlowJumpTargetSchema
6588
+ });
6241
6589
  var collectDecisionFieldKeysFromNode = (node) => {
6242
6590
  const seen = /* @__PURE__ */ new Set();
6243
6591
  for (const c of node.cases) {
@@ -6417,7 +6765,10 @@ var ThemedColorModesSchema3 = external_exports.object({
6417
6765
  var ThemedColorSchema3 = external_exports.union([external_exports.string().min(1), ThemedColorModesSchema3]);
6418
6766
  var LAYOUT_FRACTION_PRESETS3 = ["1/2", "1/3", "2/3", "1/4", "3/4"];
6419
6767
  var WIDTH_PRESETS3 = ["auto", "full", ...LAYOUT_FRACTION_PRESETS3];
6420
- var WidthValueSchema3 = external_exports.union([external_exports.enum(WIDTH_PRESETS3), external_exports.number().int().min(0).max(2e3)]);
6768
+ var WidthValueSchema3 = external_exports.preprocess(
6769
+ (value) => value === "fill" ? "full" : value,
6770
+ external_exports.union([external_exports.enum(WIDTH_PRESETS3), external_exports.number().int().min(0).max(2e3)])
6771
+ );
6421
6772
  var HEIGHT_PRESETS3 = ["auto", "full", "fill", ...LAYOUT_FRACTION_PRESETS3];
6422
6773
  var CommonLayoutHeightSchema3 = external_exports.union([
6423
6774
  external_exports.enum(HEIGHT_PRESETS3),
@@ -6450,6 +6801,8 @@ var CommonStyleSchema3 = external_exports.object({
6450
6801
  border: BorderSchema3.optional(),
6451
6802
  shadow: DropShadowSchema3.optional(),
6452
6803
  opacity: external_exports.number().min(0).max(1).optional(),
6804
+ /** Multiplier (0–1) applied to the resolved background color alpha only; children stay fully opaque unless `opacity` is set. */
6805
+ backgroundOpacity: external_exports.number().min(0).max(1).optional(),
6453
6806
  width: WidthValueSchema3.optional(),
6454
6807
  /** Omit for normal flow; `'absolute'` removes the layer from flex flow (non-root only). */
6455
6808
  position: external_exports.literal("absolute").optional(),
@@ -6460,6 +6813,11 @@ var CommonStyleSchema3 = external_exports.object({
6460
6813
  rotate: external_exports.number().min(-360).max(360).optional(),
6461
6814
  /** Cross-axis size: `auto` (hug), `full`/`fill` (parent height), fractions, or fixed px. */
6462
6815
  height: CommonLayoutHeightSchema3.optional(),
6816
+ /** Optional size clamps (px); applied on the flex shell / wrapper like width/height. */
6817
+ minWidth: NonNegativePxSchema3.max(2e3).optional(),
6818
+ maxWidth: NonNegativePxSchema3.max(2e3).optional(),
6819
+ minHeight: NonNegativePxSchema3.max(2e3).optional(),
6820
+ maxHeight: NonNegativePxSchema3.max(2e3).optional(),
6463
6821
  /** Stroke thickness in px for layers that render a stroke primitive (e.g. loader ring). */
6464
6822
  strokeWidth: external_exports.number().int().min(0).max(64).optional()
6465
6823
  }).partial();
@@ -6473,9 +6831,10 @@ var TextStyleSchema3 = CommonStyleSchema3.extend({
6473
6831
  fontWeight: external_exports.number().int().min(100).max(900).optional(),
6474
6832
  color: ThemedColorSchema3.optional(),
6475
6833
  align: external_exports.enum(["left", "center", "right"]).optional(),
6834
+ /** Unitless line-height multiplier (CSS `line-height` without units). */
6476
6835
  lineHeight: external_exports.number().min(0.8).max(3).optional(),
6477
- /** Multiplier (0–1) applied to the resolved background color alpha only; text stays fully opaque unless `opacity` is set. */
6478
- backgroundOpacity: external_exports.number().min(0).max(1).optional()
6836
+ /** Extra spacing between characters as a multiple of `fontSize` (CSS `em`; negative values tighten). */
6837
+ letterSpacing: external_exports.number().min(-0.5).max(1).optional()
6479
6838
  });
6480
6839
  var ImageStyleSchema3 = CommonStyleSchema3.extend({
6481
6840
  fit: external_exports.enum(["cover", "contain", "fill"]).optional(),
@@ -6550,6 +6909,41 @@ var ButtonLayoutBreakpointsSchema3 = external_exports.object({
6550
6909
  xl: ButtonLayoutBreakpointPatchSchema3.optional(),
6551
6910
  "2xl": ButtonLayoutBreakpointPatchSchema3.optional()
6552
6911
  }).partial().optional();
6912
+ var AuthLayoutBreakpointPatchSchema3 = external_exports.object({
6913
+ gap: NonNegativePxSchema3.optional(),
6914
+ align: external_exports.enum(["start", "center", "end", "stretch"]).optional()
6915
+ }).partial();
6916
+ var AuthLayoutBreakpointsSchema3 = external_exports.object({
6917
+ sm: AuthLayoutBreakpointPatchSchema3.optional(),
6918
+ md: AuthLayoutBreakpointPatchSchema3.optional(),
6919
+ lg: AuthLayoutBreakpointPatchSchema3.optional(),
6920
+ xl: AuthLayoutBreakpointPatchSchema3.optional(),
6921
+ "2xl": AuthLayoutBreakpointPatchSchema3.optional()
6922
+ }).partial().optional();
6923
+ var ChoiceLayoutBreakpointPatchSchema3 = external_exports.object({
6924
+ direction: external_exports.enum(["vertical", "horizontal"]).optional(),
6925
+ gap: NonNegativePxSchema3.optional(),
6926
+ columns: external_exports.number().int().min(1).max(6).optional()
6927
+ }).partial();
6928
+ var ChoiceLayoutBreakpointsSchema3 = external_exports.object({
6929
+ sm: ChoiceLayoutBreakpointPatchSchema3.optional(),
6930
+ md: ChoiceLayoutBreakpointPatchSchema3.optional(),
6931
+ lg: ChoiceLayoutBreakpointPatchSchema3.optional(),
6932
+ xl: ChoiceLayoutBreakpointPatchSchema3.optional(),
6933
+ "2xl": ChoiceLayoutBreakpointPatchSchema3.optional()
6934
+ }).partial().optional();
6935
+ var CarouselLayoutBreakpointPatchSchema3 = external_exports.object({
6936
+ pageAlignment: external_exports.enum(["top", "center", "bottom"]).optional(),
6937
+ pageSpacing: NonNegativePxSchema3.optional(),
6938
+ pagePeek: NonNegativePxSchema3.optional()
6939
+ }).partial();
6940
+ var CarouselLayoutBreakpointsSchema3 = external_exports.object({
6941
+ sm: CarouselLayoutBreakpointPatchSchema3.optional(),
6942
+ md: CarouselLayoutBreakpointPatchSchema3.optional(),
6943
+ lg: CarouselLayoutBreakpointPatchSchema3.optional(),
6944
+ xl: CarouselLayoutBreakpointPatchSchema3.optional(),
6945
+ "2xl": CarouselLayoutBreakpointPatchSchema3.optional()
6946
+ }).partial().optional();
6553
6947
  var DecisionNodeJumpIdSchema3 = external_exports.string().min(1).max(64).regex(/^dec_[a-z0-9_]+$/i);
6554
6948
  var ExternalSurfaceJumpIdSchema3 = external_exports.string().min(1).max(64).regex(/^surf_[a-z0-9_]+$/i);
6555
6949
  var FlowGraphNodeJumpTargetSchema3 = ScreenIdSchema3.or(DecisionNodeJumpIdSchema3).or(
@@ -6596,6 +6990,8 @@ var OsPermissionOutcomesSchema3 = external_exports.object({
6596
6990
  }).strict();
6597
6991
  var APP_REVIEW_OUTCOMES3 = ["not_shown", "dismissed"];
6598
6992
  var AppReviewOutcomeSchema2 = external_exports.enum(APP_REVIEW_OUTCOMES3);
6993
+ var CAROUSEL_ADVANCE_ON_LAST3 = ["noop", "complete"];
6994
+ var CarouselAdvanceOnLastSchema3 = external_exports.enum(CAROUSEL_ADVANCE_ON_LAST3);
6599
6995
  var ButtonActionSchema3 = external_exports.discriminatedUnion("kind", [
6600
6996
  external_exports.object({ kind: external_exports.literal("none") }),
6601
6997
  external_exports.object({ kind: external_exports.literal("continue") }),
@@ -6615,9 +7011,14 @@ var ButtonActionSchema3 = external_exports.discriminatedUnion("kind", [
6615
7011
  kind: external_exports.literal("play_media"),
6616
7012
  targetLayerIds: external_exports.array(external_exports.string().min(1)).min(1)
6617
7013
  }),
6618
- external_exports.object({ kind: external_exports.literal("request_app_review") })
7014
+ external_exports.object({ kind: external_exports.literal("request_app_review") }),
7015
+ external_exports.object({
7016
+ kind: external_exports.literal("advance_carousel"),
7017
+ targetLayerId: external_exports.string().min(1),
7018
+ onLast: CarouselAdvanceOnLastSchema3.optional()
7019
+ })
6619
7020
  ]);
6620
- var TEXT_INPUT_TYPES3 = ["plain", "email", "phone", "url", "multiline"];
7021
+ var TEXT_INPUT_TYPES3 = ["plain", "email", "phone", "url", "number", "multiline"];
6621
7022
  var TextInputTypeSchema3 = external_exports.enum(TEXT_INPUT_TYPES3);
6622
7023
  var COUNTER_DISPLAY_KINDS3 = ["number", "time"];
6623
7024
  var COUNTER_TIME_FORMATS3 = ["mm_ss", "hh_mm_ss", "dd_hh_mm_ss"];
@@ -6682,7 +7083,8 @@ var ProgressLayerSchema3 = external_exports.object({
6682
7083
  kind: external_exports.literal("progress"),
6683
7084
  trackColor: ThemedColorSchema3.optional(),
6684
7085
  fillColor: ThemedColorSchema3.optional(),
6685
- style: CommonStyleSchema3.optional()
7086
+ style: CommonStyleSchema3.optional(),
7087
+ styleBreakpoints: CommonStyleBreakpointsSchema3
6686
7088
  });
6687
7089
  var LoaderOnCompleteSchema3 = external_exports.discriminatedUnion("mode", [
6688
7090
  external_exports.object({ mode: external_exports.literal("none") }),
@@ -6702,7 +7104,8 @@ var LoaderLayerSchema3 = external_exports.object({
6702
7104
  fillColor: ThemedColorSchema3.optional(),
6703
7105
  /** Horizontal alignment of the bar or ring within the layer box (default start). */
6704
7106
  align: external_exports.enum(["start", "center", "end"]).optional(),
6705
- style: CommonStyleSchema3.optional()
7107
+ style: CommonStyleSchema3.optional(),
7108
+ styleBreakpoints: CommonStyleBreakpointsSchema3
6706
7109
  }).superRefine((data, ctx) => {
6707
7110
  if (data.variant !== "circular") return;
6708
7111
  const w = data.style?.width;
@@ -6739,27 +7142,39 @@ var CheckboxLayerSchema3 = external_exports.object({
6739
7142
  styleBreakpoints: CommonStyleBreakpointsSchema3
6740
7143
  });
6741
7144
  var lazyLayer23 = () => layerSchemaStore3.schema;
6742
- var StackLayerSchema3 = external_exports.object({
6743
- ...baseLayerShape3,
6744
- kind: external_exports.literal("stack"),
6745
- style: CommonStyleSchema3.optional(),
6746
- styleBreakpoints: CommonStyleBreakpointsSchema3,
6747
- stackLayoutBreakpoints: StackLayoutBreakpointsSchema3,
6748
- selectedStyle: CommonStyleSchema3.optional(),
6749
- direction: external_exports.enum(["vertical", "horizontal"]),
6750
- gap: external_exports.number().int().min(0).optional(),
6751
- align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
6752
- justify: external_exports.enum(["start", "center", "end"]).optional(),
6753
- distribution: external_exports.enum(["start", "center", "end", "between", "around"]).optional(),
6754
- wrap: external_exports.boolean().optional(),
6755
- children: external_exports.lazy(() => external_exports.array(lazyLayer23()))
6756
- });
7145
+ var migrateStackJustifyForParse3 = (raw) => {
7146
+ if (!raw || typeof raw !== "object") return raw;
7147
+ const o = { ...raw };
7148
+ if (o.justify != null && o.distribution == null) o.distribution = o.justify;
7149
+ delete o.justify;
7150
+ return o;
7151
+ };
7152
+ var StackLayerSchema3 = external_exports.preprocess(
7153
+ migrateStackJustifyForParse3,
7154
+ external_exports.object({
7155
+ ...baseLayerShape3,
7156
+ kind: external_exports.literal("stack"),
7157
+ style: CommonStyleSchema3.optional(),
7158
+ styleBreakpoints: CommonStyleBreakpointsSchema3,
7159
+ stackLayoutBreakpoints: StackLayoutBreakpointsSchema3,
7160
+ selectedStyle: CommonStyleSchema3.optional(),
7161
+ selectedStyleBreakpoints: CommonStyleBreakpointsSchema3,
7162
+ direction: external_exports.enum(["vertical", "horizontal"]),
7163
+ gap: external_exports.number().int().min(0).optional(),
7164
+ align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
7165
+ distribution: external_exports.enum(["start", "center", "end", "between", "around"]).optional(),
7166
+ wrap: external_exports.boolean().optional(),
7167
+ children: external_exports.lazy(() => external_exports.array(lazyLayer23()))
7168
+ })
7169
+ );
6757
7170
  var TextLayerSchema3 = external_exports.object({
6758
7171
  ...baseLayerShape3,
6759
7172
  kind: external_exports.literal("text"),
6760
7173
  text: LocalizedTextSchema4,
6761
7174
  style: TextStyleSchema3.optional(),
6762
- styleBreakpoints: TextStyleBreakpointsSchema3
7175
+ styleBreakpoints: TextStyleBreakpointsSchema3,
7176
+ /** Merged on top of resolved `style` when this layer is inside a selected choice option. */
7177
+ selectedStyle: TextStyleSchema3.optional()
6763
7178
  });
6764
7179
  var migrateLegacyHyperlinkForParse3 = (raw) => {
6765
7180
  if (!raw || typeof raw !== "object") return raw;
@@ -6798,7 +7213,8 @@ var HyperlinkLayerSchemaInner3 = external_exports.object({
6798
7213
  distribution: external_exports.enum(["start", "center", "end", "between", "around"]).optional(),
6799
7214
  wrap: external_exports.boolean().optional(),
6800
7215
  style: CommonStyleSchema3.optional(),
6801
- styleBreakpoints: CommonStyleBreakpointsSchema3
7216
+ styleBreakpoints: CommonStyleBreakpointsSchema3,
7217
+ hyperlinkLayoutBreakpoints: StackLayoutBreakpointsSchema3
6802
7218
  }).superRefine((data, ctx) => {
6803
7219
  const p = parseHyperlinkHref3(data.href.trim());
6804
7220
  if (!p.ok) {
@@ -6819,7 +7235,8 @@ var ImageLayerSchema3 = external_exports.object({
6819
7235
  media: MediaReferenceSchema3.optional(),
6820
7236
  alt: external_exports.string().max(280).optional(),
6821
7237
  style: ImageStyleSchema3.optional(),
6822
- styleBreakpoints: ImageStyleBreakpointsSchema3
7238
+ styleBreakpoints: ImageStyleBreakpointsSchema3,
7239
+ selectedStyle: ImageStyleSchema3.optional()
6823
7240
  });
6824
7241
  var LottieLayerSchema3 = external_exports.object({
6825
7242
  ...baseLayerShape3,
@@ -6830,7 +7247,8 @@ var LottieLayerSchema3 = external_exports.object({
6830
7247
  triggerLayerId: external_exports.string().min(1).optional(),
6831
7248
  onComplete: LoaderOnCompleteSchema3.optional(),
6832
7249
  style: ImageStyleSchema3.optional(),
6833
- styleBreakpoints: ImageStyleBreakpointsSchema3
7250
+ styleBreakpoints: ImageStyleBreakpointsSchema3,
7251
+ selectedStyle: ImageStyleSchema3.optional()
6834
7252
  });
6835
7253
  var VideoLayerSchema3 = external_exports.object({
6836
7254
  ...baseLayerShape3,
@@ -6842,7 +7260,8 @@ var VideoLayerSchema3 = external_exports.object({
6842
7260
  onComplete: LoaderOnCompleteSchema3.optional(),
6843
7261
  audioEnabled: external_exports.boolean().optional(),
6844
7262
  style: ImageStyleSchema3.optional(),
6845
- styleBreakpoints: ImageStyleBreakpointsSchema3
7263
+ styleBreakpoints: ImageStyleBreakpointsSchema3,
7264
+ selectedStyle: ImageStyleSchema3.optional()
6846
7265
  });
6847
7266
  var IconLayerSchema3 = external_exports.object({
6848
7267
  ...baseLayerShape3,
@@ -6850,7 +7269,8 @@ var IconLayerSchema3 = external_exports.object({
6850
7269
  family: external_exports.enum(ICON_FAMILIES3),
6851
7270
  iconName: external_exports.string().min(1).max(128),
6852
7271
  style: IconStyleSchema3.optional(),
6853
- styleBreakpoints: IconStyleBreakpointsSchema3
7272
+ styleBreakpoints: IconStyleBreakpointsSchema3,
7273
+ selectedStyle: IconStyleSchema3.optional()
6854
7274
  });
6855
7275
  var lazyLayer33 = () => layerSchemaStore3.schema;
6856
7276
  var OAuthProviderPresetLayerSchema3 = external_exports.object({
@@ -7004,6 +7424,7 @@ var OAuthLoginLayerSchemaValidated3 = external_exports.object({
7004
7424
  ),
7005
7425
  gap: external_exports.number().int().min(0).optional(),
7006
7426
  align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
7427
+ authLayoutBreakpoints: AuthLayoutBreakpointsSchema3,
7007
7428
  style: CommonStyleSchema3.optional(),
7008
7429
  styleBreakpoints: CommonStyleBreakpointsSchema3
7009
7430
  });
@@ -7152,6 +7573,7 @@ var EmailPasswordAuthLayerSchemaValidated3 = external_exports.object({
7152
7573
  ),
7153
7574
  gap: external_exports.number().int().min(0).optional(),
7154
7575
  align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
7576
+ authLayoutBreakpoints: AuthLayoutBreakpointsSchema3,
7155
7577
  style: CommonStyleSchema3.optional(),
7156
7578
  styleBreakpoints: CommonStyleBreakpointsSchema3
7157
7579
  }).superRefine(refineEmailPasswordAuthChildren3);
@@ -7232,7 +7654,8 @@ var SingleChoiceLayerSchema3 = external_exports.object({
7232
7654
  gap: external_exports.number().int().min(0).optional(),
7233
7655
  columns: external_exports.number().int().min(1).max(12).optional(),
7234
7656
  style: CommonStyleSchema3.optional(),
7235
- styleBreakpoints: CommonStyleBreakpointsSchema3
7657
+ styleBreakpoints: CommonStyleBreakpointsSchema3,
7658
+ choiceLayoutBreakpoints: ChoiceLayoutBreakpointsSchema3
7236
7659
  });
7237
7660
  var MultipleChoiceLayerSchema3 = external_exports.object({
7238
7661
  ...baseLayerShape3,
@@ -7249,9 +7672,20 @@ var MultipleChoiceLayerSchema3 = external_exports.object({
7249
7672
  gap: external_exports.number().int().min(0).optional(),
7250
7673
  columns: external_exports.number().int().min(1).max(12).optional(),
7251
7674
  style: CommonStyleSchema3.optional(),
7252
- styleBreakpoints: CommonStyleBreakpointsSchema3
7675
+ styleBreakpoints: CommonStyleBreakpointsSchema3,
7676
+ choiceLayoutBreakpoints: ChoiceLayoutBreakpointsSchema3
7253
7677
  });
7254
7678
  var validateChoiceChildrenAndBindings = ChoiceChildrenAndBindingsRefinement;
7679
+ var TextInputFieldStyleSchema3 = external_exports.object({
7680
+ fontFamily: external_exports.string().min(1).max(128).optional(),
7681
+ fontSize: external_exports.number().int().min(8).max(96).optional(),
7682
+ fontWeight: external_exports.number().int().min(100).max(900).optional(),
7683
+ color: ThemedColorSchema3.optional(),
7684
+ align: external_exports.enum(["left", "center", "right"]).optional(),
7685
+ lineHeight: external_exports.number().min(0.8).max(3).optional(),
7686
+ letterSpacing: external_exports.number().min(-0.5).max(1).optional(),
7687
+ opacity: external_exports.number().min(0).max(1).optional()
7688
+ }).partial();
7255
7689
  var TextInputLayerSchema3 = external_exports.object({
7256
7690
  ...baseLayerShape3,
7257
7691
  kind: external_exports.literal("text_input"),
@@ -7263,7 +7697,10 @@ var TextInputLayerSchema3 = external_exports.object({
7263
7697
  maxLength: external_exports.number().int().positive().max(2e3).optional(),
7264
7698
  classification: FieldClassificationSchema3,
7265
7699
  children: external_exports.lazy(() => external_exports.array(lazyLayer53())).optional(),
7266
- style: CommonStyleSchema3.optional()
7700
+ /** Typography for the native input's typed text. */
7701
+ fieldStyle: TextInputFieldStyleSchema3.optional(),
7702
+ style: CommonStyleSchema3.optional(),
7703
+ styleBreakpoints: CommonStyleBreakpointsSchema3
7267
7704
  });
7268
7705
  var ScaleInputLabelStyleSchema3 = external_exports.object({
7269
7706
  fontFamily: external_exports.string().min(1).max(128).optional(),
@@ -7272,6 +7709,7 @@ var ScaleInputLabelStyleSchema3 = external_exports.object({
7272
7709
  color: ThemedColorSchema3.optional(),
7273
7710
  align: external_exports.enum(["left", "center", "right"]).optional(),
7274
7711
  lineHeight: external_exports.number().min(0.8).max(3).optional(),
7712
+ letterSpacing: external_exports.number().min(-0.5).max(1).optional(),
7275
7713
  opacity: external_exports.number().min(0).max(1).optional()
7276
7714
  }).partial();
7277
7715
  var ScaleInputLayerSchema3 = external_exports.object({
@@ -7294,7 +7732,40 @@ var ScaleInputLayerSchema3 = external_exports.object({
7294
7732
  thumbSize: external_exports.number().int().min(8).max(48).optional(),
7295
7733
  thumbColor: ThemedColorSchema3.optional(),
7296
7734
  children: external_exports.lazy(() => external_exports.array(lazyLayer53())).optional(),
7297
- style: CommonStyleSchema3.optional()
7735
+ style: CommonStyleSchema3.optional(),
7736
+ styleBreakpoints: CommonStyleBreakpointsSchema3
7737
+ });
7738
+ var WheelPickerOptionSchema3 = external_exports.object({
7739
+ optionId: external_exports.string().min(1).max(64),
7740
+ label: LocalizedTextSchema4
7741
+ });
7742
+ var WheelPickerItemStyleSchema3 = external_exports.object({
7743
+ fontFamily: external_exports.string().min(1).max(128).optional(),
7744
+ fontSize: external_exports.number().int().min(8).max(96).optional(),
7745
+ fontWeight: external_exports.number().int().min(100).max(900).optional(),
7746
+ color: ThemedColorSchema3.optional(),
7747
+ opacity: external_exports.number().min(0).max(1).optional()
7748
+ }).partial();
7749
+ var WheelPickerLayerSchema3 = external_exports.object({
7750
+ ...baseLayerShape3,
7751
+ kind: external_exports.literal("wheel_picker"),
7752
+ fieldKey: FieldKeySchema3,
7753
+ mode: external_exports.enum(["options", "date"]).optional(),
7754
+ options: external_exports.array(WheelPickerOptionSchema3).min(2).optional(),
7755
+ defaultOptionId: external_exports.string().optional(),
7756
+ datePart: external_exports.enum(["year", "month", "day"]).optional(),
7757
+ minYear: external_exports.number().int().min(1e3).max(9999).optional(),
7758
+ maxYear: external_exports.number().int().min(1e3).max(9999).optional(),
7759
+ defaultValue: external_exports.string().optional(),
7760
+ placeholder: LocalizedTextSchema4.optional(),
7761
+ itemHeight: external_exports.number().int().min(28).max(72).optional(),
7762
+ visibleItemCount: external_exports.number().int().min(3).max(9).optional(),
7763
+ selectionBackgroundColor: ThemedColorSchema3.optional(),
7764
+ itemStyle: WheelPickerItemStyleSchema3.optional(),
7765
+ selectedItemStyle: WheelPickerItemStyleSchema3.optional(),
7766
+ children: external_exports.lazy(() => external_exports.array(lazyLayer53())).optional(),
7767
+ style: CommonStyleSchema3.optional(),
7768
+ styleBreakpoints: CommonStyleBreakpointsSchema3
7298
7769
  });
7299
7770
  var CarouselIndicatorsStyleSchema3 = external_exports.object({
7300
7771
  width: external_exports.number().int().min(1).max(64).optional(),
@@ -7330,8 +7801,157 @@ var CarouselLayerSchema3 = external_exports.object({
7330
7801
  autoAdvanceMs: external_exports.number().int().min(500).max(6e4).optional(),
7331
7802
  pageControl: CarouselPageControlSchema3.optional(),
7332
7803
  style: CommonStyleSchema3.optional(),
7333
- styleBreakpoints: CommonStyleBreakpointsSchema3
7804
+ styleBreakpoints: CommonStyleBreakpointsSchema3,
7805
+ carouselLayoutBreakpoints: CarouselLayoutBreakpointsSchema3
7334
7806
  });
7807
+ var DecisionBuiltinNameSchema3 = external_exports.enum(["locale", "platform"]);
7808
+ var DecisionVariableRefSchema3 = external_exports.discriminatedUnion("kind", [
7809
+ external_exports.object({ kind: external_exports.literal("builtin"), name: DecisionBuiltinNameSchema3 }),
7810
+ external_exports.object({ kind: external_exports.literal("sdk"), key: external_exports.string().min(1).max(128) }),
7811
+ external_exports.object({ kind: external_exports.literal("field"), fieldKey: external_exports.string().min(1).max(128) })
7812
+ ]);
7813
+ var DecisionStringPredicateSchema3 = external_exports.discriminatedUnion("op", [
7814
+ external_exports.object({ op: external_exports.literal("eq"), value: external_exports.string() }),
7815
+ external_exports.object({ op: external_exports.literal("neq"), value: external_exports.string() }),
7816
+ external_exports.object({ op: external_exports.literal("contains"), value: external_exports.string() })
7817
+ ]);
7818
+ var DecisionNumberPredicateSchema3 = external_exports.discriminatedUnion("op", [
7819
+ external_exports.object({ op: external_exports.literal("eq"), value: external_exports.number() }),
7820
+ external_exports.object({ op: external_exports.literal("neq"), value: external_exports.number() }),
7821
+ external_exports.object({ op: external_exports.literal("lt"), value: external_exports.number() }),
7822
+ external_exports.object({ op: external_exports.literal("lte"), value: external_exports.number() }),
7823
+ external_exports.object({ op: external_exports.literal("gt"), value: external_exports.number() }),
7824
+ external_exports.object({ op: external_exports.literal("gte"), value: external_exports.number() })
7825
+ ]);
7826
+ var DecisionChoicePredicateSchema3 = external_exports.discriminatedUnion("op", [
7827
+ external_exports.object({ op: external_exports.literal("eq"), optionId: external_exports.string().min(1) }),
7828
+ external_exports.object({ op: external_exports.literal("one_of"), optionIds: external_exports.array(external_exports.string().min(1)).min(1) })
7829
+ ]);
7830
+ var DecisionMultiPredicateSchema3 = external_exports.discriminatedUnion("op", [
7831
+ external_exports.object({
7832
+ op: external_exports.literal("intersects"),
7833
+ optionIds: external_exports.array(external_exports.string().min(1)).min(1)
7834
+ }),
7835
+ external_exports.object({
7836
+ op: external_exports.literal("contains_all"),
7837
+ optionIds: external_exports.array(external_exports.string().min(1)).min(1)
7838
+ }),
7839
+ external_exports.object({
7840
+ op: external_exports.literal("subset_of"),
7841
+ optionIds: external_exports.array(external_exports.string().min(1)).min(1)
7842
+ })
7843
+ ]);
7844
+ var DecisionBooleanPredicateSchema3 = external_exports.discriminatedUnion("op", [
7845
+ external_exports.object({ op: external_exports.literal("eq"), value: external_exports.boolean() }),
7846
+ external_exports.object({ op: external_exports.literal("neq"), value: external_exports.boolean() })
7847
+ ]);
7848
+ var DecisionPredicatePayloadSchema3 = external_exports.discriminatedUnion("type", [
7849
+ external_exports.object({ type: external_exports.literal("string"), pred: DecisionStringPredicateSchema3 }),
7850
+ external_exports.object({ type: external_exports.literal("number"), pred: DecisionNumberPredicateSchema3 }),
7851
+ external_exports.object({ type: external_exports.literal("boolean"), pred: DecisionBooleanPredicateSchema3 }),
7852
+ external_exports.object({ type: external_exports.literal("choice"), pred: DecisionChoicePredicateSchema3 }),
7853
+ external_exports.object({ type: external_exports.literal("multi"), pred: DecisionMultiPredicateSchema3 })
7854
+ ]);
7855
+ var DecisionExprSchema3 = external_exports.lazy(
7856
+ () => external_exports.discriminatedUnion("kind", [
7857
+ external_exports.object({ kind: external_exports.literal("empty") }),
7858
+ external_exports.object({
7859
+ kind: external_exports.literal("group"),
7860
+ op: external_exports.enum(["and", "or"]),
7861
+ children: external_exports.array(DecisionExprSchema3).min(1)
7862
+ }),
7863
+ external_exports.object({
7864
+ kind: external_exports.literal("predicate"),
7865
+ variable: DecisionVariableRefSchema3,
7866
+ predicate: DecisionPredicatePayloadSchema3
7867
+ })
7868
+ ])
7869
+ );
7870
+ var collectDecisionSdkKeys = (expr) => {
7871
+ const out = [];
7872
+ const walk = (e) => {
7873
+ if (e.kind === "empty") return;
7874
+ if (e.kind === "predicate") {
7875
+ if (e.variable.kind === "sdk") out.push(e.variable.key);
7876
+ return;
7877
+ }
7878
+ for (const c of e.children) walk(c);
7879
+ };
7880
+ walk(expr);
7881
+ return out;
7882
+ };
7883
+ var collectDecisionFieldKeys2 = (expr) => {
7884
+ const out = [];
7885
+ const walk = (e) => {
7886
+ if (e.kind === "empty") return;
7887
+ if (e.kind === "predicate") {
7888
+ if (e.variable.kind === "field") out.push(e.variable.fieldKey);
7889
+ return;
7890
+ }
7891
+ for (const c of e.children) walk(c);
7892
+ };
7893
+ walk(expr);
7894
+ return out;
7895
+ };
7896
+ var CONDITIONAL_MAX_CASES3 = 16;
7897
+ var ConditionalCaseSchema3 = external_exports.object({
7898
+ id: external_exports.string().min(1).max(80),
7899
+ name: external_exports.string().min(1).max(80).optional(),
7900
+ expression: DecisionExprSchema3,
7901
+ rootLayerId: LayerIdSchema3
7902
+ });
7903
+ var ConditionalLayerSchema3 = external_exports.object({
7904
+ ...baseLayerShape3,
7905
+ kind: external_exports.literal("conditional"),
7906
+ cases: external_exports.array(ConditionalCaseSchema3).min(1).max(CONDITIONAL_MAX_CASES3),
7907
+ elseRootLayerId: LayerIdSchema3,
7908
+ children: external_exports.lazy(() => external_exports.array(StackLayerSchema3).min(2))
7909
+ });
7910
+ var validateConditionalCasesAndBindings = (data, ctx) => {
7911
+ const childIds = new Set(data.children.map((c) => c.id));
7912
+ const boundRootIds = /* @__PURE__ */ new Set();
7913
+ const caseIds = /* @__PURE__ */ new Set();
7914
+ const claimRoot = (rootLayerId, path) => {
7915
+ if (!childIds.has(rootLayerId)) {
7916
+ ctx.addIssue({
7917
+ code: external_exports.ZodIssueCode.custom,
7918
+ message: `conditional rootLayerId "${rootLayerId}" does not match any direct child stack`,
7919
+ path
7920
+ });
7921
+ return;
7922
+ }
7923
+ if (boundRootIds.has(rootLayerId)) {
7924
+ ctx.addIssue({
7925
+ code: external_exports.ZodIssueCode.custom,
7926
+ message: `conditional child stack "${rootLayerId}" is bound to more than one branch`,
7927
+ path
7928
+ });
7929
+ return;
7930
+ }
7931
+ boundRootIds.add(rootLayerId);
7932
+ };
7933
+ data.cases.forEach((c, idx) => {
7934
+ if (caseIds.has(c.id)) {
7935
+ ctx.addIssue({
7936
+ code: external_exports.ZodIssueCode.custom,
7937
+ message: `duplicate conditional case id "${c.id}"`,
7938
+ path: ["cases", idx, "id"]
7939
+ });
7940
+ }
7941
+ caseIds.add(c.id);
7942
+ claimRoot(c.rootLayerId, ["cases", idx, "rootLayerId"]);
7943
+ });
7944
+ claimRoot(data.elseRootLayerId, ["elseRootLayerId"]);
7945
+ for (const child of data.children) {
7946
+ if (!boundRootIds.has(child.id)) {
7947
+ ctx.addIssue({
7948
+ code: external_exports.ZodIssueCode.custom,
7949
+ message: `conditional child stack "${child.id}" is not bound to a case or the else branch`,
7950
+ path: ["children"]
7951
+ });
7952
+ }
7953
+ }
7954
+ };
7335
7955
  layerSchemaStore3.schema = external_exports.lazy(
7336
7956
  () => external_exports.union([
7337
7957
  StackLayerSchema3,
@@ -7351,17 +7971,45 @@ layerSchemaStore3.schema = external_exports.lazy(
7351
7971
  MultipleChoiceLayerSchema3,
7352
7972
  TextInputLayerSchema3,
7353
7973
  ScaleInputLayerSchema3,
7974
+ WheelPickerLayerSchema3,
7354
7975
  OAuthLoginLayerSchema3,
7355
7976
  OAuthProviderPresetLayerSchema3,
7356
7977
  OAuthProviderCustomLayerSchema3,
7357
7978
  EmailPasswordAuthLayerSchema3,
7358
7979
  EmailPasswordFieldLayerSchema3,
7359
7980
  EmailPasswordSubmitLayerSchema3,
7360
- CarouselLayerSchema3
7981
+ CarouselLayerSchema3,
7982
+ ConditionalLayerSchema3
7361
7983
  ])
7362
7984
  );
7363
7985
  var LayerSchema2 = layerSchemaStore3.schema;
7364
7986
  var STYLE_BREAKPOINT_KEYS = ["sm", "md", "lg", "xl", "2xl"];
7987
+ var layerChildren = (layer) => {
7988
+ switch (layer.kind) {
7989
+ case "stack":
7990
+ case "conditional":
7991
+ case "button":
7992
+ case "back_button":
7993
+ case "hyperlink":
7994
+ case "single_choice":
7995
+ case "multiple_choice":
7996
+ case "oauth_login":
7997
+ case "email_password_auth":
7998
+ case "email_password_submit":
7999
+ return layer.children;
8000
+ case "carousel":
8001
+ return layer.slides;
8002
+ case "text_input":
8003
+ case "scale_input":
8004
+ case "wheel_picker":
8005
+ case "email_password_field":
8006
+ return layer.children ?? [];
8007
+ case "oauth_provider":
8008
+ return layer.variant === "custom" ? layer.children : [];
8009
+ default:
8010
+ return [];
8011
+ }
8012
+ };
7365
8013
  var commonStyleHasAbsolutePosition = (style, breakpoints) => {
7366
8014
  if (style?.position === "absolute") return true;
7367
8015
  if (!breakpoints) return false;
@@ -7392,6 +8040,7 @@ var layerHasAbsolutePositionAuthored = (layer) => {
7392
8040
  return commonStyleHasAbsolutePosition(layer.style, void 0);
7393
8041
  case "text_input":
7394
8042
  case "scale_input":
8043
+ case "wheel_picker":
7395
8044
  return commonStyleHasAbsolutePosition(layer.style, void 0);
7396
8045
  case "oauth_provider":
7397
8046
  if (layer.variant === "preset") {
@@ -7416,7 +8065,7 @@ var layerHasAbsolutePositionAuthored = (layer) => {
7416
8065
  return false;
7417
8066
  }
7418
8067
  };
7419
- var isInputLayer2 = (l) => l.kind === "single_choice" || l.kind === "multiple_choice" || l.kind === "text_input" || l.kind === "scale_input";
8068
+ var isInputLayer2 = (l) => l.kind === "single_choice" || l.kind === "multiple_choice" || l.kind === "text_input" || l.kind === "scale_input" || l.kind === "wheel_picker";
7420
8069
  var ANIMATABLE_PROPERTIES = [
7421
8070
  "opacity",
7422
8071
  "translateX",
@@ -7576,74 +8225,11 @@ var ExternalSurfaceJumpIdSchema23 = external_exports.string().min(1).max(64).reg
7576
8225
  var EXTERNAL_SURFACE_NO_NEXT2 = "__onb_surface_no_next__";
7577
8226
  var ExternalSurfaceTerminalTargetSchema2 = external_exports.literal(EXTERNAL_SURFACE_NO_NEXT2);
7578
8227
  var FlowJumpTargetSchema2 = ScreenIdSchema3.or(DecisionNodeIdSchema2).or(ExternalSurfaceJumpIdSchema23).or(ExternalSurfaceTerminalTargetSchema2).nullable();
7579
- var DecisionBuiltinNameSchema2 = external_exports.enum(["locale", "platform"]);
7580
- var DecisionVariableRefSchema2 = external_exports.discriminatedUnion("kind", [
7581
- external_exports.object({ kind: external_exports.literal("builtin"), name: DecisionBuiltinNameSchema2 }),
7582
- external_exports.object({ kind: external_exports.literal("sdk"), key: external_exports.string().min(1).max(128) }),
7583
- external_exports.object({ kind: external_exports.literal("field"), fieldKey: external_exports.string().min(1).max(128) })
7584
- ]);
7585
- var DecisionStringPredicateSchema2 = external_exports.discriminatedUnion("op", [
7586
- external_exports.object({ op: external_exports.literal("eq"), value: external_exports.string() }),
7587
- external_exports.object({ op: external_exports.literal("neq"), value: external_exports.string() }),
7588
- external_exports.object({ op: external_exports.literal("contains"), value: external_exports.string() })
7589
- ]);
7590
- var DecisionNumberPredicateSchema2 = external_exports.discriminatedUnion("op", [
7591
- external_exports.object({ op: external_exports.literal("eq"), value: external_exports.number() }),
7592
- external_exports.object({ op: external_exports.literal("neq"), value: external_exports.number() }),
7593
- external_exports.object({ op: external_exports.literal("lt"), value: external_exports.number() }),
7594
- external_exports.object({ op: external_exports.literal("lte"), value: external_exports.number() }),
7595
- external_exports.object({ op: external_exports.literal("gt"), value: external_exports.number() }),
7596
- external_exports.object({ op: external_exports.literal("gte"), value: external_exports.number() })
7597
- ]);
7598
- var DecisionChoicePredicateSchema2 = external_exports.discriminatedUnion("op", [
7599
- external_exports.object({ op: external_exports.literal("eq"), optionId: external_exports.string().min(1) }),
7600
- external_exports.object({ op: external_exports.literal("one_of"), optionIds: external_exports.array(external_exports.string().min(1)).min(1) })
7601
- ]);
7602
- var DecisionMultiPredicateSchema2 = external_exports.discriminatedUnion("op", [
7603
- external_exports.object({
7604
- op: external_exports.literal("intersects"),
7605
- optionIds: external_exports.array(external_exports.string().min(1)).min(1)
7606
- }),
7607
- external_exports.object({
7608
- op: external_exports.literal("contains_all"),
7609
- optionIds: external_exports.array(external_exports.string().min(1)).min(1)
7610
- }),
7611
- external_exports.object({
7612
- op: external_exports.literal("subset_of"),
7613
- optionIds: external_exports.array(external_exports.string().min(1)).min(1)
7614
- })
7615
- ]);
7616
- var DecisionBooleanPredicateSchema2 = external_exports.discriminatedUnion("op", [
7617
- external_exports.object({ op: external_exports.literal("eq"), value: external_exports.boolean() }),
7618
- external_exports.object({ op: external_exports.literal("neq"), value: external_exports.boolean() })
7619
- ]);
7620
- var DecisionPredicatePayloadSchema2 = external_exports.discriminatedUnion("type", [
7621
- external_exports.object({ type: external_exports.literal("string"), pred: DecisionStringPredicateSchema2 }),
7622
- external_exports.object({ type: external_exports.literal("number"), pred: DecisionNumberPredicateSchema2 }),
7623
- external_exports.object({ type: external_exports.literal("boolean"), pred: DecisionBooleanPredicateSchema2 }),
7624
- external_exports.object({ type: external_exports.literal("choice"), pred: DecisionChoicePredicateSchema2 }),
7625
- external_exports.object({ type: external_exports.literal("multi"), pred: DecisionMultiPredicateSchema2 })
7626
- ]);
7627
- var DecisionExprSchema2 = external_exports.lazy(
7628
- () => external_exports.discriminatedUnion("kind", [
7629
- external_exports.object({ kind: external_exports.literal("empty") }),
7630
- external_exports.object({
7631
- kind: external_exports.literal("group"),
7632
- op: external_exports.enum(["and", "or"]),
7633
- children: external_exports.array(DecisionExprSchema2).min(1)
7634
- }),
7635
- external_exports.object({
7636
- kind: external_exports.literal("predicate"),
7637
- variable: DecisionVariableRefSchema2,
7638
- predicate: DecisionPredicatePayloadSchema2
7639
- })
7640
- ])
7641
- );
7642
8228
  var DecisionCaseSchema2 = external_exports.object({
7643
8229
  id: external_exports.string().min(1).max(80),
7644
8230
  /** Display label in the editor (e.g. “Engaged users”). */
7645
8231
  name: external_exports.string().min(1).max(80).optional(),
7646
- expression: DecisionExprSchema2,
8232
+ expression: DecisionExprSchema3,
7647
8233
  next: FlowJumpTargetSchema2
7648
8234
  });
7649
8235
  var DecisionNodeSchema2 = external_exports.object({
@@ -7673,32 +8259,6 @@ var migrateLegacyDecisionNodeInPlace = (node) => {
7673
8259
  ];
7674
8260
  node.elseNext = onFalse;
7675
8261
  };
7676
- var collectDecisionSdkKeys = (expr) => {
7677
- const out = [];
7678
- const walk = (e) => {
7679
- if (e.kind === "empty") return;
7680
- if (e.kind === "predicate") {
7681
- if (e.variable.kind === "sdk") out.push(e.variable.key);
7682
- return;
7683
- }
7684
- for (const c of e.children) walk(c);
7685
- };
7686
- walk(expr);
7687
- return out;
7688
- };
7689
- var collectDecisionFieldKeys2 = (expr) => {
7690
- const out = [];
7691
- const walk = (e) => {
7692
- if (e.kind === "empty") return;
7693
- if (e.kind === "predicate") {
7694
- if (e.variable.kind === "field") out.push(e.variable.fieldKey);
7695
- return;
7696
- }
7697
- for (const c of e.children) walk(c);
7698
- };
7699
- walk(expr);
7700
- return out;
7701
- };
7702
8262
  var collectDecisionFieldKeysFromNode2 = (node) => {
7703
8263
  const seen = /* @__PURE__ */ new Set();
7704
8264
  for (const c of node.cases) {
@@ -7747,6 +8307,8 @@ var walkScreenLayersWithLayoutContext = (screen, fn) => {
7747
8307
  for (const c of l.children) visit(c, childCtx());
7748
8308
  } else if (l.kind === "carousel") {
7749
8309
  for (const s of l.slides) visit(s, childCtx());
8310
+ } else if (l.kind === "conditional") {
8311
+ for (const c of l.children) visit(c, childCtx());
7750
8312
  } else if (l.kind === "button" || l.kind === "back_button") {
7751
8313
  for (const c of l.children) visit(c, childCtx());
7752
8314
  } else if (l.kind === "hyperlink") {
@@ -7784,6 +8346,7 @@ var walkScreenLayers = (screen, fn) => {
7784
8346
  fn(l);
7785
8347
  if (l.kind === "stack") l.children.forEach(visit);
7786
8348
  else if (l.kind === "carousel") l.slides.forEach(visit);
8349
+ else if (l.kind === "conditional") l.children.forEach(visit);
7787
8350
  else if (l.kind === "button") l.children.forEach(visit);
7788
8351
  else if (l.kind === "back_button") l.children.forEach(visit);
7789
8352
  else if (l.kind === "hyperlink") l.children.forEach(visit);
@@ -7807,6 +8370,57 @@ var walkScreenLayers = (screen, fn) => {
7807
8370
  visit(screen.regions.body);
7808
8371
  if (screen.regions.footer) visit(screen.regions.footer);
7809
8372
  };
8373
+ var maxMatchesOnActivePath = (root, match) => {
8374
+ const self = match(root) ? 1 : 0;
8375
+ if (root.kind === "conditional") {
8376
+ let widest = 0;
8377
+ for (const branch of root.children) {
8378
+ widest = Math.max(widest, maxMatchesOnActivePath(branch, match));
8379
+ }
8380
+ return self + widest;
8381
+ }
8382
+ let total = 0;
8383
+ for (const child of layerChildren(root)) {
8384
+ total += maxMatchesOnActivePath(child, match);
8385
+ }
8386
+ return self + total;
8387
+ };
8388
+ var maxMatchesOnScreenActivePath = (screen, match) => {
8389
+ const { header, body, footer } = screen.regions;
8390
+ return (header ? maxMatchesOnActivePath(header, match) : 0) + maxMatchesOnActivePath(body, match) + (footer ? maxMatchesOnActivePath(footer, match) : 0);
8391
+ };
8392
+ var answerFieldKeyOf = (l) => {
8393
+ if (isInputLayer2(l)) return l.fieldKey;
8394
+ if (l.kind === "checkbox") return l.fieldKey;
8395
+ if (l.kind === "email_password_auth") return l.fieldKey;
8396
+ return null;
8397
+ };
8398
+ var conditionalFieldScopeViolations = (screen) => {
8399
+ const fieldOrderOnScreen = /* @__PURE__ */ new Map();
8400
+ const conditionals = [];
8401
+ let order = 0;
8402
+ walkScreenLayers(screen, (l) => {
8403
+ const fieldKey = answerFieldKeyOf(l);
8404
+ if (fieldKey != null && !fieldOrderOnScreen.has(fieldKey)) {
8405
+ fieldOrderOnScreen.set(fieldKey, order);
8406
+ }
8407
+ if (l.kind === "conditional") conditionals.push({ layer: l, order });
8408
+ order += 1;
8409
+ });
8410
+ const violations = [];
8411
+ for (const { layer, order: conditionalOrder } of conditionals) {
8412
+ layer.cases.forEach((c, caseIndex) => {
8413
+ for (const fieldKey of collectDecisionFieldKeys2(c.expression)) {
8414
+ const declaredAt = fieldOrderOnScreen.get(fieldKey);
8415
+ if (declaredAt === void 0) continue;
8416
+ if (declaredAt >= conditionalOrder) {
8417
+ violations.push({ conditionalId: layer.id, caseId: c.id, caseIndex, fieldKey });
8418
+ }
8419
+ }
8420
+ });
8421
+ }
8422
+ return violations;
8423
+ };
7810
8424
  var ExternalSurfaceNodeIdSchema = external_exports.string().min(1).max(64).regex(/^surf_[a-z0-9_]+$/i, "external surface node id must look like surf_<id>");
7811
8425
  var NORMALIZED_SURFACE_OUTCOMES = [
7812
8426
  "purchase_completed",
@@ -7937,6 +8551,8 @@ var migrateLayerInPlace = (layer) => {
7937
8551
  for (const c of l.children) migrateLayerInPlace(c);
7938
8552
  } else if (l.kind === "carousel" && Array.isArray(l.slides)) {
7939
8553
  for (const s of l.slides) migrateLayerInPlace(s);
8554
+ } else if (l.kind === "conditional" && Array.isArray(l.children)) {
8555
+ for (const c of l.children) migrateLayerInPlace(c);
7940
8556
  } else if (l.kind === "button" && Array.isArray(l.children)) {
7941
8557
  for (const c of l.children) migrateLayerInPlace(c);
7942
8558
  } else if (l.kind === "back_button" && Array.isArray(l.children)) {
@@ -8138,8 +8754,8 @@ var refineManifestGraph = (manifest, ctx, jumpTargets) => {
8138
8754
  };
8139
8755
  var refineManifestScreens = (manifest, ctx, jumpTargets, screenIds, allFieldKeys) => {
8140
8756
  const layerIds = /* @__PURE__ */ new Set();
8757
+ const sdkAllow = new Set(manifest.sdkAttributeKeys);
8141
8758
  manifest.screens.forEach((screen, screenIdx) => {
8142
- let inputCount = 0;
8143
8759
  const layerIdsForScreen = /* @__PURE__ */ new Set();
8144
8760
  walkScreenLayers(screen, (l) => {
8145
8761
  layerIdsForScreen.add(l.id);
@@ -8154,7 +8770,6 @@ var refineManifestScreens = (manifest, ctx, jumpTargets, screenIds, allFieldKeys
8154
8770
  }
8155
8771
  layerIds.add(l.id);
8156
8772
  if (isInputLayer2(l)) {
8157
- inputCount += 1;
8158
8773
  if (allFieldKeys.has(l.fieldKey)) {
8159
8774
  ctx.addIssue({
8160
8775
  code: external_exports.ZodIssueCode.custom,
@@ -8179,10 +8794,18 @@ var refineManifestScreens = (manifest, ctx, jumpTargets, screenIds, allFieldKeys
8179
8794
  if (!allFieldKeys.has(fk)) allFieldKeys.set(fk, screen.id);
8180
8795
  }
8181
8796
  });
8182
- if (inputCount > 1) {
8797
+ const inputsOnPath = maxMatchesOnScreenActivePath(screen, isInputLayer2);
8798
+ if (inputsOnPath > 1) {
8183
8799
  ctx.addIssue({
8184
8800
  code: external_exports.ZodIssueCode.custom,
8185
- message: `screen "${screen.id}" has ${inputCount} input layers (max 1 allowed)`,
8801
+ message: `screen "${screen.id}" can show ${inputsOnPath} input layers at once (max 1 allowed)`,
8802
+ path: ["screens", screenIdx, "regions"]
8803
+ });
8804
+ }
8805
+ for (const v of conditionalFieldScopeViolations(screen)) {
8806
+ ctx.addIssue({
8807
+ code: external_exports.ZodIssueCode.custom,
8808
+ message: `conditional "${v.conditionalId}" case "${v.caseId}" reads fieldKey "${v.fieldKey}" that is answered at or after it on the same screen`,
8186
8809
  path: ["screens", screenIdx, "regions"]
8187
8810
  });
8188
8811
  }
@@ -8251,6 +8874,21 @@ var refineManifestScreens = (manifest, ctx, jumpTargets, screenIds, allFieldKeys
8251
8874
  }
8252
8875
  }
8253
8876
  }
8877
+ if (l.kind === "conditional") {
8878
+ validateConditionalCasesAndBindings(l, ctx);
8879
+ for (const c of l.cases) {
8880
+ for (const sk of collectDecisionSdkKeys(c.expression)) {
8881
+ if (isReservedSdkKey(sk)) continue;
8882
+ if (!sdkAllow.has(sk)) {
8883
+ ctx.addIssue({
8884
+ code: external_exports.ZodIssueCode.custom,
8885
+ message: `conditional "${l.id}" case "${c.id}" references sdk key "${sk}" not in sdkAttributeKeys`,
8886
+ path: ["screens", screenIdx]
8887
+ });
8888
+ }
8889
+ }
8890
+ }
8891
+ }
8254
8892
  if (l.kind === "button" && l.action.kind === "go_to_step") {
8255
8893
  if (!jumpTargets.has(l.action.screenId)) {
8256
8894
  ctx.addIssue({
@@ -8402,6 +9040,22 @@ var refineFlowManifest = (manifest, ctx) => {
8402
9040
  }
8403
9041
  }
8404
9042
  });
9043
+ manifest.screens.forEach((screen, screenIdx) => {
9044
+ walkScreenLayers(screen, (l) => {
9045
+ if (l.kind !== "conditional") return;
9046
+ for (const c of l.cases) {
9047
+ for (const fk of collectDecisionFieldKeys2(c.expression)) {
9048
+ if (!allFieldKeys.has(fk)) {
9049
+ ctx.addIssue({
9050
+ code: external_exports.ZodIssueCode.custom,
9051
+ message: `conditional "${l.id}" case "${c.id}" references unknown fieldKey "${fk}"`,
9052
+ path: ["screens", screenIdx, "regions"]
9053
+ });
9054
+ }
9055
+ }
9056
+ }
9057
+ });
9058
+ });
8405
9059
  if (manifest.locales.length > 0 && !manifest.locales.includes(manifest.defaultLocale)) {
8406
9060
  ctx.addIssue({
8407
9061
  code: external_exports.ZodIssueCode.custom,
@@ -8484,7 +9138,10 @@ var FontStyleSchema = external_exports.object({
8484
9138
  label: external_exports.string().max(40).optional(),
8485
9139
  /** MediaAsset id of the uploaded font file. */
8486
9140
  mediaAssetId: external_exports.string().uuid().optional(),
8487
- /** Public URL of the uploaded font file (denormalized for SDK consumption). */
9141
+ /**
9142
+ * Access URL for the uploaded font file (denormalized for SDK consumption).
9143
+ * Freshly signed on SDK resolve and dashboard app reads; do not persist as long-lived.
9144
+ */
8488
9145
  url: external_exports.string().url().optional(),
8489
9146
  /** Original filename — useful for display. */
8490
9147
  filename: external_exports.string().max(200).optional()
@@ -8536,9 +9193,20 @@ var SdkResolveResponseSchema = external_exports.object({
8536
9193
  var SdkResolveAllResponseSchema = external_exports.object({
8537
9194
  channels: external_exports.array(SdkResolveResponseSchema)
8538
9195
  });
8539
- var SdkResolveAssignmentSchema = SdkResolveResponseSchema.omit({
8540
- manifest: true,
8541
- mediaMap: true
9196
+ var SdkResolveAssignmentSchema = external_exports.object({
9197
+ flowId: external_exports.string().uuid(),
9198
+ versionId: external_exports.string().uuid(),
9199
+ versionNumber: external_exports.number().int().positive(),
9200
+ assignmentVersion: external_exports.number().int().nonnegative(),
9201
+ environment: external_exports.enum(["test", "live"]),
9202
+ channelId: external_exports.string(),
9203
+ experimentId: external_exports.string().uuid().nullable(),
9204
+ variantId: external_exports.string().nullable(),
9205
+ branding: BrandingSchema.optional(),
9206
+ features: external_exports.object({
9207
+ attribution: external_exports.boolean()
9208
+ }).optional(),
9209
+ integrations: ResolvedAppIntegrationsSchema
8542
9210
  });
8543
9211
  var FlowTerminalCorrelationSchema = external_exports.object({
8544
9212
  channelId: external_exports.string(),
@@ -8861,7 +9529,10 @@ var ThemedColorModesSchema4 = external_exports.object({
8861
9529
  var ThemedColorSchema4 = external_exports.union([external_exports.string().min(1), ThemedColorModesSchema4]);
8862
9530
  var LAYOUT_FRACTION_PRESETS4 = ["1/2", "1/3", "2/3", "1/4", "3/4"];
8863
9531
  var WIDTH_PRESETS4 = ["auto", "full", ...LAYOUT_FRACTION_PRESETS4];
8864
- var WidthValueSchema4 = external_exports.union([external_exports.enum(WIDTH_PRESETS4), external_exports.number().int().min(0).max(2e3)]);
9532
+ var WidthValueSchema4 = external_exports.preprocess(
9533
+ (value) => value === "fill" ? "full" : value,
9534
+ external_exports.union([external_exports.enum(WIDTH_PRESETS4), external_exports.number().int().min(0).max(2e3)])
9535
+ );
8865
9536
  var HEIGHT_PRESETS4 = ["auto", "full", "fill", ...LAYOUT_FRACTION_PRESETS4];
8866
9537
  var CommonLayoutHeightSchema4 = external_exports.union([
8867
9538
  external_exports.enum(HEIGHT_PRESETS4),
@@ -8894,6 +9565,8 @@ var CommonStyleSchema4 = external_exports.object({
8894
9565
  border: BorderSchema4.optional(),
8895
9566
  shadow: DropShadowSchema4.optional(),
8896
9567
  opacity: external_exports.number().min(0).max(1).optional(),
9568
+ /** Multiplier (0–1) applied to the resolved background color alpha only; children stay fully opaque unless `opacity` is set. */
9569
+ backgroundOpacity: external_exports.number().min(0).max(1).optional(),
8897
9570
  width: WidthValueSchema4.optional(),
8898
9571
  /** Omit for normal flow; `'absolute'` removes the layer from flex flow (non-root only). */
8899
9572
  position: external_exports.literal("absolute").optional(),
@@ -8904,6 +9577,11 @@ var CommonStyleSchema4 = external_exports.object({
8904
9577
  rotate: external_exports.number().min(-360).max(360).optional(),
8905
9578
  /** Cross-axis size: `auto` (hug), `full`/`fill` (parent height), fractions, or fixed px. */
8906
9579
  height: CommonLayoutHeightSchema4.optional(),
9580
+ /** Optional size clamps (px); applied on the flex shell / wrapper like width/height. */
9581
+ minWidth: NonNegativePxSchema4.max(2e3).optional(),
9582
+ maxWidth: NonNegativePxSchema4.max(2e3).optional(),
9583
+ minHeight: NonNegativePxSchema4.max(2e3).optional(),
9584
+ maxHeight: NonNegativePxSchema4.max(2e3).optional(),
8907
9585
  /** Stroke thickness in px for layers that render a stroke primitive (e.g. loader ring). */
8908
9586
  strokeWidth: external_exports.number().int().min(0).max(64).optional()
8909
9587
  }).partial();
@@ -8917,9 +9595,10 @@ var TextStyleSchema4 = CommonStyleSchema4.extend({
8917
9595
  fontWeight: external_exports.number().int().min(100).max(900).optional(),
8918
9596
  color: ThemedColorSchema4.optional(),
8919
9597
  align: external_exports.enum(["left", "center", "right"]).optional(),
9598
+ /** Unitless line-height multiplier (CSS `line-height` without units). */
8920
9599
  lineHeight: external_exports.number().min(0.8).max(3).optional(),
8921
- /** Multiplier (0–1) applied to the resolved background color alpha only; text stays fully opaque unless `opacity` is set. */
8922
- backgroundOpacity: external_exports.number().min(0).max(1).optional()
9600
+ /** Extra spacing between characters as a multiple of `fontSize` (CSS `em`; negative values tighten). */
9601
+ letterSpacing: external_exports.number().min(-0.5).max(1).optional()
8923
9602
  });
8924
9603
  var ImageStyleSchema4 = CommonStyleSchema4.extend({
8925
9604
  fit: external_exports.enum(["cover", "contain", "fill"]).optional(),
@@ -8994,6 +9673,41 @@ var ButtonLayoutBreakpointsSchema4 = external_exports.object({
8994
9673
  xl: ButtonLayoutBreakpointPatchSchema4.optional(),
8995
9674
  "2xl": ButtonLayoutBreakpointPatchSchema4.optional()
8996
9675
  }).partial().optional();
9676
+ var AuthLayoutBreakpointPatchSchema4 = external_exports.object({
9677
+ gap: NonNegativePxSchema4.optional(),
9678
+ align: external_exports.enum(["start", "center", "end", "stretch"]).optional()
9679
+ }).partial();
9680
+ var AuthLayoutBreakpointsSchema4 = external_exports.object({
9681
+ sm: AuthLayoutBreakpointPatchSchema4.optional(),
9682
+ md: AuthLayoutBreakpointPatchSchema4.optional(),
9683
+ lg: AuthLayoutBreakpointPatchSchema4.optional(),
9684
+ xl: AuthLayoutBreakpointPatchSchema4.optional(),
9685
+ "2xl": AuthLayoutBreakpointPatchSchema4.optional()
9686
+ }).partial().optional();
9687
+ var ChoiceLayoutBreakpointPatchSchema4 = external_exports.object({
9688
+ direction: external_exports.enum(["vertical", "horizontal"]).optional(),
9689
+ gap: NonNegativePxSchema4.optional(),
9690
+ columns: external_exports.number().int().min(1).max(6).optional()
9691
+ }).partial();
9692
+ var ChoiceLayoutBreakpointsSchema4 = external_exports.object({
9693
+ sm: ChoiceLayoutBreakpointPatchSchema4.optional(),
9694
+ md: ChoiceLayoutBreakpointPatchSchema4.optional(),
9695
+ lg: ChoiceLayoutBreakpointPatchSchema4.optional(),
9696
+ xl: ChoiceLayoutBreakpointPatchSchema4.optional(),
9697
+ "2xl": ChoiceLayoutBreakpointPatchSchema4.optional()
9698
+ }).partial().optional();
9699
+ var CarouselLayoutBreakpointPatchSchema4 = external_exports.object({
9700
+ pageAlignment: external_exports.enum(["top", "center", "bottom"]).optional(),
9701
+ pageSpacing: NonNegativePxSchema4.optional(),
9702
+ pagePeek: NonNegativePxSchema4.optional()
9703
+ }).partial();
9704
+ var CarouselLayoutBreakpointsSchema4 = external_exports.object({
9705
+ sm: CarouselLayoutBreakpointPatchSchema4.optional(),
9706
+ md: CarouselLayoutBreakpointPatchSchema4.optional(),
9707
+ lg: CarouselLayoutBreakpointPatchSchema4.optional(),
9708
+ xl: CarouselLayoutBreakpointPatchSchema4.optional(),
9709
+ "2xl": CarouselLayoutBreakpointPatchSchema4.optional()
9710
+ }).partial().optional();
8997
9711
  var DecisionNodeJumpIdSchema4 = external_exports.string().min(1).max(64).regex(/^dec_[a-z0-9_]+$/i);
8998
9712
  var ExternalSurfaceJumpIdSchema4 = external_exports.string().min(1).max(64).regex(/^surf_[a-z0-9_]+$/i);
8999
9713
  var FlowGraphNodeJumpTargetSchema4 = ScreenIdSchema4.or(DecisionNodeJumpIdSchema4).or(
@@ -9038,6 +9752,8 @@ var OsPermissionOutcomesSchema4 = external_exports.object({
9038
9752
  }).strict();
9039
9753
  var APP_REVIEW_OUTCOMES4 = ["not_shown", "dismissed"];
9040
9754
  external_exports.enum(APP_REVIEW_OUTCOMES4);
9755
+ var CAROUSEL_ADVANCE_ON_LAST4 = ["noop", "complete"];
9756
+ var CarouselAdvanceOnLastSchema4 = external_exports.enum(CAROUSEL_ADVANCE_ON_LAST4);
9041
9757
  var ButtonActionSchema4 = external_exports.discriminatedUnion("kind", [
9042
9758
  external_exports.object({ kind: external_exports.literal("none") }),
9043
9759
  external_exports.object({ kind: external_exports.literal("continue") }),
@@ -9057,9 +9773,14 @@ var ButtonActionSchema4 = external_exports.discriminatedUnion("kind", [
9057
9773
  kind: external_exports.literal("play_media"),
9058
9774
  targetLayerIds: external_exports.array(external_exports.string().min(1)).min(1)
9059
9775
  }),
9060
- external_exports.object({ kind: external_exports.literal("request_app_review") })
9776
+ external_exports.object({ kind: external_exports.literal("request_app_review") }),
9777
+ external_exports.object({
9778
+ kind: external_exports.literal("advance_carousel"),
9779
+ targetLayerId: external_exports.string().min(1),
9780
+ onLast: CarouselAdvanceOnLastSchema4.optional()
9781
+ })
9061
9782
  ]);
9062
- var TEXT_INPUT_TYPES4 = ["plain", "email", "phone", "url", "multiline"];
9783
+ var TEXT_INPUT_TYPES4 = ["plain", "email", "phone", "url", "number", "multiline"];
9063
9784
  var TextInputTypeSchema4 = external_exports.enum(TEXT_INPUT_TYPES4);
9064
9785
  var COUNTER_DISPLAY_KINDS4 = ["number", "time"];
9065
9786
  var COUNTER_TIME_FORMATS4 = ["mm_ss", "hh_mm_ss", "dd_hh_mm_ss"];
@@ -9124,7 +9845,8 @@ var ProgressLayerSchema4 = external_exports.object({
9124
9845
  kind: external_exports.literal("progress"),
9125
9846
  trackColor: ThemedColorSchema4.optional(),
9126
9847
  fillColor: ThemedColorSchema4.optional(),
9127
- style: CommonStyleSchema4.optional()
9848
+ style: CommonStyleSchema4.optional(),
9849
+ styleBreakpoints: CommonStyleBreakpointsSchema4
9128
9850
  });
9129
9851
  var LoaderOnCompleteSchema4 = external_exports.discriminatedUnion("mode", [
9130
9852
  external_exports.object({ mode: external_exports.literal("none") }),
@@ -9144,7 +9866,8 @@ var LoaderLayerSchema4 = external_exports.object({
9144
9866
  fillColor: ThemedColorSchema4.optional(),
9145
9867
  /** Horizontal alignment of the bar or ring within the layer box (default start). */
9146
9868
  align: external_exports.enum(["start", "center", "end"]).optional(),
9147
- style: CommonStyleSchema4.optional()
9869
+ style: CommonStyleSchema4.optional(),
9870
+ styleBreakpoints: CommonStyleBreakpointsSchema4
9148
9871
  }).superRefine((data, ctx) => {
9149
9872
  if (data.variant !== "circular") return;
9150
9873
  const w = data.style?.width;
@@ -9181,27 +9904,39 @@ var CheckboxLayerSchema4 = external_exports.object({
9181
9904
  styleBreakpoints: CommonStyleBreakpointsSchema4
9182
9905
  });
9183
9906
  var lazyLayer24 = () => layerSchemaStore4.schema;
9184
- var StackLayerSchema4 = external_exports.object({
9185
- ...baseLayerShape4,
9186
- kind: external_exports.literal("stack"),
9187
- style: CommonStyleSchema4.optional(),
9188
- styleBreakpoints: CommonStyleBreakpointsSchema4,
9189
- stackLayoutBreakpoints: StackLayoutBreakpointsSchema4,
9190
- selectedStyle: CommonStyleSchema4.optional(),
9191
- direction: external_exports.enum(["vertical", "horizontal"]),
9192
- gap: external_exports.number().int().min(0).optional(),
9193
- align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
9194
- justify: external_exports.enum(["start", "center", "end"]).optional(),
9195
- distribution: external_exports.enum(["start", "center", "end", "between", "around"]).optional(),
9196
- wrap: external_exports.boolean().optional(),
9197
- children: external_exports.lazy(() => external_exports.array(lazyLayer24()))
9198
- });
9907
+ var migrateStackJustifyForParse4 = (raw) => {
9908
+ if (!raw || typeof raw !== "object") return raw;
9909
+ const o = { ...raw };
9910
+ if (o.justify != null && o.distribution == null) o.distribution = o.justify;
9911
+ delete o.justify;
9912
+ return o;
9913
+ };
9914
+ var StackLayerSchema4 = external_exports.preprocess(
9915
+ migrateStackJustifyForParse4,
9916
+ external_exports.object({
9917
+ ...baseLayerShape4,
9918
+ kind: external_exports.literal("stack"),
9919
+ style: CommonStyleSchema4.optional(),
9920
+ styleBreakpoints: CommonStyleBreakpointsSchema4,
9921
+ stackLayoutBreakpoints: StackLayoutBreakpointsSchema4,
9922
+ selectedStyle: CommonStyleSchema4.optional(),
9923
+ selectedStyleBreakpoints: CommonStyleBreakpointsSchema4,
9924
+ direction: external_exports.enum(["vertical", "horizontal"]),
9925
+ gap: external_exports.number().int().min(0).optional(),
9926
+ align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
9927
+ distribution: external_exports.enum(["start", "center", "end", "between", "around"]).optional(),
9928
+ wrap: external_exports.boolean().optional(),
9929
+ children: external_exports.lazy(() => external_exports.array(lazyLayer24()))
9930
+ })
9931
+ );
9199
9932
  var TextLayerSchema4 = external_exports.object({
9200
9933
  ...baseLayerShape4,
9201
9934
  kind: external_exports.literal("text"),
9202
9935
  text: LocalizedTextSchema5,
9203
9936
  style: TextStyleSchema4.optional(),
9204
- styleBreakpoints: TextStyleBreakpointsSchema4
9937
+ styleBreakpoints: TextStyleBreakpointsSchema4,
9938
+ /** Merged on top of resolved `style` when this layer is inside a selected choice option. */
9939
+ selectedStyle: TextStyleSchema4.optional()
9205
9940
  });
9206
9941
  var migrateLegacyHyperlinkForParse4 = (raw) => {
9207
9942
  if (!raw || typeof raw !== "object") return raw;
@@ -9240,7 +9975,8 @@ var HyperlinkLayerSchemaInner4 = external_exports.object({
9240
9975
  distribution: external_exports.enum(["start", "center", "end", "between", "around"]).optional(),
9241
9976
  wrap: external_exports.boolean().optional(),
9242
9977
  style: CommonStyleSchema4.optional(),
9243
- styleBreakpoints: CommonStyleBreakpointsSchema4
9978
+ styleBreakpoints: CommonStyleBreakpointsSchema4,
9979
+ hyperlinkLayoutBreakpoints: StackLayoutBreakpointsSchema4
9244
9980
  }).superRefine((data, ctx) => {
9245
9981
  const p = parseHyperlinkHref4(data.href.trim());
9246
9982
  if (!p.ok) {
@@ -9261,7 +9997,8 @@ var ImageLayerSchema4 = external_exports.object({
9261
9997
  media: MediaReferenceSchema4.optional(),
9262
9998
  alt: external_exports.string().max(280).optional(),
9263
9999
  style: ImageStyleSchema4.optional(),
9264
- styleBreakpoints: ImageStyleBreakpointsSchema4
10000
+ styleBreakpoints: ImageStyleBreakpointsSchema4,
10001
+ selectedStyle: ImageStyleSchema4.optional()
9265
10002
  });
9266
10003
  var LottieLayerSchema4 = external_exports.object({
9267
10004
  ...baseLayerShape4,
@@ -9272,7 +10009,8 @@ var LottieLayerSchema4 = external_exports.object({
9272
10009
  triggerLayerId: external_exports.string().min(1).optional(),
9273
10010
  onComplete: LoaderOnCompleteSchema4.optional(),
9274
10011
  style: ImageStyleSchema4.optional(),
9275
- styleBreakpoints: ImageStyleBreakpointsSchema4
10012
+ styleBreakpoints: ImageStyleBreakpointsSchema4,
10013
+ selectedStyle: ImageStyleSchema4.optional()
9276
10014
  });
9277
10015
  var VideoLayerSchema4 = external_exports.object({
9278
10016
  ...baseLayerShape4,
@@ -9284,7 +10022,8 @@ var VideoLayerSchema4 = external_exports.object({
9284
10022
  onComplete: LoaderOnCompleteSchema4.optional(),
9285
10023
  audioEnabled: external_exports.boolean().optional(),
9286
10024
  style: ImageStyleSchema4.optional(),
9287
- styleBreakpoints: ImageStyleBreakpointsSchema4
10025
+ styleBreakpoints: ImageStyleBreakpointsSchema4,
10026
+ selectedStyle: ImageStyleSchema4.optional()
9288
10027
  });
9289
10028
  var IconLayerSchema4 = external_exports.object({
9290
10029
  ...baseLayerShape4,
@@ -9292,7 +10031,8 @@ var IconLayerSchema4 = external_exports.object({
9292
10031
  family: external_exports.enum(ICON_FAMILIES4),
9293
10032
  iconName: external_exports.string().min(1).max(128),
9294
10033
  style: IconStyleSchema4.optional(),
9295
- styleBreakpoints: IconStyleBreakpointsSchema4
10034
+ styleBreakpoints: IconStyleBreakpointsSchema4,
10035
+ selectedStyle: IconStyleSchema4.optional()
9296
10036
  });
9297
10037
  var lazyLayer34 = () => layerSchemaStore4.schema;
9298
10038
  var OAuthProviderPresetLayerSchema4 = external_exports.object({
@@ -9446,6 +10186,7 @@ var OAuthLoginLayerSchemaValidated4 = external_exports.object({
9446
10186
  ),
9447
10187
  gap: external_exports.number().int().min(0).optional(),
9448
10188
  align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
10189
+ authLayoutBreakpoints: AuthLayoutBreakpointsSchema4,
9449
10190
  style: CommonStyleSchema4.optional(),
9450
10191
  styleBreakpoints: CommonStyleBreakpointsSchema4
9451
10192
  });
@@ -9597,6 +10338,7 @@ var EmailPasswordAuthLayerSchemaValidated4 = external_exports.object({
9597
10338
  ),
9598
10339
  gap: external_exports.number().int().min(0).optional(),
9599
10340
  align: external_exports.enum(["start", "center", "end", "stretch"]).optional(),
10341
+ authLayoutBreakpoints: AuthLayoutBreakpointsSchema4,
9600
10342
  style: CommonStyleSchema4.optional(),
9601
10343
  styleBreakpoints: CommonStyleBreakpointsSchema4
9602
10344
  }).superRefine(refineEmailPasswordAuthChildren4);
@@ -9630,7 +10372,8 @@ var SingleChoiceLayerSchema4 = external_exports.object({
9630
10372
  gap: external_exports.number().int().min(0).optional(),
9631
10373
  columns: external_exports.number().int().min(1).max(12).optional(),
9632
10374
  style: CommonStyleSchema4.optional(),
9633
- styleBreakpoints: CommonStyleBreakpointsSchema4
10375
+ styleBreakpoints: CommonStyleBreakpointsSchema4,
10376
+ choiceLayoutBreakpoints: ChoiceLayoutBreakpointsSchema4
9634
10377
  });
9635
10378
  var MultipleChoiceLayerSchema4 = external_exports.object({
9636
10379
  ...baseLayerShape4,
@@ -9647,8 +10390,19 @@ var MultipleChoiceLayerSchema4 = external_exports.object({
9647
10390
  gap: external_exports.number().int().min(0).optional(),
9648
10391
  columns: external_exports.number().int().min(1).max(12).optional(),
9649
10392
  style: CommonStyleSchema4.optional(),
9650
- styleBreakpoints: CommonStyleBreakpointsSchema4
10393
+ styleBreakpoints: CommonStyleBreakpointsSchema4,
10394
+ choiceLayoutBreakpoints: ChoiceLayoutBreakpointsSchema4
9651
10395
  });
10396
+ var TextInputFieldStyleSchema4 = external_exports.object({
10397
+ fontFamily: external_exports.string().min(1).max(128).optional(),
10398
+ fontSize: external_exports.number().int().min(8).max(96).optional(),
10399
+ fontWeight: external_exports.number().int().min(100).max(900).optional(),
10400
+ color: ThemedColorSchema4.optional(),
10401
+ align: external_exports.enum(["left", "center", "right"]).optional(),
10402
+ lineHeight: external_exports.number().min(0.8).max(3).optional(),
10403
+ letterSpacing: external_exports.number().min(-0.5).max(1).optional(),
10404
+ opacity: external_exports.number().min(0).max(1).optional()
10405
+ }).partial();
9652
10406
  var TextInputLayerSchema4 = external_exports.object({
9653
10407
  ...baseLayerShape4,
9654
10408
  kind: external_exports.literal("text_input"),
@@ -9660,7 +10414,10 @@ var TextInputLayerSchema4 = external_exports.object({
9660
10414
  maxLength: external_exports.number().int().positive().max(2e3).optional(),
9661
10415
  classification: FieldClassificationSchema5,
9662
10416
  children: external_exports.lazy(() => external_exports.array(lazyLayer54())).optional(),
9663
- style: CommonStyleSchema4.optional()
10417
+ /** Typography for the native input's typed text. */
10418
+ fieldStyle: TextInputFieldStyleSchema4.optional(),
10419
+ style: CommonStyleSchema4.optional(),
10420
+ styleBreakpoints: CommonStyleBreakpointsSchema4
9664
10421
  });
9665
10422
  var ScaleInputLabelStyleSchema4 = external_exports.object({
9666
10423
  fontFamily: external_exports.string().min(1).max(128).optional(),
@@ -9669,6 +10426,7 @@ var ScaleInputLabelStyleSchema4 = external_exports.object({
9669
10426
  color: ThemedColorSchema4.optional(),
9670
10427
  align: external_exports.enum(["left", "center", "right"]).optional(),
9671
10428
  lineHeight: external_exports.number().min(0.8).max(3).optional(),
10429
+ letterSpacing: external_exports.number().min(-0.5).max(1).optional(),
9672
10430
  opacity: external_exports.number().min(0).max(1).optional()
9673
10431
  }).partial();
9674
10432
  var ScaleInputLayerSchema4 = external_exports.object({
@@ -9691,7 +10449,40 @@ var ScaleInputLayerSchema4 = external_exports.object({
9691
10449
  thumbSize: external_exports.number().int().min(8).max(48).optional(),
9692
10450
  thumbColor: ThemedColorSchema4.optional(),
9693
10451
  children: external_exports.lazy(() => external_exports.array(lazyLayer54())).optional(),
9694
- style: CommonStyleSchema4.optional()
10452
+ style: CommonStyleSchema4.optional(),
10453
+ styleBreakpoints: CommonStyleBreakpointsSchema4
10454
+ });
10455
+ var WheelPickerOptionSchema4 = external_exports.object({
10456
+ optionId: external_exports.string().min(1).max(64),
10457
+ label: LocalizedTextSchema5
10458
+ });
10459
+ var WheelPickerItemStyleSchema4 = external_exports.object({
10460
+ fontFamily: external_exports.string().min(1).max(128).optional(),
10461
+ fontSize: external_exports.number().int().min(8).max(96).optional(),
10462
+ fontWeight: external_exports.number().int().min(100).max(900).optional(),
10463
+ color: ThemedColorSchema4.optional(),
10464
+ opacity: external_exports.number().min(0).max(1).optional()
10465
+ }).partial();
10466
+ var WheelPickerLayerSchema4 = external_exports.object({
10467
+ ...baseLayerShape4,
10468
+ kind: external_exports.literal("wheel_picker"),
10469
+ fieldKey: FieldKeySchema5,
10470
+ mode: external_exports.enum(["options", "date"]).optional(),
10471
+ options: external_exports.array(WheelPickerOptionSchema4).min(2).optional(),
10472
+ defaultOptionId: external_exports.string().optional(),
10473
+ datePart: external_exports.enum(["year", "month", "day"]).optional(),
10474
+ minYear: external_exports.number().int().min(1e3).max(9999).optional(),
10475
+ maxYear: external_exports.number().int().min(1e3).max(9999).optional(),
10476
+ defaultValue: external_exports.string().optional(),
10477
+ placeholder: LocalizedTextSchema5.optional(),
10478
+ itemHeight: external_exports.number().int().min(28).max(72).optional(),
10479
+ visibleItemCount: external_exports.number().int().min(3).max(9).optional(),
10480
+ selectionBackgroundColor: ThemedColorSchema4.optional(),
10481
+ itemStyle: WheelPickerItemStyleSchema4.optional(),
10482
+ selectedItemStyle: WheelPickerItemStyleSchema4.optional(),
10483
+ children: external_exports.lazy(() => external_exports.array(lazyLayer54())).optional(),
10484
+ style: CommonStyleSchema4.optional(),
10485
+ styleBreakpoints: CommonStyleBreakpointsSchema4
9695
10486
  });
9696
10487
  var CarouselIndicatorsStyleSchema4 = external_exports.object({
9697
10488
  width: external_exports.number().int().min(1).max(64).optional(),
@@ -9727,7 +10518,85 @@ var CarouselLayerSchema4 = external_exports.object({
9727
10518
  autoAdvanceMs: external_exports.number().int().min(500).max(6e4).optional(),
9728
10519
  pageControl: CarouselPageControlSchema4.optional(),
9729
10520
  style: CommonStyleSchema4.optional(),
9730
- styleBreakpoints: CommonStyleBreakpointsSchema4
10521
+ styleBreakpoints: CommonStyleBreakpointsSchema4,
10522
+ carouselLayoutBreakpoints: CarouselLayoutBreakpointsSchema4
10523
+ });
10524
+ var DecisionBuiltinNameSchema4 = external_exports.enum(["locale", "platform"]);
10525
+ var DecisionVariableRefSchema4 = external_exports.discriminatedUnion("kind", [
10526
+ external_exports.object({ kind: external_exports.literal("builtin"), name: DecisionBuiltinNameSchema4 }),
10527
+ external_exports.object({ kind: external_exports.literal("sdk"), key: external_exports.string().min(1).max(128) }),
10528
+ external_exports.object({ kind: external_exports.literal("field"), fieldKey: external_exports.string().min(1).max(128) })
10529
+ ]);
10530
+ var DecisionStringPredicateSchema4 = external_exports.discriminatedUnion("op", [
10531
+ external_exports.object({ op: external_exports.literal("eq"), value: external_exports.string() }),
10532
+ external_exports.object({ op: external_exports.literal("neq"), value: external_exports.string() }),
10533
+ external_exports.object({ op: external_exports.literal("contains"), value: external_exports.string() })
10534
+ ]);
10535
+ var DecisionNumberPredicateSchema4 = external_exports.discriminatedUnion("op", [
10536
+ external_exports.object({ op: external_exports.literal("eq"), value: external_exports.number() }),
10537
+ external_exports.object({ op: external_exports.literal("neq"), value: external_exports.number() }),
10538
+ external_exports.object({ op: external_exports.literal("lt"), value: external_exports.number() }),
10539
+ external_exports.object({ op: external_exports.literal("lte"), value: external_exports.number() }),
10540
+ external_exports.object({ op: external_exports.literal("gt"), value: external_exports.number() }),
10541
+ external_exports.object({ op: external_exports.literal("gte"), value: external_exports.number() })
10542
+ ]);
10543
+ var DecisionChoicePredicateSchema4 = external_exports.discriminatedUnion("op", [
10544
+ external_exports.object({ op: external_exports.literal("eq"), optionId: external_exports.string().min(1) }),
10545
+ external_exports.object({ op: external_exports.literal("one_of"), optionIds: external_exports.array(external_exports.string().min(1)).min(1) })
10546
+ ]);
10547
+ var DecisionMultiPredicateSchema4 = external_exports.discriminatedUnion("op", [
10548
+ external_exports.object({
10549
+ op: external_exports.literal("intersects"),
10550
+ optionIds: external_exports.array(external_exports.string().min(1)).min(1)
10551
+ }),
10552
+ external_exports.object({
10553
+ op: external_exports.literal("contains_all"),
10554
+ optionIds: external_exports.array(external_exports.string().min(1)).min(1)
10555
+ }),
10556
+ external_exports.object({
10557
+ op: external_exports.literal("subset_of"),
10558
+ optionIds: external_exports.array(external_exports.string().min(1)).min(1)
10559
+ })
10560
+ ]);
10561
+ var DecisionBooleanPredicateSchema4 = external_exports.discriminatedUnion("op", [
10562
+ external_exports.object({ op: external_exports.literal("eq"), value: external_exports.boolean() }),
10563
+ external_exports.object({ op: external_exports.literal("neq"), value: external_exports.boolean() })
10564
+ ]);
10565
+ var DecisionPredicatePayloadSchema4 = external_exports.discriminatedUnion("type", [
10566
+ external_exports.object({ type: external_exports.literal("string"), pred: DecisionStringPredicateSchema4 }),
10567
+ external_exports.object({ type: external_exports.literal("number"), pred: DecisionNumberPredicateSchema4 }),
10568
+ external_exports.object({ type: external_exports.literal("boolean"), pred: DecisionBooleanPredicateSchema4 }),
10569
+ external_exports.object({ type: external_exports.literal("choice"), pred: DecisionChoicePredicateSchema4 }),
10570
+ external_exports.object({ type: external_exports.literal("multi"), pred: DecisionMultiPredicateSchema4 })
10571
+ ]);
10572
+ var DecisionExprSchema4 = external_exports.lazy(
10573
+ () => external_exports.discriminatedUnion("kind", [
10574
+ external_exports.object({ kind: external_exports.literal("empty") }),
10575
+ external_exports.object({
10576
+ kind: external_exports.literal("group"),
10577
+ op: external_exports.enum(["and", "or"]),
10578
+ children: external_exports.array(DecisionExprSchema4).min(1)
10579
+ }),
10580
+ external_exports.object({
10581
+ kind: external_exports.literal("predicate"),
10582
+ variable: DecisionVariableRefSchema4,
10583
+ predicate: DecisionPredicatePayloadSchema4
10584
+ })
10585
+ ])
10586
+ );
10587
+ var CONDITIONAL_MAX_CASES4 = 16;
10588
+ var ConditionalCaseSchema4 = external_exports.object({
10589
+ id: external_exports.string().min(1).max(80),
10590
+ name: external_exports.string().min(1).max(80).optional(),
10591
+ expression: DecisionExprSchema4,
10592
+ rootLayerId: LayerIdSchema4
10593
+ });
10594
+ var ConditionalLayerSchema4 = external_exports.object({
10595
+ ...baseLayerShape4,
10596
+ kind: external_exports.literal("conditional"),
10597
+ cases: external_exports.array(ConditionalCaseSchema4).min(1).max(CONDITIONAL_MAX_CASES4),
10598
+ elseRootLayerId: LayerIdSchema4,
10599
+ children: external_exports.lazy(() => external_exports.array(StackLayerSchema4).min(2))
9731
10600
  });
9732
10601
  layerSchemaStore4.schema = external_exports.lazy(
9733
10602
  () => external_exports.union([
@@ -9748,13 +10617,15 @@ layerSchemaStore4.schema = external_exports.lazy(
9748
10617
  MultipleChoiceLayerSchema4,
9749
10618
  TextInputLayerSchema4,
9750
10619
  ScaleInputLayerSchema4,
10620
+ WheelPickerLayerSchema4,
9751
10621
  OAuthLoginLayerSchema4,
9752
10622
  OAuthProviderPresetLayerSchema4,
9753
10623
  OAuthProviderCustomLayerSchema4,
9754
10624
  EmailPasswordAuthLayerSchema4,
9755
10625
  EmailPasswordFieldLayerSchema4,
9756
10626
  EmailPasswordSubmitLayerSchema4,
9757
- CarouselLayerSchema4
10627
+ CarouselLayerSchema4,
10628
+ ConditionalLayerSchema4
9758
10629
  ])
9759
10630
  );
9760
10631
  var ScreenBackgroundFitSchema2 = external_exports.enum(["cover", "contain", "fill"]);
@@ -9820,74 +10691,11 @@ var ExternalSurfaceJumpIdSchema24 = external_exports.string().min(1).max(64).reg
9820
10691
  var EXTERNAL_SURFACE_NO_NEXT3 = "__onb_surface_no_next__";
9821
10692
  var ExternalSurfaceTerminalTargetSchema3 = external_exports.literal(EXTERNAL_SURFACE_NO_NEXT3);
9822
10693
  var FlowJumpTargetSchema3 = ScreenIdSchema4.or(DecisionNodeIdSchema3).or(ExternalSurfaceJumpIdSchema24).or(ExternalSurfaceTerminalTargetSchema3).nullable();
9823
- var DecisionBuiltinNameSchema3 = external_exports.enum(["locale", "platform"]);
9824
- var DecisionVariableRefSchema3 = external_exports.discriminatedUnion("kind", [
9825
- external_exports.object({ kind: external_exports.literal("builtin"), name: DecisionBuiltinNameSchema3 }),
9826
- external_exports.object({ kind: external_exports.literal("sdk"), key: external_exports.string().min(1).max(128) }),
9827
- external_exports.object({ kind: external_exports.literal("field"), fieldKey: external_exports.string().min(1).max(128) })
9828
- ]);
9829
- var DecisionStringPredicateSchema3 = external_exports.discriminatedUnion("op", [
9830
- external_exports.object({ op: external_exports.literal("eq"), value: external_exports.string() }),
9831
- external_exports.object({ op: external_exports.literal("neq"), value: external_exports.string() }),
9832
- external_exports.object({ op: external_exports.literal("contains"), value: external_exports.string() })
9833
- ]);
9834
- var DecisionNumberPredicateSchema3 = external_exports.discriminatedUnion("op", [
9835
- external_exports.object({ op: external_exports.literal("eq"), value: external_exports.number() }),
9836
- external_exports.object({ op: external_exports.literal("neq"), value: external_exports.number() }),
9837
- external_exports.object({ op: external_exports.literal("lt"), value: external_exports.number() }),
9838
- external_exports.object({ op: external_exports.literal("lte"), value: external_exports.number() }),
9839
- external_exports.object({ op: external_exports.literal("gt"), value: external_exports.number() }),
9840
- external_exports.object({ op: external_exports.literal("gte"), value: external_exports.number() })
9841
- ]);
9842
- var DecisionChoicePredicateSchema3 = external_exports.discriminatedUnion("op", [
9843
- external_exports.object({ op: external_exports.literal("eq"), optionId: external_exports.string().min(1) }),
9844
- external_exports.object({ op: external_exports.literal("one_of"), optionIds: external_exports.array(external_exports.string().min(1)).min(1) })
9845
- ]);
9846
- var DecisionMultiPredicateSchema3 = external_exports.discriminatedUnion("op", [
9847
- external_exports.object({
9848
- op: external_exports.literal("intersects"),
9849
- optionIds: external_exports.array(external_exports.string().min(1)).min(1)
9850
- }),
9851
- external_exports.object({
9852
- op: external_exports.literal("contains_all"),
9853
- optionIds: external_exports.array(external_exports.string().min(1)).min(1)
9854
- }),
9855
- external_exports.object({
9856
- op: external_exports.literal("subset_of"),
9857
- optionIds: external_exports.array(external_exports.string().min(1)).min(1)
9858
- })
9859
- ]);
9860
- var DecisionBooleanPredicateSchema3 = external_exports.discriminatedUnion("op", [
9861
- external_exports.object({ op: external_exports.literal("eq"), value: external_exports.boolean() }),
9862
- external_exports.object({ op: external_exports.literal("neq"), value: external_exports.boolean() })
9863
- ]);
9864
- var DecisionPredicatePayloadSchema3 = external_exports.discriminatedUnion("type", [
9865
- external_exports.object({ type: external_exports.literal("string"), pred: DecisionStringPredicateSchema3 }),
9866
- external_exports.object({ type: external_exports.literal("number"), pred: DecisionNumberPredicateSchema3 }),
9867
- external_exports.object({ type: external_exports.literal("boolean"), pred: DecisionBooleanPredicateSchema3 }),
9868
- external_exports.object({ type: external_exports.literal("choice"), pred: DecisionChoicePredicateSchema3 }),
9869
- external_exports.object({ type: external_exports.literal("multi"), pred: DecisionMultiPredicateSchema3 })
9870
- ]);
9871
- var DecisionExprSchema3 = external_exports.lazy(
9872
- () => external_exports.discriminatedUnion("kind", [
9873
- external_exports.object({ kind: external_exports.literal("empty") }),
9874
- external_exports.object({
9875
- kind: external_exports.literal("group"),
9876
- op: external_exports.enum(["and", "or"]),
9877
- children: external_exports.array(DecisionExprSchema3).min(1)
9878
- }),
9879
- external_exports.object({
9880
- kind: external_exports.literal("predicate"),
9881
- variable: DecisionVariableRefSchema3,
9882
- predicate: DecisionPredicatePayloadSchema3
9883
- })
9884
- ])
9885
- );
9886
10694
  var DecisionCaseSchema3 = external_exports.object({
9887
10695
  id: external_exports.string().min(1).max(80),
9888
10696
  /** Display label in the editor (e.g. “Engaged users”). */
9889
10697
  name: external_exports.string().min(1).max(80).optional(),
9890
- expression: DecisionExprSchema3,
10698
+ expression: DecisionExprSchema4,
9891
10699
  next: FlowJumpTargetSchema3
9892
10700
  });
9893
10701
  external_exports.object({
@@ -10042,12 +10850,13 @@ var walkLayers = (root, fn) => {
10042
10850
  fn(l, depth);
10043
10851
  if (l.kind === "stack") l.children.forEach((c) => visit(c, depth + 1));
10044
10852
  else if (l.kind === "carousel") l.slides.forEach((c) => visit(c, depth + 1));
10853
+ else if (l.kind === "conditional") l.children.forEach((c) => visit(c, depth + 1));
10045
10854
  else if (l.kind === "button") l.children.forEach((c) => visit(c, depth + 1));
10046
10855
  else if (l.kind === "back_button") l.children.forEach((c) => visit(c, depth + 1));
10047
10856
  else if (l.kind === "hyperlink") l.children.forEach((c) => visit(c, depth + 1));
10048
10857
  else if (l.kind === "single_choice" || l.kind === "multiple_choice") {
10049
10858
  l.children.forEach((c) => visit(c, depth + 1));
10050
- } else if (l.kind === "text_input" || l.kind === "scale_input") {
10859
+ } else if (l.kind === "text_input" || l.kind === "scale_input" || l.kind === "wheel_picker") {
10051
10860
  l.children?.forEach((c) => visit(c, depth + 1));
10052
10861
  } else if (l.kind === "oauth_login") {
10053
10862
  l.children.forEach((c) => visit(c, depth + 1));
@@ -10237,6 +11046,18 @@ var validatePublishable = (manifest) => {
10237
11046
  code: "screen.unreachable"
10238
11047
  });
10239
11048
  }
11049
+ walkScreen(screen, (l) => {
11050
+ if (l.kind !== "conditional") return;
11051
+ for (const c of l.cases) {
11052
+ if (decisionExprHasPredicate(c.expression)) continue;
11053
+ issues.push({
11054
+ stepId: screen.id,
11055
+ path: ["screens", screen.id, "layers", l.id, "cases", c.id],
11056
+ message: `conditional "${l.name ?? l.id}" branch "${c.name ?? c.id}" needs at least one rule before publishing`,
11057
+ code: "conditional.incomplete_cases"
11058
+ });
11059
+ }
11060
+ });
10240
11061
  }
10241
11062
  for (const sn of manifest.externalSurfaceNodes ?? []) {
10242
11063
  if (manifest.entryScreenId != null && !reachable.has(sn.id)) {
@@ -10319,11 +11140,13 @@ var collectFlowBuilderIssues = (manifest) => {
10319
11140
  const screenLabel = screen.name || screen.id;
10320
11141
  const mediaLayerIds = /* @__PURE__ */ new Set();
10321
11142
  const buttonLayerIds = /* @__PURE__ */ new Set();
11143
+ const carouselLayerIds = /* @__PURE__ */ new Set();
10322
11144
  const shellPlaybackId = screenBackgroundPlaybackId(screen.id);
10323
11145
  const shellFill = screen.containerStyle?.backgroundFill;
10324
11146
  const shellVideoFill = shellFill?.kind === "video" ? shellFill : void 0;
10325
11147
  walkScreen(screen, (l) => {
10326
11148
  if (l.kind === "button") buttonLayerIds.add(l.id);
11149
+ if (l.kind === "carousel") carouselLayerIds.add(l.id);
10327
11150
  });
10328
11151
  if (shellFill?.kind === "image" || shellFill?.kind === "video") {
10329
11152
  if (!shellFill.media?.mediaAssetId) {
@@ -10381,7 +11204,7 @@ var collectFlowBuilderIssues = (manifest) => {
10381
11204
  }
10382
11205
  if (isInputLayer(l)) {
10383
11206
  inputCount += 1;
10384
- if (l.kind === "multiple_choice" || l.kind === "text_input" || l.kind === "scale_input") {
11207
+ if (l.kind === "multiple_choice" || l.kind === "text_input" || l.kind === "scale_input" || l.kind === "wheel_picker") {
10385
11208
  needsManualSubmit = true;
10386
11209
  }
10387
11210
  const key = l.fieldKey;
@@ -10538,6 +11361,13 @@ var collectFlowBuilderIssues = (manifest) => {
10538
11361
  }
10539
11362
  }
10540
11363
  }
11364
+ if (l.kind === "button" && l.action.kind === "advance_carousel") {
11365
+ if (!carouselLayerIds.has(l.action.targetLayerId)) {
11366
+ issues.push(
11367
+ `Button "${l.name || l.id}" on screen "${screenLabel}" advance-carousel target "${l.action.targetLayerId}" must be a carousel layer on this screen.`
11368
+ );
11369
+ }
11370
+ }
10541
11371
  });
10542
11372
  if (oauthLoginLayerCount > 0 && inputCount > 0) {
10543
11373
  issues.push(
@@ -10571,7 +11401,7 @@ var collectFlowBuilderIssues = (manifest) => {
10571
11401
  }
10572
11402
  if (needsManualSubmit && !hasContinueButton) {
10573
11403
  issues.push(
10574
- `Screen "${screen.name || screen.id}" has a multiple_choice, text_input, or scale_input but no Button with action "continue". Add a Continue button so users can submit.`
11404
+ `Screen "${screen.name || screen.id}" has a multiple_choice, text_input, scale_input, or wheel_picker but no Button with action "continue". Add a Continue button so users can submit.`
10575
11405
  );
10576
11406
  }
10577
11407
  }
@@ -10794,6 +11624,28 @@ var scanLayer = (issues, screen, layer, branding) => {
10794
11624
  checkThemed(issues, stepId, id, "fillColor", layer.fillColor, false, branding);
10795
11625
  checkThemed(issues, stepId, id, "thumbColor", layer.thumbColor, false, branding);
10796
11626
  return;
11627
+ case "wheel_picker":
11628
+ walkCommonBreakpoints(issues, stepId, id, layer.style, void 0, branding);
11629
+ checkThemed(
11630
+ issues,
11631
+ stepId,
11632
+ id,
11633
+ "selectionBackgroundColor",
11634
+ layer.selectionBackgroundColor,
11635
+ false,
11636
+ branding
11637
+ );
11638
+ checkThemed(issues, stepId, id, "itemStyle.color", layer.itemStyle?.color, false, branding);
11639
+ checkThemed(
11640
+ issues,
11641
+ stepId,
11642
+ id,
11643
+ "selectedItemStyle.color",
11644
+ layer.selectedItemStyle?.color,
11645
+ false,
11646
+ branding
11647
+ );
11648
+ return;
10797
11649
  case "oauth_login":
10798
11650
  walkCommonBreakpoints(issues, stepId, id, layer.style, layer.styleBreakpoints, branding);
10799
11651
  return;
@@ -11202,7 +12054,7 @@ var defaultLayoutStyleForKind = (kind) => {
11202
12054
  case "video":
11203
12055
  return LAYOUT_FULL_FIXED_H160;
11204
12056
  case "icon":
11205
- return LAYOUT_HUG_HUG;
12057
+ return { width: 24, height: 24 };
11206
12058
  case "button":
11207
12059
  case "back_button":
11208
12060
  case "oauth_provider":
@@ -11210,6 +12062,7 @@ var defaultLayoutStyleForKind = (kind) => {
11210
12062
  return LAYOUT_FULL_HUG;
11211
12063
  case "text_input":
11212
12064
  case "scale_input":
12065
+ case "wheel_picker":
11213
12066
  case "email_password_auth":
11214
12067
  case "email_password_field":
11215
12068
  case "oauth_login":
@@ -11419,12 +12272,13 @@ var walkLayers2 = (root, fn) => {
11419
12272
  fn(l, depth);
11420
12273
  if (l.kind === "stack") l.children.forEach((c) => visit(c, depth + 1));
11421
12274
  else if (l.kind === "carousel") l.slides.forEach((c) => visit(c, depth + 1));
12275
+ else if (l.kind === "conditional") l.children.forEach((c) => visit(c, depth + 1));
11422
12276
  else if (l.kind === "button") l.children.forEach((c) => visit(c, depth + 1));
11423
12277
  else if (l.kind === "back_button") l.children.forEach((c) => visit(c, depth + 1));
11424
12278
  else if (l.kind === "hyperlink") l.children.forEach((c) => visit(c, depth + 1));
11425
12279
  else if (l.kind === "single_choice" || l.kind === "multiple_choice") {
11426
12280
  l.children.forEach((c) => visit(c, depth + 1));
11427
- } else if (l.kind === "text_input" || l.kind === "scale_input") {
12281
+ } else if (l.kind === "text_input" || l.kind === "scale_input" || l.kind === "wheel_picker") {
11428
12282
  l.children?.forEach((c) => visit(c, depth + 1));
11429
12283
  } else if (l.kind === "oauth_login") {
11430
12284
  l.children.forEach((c) => visit(c, depth + 1));
@@ -12348,7 +13202,7 @@ var analyzeBackgrounds = (files) => {
12348
13202
  };
12349
13203
 
12350
13204
  // src/audit/analyzers/carouselAnalyzer.ts
12351
- var CAROUSEL_NO_DUPLICATE_FOOTER = "Carousels are swipe-only (optional pageControl dots). Do not add regions.footer or body buttons for in-pager paging. Use regions.footer only for CTAs that advance the next screen in the flow, or single-slide carousels.";
13205
+ var CAROUSEL_NO_DUPLICATE_FOOTER = 'Carousels swipe by default (optional pageControl dots). Do not add buttons that only mimic paging; when the source has an explicit Next control, give it action.kind "advance_carousel" targeting that carousel. Use regions.footer for CTAs that advance the next screen in the flow, or single-slide carousels.';
12352
13206
  var CAROUSEL_PATTERNS = [
12353
13207
  [
12354
13208
  /\binfoSteps\b/,
@@ -13375,7 +14229,7 @@ var analyzeLayout = (files) => {
13375
14229
  confidence: "high",
13376
14230
  file: file.path,
13377
14231
  evidence: aligns.join("; "),
13378
- recommendation: 'Map RN/Tailwind centering to parent `stack.align: "center"` and `stack.justify: "center"`. Center hero images inside vertical body stacks. Use `style.align: "center"` on text layers.'
14232
+ recommendation: 'Map RN/Tailwind centering to parent `stack.align: "center"` and `stack.distribution: "center"`. Center hero images inside vertical body stacks. Use `style.align: "center"` on text layers.'
13379
14233
  });
13380
14234
  }
13381
14235
  if (CENTER_CLASS_RE.test(file.content) && /kind:\s*['"]image['"]|Image\b/.test(file.content)) {
@@ -13442,7 +14296,7 @@ var analyzeRegions = (files) => {
13442
14296
  confidence: "high",
13443
14297
  file: file.path,
13444
14298
  evidence: `Footer/sticky CTA marker: ${footer}`,
13445
- recommendation: carouselPager ? "If this footer only advances in-screen pager pages (infoSteps/currentInfoStep), do not map it to regions.footer \u2014 use a swipe-only carousel layer. Use regions.footer only for CTAs that advance the next screen in the flow." : "Use regions.footer for sticky bottom CTAs instead of placing them at the end of body."
14299
+ recommendation: carouselPager ? 'If this footer only advances in-screen pager pages (infoSteps/currentInfoStep), either drop it (swipe already pages the carousel) or keep it as a button with action.kind "advance_carousel" targeting that carousel. Use regions.footer for CTAs that advance the next screen in the flow.' : "Use regions.footer for sticky bottom CTAs instead of placing them at the end of body."
13446
14300
  });
13447
14301
  }
13448
14302
  const body = hasAny(file.content, bodyPatterns);
@@ -13711,7 +14565,7 @@ var renderAuditMarkdown = (report) => {
13711
14565
  "- Use high-confidence region findings when choosing `regions.header`, `regions.body`, and `regions.footer`.",
13712
14566
  hasStyle ? "- Populate `manifest.theme` and per-layer `style` from style-token evidence. Set `style.color` on text for colored screens." : "- No style-token evidence found \u2014 ask the user for theme sources before using black-and-white defaults.",
13713
14567
  hasGradient ? "- Apply gradient evidence to `screen.containerStyle.backgroundFill.color` using `linear-gradient(...)` CSS strings." : "- Map screen-level background findings before adding generic body layers.",
13714
- hasCarousel ? '- **Carousel required:** emit `kind: "carousel"` with one slide stack per pager page. Swipe-only \u2014 no in-pager buttons. Bundle every slide asset.' : "- No carousel markers detected \u2014 still verify multi-slide routes manually.",
14568
+ hasCarousel ? '- **Carousel required:** emit `kind: "carousel"` with one slide stack per pager page. Swipe by default \u2014 only add a paging button when the source has an explicit Next control, using `action.kind: "advance_carousel"`. Bundle every slide asset.' : "- No carousel markers detected \u2014 still verify multi-slide routes manually.",
13715
14569
  hasFonts ? "- **Fonts required:** copy `.ttf`/`.otf`/`.woff`/`.woff2` under `assets/fonts/`, add `rheo-import.fonts.json`, set `manifest.theme.fontFamily`. **Never** put font files in `rheo-import.assets.json` (see `references/font-import.md`)." : "- If custom fonts appear later in review, bundle them in `rheo-import.fonts.json` only \u2014 never in `rheo-import.assets.json`.",
13716
14570
  hasChoiceStates ? "- **Choice selected state:** each option stack needs `style` (default) and `selectedStyle` (selected), including border/background/text colors." : "- Verify single_choice / multiple_choice option stacks for `selectedStyle` when source uses selected ternaries.",
13717
14571
  hasAnimation ? "- **Motion (intake Q6=yes + Grow+ plan):** apply `screen.animations`, `screen.stagger`, and conservative `restingMotion` from animation audit findings. Use `--suggest-animations` JSON for clip shapes. Omit unmapped springs/gestures." : "- **Motion:** if intake Q6=yes, re-scan entry scope; if Q6=no or plan lacks animations, omit all `animations`, `stagger`, and `restingMotion` fields.",
@@ -13896,7 +14750,12 @@ var ActionObjectSchema = external_exports.discriminatedUnion("kind", [
13896
14750
  blocked: external_exports.string().min(1)
13897
14751
  })
13898
14752
  }),
13899
- external_exports.object({ kind: external_exports.literal("play_media"), targetLayerIds: external_exports.array(external_exports.string().min(1)).min(1) })
14753
+ external_exports.object({ kind: external_exports.literal("play_media"), targetLayerIds: external_exports.array(external_exports.string().min(1)).min(1) }),
14754
+ external_exports.object({
14755
+ kind: external_exports.literal("advance_carousel"),
14756
+ targetLayerId: external_exports.string().min(1),
14757
+ onLast: external_exports.enum(["noop", "complete"]).optional()
14758
+ })
13900
14759
  ]);
13901
14760
  var ButtonActionSpecSchema = external_exports.union([
13902
14761
  external_exports.enum(["none", "continue", "skip", "end_flow", "go_back_one_screen", "request_app_review"]),
@@ -14032,7 +14891,7 @@ var LayerIntentSchema = external_exports.lazy(
14032
14891
  kind: external_exports.literal("text_input"),
14033
14892
  fieldKey: external_exports.string().min(1),
14034
14893
  placeholder: LocalizedOrStringSchema.optional(),
14035
- inputType: external_exports.enum(["plain", "email", "phone", "url", "multiline"]).optional(),
14894
+ inputType: external_exports.enum(["plain", "email", "phone", "url", "number", "multiline"]).optional(),
14036
14895
  required: external_exports.boolean().optional(),
14037
14896
  minLength: external_exports.number().int().min(0).max(2e3).optional(),
14038
14897
  maxLength: external_exports.number().int().positive().max(2e3).optional(),
@@ -14444,8 +15303,8 @@ var buildStack = (intent, ctx) => {
14444
15303
  };
14445
15304
  if (intent.gap !== void 0) out.gap = intent.gap;
14446
15305
  if (intent.align) out.align = intent.align;
14447
- if (intent.justify) out.justify = intent.justify;
14448
- if (intent.distribution) out.distribution = intent.distribution;
15306
+ const distribution = intent.distribution ?? intent.justify;
15307
+ if (distribution) out.distribution = distribution;
14449
15308
  if (intent.wrap !== void 0) out.wrap = intent.wrap;
14450
15309
  if (intent.selectedStyle && Object.keys(intent.selectedStyle).length > 0) {
14451
15310
  out.selectedStyle = intent.selectedStyle;
@@ -14516,7 +15375,8 @@ var buildCarousel = (intent, ctx) => {
14516
15375
  };
14517
15376
  if (slide.gap !== void 0) out2.gap = slide.gap;
14518
15377
  if (slide.align) out2.align = slide.align;
14519
- if (slide.justify) out2.justify = slide.justify;
15378
+ const distribution = slide.distribution ?? slide.justify;
15379
+ if (distribution) out2.distribution = distribution;
14520
15380
  return withStyle(out2, slide.style);
14521
15381
  });
14522
15382
  const out = { id, kind: "carousel", slides };