@riverbankcms/sdk 0.60.9 → 0.60.12

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.
Files changed (45) hide show
  1. package/dist/_dts/api/src/accessAdmin.d.ts +102 -0
  2. package/dist/_dts/api/src/common/envelope.d.ts +1 -1
  3. package/dist/_dts/api/src/domains.d.ts +14 -13
  4. package/dist/_dts/api/src/endpoints.d.ts +32 -0
  5. package/dist/_dts/api/src/index.d.ts +4 -3
  6. package/dist/_dts/api/src/navigation/linkValue.d.ts +15 -2
  7. package/dist/_dts/api/src/navigation.d.ts +2 -0
  8. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +15 -1
  9. package/dist/_dts/blocks/src/index.d.ts +1 -1
  10. package/dist/_dts/blocks/src/system/node/fragments/ctaButton.d.ts +2 -2
  11. package/dist/_dts/blocks/src/system/runtime/nodes/basic.d.ts +2 -1
  12. package/dist/_dts/blocks/src/system/types/link.d.ts +7 -1
  13. package/dist/_dts/core/src/participant-identity.d.ts +72 -0
  14. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +96 -60
  15. package/dist/_dts/db/src/schemas/forms.d.ts +135 -24
  16. package/dist/_dts/sdk/src/contracts/content.d.ts +7 -1
  17. package/dist/_dts/sdk/src/public-api/contracts.d.ts +1 -1
  18. package/dist/_dts/sdk/src/version.d.ts +1 -1
  19. package/dist/_dts/theme-core/src/buttons/classNames.d.ts +21 -0
  20. package/dist/_dts/theme-core/src/buttons/index.d.ts +1 -0
  21. package/dist/_dts/theme-core/src/buttons/types.d.ts +1 -0
  22. package/dist/cli/index.mjs +188 -9
  23. package/dist/client/bookings.mjs +808 -149
  24. package/dist/client/client.mjs +553 -130
  25. package/dist/client/hooks.mjs +119 -0
  26. package/dist/client/rendering/client.mjs +412 -113
  27. package/dist/client/rendering/islands.mjs +4605 -4361
  28. package/dist/client/rendering.mjs +580 -157
  29. package/dist/preview-next/before-render.mjs +57 -0
  30. package/dist/preview-next/client/runtime.mjs +580 -151
  31. package/dist/preview-next/middleware.mjs +57 -0
  32. package/dist/server/components.mjs +293 -45
  33. package/dist/server/config-validation.mjs +119 -0
  34. package/dist/server/config.mjs +119 -0
  35. package/dist/server/data.mjs +119 -0
  36. package/dist/server/index.mjs +120 -1
  37. package/dist/server/next.mjs +300 -52
  38. package/dist/server/page-converter.mjs +62 -0
  39. package/dist/server/prebuild.mjs +1 -1
  40. package/dist/server/rendering/server.mjs +293 -45
  41. package/dist/server/rendering.mjs +293 -45
  42. package/dist/server/routing.mjs +159 -29
  43. package/dist/server/server.mjs +120 -1
  44. package/package.json +1 -1
  45. package/dist/_dts/blocks/src/system/runtime/shared/themedButtonClass.d.ts +0 -11
@@ -465,6 +465,92 @@ function encodePublicProductCategorySelector(selector) {
465
465
  };
466
466
  }
467
467
  }
