riverbankcms 0.4.2 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { At as ok, B as parseUtcIsoDateTimeString, Ct as unsafeAsSiteScopedStoragePath, D as mapNonEmptyArray, Dt as unsafeAsUploadSessionId, E as fromArray, Et as unsafeAsStoragePath, O as hasText, Ot as unsafeAsUserId, St as unsafeAsSiteId, Tt as unsafeAsStorageBucketName, Z as assertNever, _ as parseFooterCompositionV1, _t as unsafeAsPositiveByteCount, a as parseVerticalPresetId, at as unsafeAsBookingRequirementId, bt as unsafeAsSafeDownloadFilename, c as EVENT_PRESET_VALUES, dt as unsafeAsEventOfferingId, f as createSecret, ft as unsafeAsEventSeriesId, g as footerNavigationLayouts, gt as unsafeAsOriginalFilename, h as stableJsonStringify, ht as unsafeAsOccurrenceId, i as parseVerticalId, k as isPresent, kt as err, l as ORDINARY_EVENT_PRESET_VALUES, lt as unsafeAsDetectedMimeType, m as parseManagementKey, mt as unsafeAsMediaAssetId, n as canonicalizeConfiguredBookingVerticalConfig, nt as parseSiteId, o as resolveSiteVerticalBookingConfig, ot as unsafeAsBookingSessionId, p as exposeSecret, pt as unsafeAsFileChecksumSha256, st as unsafeAsDeclaredMimeType, ut as unsafeAsEntitlementId, vt as unsafeAsPositiveSeconds, w as isCanonicalRichTextDoc, xt as unsafeAsSiteFontId, yt as unsafeAsProductId } from "./src-BRAF1Dee.mjs";
3
- import { a as classifySdkEventPricing, n as sdkEventOccurrenceInputSchema, o as classifySdkEventPaymentTerms } from "./sdk-event-upsert-C6zsxDcf.mjs";
4
- import { t as CliSdkPeerError } from "./sdk-peer-C6kOODEY.mjs";
2
+ import { At as ok, B as parseUtcIsoDateTimeString, Ct as unsafeAsSiteScopedStoragePath, D as mapNonEmptyArray, Dt as unsafeAsUploadSessionId, E as fromArray, Et as unsafeAsStoragePath, O as hasText, Ot as unsafeAsUserId, St as unsafeAsSiteId, Tt as unsafeAsStorageBucketName, Z as assertNever, _ as parseFooterCompositionV1, _t as unsafeAsPositiveByteCount, a as parseVerticalPresetId, at as unsafeAsBookingRequirementId, bt as unsafeAsSafeDownloadFilename, c as EVENT_PRESET_VALUES, dt as unsafeAsEventOfferingId, f as createSecret, ft as unsafeAsEventSeriesId, g as footerNavigationLayouts, gt as unsafeAsOriginalFilename, h as stableJsonStringify, ht as unsafeAsOccurrenceId, i as parseVerticalId, k as isPresent, kt as err, l as ORDINARY_EVENT_PRESET_VALUES, lt as unsafeAsDetectedMimeType, m as parseManagementKey, mt as unsafeAsMediaAssetId, n as canonicalizeConfiguredBookingVerticalConfig, nt as parseSiteId, o as resolveSiteVerticalBookingConfig, ot as unsafeAsBookingSessionId, p as exposeSecret, pt as unsafeAsFileChecksumSha256, st as unsafeAsDeclaredMimeType, ut as unsafeAsEntitlementId, vt as unsafeAsPositiveSeconds, w as isCanonicalRichTextDoc, xt as unsafeAsSiteFontId, yt as unsafeAsProductId } from "./src-DKm0bLEA.mjs";
3
+ import { a as classifySdkEventPricing, n as sdkEventOccurrenceInputSchema, o as classifySdkEventPaymentTerms } from "./sdk-event-upsert-Dy08IXYL.mjs";
4
+ import { t as CliSdkPeerError } from "./sdk-peer-CeNepTFW.mjs";
5
5
  import "node:module";
6
6
  import { Command } from "commander";
7
7
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -10254,12 +10254,8 @@ const legacyHeaderVariantValues = Object.keys(legacyHeaderVariants);
10254
10254
  * `@riverbankcms/api` is `z.input<typeof themeSchema>`, so a widened input here
10255
10255
  * would leak straight into a public type.
10256
10256
  *
10257
- * Not every read of a persisted theme goes through the schema:
10258
- * `resolveRuntimeTheme` in
10259
- * `apps/dashboard/src/server/services/sites/runtimeSiteResponse.ts` returns the
10260
- * raw database JSON asserted as `Theme` with no parse, so a theme still
10261
- * carrying a legacy spelling reaches the theme editor un-aliased. That gap
10262
- * predates this alias and is harmless while persisted usage is zero.
10257
+ * Persisted runtime themes are admitted through `parseThemeForPersistence`
10258
+ * before reaching consumers, so legacy spellings normalize at that boundary.
10263
10259
  */
10264
10260
  const headerVariantWithLegacyAliasSchema = z.enum([...headerVariantValues, ...legacyHeaderVariantValues]).transform((value) => value in legacyHeaderVariants ? legacyHeaderVariants[value] : value);
10265
10261
 
@@ -10904,7 +10900,6 @@ const navFontWeight = z.enum([
10904
10900
  "bold"
10905
10901
  ]);
10906
10902
  const headerMaxWidth = z.enum(["container", "full"]);