468
+ function isRecord(value) {
469
+ return typeof value === "object" && value !== null;
470
+ }
471
+ function isJsonResponseContentType(contentType) {
472
+ if (!contentType) return false;
473
+ const mimeType = contentType.split(";", 1)[0]?.trim().toLowerCase() ?? "";
474
+ return mimeType === "application/json" || mimeType.endsWith("+json");
475
+ }
476
+ function getResponseContentType(response) {
477
+ return response.headers.get("content-type");
478
+ }
479
+ async function parseJsonBody(response) {
480
+ const rawText = await response.text();
481
+ if (rawText.trim().length === 0) {
482
+ return { kind: "empty-body" };
483
+ }
484
+ try {
485
+ return { kind: "success", value: JSON.parse(rawText) };
486
+ } catch {
487
+ return { kind: "invalid-json" };
488
+ }
489
+ }
490
+ function getBlockApiErrorDetails(data) {
491
+ if (!isRecord(data)) {
492
+ return {};
493
+ }
494
+ const nestedError = isRecord(data.error) ? data.error : void 0;
495
+ const message = typeof nestedError?.message === "string" ? nestedError.message : typeof data.message === "string" ? data.message : void 0;
496
+ const code = typeof nestedError?.code === "string" ? nestedError.code : typeof data.code === "string" ? data.code : void 0;
497
+ return { message, code };
498
+ }
499
+ function buildUnexpectedJsonResponseMessage(parseResult) {
500
+ switch (parseResult.kind) {
501
+ case "empty-body":
502
+ return "Expected JSON response body but received an empty response";
503
+ case "invalid-json":
504
+ return "Expected JSON response but received invalid JSON";
505
+ }
506
+ }
507
+ async function extractErrorDetails(response) {
508
+ const contentType = getResponseContentType(response);
509
+ const fallbackMessage = `Request failed: ${response.statusText}`;
510
+ if (!isJsonResponseContentType(contentType)) {
511
+ return {
512
+ message: `${fallbackMessage} (received ${contentType ?? "unknown content type"})`
513
+ };
514
+ }
515
+ const parseResult = await parseJsonBody(response);
516
+ switch (parseResult.kind) {
517
+ case "success": {
518
+ const details = getBlockApiErrorDetails(parseResult.value);
519
+ return {
520
+ message: details.message ?? fallbackMessage,
521
+ code: details.code
522
+ };
523
+ }
524
+ case "invalid-json":
525
+ return {
526
+ message: `${fallbackMessage} (received invalid JSON)`
527
+ };
528
+ case "empty-body":
529
+ return {
530
+ message: `${fallbackMessage} (received an empty response)`
531
+ };
532
+ }
533
+ }
534
+ async function parseJsonApiResponse(response) {
535
+ if (response.status === 204 || response.status === 205) {
536
+ return void 0;
537
+ }
538
+ const contentType = getResponseContentType(response);
539
+ if (!isJsonResponseContentType(contentType)) {
540
+ throw new BlockApiError(
541
+ `Expected JSON response but received ${contentType ?? "unknown content type"}`,
542
+ response.status
543
+ );
544
+ }
545
+ const parseResult = await parseJsonBody(response);
546
+ if (parseResult.kind !== "success") {
547
+ throw new BlockApiError(
548
+ buildUnexpectedJsonResponseMessage(parseResult),
549
+ response.status
550
+ );
551
+ }
552
+ return parseResult.value;
553
+ }
468
554
  function getAuthHeaders(auth) {
469
555
  switch (auth.type) {
470
556
  case "api-key":
@@ -521,21 +607,10 @@ function createBlockApi(config) {
521
607
  const doFetch = async () => {
522
608
  const response = await fetch(url, fetchOptions);
523
609
  if (!response.ok) {
524
- let errorMessage = `Request failed: ${response.statusText}`;
525
- let errorCode;
526
- try {
527
- const errorData = await response.json();
528
- if (typeof errorData.error?.message === "string") {
529
- errorMessage = errorData.error.message;
530
- } else if (typeof errorData.message === "string") {
531
- errorMessage = errorData.message;
532
- }
533
- errorCode = errorData.error?.code || errorData.code;
534
- } catch {
535
- }
536
- throw new BlockApiError(errorMessage, response.status, errorCode);
610
+ const details = await extractErrorDetails(response);
611
+ throw new BlockApiError(details.message, response.status, details.code);
537
612
  }
538
- const json = await response.json();
613
+ const json = await parseJsonApiResponse(response);
539
614
  if (isApiSuccessResponse(json)) {
540
615
  return json.data;
541
616
  }
@@ -1520,6 +1595,15 @@ var init_layout = __esm({
1520
1595
 
1521
1596
  // ../theme-core/src/buttons/types.ts
1522
1597
  import { z } from "zod";
1598
+ function isVariantRole(value) {
1599
+ return VARIANT_ROLES.includes(value);
1600
+ }
1601
+ function asSpecialVariantId(value) {
1602
+ if (value.length === 0) {
1603
+ throw new Error("SpecialVariantId must be a non-empty string");
1604
+ }
1605
+ return value;
1606
+ }
1523
1607
  var VARIANT_ROLES, DEFAULT_VARIANT_ALIAS_ID, cornerStyleSchema, shadowSizeSchema, textTransformSchema, fontWeightSchema, buttonTypographySchema, letterSpacingSchema, hoverTransformSchema, hoverColorSchema, buttonPaddingPresetSchema, gradientStyleSchema, gradientSharpnessSchema, prioritySchema, variantRoleSchema, buttonSizeNameSchema, PADDING_TOKEN_PATTERN, paddingShorthandSchema, buttonSizeConfigSchema, buttonSizesSchema, buttonGlobalSettingsSchema, gradientDirectionSchema, buttonBackgroundSchema, effectApplicationSchema, buttonBorderSchema, variantShadowSchema, variantEffectsSchema, variantSizeOverridesSchema, buttonVariantSchema, buttonSystemSchema;
1524
1608
  var init_types = __esm({
1525
1609
  "../theme-core/src/buttons/types.ts"() {
@@ -1672,6 +1756,48 @@ var init_types = __esm({
1672
1756
  }
1673
1757
  });
1674
1758
 
1759
+ // ../theme-core/src/buttons/classNames.ts
1760
+ function parseThemeButtonVariantId(value) {
1761
+ const normalized = value?.trim() ?? "";
1762
+ if (normalized.length === 0) {
1763
+ return null;
1764
+ }
1765
+ if (normalized === DEFAULT_VARIANT_ALIAS_ID) {
1766
+ return DEFAULT_VARIANT_ALIAS_ID;
1767
+ }
1768
+ return isVariantRole(normalized) ? normalized : asSpecialVariantId(normalized);
1769
+ }
1770
+ function themeButtonVariantClassNames(variant) {
1771
+ if (variant === DEFAULT_VARIANT_ALIAS_ID) {
1772
+ return [variant];
1773
+ }
1774
+ return [variant, `button-${variant}`];
1775
+ }
1776
+ function themeButtonSizeClassName(size) {
1777
+ return `btn-${size}`;
1778
+ }
1779
+ function themeButtonSelector(variant, size) {
1780
+ const baseSelector = `.${variant}`;
1781
+ if (!size) {
1782
+ return baseSelector;
1783
+ }
1784
+ return `${baseSelector}.${themeButtonSizeClassName(size)}`;
1785
+ }
1786
+ function themeButtonClassName(spec) {
1787
+ const classes = [
1788
+ ...themeButtonVariantClassNames(spec.variant),
1789
+ themeButtonSizeClassName(spec.size),
1790
+ spec.extraClassName
1791
+ ];
1792
+ return classes.filter(Boolean).join(" ");
1793
+ }
1794
+ var init_classNames = __esm({
1795
+ "../theme-core/src/buttons/classNames.ts"() {
1796
+ "use strict";
1797
+ init_types();
1798
+ }
1799
+ });
1800
+
1675
1801
  // ../theme-core/src/tokens/resolver.ts
1676
1802
  var TokenResolver;
1677
1803
  var init_resolver = __esm({
@@ -3345,17 +3471,25 @@ function resolveAliasSource(enabled) {
3345
3471
  }
3346
3472
  function variantChunks(variant, global, themeSizes, themeId, tokens, theme) {
3347
3473
  const out = [];
3348
- out.push(variantBaseRule(variant, global, themeId, tokens, theme));
3349
- const hoverBg = variantHoverBackgroundRule(variant, global, themeId, tokens);
3474
+ const variantId = parseButtonVariantIdForCss(variant.id);
3475
+ out.push(variantBaseRule(variant, variantId, global, themeId, tokens, theme));
3476
+ const hoverBg = variantHoverBackgroundRule(variant, variantId, global, themeId, tokens);
3350
3477
  if (hoverBg) out.push(hoverBg);
3351
3478
  const effects = variantEffectsCss(variant, themeId, tokens, theme);
3352
3479
  if (effects) out.push({ raw: effects });
3353
- out.push(...variantDisabledRules(variant, themeId));
3354
- out.push(...variantSizeRules(variant, themeSizes, themeId));
3480
+ out.push(...variantDisabledRules(variantId, themeId));
3481
+ out.push(...variantSizeRules(variant, variantId, themeSizes, themeId));
3355
3482
  return out;
3356
3483
  }
3357
- function variantBaseRule(variant, global, themeId, tokens, theme) {
3358
- const selector = `:where([data-theme-scope="${themeId}"]) .${variant.id}`;
3484
+ function parseButtonVariantIdForCss(value) {
3485
+ const variantId = parseThemeButtonVariantId(value);
3486
+ if (!variantId) {
3487
+ throw new Error("Button variant id must be a non-empty string");
3488
+ }
3489
+ return variantId;
3490
+ }
3491
+ function variantBaseRule(variant, variantId, global, themeId, tokens, theme) {
3492
+ const selector = `:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}`;
3359
3493
  const decls = [];
3360
3494
  decls.push(["font-weight", String(global.fontWeight)]);
3361
3495
  decls.push(["font-family", resolveFontFamily(global)]);
@@ -3388,13 +3522,13 @@ function variantBaseRule(variant, global, themeId, tokens, theme) {
3388
3522
  }
3389
3523
  return rule(selector, decls);
3390
3524
  }
3391
- function variantHoverBackgroundRule(variant, global, themeId, tokens) {
3525
+ function variantHoverBackgroundRule(variant, variantId, global, themeId, tokens) {
3392
3526
  let hoverToken = variant.hoverBackgroundToken;
3393
3527
  if (!hoverToken && global.hoverColor === "token" && global.hoverColorToken) {
3394
3528
  hoverToken = global.hoverColorToken;
3395
3529
  }
3396
3530
  if (!hoverToken) return null;
3397
- return rule(`:where([data-theme-scope="${themeId}"]) .${variant.id}:hover`, [
3531
+ return rule(`:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}:hover`, [
3398
3532
  ["background-color", tokens.getColor(hoverToken)]
3399
3533
  ]);
3400
3534
  }
@@ -3414,8 +3548,8 @@ function variantEffectsCss(variant, themeId, tokens, theme) {
3414
3548
  theme
3415
3549
  });
3416
3550
  }
3417
- function variantDisabledRules(variant, themeId) {
3418
- const base = `:where([data-theme-scope="${themeId}"]) .${variant.id}:disabled`;
3551
+ function variantDisabledRules(variantId, themeId) {
3552
+ const base = `:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}:disabled`;
3419
3553
  const disabledSelectors = [base, `${base}:hover`, `${base}:active`, `${base}:focus`];
3420
3554
  const pseudoSelectors = [`${base}::before`, `${base}::after`];
3421
3555
  return [
@@ -3433,12 +3567,12 @@ function variantDisabledRules(variant, themeId) {
3433
3567
  ])
3434
3568
  ];
3435
3569
  }
3436
- function variantSizeRules(variant, themeSizes, themeId) {
3570
+ function variantSizeRules(variant, variantId, themeSizes, themeId) {
3437
3571
  const borderWidth = variant.border ? BORDER_WIDTH_MAP[variant.border.widthClass] || "1px" : "0px";
3438
3572
  const rules = [];
3439
3573
  for (const sizeName of BUTTON_SIZE_NAMES) {
3440
3574
  const config = resolveSizeConfig(variant, sizeName, themeSizes);
3441
- const selector = `:where([data-theme-scope="${themeId}"]) .${variant.id}.btn-${sizeName}`;
3575
+ const selector = `:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId, sizeName)}`;
3442
3576
  const decls = [];
3443
3577
  for (const decl of paddingDeclarations(config.padding, borderWidth)) decls.push(decl);
3444
3578
  if (config.fontSize) {
@@ -3501,6 +3635,7 @@ var init_generateButtonCss = __esm({
3501
3635
  "../theme-core/src/buttons/generateButtonCss.ts"() {
3502
3636
  "use strict";
3503
3637
  init_types();
3638
+ init_classNames();
3504
3639
  init_resolver();
3505
3640
  init_generateEffectsCSS();
3506
3641
  init_constants();
@@ -4181,6 +4316,7 @@ var init_buttons = __esm({
4181
4316
  "../theme-core/src/buttons/index.ts"() {
4182
4317
  "use strict";
4183
4318
  init_types();
4319
+ init_classNames();
4184
4320
  init_generateButtonCss();
4185
4321
  init_generateDefaultButtonSystem();
4186
4322
  init_constants();
@@ -4830,10 +4966,71 @@ var init_participants = __esm({
4830
4966
  });
4831
4967
 
4832
4968
  // ../core/src/participant-identity.ts
4969
+ var PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD, PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATIONS;
4833
4970
  var init_participant_identity = __esm({
4834
4971
  "../core/src/participant-identity.ts"() {
4835
4972
  "use strict";
4836
4973
  init_assertNever();
4974
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD = {
4975
+ participant_id: {
4976
+ field: "participant_id",
4977
+ role: "canonical_link",
4978
+ canonicalSource: "booking_participants.id",
4979
+ contractAction: "tighten_in_839",
4980
+ notes: "Canonical person-subject link for a participation. #839 should enforce this once preflight is clean."
4981
+ },
4982
+ display_name: {
4983
+ field: "display_name",
4984
+ role: "contextual_snapshot",
4985
+ canonicalSource: "booking_participants.display_name for live identity",
4986
+ contractAction: "retain_as_snapshot",
4987
+ notes: "Participation-time display context. Readers must not treat it as mutable live participant identity."
4988
+ },
4989
+ email: {
4990
+ field: "email",
4991
+ role: "contextual_snapshot",
4992
+ canonicalSource: "booking_participants.email_normalized for live email identity",
4993
+ contractAction: "retain_as_snapshot",
4994
+ notes: "Participation-time contact snapshot used for notifications/context. Live identity belongs to the participant row."
4995
+ },
4996
+ email_normalized: {
4997
+ field: "email_normalized",
4998
+ role: "contextual_snapshot",
4999
+ canonicalSource: "booking_participants.email_normalized for live email identity",
5000
+ contractAction: "retain_as_snapshot",
5001
+ notes: "Normalized snapshot/dedupe helper for the participation slot, not live person authority."
5002
+ },
5003
+ phone: {
5004
+ field: "phone",
5005
+ role: "contextual_snapshot",
5006
+ canonicalSource: "booking_participants.phone for live phone identity",
5007
+ contractAction: "retain_as_snapshot",
5008
+ notes: "Participation-time phone context. Live identity belongs to the participant row."
5009
+ },
5010
+ identity_state: {
5011
+ field: "identity_state",
5012
+ role: "materialization_state",
5013
+ canonicalSource: "booking_participants.identity_state for subject state",
5014
+ contractAction: "review_for_later_contract_cleanup",
5015
+ notes: "Slot materialization state: booker_supplied, contactable, portal_claimed, or staff_verified."
5016
+ },
5017
+ event_attendee_guest_id: {
5018
+ field: "event_attendee_guest_id",
5019
+ role: "compatibility_projection",
5020
+ canonicalSource: "canonical participant slot plus #838 event guest compatibility projection",
5021
+ contractAction: "retain_as_projection",
5022
+ notes: "Compatibility FK for event guest read models. It is not person identity authority."
5023
+ }
5024
+ };
5025
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATIONS = [
5026
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.participant_id,
5027
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.display_name,
5028
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.email,
5029
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.email_normalized,
5030
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.phone,
5031
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.identity_state,
5032
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.event_attendee_guest_id
5033
+ ];
4837
5034
  }
4838
5035
  });
4839
5036
 
@@ -4969,11 +5166,11 @@ var init_fileAssetLegacyProjection = __esm({
4969
5166
  });
4970
5167
 
4971
5168
  // ../media-core/src/typeGuards.ts
4972
- function isRecord(value) {
5169
+ function isRecord2(value) {
4973
5170
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
4974
5171
  }
4975
5172
  function asRecord(value) {
4976
- return isRecord(value) ? value : void 0;
5173
+ return isRecord2(value) ? value : void 0;
4977
5174
  }
4978
5175
  var init_typeGuards = __esm({
4979
5176
  "../media-core/src/typeGuards.ts"() {
@@ -6717,7 +6914,7 @@ var init_Text = __esm({
6717
6914
  });
6718
6915
 
6719
6916
  // ../blocks/src/lib/typeGuards.ts
6720
- function isRecord2(value) {
6917
+ function isRecord3(value) {
6721
6918
  return typeof value === "object" && value !== null && !Array.isArray(value);
6722
6919
  }
6723
6920
  function isObjectRecord(value) {
@@ -6769,11 +6966,11 @@ function markdownToTipTapDoc(markdown) {
6769
6966
  };
6770
6967
  }
6771
6968
  function coerceRichTextDoc(value) {
6772
- const raw = isRecord2(value) && "doc" in value ? value.doc : value;
6969
+ const raw = isRecord3(value) && "doc" in value ? value.doc : value;
6773
6970
  if (typeof raw === "string") {
6774
6971
  return markdownToTipTapDoc(raw);
6775
6972
  }
6776
- if (isRecord2(raw) && typeof raw.type === "string") {
6973
+ if (isRecord3(raw) && typeof raw.type === "string") {
6777
6974
  return raw;
6778
6975
  }
6779
6976
  return null;
@@ -6833,11 +7030,12 @@ var init_basic = __esm({
6833
7030
  }
6834
7031
  return null;
6835
7032
  }
6836
- const resolvedVariantId = typeof variantId === "string" ? variantId.trim() : "";
6837
- const normalizedVariantId = resolvedVariantId === DEFAULT_VARIANT_ALIAS_ID ? "" : resolvedVariantId;
6838
- const variantClasses = normalizedVariantId ? [normalizedVariantId, `button-${normalizedVariantId}`] : [];
6839
- const sizeClass = `btn-${size}`;
6840
- const combinedClassName = [...variantClasses, sizeClass, className].filter(Boolean).join(" ");
7033
+ const resolvedVariantId = parseThemeButtonVariantId(variantId);
7034
+ const combinedClassName = resolvedVariantId ? themeButtonClassName({
7035
+ variant: resolvedVariantId,
7036
+ size,
7037
+ extraClassName: className
7038
+ }) : className;
6841
7039
  if (resolvedHref) {
6842
7040
  return /* @__PURE__ */ jsx10(
6843
7041
  "a",
@@ -7842,19 +8040,6 @@ var init_media2 = __esm({
7842
8040
  }
7843
8041
  });
7844
8042
 
7845
- // ../blocks/src/system/runtime/shared/themedButtonClass.ts
7846
- function themedButtonClass(spec) {
7847
- const { variant, size, extraClassName } = spec;
7848
- const normalizedVariant = variant.trim();
7849
- const variantClasses = normalizedVariant ? [normalizedVariant, `button-${normalizedVariant}`] : [];
7850
- return [...variantClasses, `btn-${size}`, extraClassName].filter(Boolean).join(" ");
7851
- }
7852
- var init_themedButtonClass = __esm({
7853
- "../blocks/src/system/runtime/shared/themedButtonClass.ts"() {
7854
- "use strict";
7855
- }
7856
- });
7857
-
7858
8043
  // ../blocks/src/system/runtime/nodes/file-download.tsx
7859
8044
  import { jsx as jsx13, jsxs } from "react/jsx-runtime";
7860
8045
  function isDownloadableMediaType(type) {
@@ -7928,7 +8113,7 @@ function FileDownloadNode({
7928
8113
  {
7929
8114
  href,
7930
8115
  download: filename,
7931
- className: themedButtonClass({
8116
+ className: themeButtonClassName({
7932
8117
  variant,
7933
8118
  size: "md",
7934
8119
  extraClassName: "rb-inline-flex rb-shrink-0 rb-items-center rb-justify-center rb-gap-2"
@@ -7948,7 +8133,7 @@ var init_file_download = __esm({
7948
8133
  init_lucide_react();
7949
8134
  init_colorStyles();
7950
8135
  init_media2();
7951
- init_themedButtonClass();
8136
+ init_buttons();
7952
8137
  init_media();
7953
8138
  FILE_DOWNLOAD_BUTTON_VARIANTS = ["primary", "secondary", "outline", "link"];
7954
8139
  }
@@ -11560,7 +11745,7 @@ var init_EventCard = __esm({
11560
11745
  init_EventCardIcons();
11561
11746
  init_eventCapacity();
11562
11747
  init_utils();
11563
- init_themedButtonClass();
11748
+ init_buttons();
11564
11749
  EventCard = ({
11565
11750
  event,
11566
11751
  cardVariant = "default",
@@ -11586,7 +11771,7 @@ var init_EventCard = __esm({
11586
11771
  const isSoldOut = cta.hidden;
11587
11772
  const { available: spotsLeft } = getEventAvailability(event);
11588
11773
  const cardClass = `card-${cardVariant}`;
11589
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
11774
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
11590
11775
  const title = event.title;
11591
11776
  const summary = event.presentation?.summary ?? event.description;
11592
11777
  const image = event.presentation?.image ?? null;
@@ -11668,7 +11853,7 @@ var init_EventCompactRow = __esm({
11668
11853
  "use strict";
11669
11854
  init_utils();
11670
11855
  init_EventCardIcons();
11671
- init_themedButtonClass();
11856
+ init_buttons();
11672
11857
  EventCompactRow = ({
11673
11858
  event,
11674
11859
  buttonVariant = "primary",
@@ -11680,7 +11865,7 @@ var init_EventCompactRow = __esm({
11680
11865
  const price = formatEventPrice(event);
11681
11866
  const teacherLine = formatEventTeacherLine(event);
11682
11867
  const cta = resolveEventCta(event, buttonText);
11683
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "sm" });
11868
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "sm" });
11684
11869
  return /* @__PURE__ */ jsxs17("div", { className: "event-compact-row", children: [
11685
11870
  /* @__PURE__ */ jsxs17("div", { className: "event-compact-row-content", children: [
11686
11871
  /* @__PURE__ */ jsxs17("div", { className: "event-compact-row-top", children: [
@@ -11752,7 +11937,7 @@ var init_EventSpotlight = __esm({
11752
11937
  "../blocks/src/system/runtime/nodes/events/EventSpotlight.tsx"() {
11753
11938
  "use strict";
11754
11939
  init_shared3();
11755
- init_themedButtonClass();
11940
+ init_buttons();
11756
11941
  EventSpotlight = ({
11757
11942
  events,
11758
11943
  layout = "grid",
@@ -11774,7 +11959,7 @@ var init_EventSpotlight = __esm({
11774
11959
  }
11775
11960
  const containerClass = getContainerClass(layout, columns);
11776
11961
  const cardOrientation = getCardOrientation(layout);
11777
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
11962
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
11778
11963
  return /* @__PURE__ */ jsxs19("div", { className: `event-spotlight-section ${className || ""}`, "data-block": "event-spotlight", children: [
11779
11964
  /* @__PURE__ */ jsx33("div", { className: `event-spotlight ${containerClass}`, children: normalizedEvents.map((event) => /* @__PURE__ */ jsx33(
11780
11965
  EventCard,
@@ -23488,7 +23673,16 @@ var init_view3 = __esm({
23488
23673
  import { Fragment as Fragment5, jsx as jsx37, jsxs as jsxs22 } from "react/jsx-runtime";
23489
23674
  function renderServerPendingAction(label, soldOut) {
23490
23675
  return /* @__PURE__ */ jsxs22(Fragment5, { children: [
23491
- /* @__PURE__ */ jsx37("button", { type: "button", className: "default", disabled: true, "aria-disabled": "true", children: soldOut ? "Sold out" : label }),
23676
+ /* @__PURE__ */ jsx37(
23677
+ "button",
23678
+ {
23679
+ type: "button",
23680
+ className: themeButtonClassName({ variant: "default", size: "md" }),
23681
+ disabled: true,
23682
+ "aria-disabled": "true",
23683
+ children: soldOut ? "Sold out" : label
23684
+ }
23685
+ ),
23492
23686
  !soldOut ? /* @__PURE__ */ jsx37("p", { className: "rb-caption status-muted", children: "Cart actions become interactive after page load." }) : null
23493
23687
  ] });
23494
23688
  }
@@ -23508,7 +23702,14 @@ function ProductListServerContent(props2) {
23508
23702
  ),
23509
23703
  actions: /* @__PURE__ */ jsxs22(Fragment5, { children: [
23510
23704
  renderServerPendingAction(card.actionLabel, card.soldOut),
23511
- card.path ? /* @__PURE__ */ jsx37("a", { href: card.path, className: "secondary btn-sm", children: "View details" }) : null
23705
+ card.path ? /* @__PURE__ */ jsx37(
23706
+ "a",
23707
+ {
23708
+ href: card.path,
23709
+ className: themeButtonClassName({ variant: "secondary", size: "sm" }),
23710
+ children: "View details"
23711
+ }
23712
+ ) : null
23512
23713
  ] })
23513
23714
  },
23514
23715
  card.productId
@@ -23551,6 +23752,7 @@ function CheckoutServerContent(props2) {
23551
23752
  var init_shop_commerce_server = __esm({
23552
23753
  "../blocks/src/system/runtime/nodes/shop-commerce.server.tsx"() {
23553
23754
  "use strict";
23755
+ init_buttons();
23554
23756
  init_RichText();
23555
23757
  init_carousel_server();
23556
23758
  init_richText_coerce();
@@ -24099,7 +24301,7 @@ function renderCalendarGrid(display) {
24099
24301
  "button",
24100
24302
  {
24101
24303
  type: "button",
24102
- className: themedButtonClass({
24304
+ className: themeButtonClassName({
24103
24305
  variant: display.buttonVariant,
24104
24306
  size: "sm"
24105
24307
  }),
@@ -24185,7 +24387,7 @@ function renderTimetableSsr(display) {
24185
24387
  "button",
24186
24388
  {
24187
24389
  type: "button",
24188
- className: themedButtonClass({
24390
+ className: themeButtonClassName({
24189
24391
  variant: display.buttonVariant,
24190
24392
  size: "sm"
24191
24393
  }),
@@ -24313,7 +24515,7 @@ var init_EventCalendar_server = __esm({
24313
24515
  init_renderEventListItem();
24314
24516
  init_utils();
24315
24517
  init_timetableModel();
24316
- init_themedButtonClass();
24518
+ init_buttons();
24317
24519
  EventCalendarSSR = (props2) => {
24318
24520
  const islandProps = buildEventCalendarInteractiveIslandProps(props2);
24319
24521
  const display = islandProps.render.display;
@@ -24444,7 +24646,7 @@ var init_form_server = __esm({
24444
24646
  "use strict";
24445
24647
  init_clsx();
24446
24648
  init_ssr();
24447
- init_themedButtonClass();
24649
+ init_buttons();
24448
24650
  init_form_interactive();
24449
24651
  FormNodeSSR = ({
24450
24652
  blockId,
@@ -24582,7 +24784,7 @@ var init_form_server = __esm({
24582
24784
  "button",
24583
24785
  {
24584
24786
  type: "submit",
24585
- className: themedButtonClass({
24787
+ className: themeButtonClassName({
24586
24788
  variant: "primary",
24587
24789
  size: "md",
24588
24790
  extraClassName: "rb-w-full rb-sm-w-auto"
@@ -24675,7 +24877,7 @@ function NewsletterFormSSR({
24675
24877
  "button",
24676
24878
  {
24677
24879
  type: "submit",
24678
- className: themedButtonClass({ variant: "primary", size: "md" }),
24880
+ className: themeButtonClassName({ variant: "primary", size: "md" }),
24679
24881
  children: display.buttonLabel
24680
24882
  }
24681
24883
  ) })
@@ -24692,7 +24894,7 @@ var init_newsletter_form_server = __esm({
24692
24894
  "use strict";
24693
24895
  init_clsx();
24694
24896
  init_ssr();
24695
- init_themedButtonClass();
24897
+ init_buttons();
24696
24898
  init_newsletter_form_interactive();
24697
24899
  newsletter_form_server_default = NewsletterFormSSR;
24698
24900
  }
@@ -24823,7 +25025,16 @@ function ShopSSR({
24823
25025
  PassCardView,
24824
25026
  {
24825
25027
  display: pass,
24826
- action: /* @__PURE__ */ jsx50("button", { type: "button", className: "default", disabled: true, "aria-disabled": "true", children: pass.actionLabel })
25028
+ action: /* @__PURE__ */ jsx50(
25029
+ "button",
25030
+ {
25031
+ type: "button",
25032
+ className: themeButtonClassName({ variant: "default", size: "md" }),
25033
+ disabled: true,
25034
+ "aria-disabled": "true",
25035
+ children: pass.actionLabel
25036
+ }
25037
+ )
24827
25038
  },
24828
25039
  pass.id
24829
25040
  )),
@@ -24831,7 +25042,16 @@ function ShopSSR({
24831
25042
  MembershipCardView,
24832
25043
  {
24833
25044
  display: membership,
24834
- action: /* @__PURE__ */ jsx50("button", { type: "button", className: "default", disabled: true, "aria-disabled": "true", children: membership.actionLabel })
25045
+ action: /* @__PURE__ */ jsx50(
25046
+ "button",
25047
+ {
25048
+ type: "button",
25049
+ className: themeButtonClassName({ variant: "default", size: "md" }),
25050
+ disabled: true,
25051
+ "aria-disabled": "true",
25052
+ children: membership.actionLabel
25053
+ }
25054
+ )
24835
25055
  },
24836
25056
  membership.id
24837
25057
  ))
@@ -24846,6 +25066,7 @@ var shop_server_default;
24846
25066
  var init_shop_server = __esm({
24847
25067
  "../blocks/src/system/runtime/nodes/shop.server.tsx"() {
24848
25068
  "use strict";
25069
+ init_buttons();
24849
25070
  init_ssr();
24850
25071
  init_view3();
24851
25072
  init_shop_interactive();
@@ -28272,7 +28493,7 @@ function MultiStepForm({
28272
28493
  type: "button",
28273
28494
  onClick: goToPrevious,
28274
28495
  disabled: !canGoBack,
28275
- className: "outline btn-md",
28496
+ className: themeButtonClassName({ variant: "outline", size: "md" }),
28276
28497
  children: backButtonLabel
28277
28498
  }
28278
28499
  ),
@@ -28282,7 +28503,11 @@ function MultiStepForm({
28282
28503
  type: "button",
28283
28504
  onClick: goToNext,
28284
28505
  disabled: !canGoNext,
28285
- className: "primary btn-md rb-flex-1",
28506
+ className: themeButtonClassName({
28507
+ variant: "primary",
28508
+ size: "md",
28509
+ extraClassName: "rb-flex-1"
28510
+ }),
28286
28511
  children: [
28287
28512
  (isValidating || isSubmitting) && /* @__PURE__ */ jsx52(
28288
28513
  SpinnerNode,
@@ -28398,6 +28623,7 @@ var init_MultiStepForm = __esm({
28398
28623
  "../blocks/src/system/runtime/components/multi-step/MultiStepForm.tsx"() {
28399
28624
  "use strict";
28400
28625
  "use client";
28626
+ init_buttons();
28401
28627
  init_MultiStepContext();
28402
28628
  init_useMultiStep();
28403
28629
  init_spinner();
@@ -29660,7 +29886,10 @@ function PaymentOptionSelectionStep({
29660
29886
  "button",
29661
29887
  {
29662
29888
  type: "button",
29663
- className: isSelected ? "primary btn-md" : "outline btn-md",
29889
+ className: themeButtonClassName({
29890
+ variant: isSelected ? "primary" : "outline",
29891
+ size: "md"
29892
+ }),
29664
29893
  style: paymentOptionLayoutStyle,
29665
29894
  onClick: () => updateData({
29666
29895
  selectedAppointmentPackageId: appointmentPackage.customerPassId,
@@ -29709,7 +29938,10 @@ function PaymentOptionSelectionStep({
29709
29938
  "button",
29710
29939
  {
29711
29940
  type: "button",
29712
- className: isSelected ? "primary btn-md" : "outline btn-md",
29941
+ className: themeButtonClassName({
29942
+ variant: isSelected ? "primary" : "outline",
29943
+ size: "md"
29944
+ }),
29713
29945
  style: paymentOptionLayoutStyle,
29714
29946
  onClick: () => updateData({
29715
29947
  selectedAppointmentPackageId: void 0,
@@ -29738,6 +29970,7 @@ var init_PaymentOptionSelectionStep = __esm({
29738
29970
  "../blocks/src/system/runtime/components/booking/PaymentOptionSelectionStep.tsx"() {
29739
29971
  "use strict";
29740
29972
  "use client";
29973
+ init_buttons();
29741
29974
  init_api();
29742
29975
  init_MultiStepContext();
29743
29976
  init_booking_form_state();
@@ -31370,6 +31603,7 @@ var init_booking_form_client = __esm({
31370
31603
  init_noop();
31371
31604
  init_client2();
31372
31605
  init_src3();
31606
+ init_buttons();
31373
31607
  init_api();
31374
31608
  init_MultiStepForm();
31375
31609
  init_SuccessMessage();
@@ -31606,7 +31840,7 @@ var init_booking_form_client = __esm({
31606
31840
  "button",
31607
31841
  {
31608
31842
  type: "button",
31609
- className: "secondary btn-sm",
31843
+ className: themeButtonClassName({ variant: "secondary", size: "sm" }),
31610
31844
  onClick: clearFeedback,
31611
31845
  children: "Dismiss"
31612
31846
  }
@@ -32981,7 +33215,7 @@ var init_PaymentSelectionStep = __esm({
32981
33215
  init_lucide_react();
32982
33216
  init_utils3();
32983
33217
  init_spinner();
32984
- init_themedButtonClass();
33218
+ init_buttons();
32985
33219
  init_CheckIcon2();
32986
33220
  init_SelectableOptionCard();
32987
33221
  PaymentSelectionStep = ({
@@ -33082,7 +33316,7 @@ var init_PaymentSelectionStep = __esm({
33082
33316
  "button",
33083
33317
  {
33084
33318
  type: "button",
33085
- className: themedButtonClass({ variant: "primary", size: "md" }),
33319
+ className: themeButtonClassName({ variant: "primary", size: "md" }),
33086
33320
  disabled: !email.trim(),
33087
33321
  onClick: onRequestLogin,
33088
33322
  children: "Email me a login link"
@@ -34742,7 +34976,7 @@ function MagicLinkForm({
34742
34976
  "button",
34743
34977
  {
34744
34978
  type: "button",
34745
- className: classPrefix === "cp" ? "secondary" : `${classPrefix}-modal-btn ${classPrefix}-modal-btn--secondary`,
34979
+ className: classPrefix === "cp" ? themeButtonClassName({ variant: "secondary", size: "md" }) : `${classPrefix}-modal-btn ${classPrefix}-modal-btn--secondary`,
34746
34980
  onClick: handleReset,
34747
34981
  children: "Try a different email"
34748
34982
  }
@@ -34770,7 +35004,7 @@ function MagicLinkForm({
34770
35004
  "button",
34771
35005
  {
34772
35006
  type: "submit",
34773
- className: classPrefix === "cp" ? "primary" : `${classPrefix}-modal-btn`,
35007
+ className: classPrefix === "cp" ? themeButtonClassName({ variant: "primary", size: "md" }) : `${classPrefix}-modal-btn`,
34774
35008
  disabled: !email.trim() || loading,
34775
35009
  children: loading ? "Sending..." : buttonText
34776
35010
  }
@@ -34781,6 +35015,7 @@ var init_MagicLinkForm = __esm({
34781
35015
  "../blocks/src/system/runtime/nodes/shared/MagicLinkForm.tsx"() {
34782
35016
  "use strict";
34783
35017
  "use client";
35018
+ init_buttons();
34784
35019
  init_api();
34785
35020
  }
34786
35021
  });
@@ -34806,7 +35041,7 @@ function EventRegistrationWizard(props2) {
34806
35041
  } = props2;
34807
35042
  const maxTicketsNum = parseInt(maxTickets, 10) || 5;
34808
35043
  const showSpamProtection = spamProtectionEnabled ?? isSpamProtectionEnabled();
34809
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
35044
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
34810
35045
  const wizard = useEventRegistrationWizard({
34811
35046
  anchorId: EVENT_REGISTRATION_ANCHOR_ID,
34812
35047
  occurrenceContext: occurrenceContext ?? null,
@@ -34943,7 +35178,7 @@ var init_EventRegistrationWizard = __esm({
34943
35178
  init_useEventRegistrationWizard();
34944
35179
  init_MagicLinkForm();
34945
35180
  init_spinner();
34946
- init_themedButtonClass();
35181
+ init_buttons();
34947
35182
  init_event_registration2();
34948
35183
  EVENT_REGISTRATION_ANCHOR_ID = "event-registration";
34949
35184
  EVENT_PORTAL_AUTH_COPY = {
@@ -35389,7 +35624,7 @@ function ErrorStep2({
35389
35624
  buttonVariant = "primary",
35390
35625
  onRetry
35391
35626
  }) {
35392
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
35627
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
35393
35628
  return /* @__PURE__ */ jsxs73("div", { className: "cr-error", role: "alert", children: [
35394
35629
  /* @__PURE__ */ jsx100(StateIcon, { variant: "error", children: /* @__PURE__ */ jsx100(CrossIcon, {}) }),
35395
35630
  /* @__PURE__ */ jsx100("h3", { className: "cr-error__title", children: "Enrollment Failed" }),
@@ -35401,7 +35636,7 @@ var init_ErrorStep2 = __esm({
35401
35636
  "../blocks/src/system/runtime/nodes/course-registration/ErrorStep.tsx"() {
35402
35637
  "use strict";
35403
35638
  init_shared6();
35404
- init_themedButtonClass();
35639
+ init_buttons();
35405
35640
  }
35406
35641
  });
35407
35642
 
@@ -35413,7 +35648,7 @@ function VerifyingTimeoutStep2({
35413
35648
  onCheckAgain,
35414
35649
  supportEmail
35415
35650
  }) {
35416
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
35651
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
35417
35652
  return /* @__PURE__ */ jsxs74("div", { className: "cr-error", role: "alert", children: [
35418
35653
  /* @__PURE__ */ jsx101(StateIcon, { variant: "warning", children: /* @__PURE__ */ jsx101(ClockIcon, {}) }),
35419
35654
  /* @__PURE__ */ jsx101("h3", { className: "cr-error__title", children: "Payment Verification Taking Longer" }),
@@ -35430,7 +35665,7 @@ var init_VerifyingTimeoutStep2 = __esm({
35430
35665
  "../blocks/src/system/runtime/nodes/course-registration/VerifyingTimeoutStep.tsx"() {
35431
35666
  "use strict";
35432
35667
  init_shared6();
35433
- init_themedButtonClass();
35668
+ init_buttons();
35434
35669
  }
35435
35670
  });
35436
35671
 
@@ -35442,7 +35677,7 @@ function PaymentFailedStep2({
35442
35677
  buttonVariant = "primary",
35443
35678
  onRetry
35444
35679
  }) {
35445
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
35680
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
35446
35681
  return /* @__PURE__ */ jsxs75("div", { className: "cr-payment-failed", role: "alert", children: [
35447
35682
  /* @__PURE__ */ jsx102(StateIcon, { variant: "error", children: /* @__PURE__ */ jsx102(CrossIcon, {}) }),
35448
35683
  /* @__PURE__ */ jsx102("h3", { className: "cr-payment-failed__title", children: "Payment Failed" }),
@@ -35454,7 +35689,7 @@ var init_PaymentFailedStep2 = __esm({
35454
35689
  "../blocks/src/system/runtime/nodes/course-registration/PaymentFailedStep.tsx"() {
35455
35690
  "use strict";
35456
35691
  init_shared6();
35457
- init_themedButtonClass();
35692
+ init_buttons();
35458
35693
  }
35459
35694
  });
35460
35695
 
@@ -36456,7 +36691,7 @@ function CourseRegistrationWizard(props2) {
36456
36691
  handleRetry,
36457
36692
  handleBookingModeChange
36458
36693
  } = useCourseRegistrationWizard(props2);
36459
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
36694
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
36460
36695
  if (scopedCourses.length === 0) {
36461
36696
  return /* @__PURE__ */ jsx106(
36462
36697
  "div",
@@ -36866,7 +37101,7 @@ var init_CourseRegistrationWizard = __esm({
36866
37101
  init_PaymentFailedStep2();
36867
37102
  init_VerifyingTimeoutStep2();
36868
37103
  init_spinner();
36869
- init_themedButtonClass();
37104
+ init_buttons();
36870
37105
  }
36871
37106
  });
36872
37107
 
@@ -36898,7 +37133,7 @@ var init_course_registration_client = __esm({
36898
37133
  import { useEffect as useEffect19, useRef as useRef10, useState as useState15 } from "react";
36899
37134
  import { jsx as jsx108 } from "react/jsx-runtime";
36900
37135
  function isLeafletApi(value) {
36901
- if (!isRecord2(value)) return false;
37136
+ if (!isRecord3(value)) return false;
36902
37137
  return typeof value.map === "function" && typeof value.tileLayer === "function" && typeof value.marker === "function";
36903
37138
  }
36904
37139
  function loadLeaflet() {
@@ -37600,7 +37835,11 @@ function PassesMembershipsController({ render }) {
37600
37835
  "button",
37601
37836
  {
37602
37837
  type: "button",
37603
- className: "secondary btn-sm shop__return-dismiss",
37838
+ className: themeButtonClassName({
37839
+ variant: "secondary",
37840
+ size: "sm",
37841
+ extraClassName: "shop__return-dismiss"
37842
+ }),
37604
37843
  onClick: () => dispatch({ type: "clearReturnNotice" }),
37605
37844
  children: "Dismiss"
37606
37845
  }
@@ -37617,7 +37856,11 @@ function PassesMembershipsController({ render }) {
37617
37856
  "button",
37618
37857
  {
37619
37858
  type: "button",
37620
- className: "default shop__cta",
37859
+ className: themeButtonClassName({
37860
+ variant: "default",
37861
+ size: "md",
37862
+ extraClassName: "shop__cta"
37863
+ }),
37621
37864
  onClick: () => handleBuyPass(pass),
37622
37865
  children: passDisplay.actionLabel
37623
37866
  }
@@ -37644,7 +37887,11 @@ function PassesMembershipsController({ render }) {
37644
37887
  "button",
37645
37888
  {
37646
37889
  type: "button",
37647
- className: "default shop__cta",
37890
+ className: themeButtonClassName({
37891
+ variant: "default",
37892
+ size: "md",
37893
+ extraClassName: "shop__cta"
37894
+ }),
37648
37895
  onClick: () => handleSubscribe(membership),
37649
37896
  children: membershipDisplay.actionLabel
37650
37897
  }
@@ -37688,12 +37935,20 @@ function PassesMembershipsController({ render }) {
37688
37935
  ] }) : null
37689
37936
  ] }),
37690
37937
  /* @__PURE__ */ jsxs83(ActionRow, { className: "shop__modal-warning-actions", children: [
37691
- /* @__PURE__ */ jsx112("button", { type: "button", className: "secondary", onClick: closeCheckout, children: "Cancel" }),
37692
37938
  /* @__PURE__ */ jsx112(
37693
37939
  "button",
37694
37940
  {
37695
37941
  type: "button",
37696
- className: "default",
37942
+ className: themeButtonClassName({ variant: "secondary", size: "md" }),
37943
+ onClick: closeCheckout,
37944
+ children: "Cancel"
37945
+ }
37946
+ ),
37947
+ /* @__PURE__ */ jsx112(
37948
+ "button",
37949
+ {
37950
+ type: "button",
37951
+ className: themeButtonClassName({ variant: "default", size: "md" }),
37697
37952
  onClick: handleConfirmDuplicate,
37698
37953
  disabled: checkout2.submitting,
37699
37954
  children: checkout2.submitting ? "Processing..." : "Subscribe Anyway"
@@ -37736,8 +37991,25 @@ function PassesMembershipsController({ render }) {
37736
37991
  ] }),
37737
37992
  checkout2.formError ? /* @__PURE__ */ jsx112("p", { className: "shop__modal-error", role: "alert", children: checkout2.formError }) : null,
37738
37993
  /* @__PURE__ */ jsxs83(ActionRow, { className: "shop__modal-actions", children: [
37739
- /* @__PURE__ */ jsx112("button", { type: "button", className: "secondary", onClick: closeCheckout, disabled: checkout2.submitting, children: "Cancel" }),
37740
- /* @__PURE__ */ jsx112("button", { type: "submit", className: "default", disabled: checkout2.submitting, children: checkout2.submitting ? "Processing..." : "Continue to Payment" })
37994
+ /* @__PURE__ */ jsx112(
37995
+ "button",
37996
+ {
37997
+ type: "button",
37998
+ className: themeButtonClassName({ variant: "secondary", size: "md" }),
37999
+ onClick: closeCheckout,
38000
+ disabled: checkout2.submitting,
38001
+ children: "Cancel"
38002
+ }
38003
+ ),
38004
+ /* @__PURE__ */ jsx112(
38005
+ "button",
38006
+ {
38007
+ type: "submit",
38008
+ className: themeButtonClassName({ variant: "default", size: "md" }),
38009
+ disabled: checkout2.submitting,
38010
+ children: checkout2.submitting ? "Processing..." : "Continue to Payment"
38011
+ }
38012
+ )
37741
38013
  ] })
37742
38014
  ] })
37743
38015
  ] })
@@ -37750,6 +38022,7 @@ var init_shop_client = __esm({
37750
38022
  "../blocks/src/system/runtime/nodes/shop.client.tsx"() {
37751
38023
  "use strict";
37752
38024
  "use client";
38025
+ init_buttons();
37753
38026
  init_api();
37754
38027
  init_ModalShell();
37755
38028
  init_shared6();
@@ -37964,7 +38237,7 @@ var init_embla_carousel_autoplay_esm = __esm({
37964
38237
  function isObject(subject) {
37965
38238
  return Object.prototype.toString.call(subject) === "[object Object]";
37966
38239
  }
37967
- function isRecord3(subject) {
38240
+ function isRecord4(subject) {
37968
38241
  return isObject(subject) || Array.isArray(subject);
37969
38242
  }
37970
38243
  function canUseDOM() {
@@ -37981,7 +38254,7 @@ function areOptionsEqual(optionsA, optionsB) {
37981
38254
  const valueA = optionsA[key];
37982
38255
  const valueB = optionsB[key];
37983
38256
  if (typeof valueA === "function") return `${valueA}` === `${valueB}`;
37984
- if (!isRecord3(valueA) || !isRecord3(valueB)) return valueA === valueB;
38257
+ if (!isRecord4(valueA) || !isRecord4(valueB)) return valueA === valueB;
37985
38258
  return areOptionsEqual(valueA, valueB);
37986
38259
  });
37987
38260
  }
@@ -40075,7 +40348,7 @@ function ProductListController(props2) {
40075
40348
  "button",
40076
40349
  {
40077
40350
  type: "button",
40078
- className: "default",
40351
+ className: themeButtonClassName({ variant: "default", size: "md" }),
40079
40352
  onClick: () => {
40080
40353
  const product = props2.render.hydration.products.find((candidate) => candidate.id === card.productId);
40081
40354
  if (!product) return;
@@ -40091,7 +40364,14 @@ function ProductListController(props2) {
40091
40364
  children: card.soldOut ? "Sold out" : card.actionLabel
40092
40365
  }
40093
40366
  ),
40094
- card.path ? /* @__PURE__ */ jsx114("a", { href: card.path, className: "secondary btn-sm", children: "View details" }) : null
40367
+ card.path ? /* @__PURE__ */ jsx114(
40368
+ "a",
40369
+ {
40370
+ href: card.path,
40371
+ className: themeButtonClassName({ variant: "secondary", size: "sm" }),
40372
+ children: "View details"
40373
+ }
40374
+ ) : null
40095
40375
  ] }),
40096
40376
  feedback: /* @__PURE__ */ jsx114(
40097
40377
  ShopAddFeedback,
@@ -40157,7 +40437,7 @@ function ProductDetailController(props2) {
40157
40437
  "button",
40158
40438
  {
40159
40439
  type: "button",
40160
- className: "default",
40440
+ className: themeButtonClassName({ variant: "default", size: "md" }),
40161
40441
  disabled: display.soldOut,
40162
40442
  onClick: () => {
40163
40443
  if (!selectedProduct) return;
@@ -40207,15 +40487,31 @@ function CartController(props2) {
40207
40487
  onChange: item.quantityEditable ? (event) => cart2.updateQuantity(item.key, Number(event.target.value)) : void 0
40208
40488
  }
40209
40489
  ),
40210
- /* @__PURE__ */ jsx114("button", { type: "button", className: "secondary btn-sm", onClick: () => cart2.removeItem(item.key), children: "Remove" })
40490
+ /* @__PURE__ */ jsx114(
40491
+ "button",
40492
+ {
40493
+ type: "button",
40494
+ className: themeButtonClassName({ variant: "secondary", size: "sm" }),
40495
+ onClick: () => cart2.removeItem(item.key),
40496
+ children: "Remove"
40497
+ }
40498
+ )
40211
40499
  ] }),
40212
40500
  footerActions: /* @__PURE__ */ jsxs85(Fragment19, { children: [
40213
- /* @__PURE__ */ jsx114("button", { type: "button", className: "secondary btn-sm", onClick: () => cart2.clear(), children: display.clearButtonText }),
40214
40501
  /* @__PURE__ */ jsx114(
40215
40502
  "button",
40216
40503
  {
40217
40504
  type: "button",
40218
- className: "default",
40505
+ className: themeButtonClassName({ variant: "secondary", size: "sm" }),
40506
+ onClick: () => cart2.clear(),
40507
+ children: display.clearButtonText
40508
+ }
40509
+ ),
40510
+ /* @__PURE__ */ jsx114(
40511
+ "button",
40512
+ {
40513
+ type: "button",
40514
+ className: themeButtonClassName({ variant: "default", size: "md" }),
40219
40515
  onClick: () => {
40220
40516
  window.location.href = resolveDedicatedCheckoutPath(window.location.pathname);
40221
40517
  },
@@ -40321,7 +40617,15 @@ function CheckoutController(props2) {
40321
40617
  )
40322
40618
  ] }),
40323
40619
  state.feedback.tag === "error" ? /* @__PURE__ */ jsx114("p", { className: "rb-caption status-muted", children: state.feedback.message }) : null,
40324
- /* @__PURE__ */ jsx114("button", { type: "submit", className: "default", disabled: state.submission === "submitting", children: state.submission === "submitting" ? "Loading\u2026" : display.submitButtonText })
40620
+ /* @__PURE__ */ jsx114(
40621
+ "button",
40622
+ {
40623
+ type: "submit",
40624
+ className: themeButtonClassName({ variant: "default", size: "md" }),
40625
+ disabled: state.submission === "submitting",
40626
+ children: state.submission === "submitting" ? "Loading\u2026" : display.submitButtonText
40627
+ }
40628
+ )
40325
40629
  ] })
40326
40630
  }
40327
40631
  );
@@ -40331,6 +40635,7 @@ var init_shop_commerce = __esm({
40331
40635
  "../blocks/src/system/runtime/nodes/shop-commerce.tsx"() {
40332
40636
  "use strict";
40333
40637
  "use client";
40638
+ init_buttons();
40334
40639
  init_api();
40335
40640
  init_RichText();
40336
40641
  init_carousel_client();
@@ -40441,7 +40746,7 @@ function HeaderCartDrawerItems(props2) {
40441
40746
  "button",
40442
40747
  {
40443
40748
  type: "button",
40444
- className: "secondary btn-sm",
40749
+ className: themeButtonClassName({ variant: "secondary", size: "sm" }),
40445
40750
  onClick: () => props2.cart.removeItem(item.key),
40446
40751
  children: "Remove"
40447
40752
  }
@@ -40534,7 +40839,7 @@ function HeaderCartDrawer(props2) {
40534
40839
  "button",
40535
40840
  {
40536
40841
  type: "button",
40537
- className: "secondary",
40842
+ className: themeButtonClassName({ variant: "secondary", size: "md" }),
40538
40843
  onClick: () => props2.cart.clear(),
40539
40844
  disabled: display.state === "empty",
40540
40845
  children: display.clearButtonText
@@ -40543,12 +40848,20 @@ function HeaderCartDrawer(props2) {
40543
40848
  props2.checkoutHref && display.state === "ready" ? /* @__PURE__ */ jsx119(
40544
40849
  "a",
40545
40850
  {
40546
- className: "default",
40851
+ className: themeButtonClassName({ variant: "default", size: "md" }),
40547
40852
  href: props2.checkoutHref,
40548
40853
  onClick: props2.onClose,
40549
40854
  children: display.checkoutButtonText
40550
40855
  }
40551
- ) : /* @__PURE__ */ jsx119("button", { type: "button", className: "default", disabled: true, children: display.checkoutButtonText })
40856
+ ) : /* @__PURE__ */ jsx119(
40857
+ "button",
40858
+ {
40859
+ type: "button",
40860
+ className: themeButtonClassName({ variant: "default", size: "md" }),
40861
+ disabled: true,
40862
+ children: display.checkoutButtonText
40863
+ }
40864
+ )
40552
40865
  ] })
40553
40866
  ]
40554
40867
  }
@@ -40561,6 +40874,7 @@ var init_HeaderCartDrawer = __esm({
40561
40874
  "../blocks/src/system/runtime/header/HeaderCartDrawer.tsx"() {
40562
40875
  "use strict";
40563
40876
  "use client";
40877
+ init_buttons();
40564
40878
  init_display();
40565
40879
  init_ModalShell();
40566
40880
  }
@@ -41256,7 +41570,7 @@ var init_EventPaginatedListView_client = __esm({
41256
41570
  init_EventCompactRow();
41257
41571
  init_EmptyState();
41258
41572
  init_EventListing_view();
41259
- init_themedButtonClass();
41573
+ init_buttons();
41260
41574
  EventPaginatedListView = ({
41261
41575
  filters,
41262
41576
  display,
@@ -41299,7 +41613,7 @@ var init_EventPaginatedListView_client = __esm({
41299
41613
  {
41300
41614
  type: "button",
41301
41615
  onClick: loadMore,
41302
- className: themedButtonClass({
41616
+ className: themeButtonClassName({
41303
41617
  variant: display.buttonVariant,
41304
41618
  size: "md"
41305
41619
  }),
@@ -41313,7 +41627,7 @@ var init_EventPaginatedListView_client = __esm({
41313
41627
  type: "button",
41314
41628
  onClick: loadMore,
41315
41629
  disabled: loading,
41316
- className: themedButtonClass({
41630
+ className: themeButtonClassName({
41317
41631
  variant: display.buttonVariant,
41318
41632
  size: "md",
41319
41633
  extraClassName: loading ? "rb-opacity-50 rb-cursor-wait" : null
@@ -41325,7 +41639,7 @@ var init_EventPaginatedListView_client = __esm({
41325
41639
  "a",
41326
41640
  {
41327
41641
  href: seeAllUrl,
41328
- className: themedButtonClass({
41642
+ className: themeButtonClassName({
41329
41643
  variant: display.buttonVariant,
41330
41644
  size: "md"
41331
41645
  }),
@@ -42675,7 +42989,7 @@ var init_EventCombined_client = __esm({
42675
42989
  init_EventModalContext();
42676
42990
  init_EventModals();
42677
42991
  init_utils();
42678
- init_themedButtonClass();
42992
+ init_buttons();
42679
42993
  EventCombinedClient = ({
42680
42994
  events: initialEvents,
42681
42995
  siteId,
@@ -43001,7 +43315,7 @@ var init_EventCombined_client = __esm({
43001
43315
  {
43002
43316
  type: "button",
43003
43317
  onClick: goToToday,
43004
- className: themedButtonClass({ variant: buttonVariant, size: "sm" }),
43318
+ className: themeButtonClassName({ variant: buttonVariant, size: "sm" }),
43005
43319
  children: "Today"
43006
43320
  }
43007
43321
  )
@@ -43318,7 +43632,7 @@ var init_EventCalendar_client = __esm({
43318
43632
  init_EventModalContext();
43319
43633
  init_EventModals();
43320
43634
  init_WeekTimetableView();
43321
- init_themedButtonClass();
43635
+ init_buttons();
43322
43636
  EventCalendarClient = ({
43323
43637
  render
43324
43638
  }) => {
@@ -43607,7 +43921,7 @@ var init_EventCalendar_client = __esm({
43607
43921
  {
43608
43922
  type: "button",
43609
43923
  onClick: onToday,
43610
- className: themedButtonClass({
43924
+ className: themeButtonClassName({
43611
43925
  variant: display.buttonVariant,
43612
43926
  size: "sm"
43613
43927
  }),
@@ -43623,7 +43937,7 @@ var init_EventCalendar_client = __esm({
43623
43937
  {
43624
43938
  type: "button",
43625
43939
  onClick: onToday,
43626
- className: themedButtonClass({
43940
+ className: themeButtonClassName({
43627
43941
  variant: display.buttonVariant,
43628
43942
  size: "sm"
43629
43943
  }),
@@ -43721,7 +44035,7 @@ var init_form_client = __esm({
43721
44035
  init_client2();
43722
44036
  init_src3();
43723
44037
  init_useFormSubmission();
43724
- init_themedButtonClass();
44038
+ init_buttons();
43725
44039
  FormNodeClient = ({
43726
44040
  render
43727
44041
  }) => {
@@ -43863,7 +44177,7 @@ var init_form_client = __esm({
43863
44177
  "button",
43864
44178
  {
43865
44179
  type: "submit",
43866
- className: themedButtonClass({
44180
+ className: themeButtonClassName({
43867
44181
  variant: "primary",
43868
44182
  size: "md",
43869
44183
  extraClassName: "rb-w-full rb-sm-w-auto"
@@ -43990,7 +44304,7 @@ function NewsletterFormClient({
43990
44304
  "button",
43991
44305
  {
43992
44306
  type: "submit",
43993
- className: themedButtonClass({ variant: "primary", size: "md" }),
44307
+ className: themeButtonClassName({ variant: "primary", size: "md" }),
43994
44308
  disabled: isSubmitting,
43995
44309
  children: isSubmitting ? "Subscribing..." : render.display.buttonLabel
43996
44310
  }
@@ -44008,7 +44322,7 @@ var init_newsletter_form_client = __esm({
44008
44322
  init_client2();
44009
44323
  init_src3();
44010
44324
  init_api();
44011
- init_themedButtonClass();
44325
+ init_buttons();
44012
44326
  }
44013
44327
  });
44014
44328
 
@@ -58847,6 +59161,9 @@ function validationContext(options = {}) {
58847
59161
  allowIncomplete: isDraft || (options.allowIncomplete ?? false)
58848
59162
  };
58849
59163
  }
59164
+ function formatFieldPath(path) {
59165
+ return path.map((segment) => String(segment)).join(".");
59166
+ }
58850
59167
  function fieldIssueToMessage(issue2) {
58851
59168
  switch (issue2.kind) {
58852
59169
  case "required":
@@ -59070,7 +59387,7 @@ function normalizeRepeaterItems(plan, value, ctx) {
59070
59387
  return normalizeObjectChildren(fields3, itemRecord, ctx);
59071
59388
  });
59072
59389
  }
59073
- function normalizeNumberInput(value, allowNull) {
59390
+ function normalizeNumberInput(value, _allowNull) {
59074
59391
  if (value === "") return void 0;
59075
59392
  if (typeof value === "string" && value.trim() !== "") return Number(value);
59076
59393
  return value;
@@ -59202,7 +59519,7 @@ function validateRepeaterItem(plan, item, index, ctx) {
59202
59519
  const fields3 = plan.repeatedItemVariants ? plan.repeatedItemVariants.find((variant) => variant.typeId === itemType)?.fields : plan.repeatedItemPlan;
59203
59520
  if (!fields3) return [];
59204
59521
  return fields3.flatMap((childPlan) => {
59205
- const indexedPlan = withIndexedPath(childPlan, plan.path, index);
59522
+ const indexedPlan = materializeRepeaterItemPlan(childPlan, plan.path, index);
59206
59523
  return validateNormalizedFieldValue(indexedPlan, item[childPlan.fieldId], ctx);
59207
59524
  });
59208
59525
  }
@@ -59214,12 +59531,58 @@ function validateGroupPlan(plan, value, ctx) {
59214
59531
  function childValidationContext(plan, ctx) {
59215
59532
  return plan.allowNullChildren ? { ...ctx, allowNull: true } : ctx;
59216
59533
  }
59217
- function withIndexedPath(plan, parentPath, index) {
59218
- const suffix = plan.path.slice(parentPath.length + 1);
59219
- return {
59220
- ...plan,
59221
- path: [...parentPath, index, plan.fieldId, ...suffix]
59222
- };
59534
+ function materializeRepeaterItemPlan(plan, parentPath, index) {
59535
+ return rebaseFieldPlanPath(plan, [...parentPath, 0], [...parentPath, index]);
59536
+ }
59537
+ function rebaseFieldPlanPath(plan, fromPrefix, toPrefix) {
59538
+ const path = rebaseFieldPath(plan.path, fromPrefix, toPrefix);
59539
+ switch (plan.kind) {
59540
+ case "group":
59541
+ return {
59542
+ ...plan,
59543
+ path,
59544
+ children: plan.children.map((childPlan) => rebaseFieldPlanPath(childPlan, fromPrefix, toPrefix))
59545
+ };
59546
+ case "repeater":
59547
+ return {
59548
+ ...plan,
59549
+ path,
59550
+ ...plan.repeatedItemVariants ? {
59551
+ repeatedItemVariants: plan.repeatedItemVariants.map((variant) => ({
59552
+ ...variant,
59553
+ fields: variant.fields.map((fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix))
59554
+ }))
59555
+ } : {},
59556
+ ...plan.repeatedItemPlan ? {
59557
+ repeatedItemPlan: plan.repeatedItemPlan.map(
59558
+ (fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix)
59559
+ )
59560
+ } : {}
59561
+ };
59562
+ case "string":
59563
+ case "number":
59564
+ case "boolean":
59565
+ case "richText":
59566
+ case "media":
59567
+ case "link":
59568
+ case "select":
59569
+ case "passthrough":
59570
+ return {
59571
+ ...plan,
59572
+ path
59573
+ };
59574
+ default:
59575
+ return assertNever6(plan);
59576
+ }
59577
+ }
59578
+ function rebaseFieldPath(path, fromPrefix, toPrefix) {
59579
+ if (!startsWithFieldPath(path, fromPrefix)) {
59580
+ throw new Error(`Cannot rebase field path ${formatFieldPath(path)} from ${formatFieldPath(fromPrefix)}`);
59581
+ }
59582
+ return [...toPrefix, ...path.slice(fromPrefix.length)];
59583
+ }
59584
+ function startsWithFieldPath(path, prefix) {
59585
+ return prefix.every((segment, index) => path[index] === segment);
59223
59586
  }
59224
59587
  function issue(plan, kind, extra) {
59225
59588
  return {
@@ -63583,16 +63946,16 @@ var interpolateRichTextTokensOptionsSchema = z58.object({
63583
63946
  var richTextTokenPattern = /\{\{\s*([a-zA-Z0-9_]+)\s*\}\}/g;
63584
63947
  function getSiteName(context) {
63585
63948
  const viewModel = context.viewModel;
63586
- if (!isRecord2(viewModel)) return null;
63949
+ if (!isRecord3(viewModel)) return null;
63587
63950
  const site = viewModel.site;
63588
- if (isRecord2(site) && typeof site.title === "string") {
63951
+ if (isRecord3(site) && typeof site.title === "string") {
63589
63952
  const title = site.title.trim();
63590
63953
  return title.length > 0 ? title : null;
63591
63954
  }
63592
63955
  const root = viewModel.$root;
63593
- if (isRecord2(root)) {
63956
+ if (isRecord3(root)) {
63594
63957
  const rootSite = root.site;
63595
- if (isRecord2(rootSite) && typeof rootSite.title === "string") {
63958
+ if (isRecord3(rootSite) && typeof rootSite.title === "string") {
63596
63959
  const title = rootSite.title.trim();
63597
63960
  if (title.length > 0) return title;
63598
63961
  }
@@ -63614,7 +63977,7 @@ function replaceTokenText(input, allowedTokens, tokenValues) {
63614
63977
  });
63615
63978
  }
63616
63979
  function visitRichTextNode(node, allowedTokens, tokenValues) {
63617
- if (!isRecord2(node)) return node;
63980
+ if (!isRecord3(node)) return node;
63618
63981
  let changed = false;
63619
63982
  const nextNode = { ...node };
63620
63983
  if (nextNode.type === "text" && typeof nextNode.text === "string") {
@@ -63640,13 +64003,13 @@ function visitRichTextNode(node, allowedTokens, tokenValues) {
63640
64003
  return changed ? nextNode : node;
63641
64004
  }
63642
64005
  function interpolateRichTextTokens(value, options, context) {
63643
- if (!isRecord2(value)) return value;
64006
+ if (!isRecord3(value)) return value;
63644
64007
  const allowedTokens = new Set(options.tokens);
63645
64008
  const tokenValues = {
63646
64009
  year: String((/* @__PURE__ */ new Date()).getFullYear()),
63647
64010
  site_name: getSiteName(context)
63648
64011
  };
63649
- if (isRecord2(value.doc)) {
64012
+ if (isRecord3(value.doc)) {
63650
64013
  const nextDoc = visitRichTextNode(value.doc, allowedTokens, tokenValues);
63651
64014
  if (nextDoc === value.doc) return value;
63652
64015
  return { ...value, doc: nextDoc };
@@ -69671,7 +70034,7 @@ function hydrateValue(value, context) {
69671
70034
  const isUnchanged = resolvedItems.every((item, index) => item === value[index]);
69672
70035
  return isUnchanged ? value : resolvedItems;
69673
70036
  }
69674
- if (isRecord2(value)) {
70037
+ if (isRecord3(value)) {
69675
70038
  if (isInternalLink(value)) {
69676
70039
  return hydrateInternalLink(value, context.routes);
69677
70040
  }
@@ -74833,6 +75196,63 @@ var ENDPOINT_DEFINITIONS = {
74833
75196
  auth: "user",
74834
75197
  responseKind: "json"
74835
75198
  },
75199
+ updateRegisteredDomainContact: {
75200
+ path: "/domains/{domainId}/registrar/contact",
75201
+ method: "POST",
75202
+ errors: [
75203
+ "validation:invalid_input",
75204
+ "resource:not_found",
75205
+ "auth:forbidden",
75206
+ "external:service_error",
75207
+ "external:registrar_orphaned_contact_profile",
75208
+ "server:internal_error"
75209
+ ],
75210
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
75211
+ auth: "user",
75212
+ responseKind: "json"
75213
+ },
75214
+ setRegisteredDomainPrivacy: {
75215
+ path: "/domains/{domainId}/registrar/privacy",
75216
+ method: "POST",
75217
+ errors: [
75218
+ "validation:invalid_input",
75219
+ "resource:not_found",
75220
+ "auth:forbidden",
75221
+ "external:service_error",
75222
+ "server:internal_error"
75223
+ ],
75224
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
75225
+ auth: "user",
75226
+ responseKind: "json"
75227
+ },
75228
+ setRegisteredDomainAutoRenew: {
75229
+ path: "/domains/{domainId}/registrar/auto-renew",
75230
+ method: "POST",
75231
+ errors: [
75232
+ "validation:invalid_input",
75233
+ "resource:not_found",
75234
+ "auth:forbidden",
75235
+ "external:service_error",
75236
+ "server:internal_error"
75237
+ ],
75238
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
75239
+ auth: "user",
75240
+ responseKind: "json"
75241
+ },
75242
+ getRegisteredDomainRenewalPosture: {
75243
+ path: "/domains/{domainId}/registrar/renewal",
75244
+ method: "GET",
75245
+ errors: [
75246
+ "validation:invalid_input",
75247
+ "resource:not_found",
75248
+ "auth:forbidden",
75249
+ "external:service_error",
75250
+ "server:internal_error"
75251
+ ],
75252
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
75253
+ auth: "user",
75254
+ responseKind: "json"
75255
+ },
74836
75256
  retryDomainVercel: {
74837
75257
  path: "/domains/{domainId}/vercel",
74838
75258
  method: "POST",
@@ -78971,7 +79391,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
78971
79391
  }
78972
79392
 
78973
79393
  // ../api/src/utils/isRecord.ts
78974
- function isRecord4(value) {
79394
+ function isRecord5(value) {
78975
79395
  return typeof value === "object" && value !== null && !Array.isArray(value);
78976
79396
  }
78977
79397
 
@@ -79231,7 +79651,7 @@ function sanitizeMarks(marks) {
79231
79651
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
79232
79652
  return [{ type: mark.type }];
79233
79653
  }
79234
- if (mark.type === "link" && isRecord4(mark.attrs) && typeof mark.attrs.href === "string") {
79654
+ if (mark.type === "link" && isRecord5(mark.attrs) && typeof mark.attrs.href === "string") {
79235
79655
  const attrs = { href: mark.attrs.href };
79236
79656
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
79237
79657
  attrs.target = mark.attrs.target;
@@ -79246,10 +79666,10 @@ function sanitizeMarks(marks) {
79246
79666
  return sanitized.length > 0 ? sanitized : void 0;
79247
79667
  }
79248
79668
  function unwrapRichTextValue(value) {
79249
- if (isRecord4(value) && isRecord4(value.doc)) {
79669
+ if (isRecord5(value) && isRecord5(value.doc)) {
79250
79670
  return unwrapRichTextValue(value.doc);
79251
79671
  }
79252
- if (isRecord4(value) && value.type === "doc") {
79672
+ if (isRecord5(value) && value.type === "doc") {
79253
79673
  return {
79254
79674
  type: "doc",
79255
79675
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -79258,7 +79678,7 @@ function unwrapRichTextValue(value) {
79258
79678
  return EMPTY_SITE_BANNER_BODY;
79259
79679
  }
79260
79680
  function isTipTapNodeLike(value) {
79261
- return isRecord4(value) && typeof value.type === "string";
79681
+ return isRecord5(value) && typeof value.type === "string";
79262
79682
  }
79263
79683
  function coerceTipTapNode(value) {
79264
79684
  return {
@@ -79266,9 +79686,9 @@ function coerceTipTapNode(value) {
79266
79686
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
79267
79687
  ...typeof value.text === "string" ? { text: value.text } : {},
79268
79688
  ...Array.isArray(value.marks) ? {
79269
- marks: value.marks.filter((mark) => isRecord4(mark) && typeof mark.type === "string").map((mark) => ({
79689
+ marks: value.marks.filter((mark) => isRecord5(mark) && typeof mark.type === "string").map((mark) => ({
79270
79690
  type: mark.type,
79271
- ...isRecord4(mark.attrs) ? { attrs: mark.attrs } : {}
79691
+ ...isRecord5(mark.attrs) ? { attrs: mark.attrs } : {}
79272
79692
  }))
79273
79693
  } : {}
79274
79694
  };
@@ -79321,6 +79741,9 @@ function parsePublicProductCategorySelector(value) {
79321
79741
  return void 0;
79322
79742
  }
79323
79743
 
79744
+ // ../api/src/navigation/linkValue.ts
79745
+ init_src();
79746
+
79324
79747
  // ../api/src/aiPlayground.ts
79325
79748
  import { z as z68 } from "zod";
79326
79749
  var Rfc6902PatchOp = z68.discriminatedUnion("op", [
@@ -79975,7 +80398,7 @@ function applyBindings(bindings, context) {
79975
80398
  }
79976
80399
  continue;
79977
80400
  }
79978
- if (isRecord2(bindingSpec)) {
80401
+ if (isRecord3(bindingSpec)) {
79979
80402
  const nested = applyBindings(bindingSpec, context);
79980
80403
  if (Object.keys(nested).length > 0) {
79981
80404
  setBindingValue(result, key, nested);
@@ -80005,7 +80428,7 @@ function setBindingValue(target, path, value) {
80005
80428
  current[Number(segment)] = value;
80006
80429
  return;
80007
80430
  }
80008
- if (isRecord2(current)) {
80431
+ if (isRecord3(current)) {
80009
80432
  current[segment] = value;
80010
80433
  }
80011
80434
  return;
@@ -80017,17 +80440,17 @@ function setBindingValue(target, path, value) {
80017
80440
  if (nextWantsArray) {
80018
80441
  if (!Array.isArray(existing)) current[index] = [];
80019
80442
  } else {
80020
- if (!isRecord2(existing)) current[index] = {};
80443
+ if (!isRecord3(existing)) current[index] = {};
80021
80444
  }
80022
80445
  current = current[index];
80023
80446
  continue;
80024
80447
  }
80025
- if (isRecord2(current)) {
80448
+ if (isRecord3(current)) {
80026
80449
  const existing = current[segment];
80027
80450
  if (nextWantsArray) {
80028
80451
  if (!Array.isArray(existing)) current[segment] = [];
80029
80452
  } else {
80030
- if (!isRecord2(existing)) current[segment] = {};
80453
+ if (!isRecord3(existing)) current[segment] = {};
80031
80454
  }
80032
80455
  current = current[segment];
80033
80456
  continue;
@@ -80067,7 +80490,7 @@ function getPath(source, path) {
80067
80490
  const segments = path.split(".").map((segment) => segment.trim()).filter(Boolean);
80068
80491
  let current = source;
80069
80492
  for (const segment of segments) {
80070
- if (!isRecord2(current)) return void 0;
80493
+ if (!isRecord3(current)) return void 0;
80071
80494
  current = current[segment];
80072
80495
  }
80073
80496
  return current;
@@ -80086,13 +80509,13 @@ function applyTransform(name, value) {
80086
80509
  }
80087
80510
  }
80088
80511
  function extractFirstParagraph(value) {
80089
- if (!isRecord2(value)) return null;
80512
+ if (!isRecord3(value)) return null;
80090
80513
  const doc = value;
80091
80514
  if (!Array.isArray(doc.content)) return null;
80092
80515
  for (const node of doc.content) {
80093
- if (!isRecord2(node)) continue;
80516
+ if (!isRecord3(node)) continue;
80094
80517
  if (node.type !== "paragraph" || !Array.isArray(node.content)) continue;
80095
- const text2 = node.content.filter((item) => isRecord2(item) && item.type === "text").map((item) => typeof item.text === "string" ? item.text : "").join("").trim();
80518
+ const text2 = node.content.filter((item) => isRecord3(item) && item.type === "text").map((item) => typeof item.text === "string" ? item.text : "").join("").trim();
80096
80519
  if (text2.length > 0) {
80097
80520
  return text2;
80098
80521
  }
@@ -80106,7 +80529,7 @@ function formatDate5(value, options) {
80106
80529
  return new Intl.DateTimeFormat(void 0, options).format(date);
80107
80530
  }
80108
80531
  function isBindingDescriptor(value) {
80109
- if (!isRecord2(value) || typeof value.source !== "string") {
80532
+ if (!isRecord3(value) || typeof value.source !== "string") {
80110
80533
  return false;
80111
80534
  }
80112
80535
  if (!BINDING_SOURCES.includes(value.source)) {
@@ -80127,7 +80550,7 @@ function isBindingDescriptor(value) {
80127
80550
  }
80128
80551
  }
80129
80552
  function isBindingDescriptorLike(value) {
80130
- return isBindingDescriptor(value) || typeof value === "string" || isRecord2(value) && typeof value.source === "string" && typeof value.path === "string";
80553
+ return isBindingDescriptor(value) || typeof value === "string" || isRecord3(value) && typeof value.source === "string" && typeof value.path === "string";
80131
80554
  }
80132
80555
  function normalizeBindingInput(value) {
80133
80556
  if (isBindingDescriptor(value)) return value;
@@ -80143,7 +80566,7 @@ function normalizeValue(value) {
80143
80566
  if (Array.isArray(value)) {
80144
80567
  return value.map((item) => normalizeValue(item));
80145
80568
  }
80146
- if (!isRecord2(value)) {
80569
+ if (!isRecord3(value)) {
80147
80570
  return value;
80148
80571
  }
80149
80572
  if (isDocWrapper(value)) {
@@ -80157,7 +80580,7 @@ function isDocWrapper(value) {
80157
80580
  const keys = Object.keys(value);
80158
80581
  if (keys.length !== 1) return false;
80159
80582
  const doc = value.doc;
80160
- return isRecord2(doc) && typeof doc.type === "string" && doc.type === "doc";
80583
+ return isRecord3(doc) && typeof doc.type === "string" && doc.type === "doc";
80161
80584
  }
80162
80585
 
80163
80586
  // src/rendering/helpers/bindings.ts