10907
- const headerBarFrame = z.enum(["full-bleed", "inset-shell"]);
10908
10903
  const headerBorderSchema = componentBorderSchema.extend({ position: z.enum([
10909
10904
  "bottom",
10910
10905
  "top",
@@ -10933,12 +10928,6 @@ const headerLogoTextSchema = z.object({
10933
10928
  ]).optional(),
10934
10929
  hideOnShrink: z.boolean().optional()
10935
10930
  }).optional();
10936
- const navEffectsSchema = z.object({
10937
- underlineGradient: z.boolean().default(false),
10938
- glow: z.boolean().default(false),
10939
- glowColor: z.string().optional(),
10940
- neumorphic: z.boolean().default(false)
10941
- }).optional();
10942
10931
  const dropdownStyleSchema = z.object({
10943
10932
  background: themeColorTokenSchema.default("surface"),
10944
10933
  textColor: themeColorTokenSchema.default("text"),
@@ -11030,9 +11019,7 @@ const headerSchema = z.object({
11030
11019
  positioning: headerPositioning,
11031
11020
  shrinkOnScroll: z.boolean(),
11032
11021
  maxWidth: headerMaxWidth,
11033
- barFrame: headerBarFrame.optional(),
11034
11022
  scrollTreatment: headerScrollTreatmentSchema,
11035
- logoOverride: mediaSchema.nullable().optional(),
11036
11023
  background: headerBackgroundSchema.default({
11037
11024
  type: "color",
11038
11025
  color: "surface"
@@ -11044,13 +11031,11 @@ const headerSchema = z.object({
11044
11031
  navFontRole: z.enum(["body", "heading"]).optional(),
11045
11032
  navTextSize: navLinkStyleSchema.shape.textSize,
11046
11033
  interactionPalette: headerInteractionPaletteSchema.optional(),
11047
- navPlacement: z.enum(["end", "center"]).optional(),
11048
11034
  container: headerContainerSchema,
11049
11035
  border: headerBorderSchema,
11050
11036
  shadow: componentShadowSchema.optional(),
11051
11037
  logo: logoStyleSchema,
11052
11038
  logoText: headerLogoTextSchema,
11053
- navEffects: navEffectsSchema,
11054
11039
  navContainer: navContainerSchema,
11055
11040
  navLinkStyle: navLinkStyleSchema.optional(),
11056
11041
  ctaGap: headerCtaGapSchema.optional(),
@@ -12638,7 +12623,7 @@ const blockAppearancePresets = [
12638
12623
  id: "schedule-details-brand-depth",
12639
12624
  target: "events",
12640
12625
  label: "Brand-depth schedule details",
12641
- blockKinds: ["block.event-details", "block.course-details"],
12626
+ blockKinds: ["block.event-details"],
12642
12627
  design: {
12643
12628
  sectionSurface: "brand-depth-band",
12644
12629
  contentFrame: plainFrame,
@@ -16360,90 +16345,6 @@ function deriveHeaderLogoShapeFromDimensions({ width, height }) {
16360
16345
  }
16361
16346
  const defaultHeaderLogoContext = { shape: "text-only" };
16362
16347
 
16363
- //#endregion
16364
- //#region ../theme-core/src/site-styles/headerInteractionPalette.ts
16365
- const clearSplitInteractionPalette = defineLookOptionGroup({
16366
- id: "interaction-palette",
16367
- label: "Hover colour",
16368
- defaultOptionId: "accent",
16369
- options: [
16370
- {
16371
- id: "accent",
16372
- label: "Accent"
16373
- },
16374
- {
16375
- id: "primary",
16376
- label: "Primary"
16377
- },
16378
- {
16379
- id: "secondary",
16380
- label: "Secondary"
16381
- }
16382
- ]
16383
- });
16384
- function resolveHeaderInteractionPaletteControl(group, preference) {
16385
- if (!group) return { kind: "unavailable" };
16386
- if (preference === "recommended") {
16387
- const resolution$1 = resolveLookOption(group, undefined);
16388
- return availableControlState(group, preference, resolution$1.option.id, null);
16389
- }
16390
- const resolution = resolveHeaderInteractionPalette(group, preference);
16391
- return availableControlState(group, preference, resolution.option.id, resolution.kind === "repaired" ? {
16392
- requested: preference,
16393
- fallback: resolution.option.id,
16394
- reason: resolution.reason
16395
- } : null);
16396
- }
16397
- function availableControlState(group, preference, effectivePalette, repair$1) {
16398
- return {
16399
- kind: "available",
16400
- preference,
16401
- effectivePalette,
16402
- options: [{
16403
- value: "recommended",
16404
- label: `Recommended (${defaultOptionLabel(group)})`
16405
- }, ...group.options.map((option) => ({
16406
- value: option.id,
16407
- label: option.label
16408
- }))],
16409
- repair: repair$1
16410
- };
16411
- }
16412
- function applyHeaderInteractionPalette(header, group, preference) {
16413
- if (!group) return header;
16414
- if (!header.navLinkStyle) {
16415
- throw new Error(`Header interaction palette "${group.id}" requires a nav link style.`);
16416
- }
16417
- const palette = resolveHeaderInteractionPalette(group, preference).option.id;
16418
- const pair = headerInteractionPalettePair(palette);
16419
- const pillEffect = {
16420
- effectId: "background-on-hover",
16421
- options: {
16422
- colorToken: pair.backgroundToken,
16423
- textColorToken: pair.foregroundToken
16424
- }
16425
- };
16426
- return {
16427
- ...header,
16428
- navLinkStyle: {
16429
- ...header.navLinkStyle,
16430
- hoverColorToken: null,
16431
- borderRadius: "full",
16432
- effects: {
16433
- ...header.navLinkStyle.effects,
16434
- hover: [pillEffect],
16435
- focus: [pillEffect]
16436
- }
16437
- }
16438
- };
16439
- }
16440
- function resolveHeaderInteractionPalette(group, preference) {
16441
- return resolveLookOption(group, preference === "recommended" ? undefined : preference);
16442
- }
16443
- function defaultOptionLabel(group) {
16444
- return resolveLookOption(group, undefined).option.label;
16445
- }
16446
-
16447
16348
  //#endregion
16448
16349
  //#region ../theme-core/src/site-styles/headerLayoutCatalog.ts
16449
16350
  const titleOnlyLogoAccommodation = {
@@ -16660,43 +16561,37 @@ const headerStyleCatalog = defineExactCatalog()([
16660
16561
  id: asHeaderStyleId("minimal"),
16661
16562
  label: "Minimal",
16662
16563
  description: "Quiet surface with simple color-change navigation.",
16663
- supportedLayoutIds: supportedLayouts(["classic", "centered"]),
16664
- navTypography: "plain"
16564
+ supportedLayoutIds: supportedLayouts(["classic", "centered"])
16665
16565
  },
16666
16566
  {
16667
16567
  id: asHeaderStyleId("fine-line"),
16668
16568
  label: "Seamless",
16669
16569
  description: "Borderless surface with underline hover for a quieter page transition.",
16670
- supportedLayoutIds: supportedLayouts(["classic", "centered"]),
16671
- navTypography: "plain"
16570
+ supportedLayoutIds: supportedLayouts(["classic", "centered"])
16672
16571
  },
16673
16572
  {
16674
16573
  id: asHeaderStyleId("soft-bar"),
16675
16574
  label: "Soft Bar",
16676
16575
  description: "Soft tinted surface with gentle pill hover states.",
16677
- supportedLayoutIds: supportedLayouts(["classic", "centered"]),
16678
- navTypography: "plain"
16576
+ supportedLayoutIds: supportedLayouts(["classic", "centered"])
16679
16577
  },
16680
16578
  {
16681
16579
  id: asHeaderStyleId("pill-nav"),
16682
16580
  label: "Pill Nav",
16683
16581
  description: "A calm pill navigation rail over a neutral header.",
16684
- supportedLayoutIds: supportedLayouts(["classic", "centered"]),
16685
- navTypography: "plain"
16582
+ supportedLayoutIds: supportedLayouts(["classic", "centered"])
16686
16583
  },
16687
16584
  {
16688
16585
  id: asHeaderStyleId("brand-bar"),
16689
16586
  label: "Brand Bar",
16690
16587
  description: "Solid brand surface with high-contrast navigation.",
16691
- supportedLayoutIds: supportedLayouts(["classic", "centered"]),
16692
- navTypography: "brand-caps"
16588
+ supportedLayoutIds: supportedLayouts(["classic", "centered"])
16693
16589
  },
16694
16590
  {
16695
16591
  id: asHeaderStyleId("brand-underline"),
16696
16592
  label: "Brand Underline",
16697
16593
  description: "Brand surface with underline-grow navigation.",
16698
- supportedLayoutIds: supportedLayouts(["classic"]),
16699
- navTypography: "brand-caps"
16594
+ supportedLayoutIds: supportedLayouts(["classic"])
16700
16595
  },
16701
16596
  {
16702
16597
  id: asHeaderStyleId("brand-pill"),
@@ -16706,69 +16601,55 @@ const headerStyleCatalog = defineExactCatalog()([
16706
16601
  "classic",
16707
16602
  "centered",
16708
16603
  "floating"
16709
- ]),
16710
- navTypography: "brand-caps"
16604
+ ])
16711
16605
  },
16712
16606
  {
16713
16607
  id: asHeaderStyleId("brand-capsule"),
16714
16608
  label: "Brand Capsule",
16715
16609
  description: "Solid brand chrome designed as a floating capsule, with quiet-caps nav, a soft pill active state, and an inverted CTA pill.",
16716
- supportedLayoutIds: supportedLayouts(["classic"]),
16717
- navTypography: "quiet-caps"
16610
+ supportedLayoutIds: supportedLayouts(["classic"])
16718
16611
  },
16719
16612
  {
16720
16613
  id: asHeaderStyleId("serif-line"),
16721
16614
  label: "Serif Line",
16722
16615
  description: "Typographic logo treatment with understated underline navigation.",
16723
- supportedLayoutIds: supportedLayouts(["classic", "centered"]),
16724
- navTypography: "heading"
16616
+ supportedLayoutIds: supportedLayouts(["classic", "centered"])
16725
16617
  },
16726
16618
  {
16727
16619
  id: asHeaderStyleId("flat-tabs"),
16728
16620
  label: "Flat Tabs",
16729
16621
  description: "Flat block hover and active states with a Swiss utility feel.",
16730
- supportedLayoutIds: supportedLayouts(["classic", "centered"]),
16731
- navTypography: "quiet-caps"
16622
+ supportedLayoutIds: supportedLayouts(["classic", "centered"])
16732
16623
  },
16733
16624
  {
16734
16625
  id: asHeaderStyleId("glass"),
16735
16626
  label: "Glass",
16736
16627
  description: "Translucent chrome with frosted navigation backing.",
16737
- supportedLayoutIds: supportedLayouts(["floating"]),
16738
- navTypography: "plain"
16628
+ supportedLayoutIds: supportedLayouts(["floating"])
16739
16629
  },
16740
16630
  {
16741
16631
  id: asHeaderStyleId("minimal-surface"),
16742
16632
  label: "Clear Split",
16743
16633
  description: "Floating logo with transparent navigation and no shared shell.",
16744
- supportedLayoutIds: supportedLayouts(["floating"]),
16745
- navTypography: "plain",
16746
- openingForegroundTarget: "all",
16747
- scrollTreatment: "contrast-glass",
16748
- interactionPalette: clearSplitInteractionPalette
16634
+ supportedLayoutIds: supportedLayouts(["floating"])
16749
16635
  },
16750
16636
  {
16751
16637
  id: asHeaderStyleId("soft-shell"),
16752
16638
  label: "Soft Shell",
16753
16639
  description: "Floating rounded shell with soft pill navigation states.",
16754
- supportedLayoutIds: supportedLayouts(["floating"]),
16755
- navTypography: "plain"
16640
+ supportedLayoutIds: supportedLayouts(["floating"])
16756
16641
  },
16757
16642
  {
16758
16643
  id: asHeaderStyleId("split-glass"),
16759
16644
  label: "Split Glass",
16760
16645
  description: "Logo floats independently while the navigation sits in a glass rail.",
16761
- supportedLayoutIds: supportedLayouts(["floating"]),
16762
- navTypography: "quiet-caps",
16763
- openingForegroundTarget: "brand-only"
16646
+ supportedLayoutIds: supportedLayouts(["floating"])
16764
16647
  },
16765
16648
  {
16766
16649
  id: asHeaderStyleId("split-pill"),
16767
16650
  label: "Split Pill",
16768
16651
  description: "Logo floats independently with a soft pill-backed navigation rail.",
16769
- supportedLayoutIds: supportedLayouts(["floating"]),
16770
- navTypography: "heading",
16771
- openingForegroundTarget: "brand-only"
16652
+ supportedLayoutIds: supportedLayouts(["floating"])
16772
16653
  }
16773
16654
  ]);
16774
16655
  const headerLayoutsById = new Map(headerLayoutCatalog.map((layout) => [layout.id, layout]));
@@ -16955,6 +16836,449 @@ function resolveHeaderLayoutStyleSelection(selection) {
16955
16836
  };
16956
16837
  }
16957
16838
 
16839
+ //#endregion
16840
+ //#region ../theme-core/src/site-styles/headerInteractionPalette.ts
16841
+ const clearSplitInteractionPalette = defineLookOptionGroup({
16842
+ id: "interaction-palette",
16843
+ label: "Hover colour",
16844
+ defaultOptionId: "accent",
16845
+ options: [
16846
+ {
16847
+ id: "accent",
16848
+ label: "Accent"
16849
+ },
16850
+ {
16851
+ id: "primary",
16852
+ label: "Primary"
16853
+ },
16854
+ {
16855
+ id: "secondary",
16856
+ label: "Secondary"
16857
+ }
16858
+ ]
16859
+ });
16860
+ function resolveHeaderInteractionPaletteControl(group, preference) {
16861
+ if (!group) return { kind: "unavailable" };
16862
+ if (preference === "recommended") {
16863
+ const resolution$1 = resolveLookOption(group, undefined);
16864
+ return availableControlState(group, preference, resolution$1.option.id, null);
16865
+ }
16866
+ const resolution = resolveHeaderInteractionPalette(group, preference);
16867
+ return availableControlState(group, preference, resolution.option.id, resolution.kind === "repaired" ? {
16868
+ requested: preference,
16869
+ fallback: resolution.option.id,
16870
+ reason: resolution.reason
16871
+ } : null);
16872
+ }
16873
+ function availableControlState(group, preference, effectivePalette, repair$1) {
16874
+ return {
16875
+ kind: "available",
16876
+ preference,
16877
+ effectivePalette,
16878
+ options: [{
16879
+ value: "recommended",
16880
+ label: `Recommended (${defaultOptionLabel(group)})`
16881
+ }, ...group.options.map((option) => ({
16882
+ value: option.id,
16883
+ label: option.label
16884
+ }))],
16885
+ repair: repair$1
16886
+ };
16887
+ }
16888
+ function applyHeaderInteractionPalette(header, group, preference) {
16889
+ if (!group) return header;
16890
+ if (!header.navLinkStyle) {
16891
+ throw new Error(`Header interaction palette "${group.id}" requires a nav link style.`);
16892
+ }
16893
+ const palette = resolveHeaderInteractionPalette(group, preference).option.id;
16894
+ const pair = headerInteractionPalettePair(palette);
16895
+ const pillEffect = {
16896
+ effectId: "background-on-hover",
16897
+ options: {
16898
+ colorToken: pair.backgroundToken,
16899
+ textColorToken: pair.foregroundToken
16900
+ }
16901
+ };
16902
+ return {
16903
+ ...header,
16904
+ navLinkStyle: {
16905
+ ...header.navLinkStyle,
16906
+ hoverColorToken: null,
16907
+ borderRadius: "full",
16908
+ effects: {
16909
+ ...header.navLinkStyle.effects,
16910
+ hover: [pillEffect],
16911
+ focus: [pillEffect]
16912
+ }
16913
+ }
16914
+ };
16915
+ }
16916
+ function resolveHeaderInteractionPalette(group, preference) {
16917
+ return resolveLookOption(group, preference === "recommended" ? undefined : preference);
16918
+ }
16919
+ function defaultOptionLabel(group) {
16920
+ return resolveLookOption(group, undefined).option.label;
16921
+ }
16922
+
16923
+ //#endregion
16924
+ //#region ../theme-core/src/site-styles/headerStyleDefaults.ts
16925
+ /**
16926
+ * A style either takes the default recipe or authors a complete one. This is
16927
+ * deliberately not a deep merge: the same "declare the variant or fall back"
16928
+ * rule cards use, so a half-authored recipe cannot exist.
16929
+ */
16930
+ function resolveHeaderStyleRecipe(siteStyle, styleId) {
16931
+ return siteStyle?.headerStyleRecipes?.[styleId] ?? defaultHeaderStyleRecipes[styleId];
16932
+ }
16933
+ /**
16934
+ * The default header appearance for every catalogue style id (#1318).
16935
+ *
16936
+ * This is the only id-keyed structure in the header appearance pipeline, and it
16937
+ * is data rather than dispatch — the same shape `cards/siteStyleDefaults.ts`
16938
+ * uses. A site style that wants a different header takes over an entry here
16939
+ * with its own recipe; it does not add a branch anywhere.
16940
+ *
16941
+ * `navWeight` (the bar) and `navLinkWeight` (the link text) are separate fields
16942
+ * and they disagree on five styles. That disagreement is real and pre-existing;
16943
+ * it is spelled out here rather than left implicit in a helper default. See the
16944
+ * note on `HeaderStyleRecipeCore.navLinkWeight`.
16945
+ */
16946
+ const defaultHeaderStyleRecipes = {
16947
+ minimal: {
16948
+ tone: "neutral",
16949
+ background: {
16950
+ kind: "token",
16951
+ token: "surface"
16952
+ },
16953
+ nav: {
16954
+ kind: "minimal",
16955
+ hoverColorToken: "primary"
16956
+ },
16957
+ navWeight: "medium",
16958
+ navLinkWeight: "medium",
16959
+ navTypography: "plain",
16960
+ border: "none",
16961
+ shadow: { kind: "absent" },
16962
+ frame: { kind: "none" },
16963
+ cta: { treatment: "default" }
16964
+ },
16965
+ "fine-line": {
16966
+ tone: "neutral",
16967
+ background: {
16968
+ kind: "token",
16969
+ token: "surface"
16970
+ },
16971
+ nav: {
16972
+ kind: "underline",
16973
+ hover: "underline"
16974
+ },
16975
+ navWeight: "medium",
16976
+ navLinkWeight: "medium",
16977
+ navTypography: "plain",
16978
+ border: "none",
16979
+ shadow: { kind: "absent" },
16980
+ frame: { kind: "none" },
16981
+ cta: { treatment: "outline" }
16982
+ },
16983
+ "soft-bar": {
16984
+ tone: "neutral",
16985
+ background: {
16986
+ kind: "token",
16987
+ token: "surfaceAlt"
16988
+ },
16989
+ nav: {
16990
+ kind: "pill",
16991
+ backing: "capsule",
16992
+ hoverColorToken: "primary",
16993
+ hoverAlpha: 8
16994
+ },
16995
+ navWeight: "medium",
16996
+ navLinkWeight: "medium",
16997
+ navTypography: "plain",
16998
+ border: "bottom",
16999
+ shadow: { kind: "absent" },
17000
+ frame: { kind: "none" },
17001
+ cta: { treatment: "default" }
17002
+ },
17003
+ "pill-nav": {
17004
+ tone: "neutral",
17005
+ background: {
17006
+ kind: "token",
17007
+ token: "surface"
17008
+ },
17009
+ nav: {
17010
+ kind: "pill",
17011
+ backing: "capsule",
17012
+ hoverColorToken: "primary",
17013
+ hoverAlpha: 10
17014
+ },
17015
+ navWeight: "medium",
17016
+ navLinkWeight: "medium",
17017
+ navTypography: "plain",
17018
+ border: "none",
17019
+ shadow: { kind: "absent" },
17020
+ frame: {
17021
+ kind: "nav-container",
17022
+ type: "pill",
17023
+ tint: "surfaceAlt",
17024
+ opacity: .7
17025
+ },
17026
+ cta: { treatment: "default" }
17027
+ },
17028
+ "brand-bar": {
17029
+ tone: "brand",
17030
+ background: {
17031
+ kind: "token",
17032
+ token: "primary"
17033
+ },
17034
+ nav: {
17035
+ kind: "minimal",
17036
+ hoverColorToken: "secondary"
17037
+ },
17038
+ navWeight: "semibold",
17039
+ navLinkWeight: "medium",
17040
+ navTypography: "brand-caps",
17041
+ border: "none",
17042
+ shadow: { kind: "absent" },
17043
+ frame: { kind: "none" },
17044
+ cta: { treatment: "inverted" }
17045
+ },
17046
+ "brand-underline": {
17047
+ tone: "brand",
17048
+ background: {
17049
+ kind: "token",
17050
+ token: "primary"
17051
+ },
17052
+ nav: {
17053
+ kind: "underline",
17054
+ hover: "both",
17055
+ hoverColorToken: "secondary",
17056
+ underlineColorToken: "secondary"
17057
+ },
17058
+ navWeight: "bold",
17059
+ navLinkWeight: "bold",
17060
+ navTypography: "brand-caps",
17061
+ border: "none",
17062
+ shadow: { kind: "absent" },
17063
+ frame: { kind: "none" },
17064
+ cta: {
17065
+ treatment: "inverted",
17066
+ gap: "compact"
17067
+ }
17068
+ },
17069
+ "brand-pill": {
17070
+ tone: "brand",
17071
+ background: {
17072
+ kind: "token",
17073
+ token: "primary"
17074
+ },
17075
+ nav: {
17076
+ kind: "pill",
17077
+ backing: "capsule",
17078
+ hoverColorToken: "primaryForeground",
17079
+ hoverAlpha: 14
17080
+ },
17081
+ navWeight: "semibold",
17082
+ navLinkWeight: "medium",
17083
+ navTypography: "brand-caps",
17084
+ border: "none",
17085
+ shadow: { kind: "absent" },
17086
+ frame: { kind: "none" },
17087
+ cta: { treatment: "inverted" },
17088
+ onFloating: {
17089
+ background: { kind: "transparent" },
17090
+ frame: {
17091
+ kind: "container",
17092
+ rounded: "2xl",
17093
+ padding: "sm",
17094
+ tint: "primary",
17095
+ opacity: .95
17096
+ }
17097
+ }
17098
+ },
17099
+ "brand-capsule": {
17100
+ tone: "brand",
17101
+ background: {
17102
+ kind: "token",
17103
+ token: "primary"
17104
+ },
17105
+ nav: {
17106
+ kind: "pill",
17107
+ backing: "capsule",
17108
+ hoverColorToken: "primaryForeground",
17109
+ hoverAlpha: 16
17110
+ },
17111
+ navWeight: "semibold",
17112
+ navLinkWeight: "medium",
17113
+ navTypography: "quiet-caps",
17114
+ border: "none",
17115
+ shadow: {
17116
+ kind: "fixed",
17117
+ elevation: "md"
17118
+ },
17119
+ frame: { kind: "none" },
17120
+ cta: { treatment: "inverted" }
17121
+ },
17122
+ "serif-line": {
17123
+ tone: "neutral",
17124
+ background: {
17125
+ kind: "token",
17126
+ token: "background"
17127
+ },
17128
+ nav: {
17129
+ kind: "underline",
17130
+ hover: "underline"
17131
+ },
17132
+ navWeight: "medium",
17133
+ navLinkWeight: "medium",
17134
+ navTypography: "heading",
17135
+ border: "none",
17136
+ shadow: { kind: "explicit-none" },
17137
+ frame: { kind: "none" },
17138
+ cta: {
17139
+ treatment: "outline",
17140
+ gap: "relaxed"
17141
+ },
17142
+ logo: {
17143
+ fontFamily: "heading",
17144
+ letterSpacing: "wide",
17145
+ gradient: false
17146
+ }
17147
+ },
17148
+ "flat-tabs": {
17149
+ tone: "neutral",
17150
+ background: {
17151
+ kind: "token",
17152
+ token: "surface"
17153
+ },
17154
+ nav: { kind: "flat-tab" },
17155
+ navWeight: "semibold",
17156
+ navLinkWeight: "semibold",
17157
+ navTypography: "quiet-caps",
17158
+ border: "bottom",
17159
+ shadow: { kind: "themed" },
17160
+ frame: { kind: "none" },
17161
+ cta: {
17162
+ treatment: "primary",
17163
+ gap: "compact"
17164
+ }
17165
+ },
17166
+ glass: {
17167
+ tone: "neutral",
17168
+ background: { kind: "transparent" },
17169
+ nav: {
17170
+ kind: "pill",
17171
+ backing: "frosted",
17172
+ hoverColorToken: "primary",
17173
+ hoverAlpha: 8
17174
+ },
17175
+ navWeight: "semibold",
17176
+ navLinkWeight: "medium",
17177
+ navTypography: "plain",
17178
+ border: "none",
17179
+ shadow: { kind: "absent" },
17180
+ frame: {
17181
+ kind: "container",
17182
+ rounded: "2xl",
17183
+ padding: "sm",
17184
+ tint: "surface",
17185
+ opacity: .4
17186
+ },
17187
+ cta: { treatment: "default" }
17188
+ },
17189
+ "minimal-surface": {
17190
+ tone: "neutral",
17191
+ background: { kind: "transparent" },
17192
+ nav: {
17193
+ kind: "minimal",
17194
+ hoverColorToken: "primary"
17195
+ },
17196
+ navWeight: "medium",
17197
+ navLinkWeight: "medium",
17198
+ navTypography: "plain",
17199
+ border: "none",
17200
+ shadow: { kind: "absent" },
17201
+ frame: { kind: "none" },
17202
+ cta: { treatment: "default" },
17203
+ navLinkExtras: {
17204
+ textSize: "lg",
17205
+ contrastTreatment: "soft-glow"
17206
+ },
17207
+ openingForeground: "all",
17208
+ scrollTreatment: "contrast-glass",
17209
+ interactionPalette: clearSplitInteractionPalette
17210
+ },
17211
+ "soft-shell": {
17212
+ tone: "neutral",
17213
+ background: { kind: "transparent" },
17214
+ nav: {
17215
+ kind: "pill",
17216
+ backing: "capsule",
17217
+ hoverColorToken: "primary",
17218
+ hoverAlpha: 8
17219
+ },
17220
+ navWeight: "medium",
17221
+ navLinkWeight: "medium",
17222
+ navTypography: "plain",
17223
+ border: "none",
17224
+ shadow: { kind: "absent" },
17225
+ frame: {
17226
+ kind: "container",
17227
+ rounded: "2xl",
17228
+ padding: "md",
17229
+ tint: "surfaceAlt",
17230
+ opacity: .95
17231
+ },
17232
+ cta: { treatment: "default" }
17233
+ },
17234
+ "split-glass": {
17235
+ tone: "neutral",
17236
+ background: { kind: "transparent" },
17237
+ nav: {
17238
+ kind: "pill",
17239
+ backing: "frosted",
17240
+ hoverColorToken: "primary",
17241
+ hoverAlpha: 8
17242
+ },
17243
+ navWeight: "semibold",
17244
+ navLinkWeight: "medium",
17245
+ navTypography: "quiet-caps",
17246
+ border: "none",
17247
+ shadow: { kind: "absent" },
17248
+ frame: {
17249
+ kind: "nav-container",
17250
+ type: "glass",
17251
+ tint: "surface",
17252
+ opacity: .4
17253
+ },
17254
+ cta: { treatment: "default" },
17255
+ openingForeground: "brand-only"
17256
+ },
17257
+ "split-pill": {
17258
+ tone: "neutral",
17259
+ background: { kind: "transparent" },
17260
+ nav: {
17261
+ kind: "pill",
17262
+ backing: "capsule",
17263
+ hoverColorToken: "primary",
17264
+ hoverAlpha: 10
17265
+ },
17266
+ navWeight: "medium",
17267
+ navLinkWeight: "medium",
17268
+ navTypography: "heading",
17269
+ border: "none",
17270
+ shadow: { kind: "absent" },
17271
+ frame: {
17272
+ kind: "nav-container",
17273
+ type: "pill",
17274
+ tint: "surface",
17275
+ opacity: .94
17276
+ },
17277
+ cta: { treatment: "default" },
17278
+ openingForeground: "brand-only"
17279
+ }
17280
+ };
17281
+
16958
17282
  //#endregion
16959
17283
  //#region ../theme-core/src/site-styles/headerNavStyles.ts
16960
17284
  function applyNavTypography(style, typography) {
@@ -17078,95 +17402,133 @@ function flatTabNavLinkStyle(colorToken, typography = "plain") {
17078
17402
  }
17079
17403
 
17080
17404
  //#endregion
17081
- //#region ../theme-core/src/site-styles/headerStyleCompiler.ts
17082
- function headerForLayout(theme, layout) {
17083
- return {
17084
- ...baseHeader(theme),
17085
- variant: layout.variant,
17086
- positioning: layout.defaultPositioning,
17087
- shrinkOnScroll: layout.shrinkOnScroll,
17088
- ctaGap: layout.id === asHeaderLayoutId("floating") ? "compact" : "default",
17089
- logoText: layout.id === asHeaderLayoutId("classic") ? {
17090
- mobileMaxWidth: "sm",
17091
- mobileWrapLines: 1,
17092
- hideOnShrink: false
17093
- } : undefined
17094
- };
17405
+ //#region ../theme-core/src/site-styles/headerStyleRecipe.ts
17406
+ function effectiveRecipe(layout, recipe) {
17407
+ return layout.id === asHeaderLayoutId("floating") && recipe.onFloating ? {
17408
+ ...recipe,
17409
+ ...recipe.onFloating
17410
+ } : recipe;
17095
17411
  }
17096
- function brandHeaderForeground() {
17097
- return {
17098
- textColor: "primaryForeground",
17099
- navColor: "primaryForeground"
17100
- };
17412
+ /**
17413
+ * One token drives the header text, the nav text and the nav link colour: they
17414
+ * are the same decision, and splitting them was how they could disagree.
17415
+ */
17416
+ function toneColorToken(tone) {
17417
+ switch (tone) {
17418
+ case "neutral": return "text";
17419
+ case "brand": return "primaryForeground";
17420
+ default: return assertNever$5(tone, "Unhandled header tone recipe");
17421
+ }
17101
17422
  }
17102
- function neutralDropdownStyle() {
17103
- return {
17104
- background: "surface",
17105
- textColor: "text",
17106
- borderColor: "border",
17107
- shadow: "md",
17108
- borderRadius: "md",
17109
- textTransform: "none",
17110
- letterSpacing: "normal"
17111
- };
17423
+ function toneDropdownStyle(tone) {
17424
+ switch (tone) {
17425
+ case "neutral": return {
17426
+ background: "surface",
17427
+ textColor: "text",
17428
+ borderColor: "border",
17429
+ shadow: "md",
17430
+ borderRadius: "md",
17431
+ textTransform: "none",
17432
+ letterSpacing: "normal"
17433
+ };
17434
+ case "brand": return {
17435
+ background: "primary-700",
17436
+ textColor: "primaryForeground",
17437
+ borderColor: null,
17438
+ shadow: "md",
17439
+ borderRadius: "md",
17440
+ hoverBackground: "primary-900",
17441
+ hoverTextColor: "secondary",
17442
+ textTransform: "uppercase",
17443
+ letterSpacing: "wider",
17444
+ fontWeight: "bold",
17445
+ textSize: "sm"
17446
+ };
17447
+ default: return assertNever$5(tone, "Unhandled header tone recipe");
17448
+ }
17112
17449
  }
17113
- function brandDropdownStyle() {
17114
- return {
17115
- background: "primary-700",
17116
- textColor: "primaryForeground",
17117
- borderColor: null,
17118
- shadow: "md",
17119
- borderRadius: "md",
17120
- hoverBackground: "primary-900",
17121
- hoverTextColor: "secondary",
17122
- textTransform: "uppercase",
17123
- letterSpacing: "wider",
17124
- fontWeight: "bold",
17125
- textSize: "sm"
17126
- };
17450
+ function recipeBackground(background) {
17451
+ switch (background.kind) {
17452
+ case "token": return {
17453
+ type: "color",
17454
+ color: background.token
17455
+ };
17456
+ case "transparent": return {
17457
+ type: "color",
17458
+ color: "transparent"
17459
+ };
17460
+ default: return assertNever$5(background, "Unhandled header background recipe");
17461
+ }
17127
17462
  }
17128
- function noHeaderBorder() {
17129
- return {
17130
- style: "solid",
17131
- width: "none",
17132
- position: "none"
17133
- };
17463
+ function recipeBorder(border$1) {
17464
+ switch (border$1) {
17465
+ case "none": return {
17466
+ style: "solid",
17467
+ width: "none",
17468
+ position: "none"
17469
+ };
17470
+ case "bottom": return {
17471
+ style: "solid",
17472
+ width: "thin",
17473
+ position: "bottom",
17474
+ colorToken: "border"
17475
+ };
17476
+ default: return assertNever$5(border$1, "Unhandled header border recipe");
17477
+ }
17134
17478
  }
17135
- function bottomHeaderBorder() {
17136
- return {
17137
- style: "solid",
17138
- width: "thin",
17139
- position: "bottom",
17140
- colorToken: "border"
17141
- };
17479
+ function recipeNavStyle(nav) {
17480
+ switch (nav.kind) {
17481
+ case "minimal": return "minimal";
17482
+ case "underline": return "underline-grow";
17483
+ case "pill": return nav.backing;
17484
+ case "flat-tab": return "solid";
17485
+ default: return assertNever$5(nav, "Unhandled header nav recipe");
17486
+ }
17142
17487
  }
17143
- function colorHeaderBackground(color) {
17144
- return {
17145
- type: "color",
17146
- color
17488
+ function underlineHoverEffects(nav) {
17489
+ const underline = {
17490
+ effectId: "nav-underline",
17491
+ options: {
17492
+ style: "grow",
17493
+ ...nav.underlineColorToken ? { colorToken: nav.underlineColorToken } : {}
17494
+ }
17147
17495
  };
17496
+ switch (nav.hover) {
17497
+ case "underline": return [underline];
17498
+ case "colour": return [{
17499
+ effectId: "text-color-change",
17500
+ options: { hoverColorToken: nav.hoverColorToken }
17501
+ }];
17502
+ case "both": return [{
17503
+ effectId: "text-color-change",
17504
+ options: { hoverColorToken: nav.hoverColorToken }
17505
+ }, underline];
17506
+ default: return assertNever$5(nav, "Unhandled underline nav hover affordance");
17507
+ }
17148
17508
  }
17149
- function neutralHeaderBase() {
17509
+ function underlineNavLink(nav, colorToken, typography) {
17510
+ const base = underlineNavLinkStyle(colorToken, nav.underlineColorToken, typography);
17150
17511
  return {
17151
- textColor: "text",
17152
- navColor: "text",
17153
- dropdownStyle: neutralDropdownStyle()
17512
+ ...base,
17513
+ ...nav.hover === "underline" ? {} : { hoverColorToken: nav.hoverColorToken },
17514
+ effects: {
17515
+ ...base.effects,
17516
+ hover: underlineHoverEffects(nav)
17517
+ }
17154
17518
  };
17155
17519
  }
17156
- function transparentHeaderBackground() {
17157
- return colorHeaderBackground("transparent");
17158
- }
17159
- function floatingContainer(input) {
17160
- return {
17161
- rounded: input.rounded,
17162
- border: true,
17163
- shadow: true,
17164
- padding: input.padding,
17165
- tint: input.tint,
17166
- opacity: input.opacity
17167
- };
17520
+ function recipeNavLinkStyle(recipe) {
17521
+ const colorToken = toneColorToken(recipe.tone);
17522
+ const nav = recipe.nav;
17523
+ switch (nav.kind) {
17524
+ case "minimal": return minimalNavLinkStyle(colorToken, nav.hoverColorToken, recipe.navTypography);
17525
+ case "underline": return underlineNavLink(nav, colorToken, recipe.navTypography);
17526
+ case "pill": return pillNavLinkStyle(colorToken, nav.hoverColorToken, nav.hoverAlpha, recipe.navTypography);
17527
+ case "flat-tab": return flatTabNavLinkStyle(colorToken, recipe.navTypography);
17528
+ default: return assertNever$5(nav, "Unhandled header nav recipe");
17529
+ }
17168
17530
  }
17169
- function themedHeaderShadow(theme) {
17531
+ function themedShadow(theme) {
17170
17532
  switch (theme.shadow.elevation) {
17171
17533
  case "none": return undefined;
17172
17534
  case "low": return { elevation: "sm" };
@@ -17175,248 +17537,120 @@ function themedHeaderShadow(theme) {
17175
17537
  default: return assertNever$5(theme.shadow.elevation, "Unhandled theme shadow elevation");
17176
17538
  }
17177
17539
  }
17178
- function brandSurfaceBase(theme, header) {
17179
- const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
17540
+ function recipeShadow(shadow$1, theme) {
17541
+ switch (shadow$1.kind) {
17542
+ case "absent": return {};
17543
+ case "explicit-none": return { shadow: { elevation: "none" } };
17544
+ case "fixed": return { shadow: { elevation: shadow$1.elevation } };
17545
+ case "themed": {
17546
+ const resolved = themedShadow(theme);
17547
+ return resolved ? { shadow: resolved } : {};
17548
+ }
17549
+ default: return assertNever$5(shadow$1, "Unhandled header shadow recipe");
17550
+ }
17551
+ }
17552
+ /**
17553
+ * `{kind: 'none'}` writes nothing: the base header already carries the
17554
+ * `{type: 'none', tint: null, opacity: 0.15}` nav container default, and
17555
+ * omitting the key would be a different JSON.
17556
+ */
17557
+ function recipeFrame(frame) {
17558
+ switch (frame.kind) {
17559
+ case "none": return {};
17560
+ case "container": return { container: {
17561
+ rounded: frame.rounded,
17562
+ border: true,
17563
+ shadow: true,
17564
+ padding: frame.padding,
17565
+ tint: frame.tint,
17566
+ opacity: frame.opacity
17567
+ } };
17568
+ case "nav-container": return { navContainer: {
17569
+ type: frame.type,
17570
+ tint: frame.tint,
17571
+ opacity: frame.opacity
17572
+ } };
17573
+ default: return assertNever$5(frame, "Unhandled header frame recipe");
17574
+ }
17575
+ }
17576
+ /**
17577
+ * `ctaVariant` is spread conditionally everywhere, which is byte-safe for the
17578
+ * nine `'default'` styles only because `resolveHeaderCtaVariant(theme,
17579
+ * 'default')` returns `undefined`. The compiler used to mix a conditional
17580
+ * spread with three direct assignments; the difference was invisible in
17581
+ * persisted JSON and visible to an in-memory `toEqual`, so it is normalised
17582
+ * here (ledger D1).
17583
+ */
17584
+ function recipeCta(cta, theme) {
17585
+ const variant = resolveHeaderCtaVariant(theme, cta.treatment);
17180
17586
  return {
17181
- ...header,
17182
- ...brandHeaderForeground(),
17183
- background: colorHeaderBackground("primary"),
17184
- dropdownStyle: brandDropdownStyle(),
17185
- border: noHeaderBorder(),
17186
- ctaTreatment: "inverted",
17187
- ...ctaVariant ? { ctaVariant } : {}
17587
+ ctaTreatment: cta.treatment,
17588
+ ...variant ? { ctaVariant: variant } : {},
17589
+ ...cta.gap ? { ctaGap: cta.gap } : {}
17188
17590
  };
17189
17591
  }
17190
- function floatingSurfaceBase(header) {
17592
+ /** Layout-derived structure. The only part of the header a recipe cannot reach. */
17593
+ function headerForLayout(theme, layout) {
17191
17594
  return {
17192
- ...header,
17193
- background: transparentHeaderBackground(),
17194
- border: noHeaderBorder()
17195
- };
17196
- }
17197
- function applyBasicHeaderStyle(id, theme, header, style) {
17198
- switch (id) {
17199
- case "minimal": return {
17200
- ...header,
17201
- ...neutralHeaderBase(),
17202
- background: colorHeaderBackground("surface"),
17203
- navStyle: "minimal",
17204
- navWeight: "medium",
17205
- navLinkStyle: minimalNavLinkStyle("text", "primary", style.navTypography),
17206
- border: noHeaderBorder(),
17207
- ctaTreatment: "default"
17208
- };
17209
- case "fine-line": return {
17210
- ...header,
17211
- ...neutralHeaderBase(),
17212
- background: colorHeaderBackground("surface"),
17213
- navStyle: "underline-grow",
17214
- navWeight: "medium",
17215
- navLinkStyle: underlineNavLinkStyle("text", undefined, style.navTypography),
17216
- border: noHeaderBorder(),
17217
- ctaTreatment: "outline",
17218
- ctaVariant: resolveHeaderCtaVariant(theme, "outline")
17219
- };
17220
- case "soft-bar": return {
17221
- ...header,
17222
- ...neutralHeaderBase(),
17223
- background: colorHeaderBackground("surfaceAlt"),
17224
- navStyle: "capsule",
17225
- navWeight: "medium",
17226
- navLinkStyle: pillNavLinkStyle("text", "primary", 8, style.navTypography),
17227
- border: bottomHeaderBorder(),
17228
- ctaTreatment: "default"
17229
- };
17230
- case "pill-nav": return {
17231
- ...header,
17232
- ...neutralHeaderBase(),
17233
- background: colorHeaderBackground("surface"),
17234
- navStyle: "capsule",
17235
- navWeight: "medium",
17236
- navLinkStyle: pillNavLinkStyle("text", "primary", 10, style.navTypography),
17237
- navContainer: {
17238
- type: "pill",
17239
- tint: "surfaceAlt",
17240
- opacity: .7
17241
- },
17242
- border: noHeaderBorder(),
17243
- ctaTreatment: "default"
17244
- };
17245
- default: return assertNever$5(id, "Unhandled basic header style id");
17246
- }
17247
- }
17248
- function applyBrandHeaderStyle(id, theme, header, style) {
17249
- switch (id) {
17250
- case "brand-bar": return {
17251
- ...brandSurfaceBase(theme, header),
17252
- navStyle: "minimal",
17253
- navWeight: "semibold",
17254
- navLinkStyle: minimalNavLinkStyle("primaryForeground", "secondary", style.navTypography)
17255
- };
17256
- case "brand-underline": return {
17257
- ...brandSurfaceBase(theme, header),
17258
- navStyle: "underline-grow",
17259
- navWeight: "bold",
17260
- navLinkStyle: underlineNavLinkStyle("primaryForeground", "secondary", style.navTypography)
17261
- };
17262
- case "brand-pill": return {
17263
- ...brandSurfaceBase(theme, header),
17264
- ...header.variant === "floating" ? {
17265
- background: transparentHeaderBackground(),
17266
- container: floatingContainer({
17267
- rounded: "2xl",
17268
- padding: "sm",
17269
- tint: "primary",
17270
- opacity: .95
17271
- })
17272
- } : {},
17273
- navStyle: "capsule",
17274
- navWeight: "semibold",
17275
- navLinkStyle: pillNavLinkStyle("primaryForeground", "primaryForeground", 14, style.navTypography)
17276
- };
17277
- case "brand-capsule": return {
17278
- ...brandSurfaceBase(theme, header),
17279
- navStyle: "capsule",
17280
- navWeight: "semibold",
17281
- navLinkStyle: pillNavLinkStyle("primaryForeground", "primaryForeground", 16, style.navTypography),
17282
- shadow: { elevation: "md" }
17283
- };
17284
- default: return assertNever$5(id, "Unhandled brand header style id");
17285
- }
17286
- }
17287
- function applyEditorialHeaderStyle(id, theme, header, style) {
17288
- switch (id) {
17289
- case "serif-line": return {
17290
- ...header,
17291
- ...neutralHeaderBase(),
17292
- background: colorHeaderBackground("background"),
17293
- navStyle: "underline-grow",
17294
- navWeight: "medium",
17295
- navLinkStyle: underlineNavLinkStyle("text", undefined, style.navTypography),
17296
- border: noHeaderBorder(),
17297
- shadow: { elevation: "none" },
17298
- logo: {
17299
- fontFamily: "heading",
17300
- letterSpacing: "wide",
17301
- gradient: false
17302
- },
17303
- ctaTreatment: "outline",
17304
- ctaVariant: resolveHeaderCtaVariant(theme, "outline"),
17305
- ctaGap: "relaxed"
17306
- };
17307
- case "flat-tabs": return {
17308
- ...header,
17309
- ...neutralHeaderBase(),
17310
- background: colorHeaderBackground("surface"),
17311
- navStyle: "solid",
17312
- navWeight: "semibold",
17313
- navLinkStyle: flatTabNavLinkStyle("text", style.navTypography),
17314
- border: bottomHeaderBorder(),
17315
- shadow: themedHeaderShadow(theme),
17316
- ctaTreatment: "primary",
17317
- ctaVariant: resolveHeaderCtaVariant(theme, "primary"),
17318
- ctaGap: "compact"
17319
- };
17320
- default: return assertNever$5(id, "Unhandled editorial header style id");
17321
- }
17322
- }
17323
- function applyFloatingHeaderStyle(id, header, style) {
17324
- switch (id) {
17325
- case "glass": return {
17326
- ...floatingSurfaceBase(header),
17327
- ...neutralHeaderBase(),
17328
- navStyle: "frosted",
17329
- navWeight: "semibold",
17330
- navLinkStyle: pillNavLinkStyle("text", "primary", 8, style.navTypography),
17331
- container: floatingContainer({
17332
- rounded: "2xl",
17333
- padding: "sm",
17334
- tint: "surface",
17335
- opacity: .4
17336
- }),
17337
- ctaTreatment: "default"
17338
- };
17339
- case "minimal-surface": return {
17340
- ...floatingSurfaceBase(header),
17341
- ...neutralHeaderBase(),
17342
- navStyle: "minimal",
17343
- navWeight: "medium",
17344
- navLinkStyle: {
17345
- ...minimalNavLinkStyle("text", "primary", style.navTypography),
17346
- textSize: "lg",
17347
- contrastTreatment: "soft-glow"
17348
- },
17349
- ctaTreatment: "default"
17350
- };
17351
- case "soft-shell": return {
17352
- ...floatingSurfaceBase(header),
17353
- ...neutralHeaderBase(),
17354
- navStyle: "capsule",
17355
- navWeight: "medium",
17356
- navLinkStyle: pillNavLinkStyle("text", "primary", 8, style.navTypography),
17357
- container: floatingContainer({
17358
- rounded: "2xl",
17359
- padding: "md",
17360
- tint: "surfaceAlt",
17361
- opacity: .95
17362
- }),
17363
- ctaTreatment: "default"
17364
- };
17365
- case "split-glass": return {
17366
- ...floatingSurfaceBase(header),
17367
- ...neutralHeaderBase(),
17368
- navStyle: "frosted",
17369
- navWeight: "semibold",
17370
- navLinkStyle: pillNavLinkStyle("text", "primary", 8, style.navTypography),
17371
- navContainer: {
17372
- type: "glass",
17373
- tint: "surface",
17374
- opacity: .4
17375
- },
17376
- ctaTreatment: "default"
17377
- };
17378
- case "split-pill": return {
17379
- ...floatingSurfaceBase(header),
17380
- ...neutralHeaderBase(),
17381
- navStyle: "capsule",
17382
- navWeight: "medium",
17383
- navLinkStyle: pillNavLinkStyle("text", "primary", 10, style.navTypography),
17384
- navContainer: {
17385
- type: "pill",
17386
- tint: "surface",
17387
- opacity: .94
17388
- },
17389
- ctaTreatment: "default"
17390
- };
17391
- default: return assertNever$5(id, "Unhandled floating header style id");
17392
- }
17393
- }
17394
- const headerStyleCompilers = {
17395
- minimal: (theme, header, style) => applyBasicHeaderStyle("minimal", theme, header, style),
17396
- "fine-line": (theme, header, style) => applyBasicHeaderStyle("fine-line", theme, header, style),
17397
- "soft-bar": (theme, header, style) => applyBasicHeaderStyle("soft-bar", theme, header, style),
17398
- "pill-nav": (theme, header, style) => applyBasicHeaderStyle("pill-nav", theme, header, style),
17399
- "brand-bar": (theme, header, style) => applyBrandHeaderStyle("brand-bar", theme, header, style),
17400
- "brand-underline": (theme, header, style) => applyBrandHeaderStyle("brand-underline", theme, header, style),
17401
- "brand-pill": (theme, header, style) => applyBrandHeaderStyle("brand-pill", theme, header, style),
17402
- "brand-capsule": (theme, header, style) => applyBrandHeaderStyle("brand-capsule", theme, header, style),
17403
- "serif-line": (theme, header, style) => applyEditorialHeaderStyle("serif-line", theme, header, style),
17404
- "flat-tabs": (theme, header, style) => applyEditorialHeaderStyle("flat-tabs", theme, header, style),
17405
- glass: (_theme, header, style) => applyFloatingHeaderStyle("glass", header, style),
17406
- "minimal-surface": (_theme, header, style) => applyFloatingHeaderStyle("minimal-surface", header, style),
17407
- "soft-shell": (_theme, header, style) => applyFloatingHeaderStyle("soft-shell", header, style),
17408
- "split-glass": (_theme, header, style) => applyFloatingHeaderStyle("split-glass", header, style),
17409
- "split-pill": (_theme, header, style) => applyFloatingHeaderStyle("split-pill", header, style)
17410
- };
17411
- function applyHeaderStyle(theme, header, style) {
17412
- return headerStyleCompilers[headerStyleIdValue(style.id)](theme, header, style);
17595
+ ...baseHeader(theme),
17596
+ variant: layout.variant,
17597
+ positioning: layout.defaultPositioning,
17598
+ shrinkOnScroll: layout.shrinkOnScroll,
17599
+ ctaGap: layout.id === asHeaderLayoutId("floating") ? "compact" : "default",
17600
+ logoText: layout.id === asHeaderLayoutId("classic") ? {
17601
+ mobileMaxWidth: "sm",
17602
+ mobileWrapLines: 1,
17603
+ hideOnShrink: false
17604
+ } : undefined
17605
+ };
17413
17606
  }
17414
- function headerStyleIdValue(id) {
17415
- return id;
17607
+ /**
17608
+ * The single header interpreter. Pure and total: same `(theme, layout, recipe)`
17609
+ * in, same object out, no throws of its own.
17610
+ */
17611
+ function compileHeaderRecipe(theme, layout, recipe) {
17612
+ const effective = effectiveRecipe(layout, recipe);
17613
+ const navLinkStyle = recipeNavLinkStyle(effective);
17614
+ return {
17615
+ ...headerForLayout(theme, layout),
17616
+ textColor: toneColorToken(effective.tone),
17617
+ navColor: toneColorToken(effective.tone),
17618
+ dropdownStyle: toneDropdownStyle(effective.tone),
17619
+ background: recipeBackground(effective.background),
17620
+ border: recipeBorder(effective.border),
17621
+ navStyle: recipeNavStyle(effective.nav),
17622
+ navWeight: effective.navWeight,
17623
+ navLinkStyle: {
17624
+ ...navLinkStyle,
17625
+ fontWeight: effective.navLinkWeight,
17626
+ ...effective.navLinkExtras ?? {}
17627
+ },
17628
+ ...recipeShadow(effective.shadow, theme),
17629
+ ...recipeFrame(effective.frame),
17630
+ ...effective.logo ? { logo: effective.logo } : {},
17631
+ ...recipeCta(effective.cta, theme)
17632
+ };
17416
17633
  }
17417
- function compileHeaderLayoutStyleSelection(theme, resolution) {
17418
- const header = applyHeaderStyle(theme, headerForLayout(theme, resolution.layout), resolution.style);
17419
- return applyHeaderInteractionPalette(header, resolution.style.interactionPalette, theme.header.interactionPalette ?? "recommended");
17634
+
17635
+ //#endregion
17636
+ //#region ../theme-core/src/site-styles/headerStyleCompiler.ts
17637
+ /**
17638
+ * The header compilation pipeline: pick the recipe, interpret it, then apply
17639
+ * the user's interaction-palette preference.
17640
+ *
17641
+ * Appearance decisions live in `headerStyleDefaults.ts` (data), optionally
17642
+ * taken over per site style, and `headerStyleRecipe.ts` (one pure interpreter).
17643
+ * Nothing here switches on a header style id.
17644
+ *
17645
+ * `siteStyle` is required rather than optional: a caller that has no resolved
17646
+ * site style has to say so, because silently falling back to the catalogue
17647
+ * default is exactly the ownership leak this slice closes. Pass `null` when
17648
+ * there genuinely is no site style (initial site provisioning).
17649
+ */
17650
+ function compileHeaderLayoutStyleSelection(theme, resolution, siteStyle) {
17651
+ const recipe = resolveHeaderStyleRecipe(siteStyle, resolution.style.id);
17652
+ const header = compileHeaderRecipe(theme, resolution.layout, recipe);
17653
+ return applyHeaderInteractionPalette(header, recipe.interactionPalette, theme.header.interactionPalette ?? "recommended");
17420
17654
  }
17421
17655
 
17422
17656
  //#endregion
@@ -18228,7 +18462,6 @@ const modernMinimalTheme = {
18228
18462
  positioning: "static",
18229
18463
  shrinkOnScroll: false,
18230
18464
  maxWidth: "container",
18231
- logoOverride: null,
18232
18465
  background: {
18233
18466
  type: "color",
18234
18467
  color: "surface"
@@ -21085,6 +21318,19 @@ const curatedSiteStyles = [
21085
21318
  })
21086
21319
  ];
21087
21320
  const curatedSiteStylesById = new Map(curatedSiteStyles.map((style) => [style.id, style]));
21321
+ /**
21322
+ * The header appearance a persisted theme actually renders: the catalogue
21323
+ * recipe unless the theme's own site style has taken that id over (#1318).
21324
+ *
21325
+ * Consumers that hold a theme and a selected style id — the public frontend and
21326
+ * the chrome customiser — go through here rather than reading the style
21327
+ * definition, so a site-style override is visible to every reader rather than
21328
+ * only to the compiler.
21329
+ */
21330
+ function headerStyleRecipeForTheme(theme, styleId) {
21331
+ const siteStyle = theme?.siteStyleId ? getCuratedSiteStyle(theme.siteStyleId) : null;
21332
+ return resolveHeaderStyleRecipe(siteStyle, styleId);
21333
+ }
21088
21334
  function getCuratedSiteStyle(id) {
21089
21335
  return curatedSiteStylesById.get(id) ?? null;
21090
21336
  }
@@ -22786,7 +23032,7 @@ function compileHeaderDirective(input) {
22786
23032
  layoutId: resolvedLayoutId,
22787
23033
  styleId: resolvedStyleId
22788
23034
  });
22789
- const header = compileHeaderLayoutStyleSelection(input.theme, resolution);
23035
+ const header = compileHeaderLayoutStyleSelection(input.theme, resolution, input.siteStyle);
22790
23036
  const brandPresentation = input.directive.brandPresentation.kind === "apply-logo-context" ? resolveHeaderBrandPresentationForLayout({
22791
23037
  layout: resolution.layout,
22792
23038
  logo: input.directive.brandPresentation.logo
@@ -23926,8 +24172,8 @@ function runGeneratedPageDesignPipeline(input) {
23926
24172
 
23927
24173
  //#endregion
23928
24174
  //#region ../theme-core/src/site-styles/headerOpeningForeground.ts
23929
- function headerStyleAvailability(style, context) {
23930
- if (!style.openingForegroundTarget) return { kind: "available" };
24175
+ function headerStyleAvailability(recipe, context) {
24176
+ if (!recipe.openingForeground) return { kind: "available" };
23931
24177
  return context?.openingForeground?.kind === "known" ? { kind: "available" } : {
23932
24178
  kind: "unavailable",
23933
24179
  reason: "requires-known-opening-foreground"
@@ -23939,16 +24185,16 @@ function headerStyleAvailabilityReasonLabel(reason) {
23939
24185
  default: return assertNever$5(reason, "Unhandled header style availability reason");
23940
24186
  }
23941
24187
  }
23942
- function applyOpeningForeground(theme, header, style, context) {
23943
- if (!style.openingForegroundTarget) return header;
24188
+ function applyOpeningForeground(theme, header, recipe, context) {
24189
+ if (!recipe.openingForeground) return header;
23944
24190
  const foreground = context?.openingForeground ?? { kind: "unknown" };
23945
24191
  if (foreground.kind === "unknown") return applyUnknownOpeningForegroundFallback(header);
23946
24192
  const withBrandForeground = {
23947
24193
  ...header,
23948
24194
  textColor: foreground.roles.text
23949
24195
  };
23950
- if (style.openingForegroundTarget === "brand-only") return withBrandForeground;
23951
- const scrollTreatment = compileHeaderScrollTreatment(theme, style, foreground.roles.text);
24196
+ if (recipe.openingForeground === "brand-only") return withBrandForeground;
24197
+ const scrollTreatment = compileHeaderScrollTreatment(theme, recipe, foreground.roles.text);
23952
24198
  return {
23953
24199
  ...withBrandForeground,
23954
24200
  navColor: foreground.roles.text,
@@ -23965,8 +24211,8 @@ function applyOpeningForeground(theme, header, style, context) {
23965
24211
  ...scrollTreatment ? { scrollTreatment } : {}
23966
24212
  };
23967
24213
  }
23968
- function compileHeaderScrollTreatment(theme, style, foregroundToken) {
23969
- if (style.scrollTreatment !== "contrast-glass") return undefined;
24214
+ function compileHeaderScrollTreatment(theme, recipe, foregroundToken) {
24215
+ if (recipe.scrollTreatment !== "contrast-glass") return undefined;
23970
24216
  const tokenParts = parseColorTokenParts(foregroundToken);
23971
24217
  if (tokenParts.kind !== "token") return undefined;
23972
24218
  const foregroundHex = expandPalette(theme.palette)[tokenParts.token];
@@ -24003,11 +24249,11 @@ function applyUnknownOpeningForegroundFallback(header) {
24003
24249
  container: UNKNOWN_OPENING_FOREGROUND_CONTAINER
24004
24250
  };
24005
24251
  }
24006
- function applyPageOpeningForegroundToTheme(theme, style, context) {
24007
- if (!style || !style.openingForegroundTarget) return theme;
24252
+ function applyPageOpeningForegroundToTheme(theme, recipe, context) {
24253
+ if (!recipe?.openingForeground) return theme;
24008
24254
  return {
24009
24255
  ...theme,
24010
- header: applyOpeningForeground(theme, theme.header, style, context)
24256
+ header: applyOpeningForeground(theme, theme.header, recipe, context)
24011
24257
  };
24012
24258
  }
24013
24259
 
@@ -27708,7 +27954,7 @@ const resourceKinds = [
27708
27954
  "customer-pass",
27709
27955
  "customer-membership",
27710
27956
  "appointment",
27711
- "course-enrollment",
27957
+ "event-series-registration",
27712
27958
  "event-registration",
27713
27959
  "pass-redemption",
27714
27960
  "order",
@@ -27857,7 +28103,7 @@ const appointmentBookingStatuses = [
27857
28103
  "cancelled",
27858
28104
  "no_show"
27859
28105
  ];
27860
- const courseEnrollmentStatuses = ["enrolled"];
28106
+ const eventSeriesRegistrationStatuses = ["enrolled"];
27861
28107
  const eventRegistrationStatuses = ["confirmed"];
27862
28108
 
27863
28109
  //#endregion
@@ -28011,7 +28257,6 @@ const classicProfessionalTheme = {
28011
28257
  positioning: "static",
28012
28258
  shrinkOnScroll: false,
28013
28259
  maxWidth: "container",
28014
- logoOverride: null,
28015
28260
  background: {
28016
28261
  type: "color",
28017
28262
  color: "surface"
@@ -28168,7 +28413,6 @@ const vibrantCreativeTheme = {
28168
28413
  positioning: "sticky",
28169
28414
  shrinkOnScroll: false,
28170
28415
  maxWidth: "container",
28171
- logoOverride: null,
28172
28416
  background: {
28173
28417
  type: "color",
28174
28418
  color: "surface"
@@ -31363,7 +31607,7 @@ const appointmentBookingRefSchema = resourceRefSchema("appointment");
31363
31607
  const appointmentResourceRefSchema = resourceRefSchema("appointment-resource");
31364
31608
  const appointmentServiceRefSchema = resourceRefSchema("appointment-service");
31365
31609
  const bookingCustomerRefSchema = resourceRefSchema("customer");
31366
- const courseEnrollmentRefSchema = resourceRefSchema("course-enrollment");
31610
+ const eventSeriesRegistrationRefSchema = resourceRefSchema("event-series-registration");
31367
31611
  const customerMembershipRefSchema = resourceRefSchema("customer-membership");
31368
31612
  const customerPassRefSchema = resourceRefSchema("customer-pass");
31369
31613
  const eventRegistrationRefSchema = resourceRefSchema("event-registration");
@@ -31544,13 +31788,13 @@ const seedAppointmentBookingCommandSchema = z.object({
31544
31788
  });
31545
31789
  })
31546
31790
  }).strict();
31547
- const seedCourseEnrollmentCommandSchema = z.object({
31548
- type: z.literal("seedCourseEnrollment"),
31549
- ref: courseEnrollmentRefSchema,
31791
+ const seedEventSeriesRegistrationCommandSchema = z.object({
31792
+ type: z.literal("seedEventSeriesRegistration"),
31793
+ ref: eventSeriesRegistrationRefSchema,
31550
31794
  input: z.object({
31551
31795
  customerRef: bookingCustomerRefSchema,
31552
31796
  eventRef: eventSeriesRefSchema$1,
31553
- status: z.enum(courseEnrollmentStatuses).default("enrolled"),
31797
+ status: z.enum(eventSeriesRegistrationStatuses).default("enrolled"),
31554
31798
  paymentMethod: z.literal("free").default("free"),
31555
31799
  paymentStatus: z.literal("not_required").default("not_required"),
31556
31800
  formSubmission: unknownRecordSchema.default({}),
@@ -31592,8 +31836,8 @@ const portalOrderSubjectSchema = z.discriminatedUnion("kind", [z.object({
31592
31836
  kind: z.literal("event_registration"),
31593
31837
  eventRegistrationRef: eventRegistrationRefSchema
31594
31838
  }).strict(), z.object({
31595
- kind: z.literal("course_enrollment"),
31596
- courseEnrollmentRef: courseEnrollmentRefSchema
31839
+ kind: z.literal("event_series_registration"),
31840
+ eventSeriesRegistrationRef: eventSeriesRegistrationRefSchema
31597
31841
  }).strict()]);
31598
31842
  const seedPortalOrderCommandSchema = z.object({
31599
31843
  type: z.literal("seedPortalOrder"),
@@ -32253,7 +32497,7 @@ const siteCommandSchema = z.discriminatedUnion("type", [
32253
32497
  grantCustomerPassCommandSchema,
32254
32498
  grantCustomerMembershipCommandSchema,
32255
32499
  seedAppointmentBookingCommandSchema,
32256
- seedCourseEnrollmentCommandSchema,
32500
+ seedEventSeriesRegistrationCommandSchema,
32257
32501
  seedEventRegistrationCommandSchema,
32258
32502
  seedPassRedemptionCommandSchema,
32259
32503
  seedPortalOrderCommandSchema,
@@ -32377,7 +32621,7 @@ const commandScopes = [
32377
32621
  "customer_pass",
32378
32622
  "customer_membership",
32379
32623
  "appointment",
32380
- "course_enrollment",
32624
+ "event_series_registration",
32381
32625
  "event_registration",
32382
32626
  "pass_redemption",
32383
32627
  "order",
@@ -32972,8 +33216,8 @@ const siteCommandMetadata = {
32972
33216
  capability: "bookings.appointments.write",
32973
33217
  support: "supported"
32974
33218
  },
32975
- seedCourseEnrollment: {
32976
- scope: "course_enrollment",
33219
+ seedEventSeriesRegistration: {
33220
+ scope: "event_series_registration",
32977
33221
  risk: "medium",
32978
33222
  writeSemantics: "upsert",
32979
33223
  lifecycleIntent: "seed",
@@ -32982,7 +33226,7 @@ const siteCommandMetadata = {
32982
33226
  previewability: "dry_run_only",
32983
33227
  allowedRuntimes: allRuntimes,
32984
33228
  intendedExposure: recipeExposure,
32985
- capability: "bookings.course_enrollments.write",
33229
+ capability: "bookings.event_series_registrations.write",
32986
33230
  support: "supported"
32987
33231
  },
32988
33232
  seedEventRegistration: {
@@ -33199,7 +33443,7 @@ const bookingRefCommandTypeValues = [
33199
33443
  "grantCustomerPass",
33200
33444
  "grantCustomerMembership",
33201
33445
  "seedAppointmentBooking",
33202
- "seedCourseEnrollment",
33446
+ "seedEventSeriesRegistration",
33203
33447
  "seedEventRegistration",
33204
33448
  "seedPassRedemption",
33205
33449
  "seedPortalOrder",
@@ -33253,7 +33497,7 @@ function bookingCommandRefContributions(command) {
33253
33497
  field: "input.resourceRef"
33254
33498
  }
33255
33499
  ]);
33256
- case "seedCourseEnrollment": return providedWithRequirements(command.ref, [{
33500
+ case "seedEventSeriesRegistration": return providedWithRequirements(command.ref, [{
33257
33501
  ref: command.input.customerRef,
33258
33502
  field: "input.customerRef"
33259
33503
  }, {
@@ -33329,9 +33573,9 @@ function portalOrderSubjectRefContribution(subject) {
33329
33573
  ref: subject.eventRegistrationRef,
33330
33574
  field: "input.subject.eventRegistrationRef"
33331
33575
  };
33332
- case "course_enrollment": return {
33333
- ref: subject.courseEnrollmentRef,
33334
- field: "input.subject.courseEnrollmentRef"
33576
+ case "event_series_registration": return {
33577
+ ref: subject.eventSeriesRegistrationRef,
33578
+ field: "input.subject.eventSeriesRegistrationRef"
33335
33579
  };
33336
33580
  default: return assertNever(subject);
33337
33581
  }
@@ -33765,7 +34009,7 @@ function matchSiteCommand(command, match) {
33765
34009
  case "grantCustomerPass": return match(command);
33766
34010
  case "grantCustomerMembership": return match(command);
33767
34011
  case "seedAppointmentBooking": return match(command);
33768
- case "seedCourseEnrollment": return match(command);
34012
+ case "seedEventSeriesRegistration": return match(command);
33769
34013
  case "seedEventRegistration": return match(command);
33770
34014
  case "seedPassRedemption": return match(command);
33771
34015
  case "seedPortalOrder": return match(command);
@@ -34022,7 +34266,7 @@ function checkPortalOrdersHaveUniqueSubjects(batch) {
34022
34266
  function portalOrderSubjectKey(subject) {
34023
34267
  switch (subject.kind) {
34024
34268
  case "event_registration": return `event_registration:${subject.eventRegistrationRef}`;
34025
- case "course_enrollment": return `course_enrollment:${subject.courseEnrollmentRef}`;
34269
+ case "event_series_registration": return `event_series_registration:${subject.eventSeriesRegistrationRef}`;
34026
34270
  }
34027
34271
  }
34028
34272
  function indexOfferingCommands(batch) {
@@ -34071,7 +34315,7 @@ function indexOfferingCommands(batch) {
34071
34315
  case "grantCustomerPass":
34072
34316
  case "grantCustomerMembership":
34073
34317
  case "seedAppointmentBooking":
34074
- case "seedCourseEnrollment":
34318
+ case "seedEventSeriesRegistration":
34075
34319
  case "seedEventRegistration":
34076
34320
  case "seedPassRedemption":
34077
34321
  case "seedPortalOrder":
@@ -44945,4 +45189,4 @@ Examples:
44945
45189
  }
44946
45190
 
44947
45191
  //#endregion
44948
- export { require_jsx_runtime as $, NAV_LINK_LETTER_SPACING_MAP as $n, surfaceForegroundDeclarations as $r, formatIgnoredDocumentSyncSectionWarning as $t, getImageUrl as A, __toESM as Ai, MQ_SM_DOWN as An, isCssColorLiteral as Ar, parseJsonData as At, createDryRunReport as B, eyebrowTreatmentValues as Bn, resolveSurfaceForeground as Br, planEnvironmentExecution as Bt, rotateNormalizedPoint as C, internalResolvedLinkSchema as Ci, BREAKPOINT_LG as Cn, RESOLVED_BUTTON_DISABLED_DECLARATIONS as Cr, currentInvocationEnvelope as Ct, resolveMediaTransformForAspect as D, linkSchema as Di, MQ_LG_UP as Dn, contextualButtonSurfaceStyles as Dr, handleCommandError as Dt, parseAspectRatioValue as E, isResolvedInternalLinkEntityType as Ei, BREAKPOINT_XL as En, contextualButtonSurfaceResetStyles as Er, getOutputOnlyContext as Et, parseRelativeStoragePath as F, assertNever$5 as Fn, borderColorStyle as Fr, withConfirmation as Ft, getSiteCommandMetadata as G, testimonialsCompositionTreatmentValues as Gn, TokenResolver as Gr, CliExit as Gt, mapEventCommandContent as H, headingDecorationColorTokenValues as Hn, generateEffectsCSS as Hr, requireEnvironmentWriteAuthorization as Ht, classifyKnownMimeType as I, defineBlockDesignCapability as In, cssVarValue as Ir, withErrorHandling as It, entryIdentifierForCommand as J, getComponentBorderWidthPx as Jn, parseThemeForPersistence as Jr, getEnvironmentDebugInfo as Jt, blockIdentifierForCommand as K, tileTreatmentValues as Kn, parseThemeButtonVariantId as Kr, getEnvPrefix as Kt, venueManagementFields as L, defineFrameCapability as Ln, mergeStyles as Lr, withOutputOnlyErrorHandling as Lt, deriveVideoSlotPolicy as M, MQ_TABLET_ONLY as Mn, resolveThemeColorReferenceValue as Mr, resolveCommandPath as Mt, resolveVideoSelectionIntentForMediaField as N, headerVariantValues as Nn, resolveTokenOrCssColorValue as Nr, runWithInvocation as Nt, getDirectImageUrlForRelativePath as O, pageLinkSchema$1 as Oi, MQ_MD_DOWN as On, deriveButtonSurfaceContext as Or, mapEntryForOutput as Ot, asRecord as P, pageDesignEditorBackgroundOverrideOwner as Pn, backgroundColorStyle as Pr, withCommandContext as Pt, hasConfiguredBookingVertical as Q, NAV_LINK_BORDER_RADIUS_MAP as Qn, DEFAULT_SURFACE_TEXT_COLOR as Qr, createManagementClient as Qt, sortRecord as R, defineNoBlockDesignCapability as Rn, rgbColorValue as Rr, executeEnvironmentPlan as Rt, deleteEnvSpecificKeys as S, internalLinkSchema as Si, renderHeaderPaintTargetRules as Sn, generateButtonCss as Sr, createOutputForCommand as St, isExplicitRectCrop as T, isInternalResolvedLinkValue as Ti, BREAKPOINT_SM as Tn, resolvedButtonFocusDeclarations as Tr, getOutputContext as Tt, evaluateSiteCommandBatchExposure as U, introCompositionTreatmentValues as Un, generateBaseInteractiveCSS as Ur, withRiverbankEnv as Ut, parseAndPlanCommandBatchForTypes as V, featureCardCompositionTreatmentValues as Vn, generateDefaultButtonSystem as Vr, planEnvironmentWriteAuthorization as Vt, evaluateSiteCommandExposure as W, offeringsPreviewCompositionTreatmentValues as Wn, generateInteractiveChildInheritanceCSS as Wr, formatError as Wt, pageIdentifierForCommand as X, parseBlockCustomCssRules as Xn, formatButtonColourContractError as Xr, isRemoteConfigured as Xt, pageIdentifierForBlockCommand as Y, getComponentShadowVar as Yn, compileButtonColourStates as Yr, isLocalConfigured as Yt, pagePathForCommand as Z, parseCustomCssRules as Zn, generateShadowValue$1 as Zr, loadSdkEnvironment as Zt, hasOwnSettingsField as _, linkPayloadSchema as _i, boxBackgroundOverlaySchema as _n, cardRoleSchema as _r, confirmAction as _t, syncLocalMediaForPull as a, getTextColorForBackground as ai, GRADIENT_PRESET_IDS as an, INPUT_SPACING_MAP as ar, createCommandRef as at, attachRenderableMediaAssetFields as b, entryLinkSchema$1 as bi, generateMobileOverlayBackdropFilterFix as bn, PUBLIC_BUTTON_ROLES as br, createGetCommand as bt, sha256 as c, hexToRgb$1 as ci, boundaryRuntimeMetricsForTransition as cn, ACCORDION_SPACING_MAP as cr, createEventSeriesRef as ct, walkLocalContentMedia as d, unsafeAsOpaqueButtonColourToken as di, parseBackgroundAppearanceColorToken as dn, ICON_CONFIG as dr, createNavigationRef as dt, surfaceForegroundStyle as ei, ManagementApiError as en, NAV_LINK_PADDING_MAP as er, require_react as et, buildStorageUrl as f, parseBlockColorToken as fi, defaultThemeTokens as fn, ICON_SIZE_PX as fr, createPageRef as ft, buildSettingsUpdateInput as g, persistableMediaSchema as gi, themeSchema as gn, generateShadowValue as gr, slugPart as gt, SETTINGS_FILE_FIELDS as h, mediaTypeDiscriminants as hi, sdkThemeWireSchema as hn, generateCardCss as hr, refSlug as ht, syncLocalMediaForPush as i, onColorTokenName as ii, gradientToCss as in, INPUT_FONT_SIZE_MAP as ir, createBlocksRef as it, isSiteScopedDirectImageStoragePath as j, MQ_SM_UP as jn, resolveOnColorForThemeToken as jr, parsePaginationOptions as jt, getDirectImageUrlForSiteScopedPath as k, sdkConfiguredBookingVerticalConfigSchema as ki, MQ_MD_UP as kn, resolveContextualButtonRole as kr, parseJsonArray as kt, normalizeMediaIdentifierInput as l, VARIANT_ROLES as li, backgroundAppearanceColorTokenNames as ln, ACCORDION_TRIGGER_FONT_SCALE as lr, createFooterRef as lt, extractMediaIdentifiers as m, mediaSchema as mi, sdkSettingsUpdateSchema as mn, getDefaultCardVariants as mr, createVenueRef as mt, createStyleCommand as n, expandPalette as ni, readHeaderNavFontSizePreference as nn, NAV_LINK_TEXT_SIZE_MAP as nr, generateCssVars as nt, applyLocalMediaPush as o, ORDINARY_TEXT_MIN_CONTRAST_RATIO as oi, getGradientPreset as on, LABEL_FONT_SIZE_MAP as or, createContentEntryRef as ot, downloadMedia as p, mediaIdentifierSchema as pi, defineBlockDesignMetadata as pn, generateCardCoreCss as pr, createSiteCommandSiteRef as pt, blockOrderIdentifiersForCommand as q, visibleHeadingDecorationFamilyValues as qn, themeButtonClassName as qr, getEnvVarName as qt, revalidateLocalMediaPushPlan as r, isOnColorBackgroundCandidateToken as ri, getCuratedSiteStyle as rn, FONT_WEIGHT_MAP as rr, createBlockRef as rt, prepareLocalMediaForPush as s, featuresFromHex as si, parseGradientPresetId as sn, ACCORDION_OPEN_ACCENT_THICKNESS as sr, createEventCategoryRef as st, buildStyleSelectionInitializeCommandFromOptions as t, surfaceForegroundValue as ti, mergeHeaderNavTypographyPreference as tn, NAV_LINK_PADDING_X_MAP as tr, pickShadeTowardBackground as tt, normalizeMediaValueToIdentifierOnly as u, buttonVariantIdSchema as ui, backgroundAppearanceQuickColorTokenNames as un, ACCORDION_TRIGGER_LETTER_SPACING as ur, createFormRef as ut, writeMediaManifest as v, RESOLVED_INTERNAL_LINK_ENTITY_TYPES as vi, boxBackgroundSchema as vn, cardVariantRoleValues as vr, createClientForEnv as vt, normalizeWidthCandidates as w, internalRouteOnlyLinkSchema as wi, BREAKPOINT_MD as wn, resolvedButtonColourDeclarations as wr, formatDateShort as wt, buildRenderableMediaAssetIndex as x, externalLinkSchema$1 as xi, getHeaderPaintTargets as xn, AFFORDANCE_SUPPRESS_CLASS as xr, createListCommand$1 as xt, isMediaValue as y, customLinkSchema$1 as yi, generateHeaderScrollTreatmentStyles as yn, normalizeCardRole as yr, createCommandContext as yt, stableStringify as z, eventListTreatmentValues as zn, textColorStyle as zr, parseEnvironmentSelection as zt };
45192
+ export { pagePathForCommand as $, NAV_LINK_BORDER_RADIUS_MAP as $n, DEFAULT_SURFACE_TEXT_COLOR as $r, loadSdkEnvironment as $t, getDirectImageUrlForRelativePath as A, sdkConfiguredBookingVerticalConfigSchema as Ai, MQ_MD_DOWN as An, resolveContextualButtonRole as Ar, mapEntryForOutput as At, sortRecord as B, eventListTreatmentValues as Bn, textColorStyle as Br, executeEnvironmentPlan as Bt, deleteEnvSpecificKeys as C, internalLinkSchema as Ci, getHeaderPaintTargets as Cn, generateButtonCss as Cr, createListCommand$1 as Ct, isExplicitRectCrop as D, isResolvedInternalLinkEntityType as Di, BREAKPOINT_SM as Dn, contextualButtonSurfaceResetStyles as Dr, getOutputContext as Dt, normalizeWidthCandidates as E, isInternalResolvedLinkValue as Ei, BREAKPOINT_MD as En, resolvedButtonFocusDeclarations as Er, formatDateShort as Et, resolveVideoSelectionIntentForMediaField as F, pageDesignEditorBackgroundOverrideOwner as Fn, backgroundColorStyle as Fr, runWithInvocation as Ft, evaluateSiteCommandBatchExposure as G, offeringsPreviewCompositionTreatmentValues as Gn, generateInteractiveChildInheritanceCSS as Gr, withRiverbankEnv as Gt, createDryRunReport as H, featureCardCompositionTreatmentValues as Hn, generateDefaultButtonSystem as Hr, planEnvironmentExecution as Ht, asRecord as I, assertNever$5 as In, borderColorStyle as Ir, withCommandContext as It, blockIdentifierForCommand as J, visibleHeadingDecorationFamilyValues as Jn, themeButtonClassName as Jr, getEnvPrefix as Jt, evaluateSiteCommandExposure as K, testimonialsCompositionTreatmentValues as Kn, TokenResolver as Kr, formatError as Kt, parseRelativeStoragePath as L, defineBlockDesignCapability as Ln, cssVarValue as Lr, withConfirmation as Lt, getImageUrl as M, MQ_SM_UP as Mn, resolveOnColorForThemeToken as Mr, parseJsonData as Mt, isSiteScopedDirectImageStoragePath as N, MQ_TABLET_ONLY as Nn, resolveThemeColorReferenceValue as Nr, parsePaginationOptions as Nt, parseAspectRatioValue as O, linkSchema as Oi, BREAKPOINT_XL as On, contextualButtonSurfaceStyles as Or, getOutputOnlyContext as Ot, deriveVideoSlotPolicy as P, headerVariantValues as Pn, resolveTokenOrCssColorValue as Pr, resolveCommandPath as Pt, pageIdentifierForCommand as Q, parseCustomCssRules as Qn, generateShadowValue$1 as Qr, isRemoteConfigured as Qt, classifyKnownMimeType as R, defineFrameCapability as Rn, mergeStyles as Rr, withErrorHandling as Rt, walkAndCollectImageAttrs as S, externalLinkSchema$1 as Si, generateMobileOverlayBackdropFilterFix as Sn, AFFORDANCE_SUPPRESS_CLASS as Sr, createGetCommand as St, rotateNormalizedPoint as T, internalRouteOnlyLinkSchema as Ti, BREAKPOINT_LG as Tn, resolvedButtonColourDeclarations as Tr, currentInvocationEnvelope as Tt, parseAndPlanCommandBatchForTypes as U, headingDecorationColorTokenValues as Un, generateEffectsCSS as Ur, planEnvironmentWriteAuthorization as Ut, stableStringify as V, eyebrowTreatmentValues as Vn, resolveSurfaceForeground as Vr, parseEnvironmentSelection as Vt, mapEventCommandContent as W, introCompositionTreatmentValues as Wn, generateBaseInteractiveCSS as Wr, requireEnvironmentWriteAuthorization as Wt, entryIdentifierForCommand as X, getComponentShadowVar as Xn, compileButtonColourStates as Xr, getEnvironmentDebugInfo as Xt, blockOrderIdentifiersForCommand as Y, getComponentBorderWidthPx as Yn, parseThemeForPersistence as Yr, getEnvVarName as Yt, pageIdentifierForBlockCommand as Z, parseBlockCustomCssRules as Zn, formatButtonColourContractError as Zr, isLocalConfigured as Zt, hasOwnSettingsField as _, persistableMediaSchema as _i, sdkThemeWireSchema as _n, generateShadowValue as _r, refSlug as _t, syncLocalMediaForPull as a, onColorTokenName as ai, getCuratedSiteStyle as an, INPUT_FONT_SIZE_MAP as ar, createBlockRef as at, attachRenderableMediaAssetFields as b, customLinkSchema$1 as bi, boxBackgroundSchema as bn, normalizeCardRole as br, createClientForEnv as bt, sha256 as c, featuresFromHex as ci, getGradientPreset as cn, ACCORDION_OPEN_ACCENT_THICKNESS as cr, createContentEntryRef as ct, walkLocalContentMedia as d, buttonVariantIdSchema as di, backgroundAppearanceColorTokenNames as dn, ACCORDION_TRIGGER_LETTER_SPACING as dr, createFooterRef as dt, surfaceForegroundDeclarations as ei, createManagementClient as en, NAV_LINK_LETTER_SPACING_MAP as er, hasConfiguredBookingVertical as et, buildStorageUrl as f, unsafeAsOpaqueButtonColourToken as fi, backgroundAppearanceQuickColorTokenNames as fn, ICON_CONFIG as fr, createFormRef as ft, buildSettingsUpdateInput as g, mediaTypeDiscriminants as gi, sdkSettingsUpdateSchema as gn, generateCardCss as gr, createVenueRef as gt, SETTINGS_FILE_FIELDS as h, mediaSchema as hi, defineBlockDesignMetadata as hn, getDefaultCardVariants as hr, createSiteCommandSiteRef as ht, syncLocalMediaForPush as i, isOnColorBackgroundCandidateToken as ii, readHeaderNavFontSizePreference as in, FONT_WEIGHT_MAP as ir, generateCssVars as it, getDirectImageUrlForSiteScopedPath as j, __toESM as ji, MQ_SM_DOWN as jn, isCssColorLiteral as jr, parseJsonArray as jt, resolveMediaTransformForAspect as k, pageLinkSchema$1 as ki, MQ_LG_UP as kn, deriveButtonSurfaceContext as kr, handleCommandError as kt, normalizeMediaIdentifierInput as l, hexToRgb$1 as li, parseGradientPresetId as ln, ACCORDION_SPACING_MAP as lr, createEventCategoryRef as lt, extractMediaIdentifiers as m, mediaIdentifierSchema as mi, defaultThemeTokens as mn, generateCardCoreCss as mr, createPageRef as mt, createStyleCommand as n, surfaceForegroundValue as ni, ManagementApiError as nn, NAV_LINK_PADDING_X_MAP as nr, require_react as nt, applyLocalMediaPush as o, getTextColorForBackground as oi, gradientToCss as on, INPUT_SPACING_MAP as or, createBlocksRef as ot, downloadMedia as p, parseBlockColorToken as pi, parseBackgroundAppearanceColorToken as pn, ICON_SIZE_PX as pr, createNavigationRef as pt, getSiteCommandMetadata as q, tileTreatmentValues as qn, parseThemeButtonVariantId as qr, CliExit as qt, revalidateLocalMediaPushPlan as r, expandPalette as ri, mergeHeaderNavTypographyPreference as rn, NAV_LINK_TEXT_SIZE_MAP as rr, pickShadeTowardBackground as rt, prepareLocalMediaForPush as s, ORDINARY_TEXT_MIN_CONTRAST_RATIO as si, GRADIENT_PRESET_IDS as sn, LABEL_FONT_SIZE_MAP as sr, createCommandRef as st, buildStyleSelectionInitializeCommandFromOptions as t, surfaceForegroundStyle as ti, formatIgnoredDocumentSyncSectionWarning as tn, NAV_LINK_PADDING_MAP as tr, require_jsx_runtime as tt, normalizeMediaValueToIdentifierOnly as u, VARIANT_ROLES as ui, boundaryRuntimeMetricsForTransition as un, ACCORDION_TRIGGER_FONT_SCALE as ur, createEventSeriesRef as ut, writeMediaManifest as v, linkPayloadSchema as vi, themeSchema as vn, cardRoleSchema as vr, slugPart as vt, looksLikeUuid as w, internalResolvedLinkSchema as wi, renderHeaderPaintTargetRules as wn, RESOLVED_BUTTON_DISABLED_DECLARATIONS as wr, createOutputForCommand as wt, buildRenderableMediaAssetIndex as x, entryLinkSchema$1 as xi, generateHeaderScrollTreatmentStyles as xn, PUBLIC_BUTTON_ROLES as xr, createCommandContext as xt, isMediaValue as y, RESOLVED_INTERNAL_LINK_ENTITY_TYPES as yi, boxBackgroundOverlaySchema as yn, cardVariantRoleValues as yr, confirmAction as yt, venueManagementFields as z, defineNoBlockDesignCapability as zn, rgbColorValue as zr, withOutputOnlyErrorHandling as zt };