@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
@@ -466,6 +466,92 @@ function encodePublicProductCategorySelector(selector) {
466
466
  };
467
467
  }
468
468
  }
469
+ function isRecord(value) {
470
+ return typeof value === "object" && value !== null;
471
+ }
472
+ function isJsonResponseContentType(contentType) {
473
+ if (!contentType) return false;
474
+ const mimeType = contentType.split(";", 1)[0]?.trim().toLowerCase() ?? "";
475
+ return mimeType === "application/json" || mimeType.endsWith("+json");
476
+ }
477
+ function getResponseContentType(response) {
478
+ return response.headers.get("content-type");
479
+ }
480
+ async function parseJsonBody(response) {
481
+ const rawText = await response.text();
482
+ if (rawText.trim().length === 0) {
483
+ return { kind: "empty-body" };
484
+ }
485
+ try {
486
+ return { kind: "success", value: JSON.parse(rawText) };
487
+ } catch {
488
+ return { kind: "invalid-json" };
489
+ }
490
+ }
491
+ function getBlockApiErrorDetails(data) {
492
+ if (!isRecord(data)) {
493
+ return {};
494
+ }
495
+ const nestedError = isRecord(data.error) ? data.error : void 0;
496
+ const message = typeof nestedError?.message === "string" ? nestedError.message : typeof data.message === "string" ? data.message : void 0;
497
+ const code = typeof nestedError?.code === "string" ? nestedError.code : typeof data.code === "string" ? data.code : void 0;
498
+ return { message, code };
499
+ }
500
+ function buildUnexpectedJsonResponseMessage(parseResult) {
501
+ switch (parseResult.kind) {
502
+ case "empty-body":
503
+ return "Expected JSON response body but received an empty response";
504
+ case "invalid-json":
505
+ return "Expected JSON response but received invalid JSON";
506
+ }
507
+ }
508
+ async function extractErrorDetails(response) {
509
+ const contentType = getResponseContentType(response);
510
+ const fallbackMessage = `Request failed: ${response.statusText}`;
511
+ if (!isJsonResponseContentType(contentType)) {
512
+ return {
513
+ message: `${fallbackMessage} (received ${contentType ?? "unknown content type"})`
514
+ };
515
+ }
516
+ const parseResult = await parseJsonBody(response);
517
+ switch (parseResult.kind) {
518
+ case "success": {
519
+ const details = getBlockApiErrorDetails(parseResult.value);
520
+ return {
521
+ message: details.message ?? fallbackMessage,
522
+ code: details.code
523
+ };
524
+ }
525
+ case "invalid-json":
526
+ return {
527
+ message: `${fallbackMessage} (received invalid JSON)`
528
+ };
529
+ case "empty-body":
530
+ return {
531
+ message: `${fallbackMessage} (received an empty response)`
532
+ };
533
+ }
534
+ }
535
+ async function parseJsonApiResponse(response) {
536
+ if (response.status === 204 || response.status === 205) {
537
+ return void 0;
538
+ }
539
+ const contentType = getResponseContentType(response);
540
+ if (!isJsonResponseContentType(contentType)) {
541
+ throw new BlockApiError(
542
+ `Expected JSON response but received ${contentType ?? "unknown content type"}`,
543
+ response.status
544
+ );
545
+ }
546
+ const parseResult = await parseJsonBody(response);
547
+ if (parseResult.kind !== "success") {
548
+ throw new BlockApiError(
549
+ buildUnexpectedJsonResponseMessage(parseResult),
550
+ response.status
551
+ );
552
+ }
553
+ return parseResult.value;
554
+ }
469
555
  function getAuthHeaders(auth) {
470
556
  switch (auth.type) {
471
557
  case "api-key":
@@ -522,21 +608,10 @@ function createBlockApi(config) {
522
608
  const doFetch = async () => {
523
609
  const response = await fetch(url, fetchOptions);
524
610
  if (!response.ok) {
525
- let errorMessage = `Request failed: ${response.statusText}`;
526
- let errorCode;
527
- try {
528
- const errorData = await response.json();
529
- if (typeof errorData.error?.message === "string") {
530
- errorMessage = errorData.error.message;
531
- } else if (typeof errorData.message === "string") {
532
- errorMessage = errorData.message;
533
- }
534
- errorCode = errorData.error?.code || errorData.code;
535
- } catch {
536
- }
537
- throw new BlockApiError(errorMessage, response.status, errorCode);
611
+ const details = await extractErrorDetails(response);
612
+ throw new BlockApiError(details.message, response.status, details.code);
538
613
  }
539
- const json = await response.json();
614
+ const json = await parseJsonApiResponse(response);
540
615
  if (isApiSuccessResponse(json)) {
541
616
  return json.data;
542
617
  }
@@ -1521,6 +1596,15 @@ var init_layout = __esm({
1521
1596
 
1522
1597
  // ../theme-core/src/buttons/types.ts
1523
1598
  import { z } from "zod";
1599
+ function isVariantRole(value) {
1600
+ return VARIANT_ROLES.includes(value);
1601
+ }
1602
+ function asSpecialVariantId(value) {
1603
+ if (value.length === 0) {
1604
+ throw new Error("SpecialVariantId must be a non-empty string");
1605
+ }
1606
+ return value;
1607
+ }
1524
1608
  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;
1525
1609
  var init_types = __esm({
1526
1610
  "../theme-core/src/buttons/types.ts"() {
@@ -1673,6 +1757,41 @@ var init_types = __esm({
1673
1757
  }
1674
1758
  });
1675
1759
 
1760
+ // ../theme-core/src/buttons/classNames.ts
1761
+ function parseThemeButtonVariantId(value) {
1762
+ const normalized = value?.trim() ?? "";
1763
+ if (normalized.length === 0) {
1764
+ return null;
1765
+ }
1766
+ if (normalized === DEFAULT_VARIANT_ALIAS_ID) {
1767
+ return DEFAULT_VARIANT_ALIAS_ID;
1768
+ }
1769
+ return isVariantRole(normalized) ? normalized : asSpecialVariantId(normalized);
1770
+ }
1771
+ function themeButtonVariantClassNames(variant) {
1772
+ if (variant === DEFAULT_VARIANT_ALIAS_ID) {
1773
+ return [variant];
1774
+ }
1775
+ return [variant, `button-${variant}`];
1776
+ }
1777
+ function themeButtonSizeClassName(size) {
1778
+ return `btn-${size}`;
1779
+ }
1780
+ function themeButtonClassName(spec) {
1781
+ const classes = [
1782
+ ...themeButtonVariantClassNames(spec.variant),
1783
+ themeButtonSizeClassName(spec.size),
1784
+ spec.extraClassName
1785
+ ];
1786
+ return classes.filter(Boolean).join(" ");
1787
+ }
1788
+ var init_classNames = __esm({
1789
+ "../theme-core/src/buttons/classNames.ts"() {
1790
+ "use strict";
1791
+ init_types();
1792
+ }
1793
+ });
1794
+
1676
1795
  // ../theme-core/src/tokens/resolver.ts
1677
1796
  var init_resolver = __esm({
1678
1797
  "../theme-core/src/tokens/resolver.ts"() {
@@ -1812,6 +1931,7 @@ var init_generateButtonCss = __esm({
1812
1931
  "../theme-core/src/buttons/generateButtonCss.ts"() {
1813
1932
  "use strict";
1814
1933
  init_types();
1934
+ init_classNames();
1815
1935
  init_resolver();
1816
1936
  init_generateEffectsCSS();
1817
1937
  init_constants();
@@ -2480,6 +2600,7 @@ var init_buttons = __esm({
2480
2600
  "../theme-core/src/buttons/index.ts"() {
2481
2601
  "use strict";
2482
2602
  init_types();
2603
+ init_classNames();
2483
2604
  init_generateButtonCss();
2484
2605
  init_generateDefaultButtonSystem();
2485
2606
  init_constants();
@@ -3129,10 +3250,71 @@ var init_participants = __esm({
3129
3250
  });
3130
3251
 
3131
3252
  // ../core/src/participant-identity.ts
3253
+ var PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD, PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATIONS;
3132
3254
  var init_participant_identity = __esm({
3133
3255
  "../core/src/participant-identity.ts"() {
3134
3256
  "use strict";
3135
3257
  init_assertNever();
3258
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD = {
3259
+ participant_id: {
3260
+ field: "participant_id",
3261
+ role: "canonical_link",
3262
+ canonicalSource: "booking_participants.id",
3263
+ contractAction: "tighten_in_839",
3264
+ notes: "Canonical person-subject link for a participation. #839 should enforce this once preflight is clean."
3265
+ },
3266
+ display_name: {
3267
+ field: "display_name",
3268
+ role: "contextual_snapshot",
3269
+ canonicalSource: "booking_participants.display_name for live identity",
3270
+ contractAction: "retain_as_snapshot",
3271
+ notes: "Participation-time display context. Readers must not treat it as mutable live participant identity."
3272
+ },
3273
+ email: {
3274
+ field: "email",
3275
+ role: "contextual_snapshot",
3276
+ canonicalSource: "booking_participants.email_normalized for live email identity",
3277
+ contractAction: "retain_as_snapshot",
3278
+ notes: "Participation-time contact snapshot used for notifications/context. Live identity belongs to the participant row."
3279
+ },
3280
+ email_normalized: {
3281
+ field: "email_normalized",
3282
+ role: "contextual_snapshot",
3283
+ canonicalSource: "booking_participants.email_normalized for live email identity",
3284
+ contractAction: "retain_as_snapshot",
3285
+ notes: "Normalized snapshot/dedupe helper for the participation slot, not live person authority."
3286
+ },
3287
+ phone: {
3288
+ field: "phone",
3289
+ role: "contextual_snapshot",
3290
+ canonicalSource: "booking_participants.phone for live phone identity",
3291
+ contractAction: "retain_as_snapshot",
3292
+ notes: "Participation-time phone context. Live identity belongs to the participant row."
3293
+ },
3294
+ identity_state: {
3295
+ field: "identity_state",
3296
+ role: "materialization_state",
3297
+ canonicalSource: "booking_participants.identity_state for subject state",
3298
+ contractAction: "review_for_later_contract_cleanup",
3299
+ notes: "Slot materialization state: booker_supplied, contactable, portal_claimed, or staff_verified."
3300
+ },
3301
+ event_attendee_guest_id: {
3302
+ field: "event_attendee_guest_id",
3303
+ role: "compatibility_projection",
3304
+ canonicalSource: "canonical participant slot plus #838 event guest compatibility projection",
3305
+ contractAction: "retain_as_projection",
3306
+ notes: "Compatibility FK for event guest read models. It is not person identity authority."
3307
+ }
3308
+ };
3309
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATIONS = [
3310
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.participant_id,
3311
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.display_name,
3312
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.email,
3313
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.email_normalized,
3314
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.phone,
3315
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.identity_state,
3316
+ PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.event_attendee_guest_id
3317
+ ];
3136
3318
  }
3137
3319
  });
3138
3320
 
@@ -3268,11 +3450,11 @@ var init_fileAssetLegacyProjection = __esm({
3268
3450
  });
3269
3451
 
3270
3452
  // ../media-core/src/typeGuards.ts
3271
- function isRecord(value) {
3453
+ function isRecord2(value) {
3272
3454
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
3273
3455
  }
3274
3456
  function asRecord(value) {
3275
- return isRecord(value) ? value : void 0;
3457
+ return isRecord2(value) ? value : void 0;
3276
3458
  }
3277
3459
  var init_typeGuards = __esm({
3278
3460
  "../media-core/src/typeGuards.ts"() {
@@ -5013,7 +5195,7 @@ var init_Text = __esm({
5013
5195
  });
5014
5196
 
5015
5197
  // ../blocks/src/lib/typeGuards.ts
5016
- function isRecord2(value) {
5198
+ function isRecord3(value) {
5017
5199
  return typeof value === "object" && value !== null && !Array.isArray(value);
5018
5200
  }
5019
5201
  var init_typeGuards2 = __esm({
@@ -5062,11 +5244,11 @@ function markdownToTipTapDoc(markdown) {
5062
5244
  };
5063
5245
  }
5064
5246
  function coerceRichTextDoc(value) {
5065
- const raw = isRecord2(value) && "doc" in value ? value.doc : value;
5247
+ const raw = isRecord3(value) && "doc" in value ? value.doc : value;
5066
5248
  if (typeof raw === "string") {
5067
5249
  return markdownToTipTapDoc(raw);
5068
5250
  }
5069
- if (isRecord2(raw) && typeof raw.type === "string") {
5251
+ if (isRecord3(raw) && typeof raw.type === "string") {
5070
5252
  return raw;
5071
5253
  }
5072
5254
  return null;
@@ -5126,11 +5308,12 @@ var init_basic = __esm({
5126
5308
  }
5127
5309
  return null;
5128
5310
  }
5129
- const resolvedVariantId = typeof variantId === "string" ? variantId.trim() : "";
5130
- const normalizedVariantId = resolvedVariantId === DEFAULT_VARIANT_ALIAS_ID ? "" : resolvedVariantId;
5131
- const variantClasses = normalizedVariantId ? [normalizedVariantId, `button-${normalizedVariantId}`] : [];
5132
- const sizeClass = `btn-${size}`;
5133
- const combinedClassName = [...variantClasses, sizeClass, className].filter(Boolean).join(" ");
5311
+ const resolvedVariantId = parseThemeButtonVariantId(variantId);
5312
+ const combinedClassName = resolvedVariantId ? themeButtonClassName({
5313
+ variant: resolvedVariantId,
5314
+ size,
5315
+ extraClassName: className
5316
+ }) : className;
5134
5317
  if (resolvedHref) {
5135
5318
  return /* @__PURE__ */ jsx10(
5136
5319
  "a",
@@ -6135,19 +6318,6 @@ var init_media2 = __esm({
6135
6318
  }
6136
6319
  });
6137
6320
 
6138
- // ../blocks/src/system/runtime/shared/themedButtonClass.ts
6139
- function themedButtonClass(spec) {
6140
- const { variant, size, extraClassName } = spec;
6141
- const normalizedVariant = variant.trim();
6142
- const variantClasses = normalizedVariant ? [normalizedVariant, `button-${normalizedVariant}`] : [];
6143
- return [...variantClasses, `btn-${size}`, extraClassName].filter(Boolean).join(" ");
6144
- }
6145
- var init_themedButtonClass = __esm({
6146
- "../blocks/src/system/runtime/shared/themedButtonClass.ts"() {
6147
- "use strict";
6148
- }
6149
- });
6150
-
6151
6321
  // ../blocks/src/system/runtime/nodes/file-download.tsx
6152
6322
  import { jsx as jsx13, jsxs } from "react/jsx-runtime";
6153
6323
  function isDownloadableMediaType(type) {
@@ -6221,7 +6391,7 @@ function FileDownloadNode({
6221
6391
  {
6222
6392
  href,
6223
6393
  download: filename,
6224
- className: themedButtonClass({
6394
+ className: themeButtonClassName({
6225
6395
  variant,
6226
6396
  size: "md",
6227
6397
  extraClassName: "rb-inline-flex rb-shrink-0 rb-items-center rb-justify-center rb-gap-2"
@@ -6241,7 +6411,7 @@ var init_file_download = __esm({
6241
6411
  init_lucide_react();
6242
6412
  init_colorStyles();
6243
6413
  init_media2();
6244
- init_themedButtonClass();
6414
+ init_buttons();
6245
6415
  init_media();
6246
6416
  FILE_DOWNLOAD_BUTTON_VARIANTS = ["primary", "secondary", "outline", "link"];
6247
6417
  }
@@ -9717,7 +9887,7 @@ var init_EventCard = __esm({
9717
9887
  init_EventCardIcons();
9718
9888
  init_eventCapacity();
9719
9889
  init_utils();
9720
- init_themedButtonClass();
9890
+ init_buttons();
9721
9891
  EventCard = ({
9722
9892
  event,
9723
9893
  cardVariant = "default",
@@ -9743,7 +9913,7 @@ var init_EventCard = __esm({
9743
9913
  const isSoldOut = cta.hidden;
9744
9914
  const { available: spotsLeft } = getEventAvailability(event);
9745
9915
  const cardClass = `card-${cardVariant}`;
9746
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
9916
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
9747
9917
  const title = event.title;
9748
9918
  const summary = event.presentation?.summary ?? event.description;
9749
9919
  const image = event.presentation?.image ?? null;
@@ -9825,7 +9995,7 @@ var init_EventCompactRow = __esm({
9825
9995
  "use strict";
9826
9996
  init_utils();
9827
9997
  init_EventCardIcons();
9828
- init_themedButtonClass();
9998
+ init_buttons();
9829
9999
  EventCompactRow = ({
9830
10000
  event,
9831
10001
  buttonVariant = "primary",
@@ -9837,7 +10007,7 @@ var init_EventCompactRow = __esm({
9837
10007
  const price = formatEventPrice(event);
9838
10008
  const teacherLine = formatEventTeacherLine(event);
9839
10009
  const cta = resolveEventCta(event, buttonText);
9840
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "sm" });
10010
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "sm" });
9841
10011
  return /* @__PURE__ */ jsxs17("div", { className: "event-compact-row", children: [
9842
10012
  /* @__PURE__ */ jsxs17("div", { className: "event-compact-row-content", children: [
9843
10013
  /* @__PURE__ */ jsxs17("div", { className: "event-compact-row-top", children: [
@@ -9909,7 +10079,7 @@ var init_EventSpotlight = __esm({
9909
10079
  "../blocks/src/system/runtime/nodes/events/EventSpotlight.tsx"() {
9910
10080
  "use strict";
9911
10081
  init_shared3();
9912
- init_themedButtonClass();
10082
+ init_buttons();
9913
10083
  EventSpotlight = ({
9914
10084
  events,
9915
10085
  layout = "grid",
@@ -9931,7 +10101,7 @@ var init_EventSpotlight = __esm({
9931
10101
  }
9932
10102
  const containerClass = getContainerClass(layout, columns);
9933
10103
  const cardOrientation = getCardOrientation(layout);
9934
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
10104
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
9935
10105
  return /* @__PURE__ */ jsxs19("div", { className: `event-spotlight-section ${className || ""}`, "data-block": "event-spotlight", children: [
9936
10106
  /* @__PURE__ */ jsx33("div", { className: `event-spotlight ${containerClass}`, children: normalizedEvents.map((event) => /* @__PURE__ */ jsx33(
9937
10107
  EventCard,
@@ -20312,7 +20482,16 @@ var init_view3 = __esm({
20312
20482
  import { Fragment as Fragment5, jsx as jsx37, jsxs as jsxs22 } from "react/jsx-runtime";
20313
20483
  function renderServerPendingAction(label, soldOut) {
20314
20484
  return /* @__PURE__ */ jsxs22(Fragment5, { children: [
20315
- /* @__PURE__ */ jsx37("button", { type: "button", className: "default", disabled: true, "aria-disabled": "true", children: soldOut ? "Sold out" : label }),
20485
+ /* @__PURE__ */ jsx37(
20486
+ "button",
20487
+ {
20488
+ type: "button",
20489
+ className: themeButtonClassName({ variant: "default", size: "md" }),
20490
+ disabled: true,
20491
+ "aria-disabled": "true",
20492
+ children: soldOut ? "Sold out" : label
20493
+ }
20494
+ ),
20316
20495
  !soldOut ? /* @__PURE__ */ jsx37("p", { className: "rb-caption status-muted", children: "Cart actions become interactive after page load." }) : null
20317
20496
  ] });
20318
20497
  }
@@ -20332,7 +20511,14 @@ function ProductListServerContent(props2) {
20332
20511
  ),
20333
20512
  actions: /* @__PURE__ */ jsxs22(Fragment5, { children: [
20334
20513
  renderServerPendingAction(card.actionLabel, card.soldOut),
20335
- card.path ? /* @__PURE__ */ jsx37("a", { href: card.path, className: "secondary btn-sm", children: "View details" }) : null
20514
+ card.path ? /* @__PURE__ */ jsx37(
20515
+ "a",
20516
+ {
20517
+ href: card.path,
20518
+ className: themeButtonClassName({ variant: "secondary", size: "sm" }),
20519
+ children: "View details"
20520
+ }
20521
+ ) : null
20336
20522
  ] })
20337
20523
  },
20338
20524
  card.productId
@@ -20375,6 +20561,7 @@ function CheckoutServerContent(props2) {
20375
20561
  var init_shop_commerce_server = __esm({
20376
20562
  "../blocks/src/system/runtime/nodes/shop-commerce.server.tsx"() {
20377
20563
  "use strict";
20564
+ init_buttons();
20378
20565
  init_RichText();
20379
20566
  init_carousel_server();
20380
20567
  init_richText_coerce();
@@ -20923,7 +21110,7 @@ function renderCalendarGrid(display) {
20923
21110
  "button",
20924
21111
  {
20925
21112
  type: "button",
20926
- className: themedButtonClass({
21113
+ className: themeButtonClassName({
20927
21114
  variant: display.buttonVariant,
20928
21115
  size: "sm"
20929
21116
  }),
@@ -21009,7 +21196,7 @@ function renderTimetableSsr(display) {
21009
21196
  "button",
21010
21197
  {
21011
21198
  type: "button",
21012
- className: themedButtonClass({
21199
+ className: themeButtonClassName({
21013
21200
  variant: display.buttonVariant,
21014
21201
  size: "sm"
21015
21202
  }),
@@ -21137,7 +21324,7 @@ var init_EventCalendar_server = __esm({
21137
21324
  init_renderEventListItem();
21138
21325
  init_utils();
21139
21326
  init_timetableModel();
21140
- init_themedButtonClass();
21327
+ init_buttons();
21141
21328
  EventCalendarSSR = (props2) => {
21142
21329
  const islandProps = buildEventCalendarInteractiveIslandProps(props2);
21143
21330
  const display = islandProps.render.display;
@@ -21268,7 +21455,7 @@ var init_form_server = __esm({
21268
21455
  "use strict";
21269
21456
  init_clsx();
21270
21457
  init_ssr();
21271
- init_themedButtonClass();
21458
+ init_buttons();
21272
21459
  init_form_interactive();
21273
21460
  FormNodeSSR = ({
21274
21461
  blockId,
@@ -21406,7 +21593,7 @@ var init_form_server = __esm({
21406
21593
  "button",
21407
21594
  {
21408
21595
  type: "submit",
21409
- className: themedButtonClass({
21596
+ className: themeButtonClassName({
21410
21597
  variant: "primary",
21411
21598
  size: "md",
21412
21599
  extraClassName: "rb-w-full rb-sm-w-auto"
@@ -21499,7 +21686,7 @@ function NewsletterFormSSR({
21499
21686
  "button",
21500
21687
  {
21501
21688
  type: "submit",
21502
- className: themedButtonClass({ variant: "primary", size: "md" }),
21689
+ className: themeButtonClassName({ variant: "primary", size: "md" }),
21503
21690
  children: display.buttonLabel
21504
21691
  }
21505
21692
  ) })
@@ -21516,7 +21703,7 @@ var init_newsletter_form_server = __esm({
21516
21703
  "use strict";
21517
21704
  init_clsx();
21518
21705
  init_ssr();
21519
- init_themedButtonClass();
21706
+ init_buttons();
21520
21707
  init_newsletter_form_interactive();
21521
21708
  newsletter_form_server_default = NewsletterFormSSR;
21522
21709
  }
@@ -21647,7 +21834,16 @@ function ShopSSR({
21647
21834
  PassCardView,
21648
21835
  {
21649
21836
  display: pass,
21650
- action: /* @__PURE__ */ jsx50("button", { type: "button", className: "default", disabled: true, "aria-disabled": "true", children: pass.actionLabel })
21837
+ action: /* @__PURE__ */ jsx50(
21838
+ "button",
21839
+ {
21840
+ type: "button",
21841
+ className: themeButtonClassName({ variant: "default", size: "md" }),
21842
+ disabled: true,
21843
+ "aria-disabled": "true",
21844
+ children: pass.actionLabel
21845
+ }
21846
+ )
21651
21847
  },
21652
21848
  pass.id
21653
21849
  )),
@@ -21655,7 +21851,16 @@ function ShopSSR({
21655
21851
  MembershipCardView,
21656
21852
  {
21657
21853
  display: membership,
21658
- action: /* @__PURE__ */ jsx50("button", { type: "button", className: "default", disabled: true, "aria-disabled": "true", children: membership.actionLabel })
21854
+ action: /* @__PURE__ */ jsx50(
21855
+ "button",
21856
+ {
21857
+ type: "button",
21858
+ className: themeButtonClassName({ variant: "default", size: "md" }),
21859
+ disabled: true,
21860
+ "aria-disabled": "true",
21861
+ children: membership.actionLabel
21862
+ }
21863
+ )
21659
21864
  },
21660
21865
  membership.id
21661
21866
  ))
@@ -21670,6 +21875,7 @@ var shop_server_default;
21670
21875
  var init_shop_server = __esm({
21671
21876
  "../blocks/src/system/runtime/nodes/shop.server.tsx"() {
21672
21877
  "use strict";
21878
+ init_buttons();
21673
21879
  init_ssr();
21674
21880
  init_view3();
21675
21881
  init_shop_interactive();
@@ -25110,7 +25316,7 @@ function MultiStepForm({
25110
25316
  type: "button",
25111
25317
  onClick: goToPrevious,
25112
25318
  disabled: !canGoBack,
25113
- className: "outline btn-md",
25319
+ className: themeButtonClassName({ variant: "outline", size: "md" }),
25114
25320
  children: backButtonLabel
25115
25321
  }
25116
25322
  ),
@@ -25120,7 +25326,11 @@ function MultiStepForm({
25120
25326
  type: "button",
25121
25327
  onClick: goToNext,
25122
25328
  disabled: !canGoNext,
25123
- className: "primary btn-md rb-flex-1",
25329
+ className: themeButtonClassName({
25330
+ variant: "primary",
25331
+ size: "md",
25332
+ extraClassName: "rb-flex-1"
25333
+ }),
25124
25334
  children: [
25125
25335
  (isValidating || isSubmitting) && /* @__PURE__ */ jsx52(
25126
25336
  SpinnerNode,
@@ -25236,6 +25446,7 @@ var init_MultiStepForm = __esm({
25236
25446
  "../blocks/src/system/runtime/components/multi-step/MultiStepForm.tsx"() {
25237
25447
  "use strict";
25238
25448
  "use client";
25449
+ init_buttons();
25239
25450
  init_MultiStepContext();
25240
25451
  init_useMultiStep();
25241
25452
  init_spinner();
@@ -26498,7 +26709,10 @@ function PaymentOptionSelectionStep({
26498
26709
  "button",
26499
26710
  {
26500
26711
  type: "button",
26501
- className: isSelected ? "primary btn-md" : "outline btn-md",
26712
+ className: themeButtonClassName({
26713
+ variant: isSelected ? "primary" : "outline",
26714
+ size: "md"
26715
+ }),
26502
26716
  style: paymentOptionLayoutStyle,
26503
26717
  onClick: () => updateData({
26504
26718
  selectedAppointmentPackageId: appointmentPackage.customerPassId,
@@ -26547,7 +26761,10 @@ function PaymentOptionSelectionStep({
26547
26761
  "button",
26548
26762
  {
26549
26763
  type: "button",
26550
- className: isSelected ? "primary btn-md" : "outline btn-md",
26764
+ className: themeButtonClassName({
26765
+ variant: isSelected ? "primary" : "outline",
26766
+ size: "md"
26767
+ }),
26551
26768
  style: paymentOptionLayoutStyle,
26552
26769
  onClick: () => updateData({
26553
26770
  selectedAppointmentPackageId: void 0,
@@ -26576,6 +26793,7 @@ var init_PaymentOptionSelectionStep = __esm({
26576
26793
  "../blocks/src/system/runtime/components/booking/PaymentOptionSelectionStep.tsx"() {
26577
26794
  "use strict";
26578
26795
  "use client";
26796
+ init_buttons();
26579
26797
  init_api();
26580
26798
  init_MultiStepContext();
26581
26799
  init_booking_form_state();
@@ -28211,6 +28429,7 @@ var init_booking_form_client = __esm({
28211
28429
  init_noop();
28212
28430
  init_client2();
28213
28431
  init_src3();
28432
+ init_buttons();
28214
28433
  init_api();
28215
28434
  init_MultiStepForm();
28216
28435
  init_SuccessMessage();
@@ -28448,7 +28667,7 @@ var init_booking_form_client = __esm({
28448
28667
  "button",
28449
28668
  {
28450
28669
  type: "button",
28451
- className: "secondary btn-sm",
28670
+ className: themeButtonClassName({ variant: "secondary", size: "sm" }),
28452
28671
  onClick: clearFeedback,
28453
28672
  children: "Dismiss"
28454
28673
  }
@@ -29824,7 +30043,7 @@ var init_PaymentSelectionStep = __esm({
29824
30043
  init_lucide_react();
29825
30044
  init_utils3();
29826
30045
  init_spinner();
29827
- init_themedButtonClass();
30046
+ init_buttons();
29828
30047
  init_CheckIcon2();
29829
30048
  init_SelectableOptionCard();
29830
30049
  PaymentSelectionStep = ({
@@ -29925,7 +30144,7 @@ var init_PaymentSelectionStep = __esm({
29925
30144
  "button",
29926
30145
  {
29927
30146
  type: "button",
29928
- className: themedButtonClass({ variant: "primary", size: "md" }),
30147
+ className: themeButtonClassName({ variant: "primary", size: "md" }),
29929
30148
  disabled: !email.trim(),
29930
30149
  onClick: onRequestLogin,
29931
30150
  children: "Email me a login link"
@@ -31585,7 +31804,7 @@ function MagicLinkForm({
31585
31804
  "button",
31586
31805
  {
31587
31806
  type: "button",
31588
- className: classPrefix === "cp" ? "secondary" : `${classPrefix}-modal-btn ${classPrefix}-modal-btn--secondary`,
31807
+ className: classPrefix === "cp" ? themeButtonClassName({ variant: "secondary", size: "md" }) : `${classPrefix}-modal-btn ${classPrefix}-modal-btn--secondary`,
31589
31808
  onClick: handleReset,
31590
31809
  children: "Try a different email"
31591
31810
  }
@@ -31613,7 +31832,7 @@ function MagicLinkForm({
31613
31832
  "button",
31614
31833
  {
31615
31834
  type: "submit",
31616
- className: classPrefix === "cp" ? "primary" : `${classPrefix}-modal-btn`,
31835
+ className: classPrefix === "cp" ? themeButtonClassName({ variant: "primary", size: "md" }) : `${classPrefix}-modal-btn`,
31617
31836
  disabled: !email.trim() || loading,
31618
31837
  children: loading ? "Sending..." : buttonText
31619
31838
  }
@@ -31624,6 +31843,7 @@ var init_MagicLinkForm = __esm({
31624
31843
  "../blocks/src/system/runtime/nodes/shared/MagicLinkForm.tsx"() {
31625
31844
  "use strict";
31626
31845
  "use client";
31846
+ init_buttons();
31627
31847
  init_api();
31628
31848
  }
31629
31849
  });
@@ -31649,7 +31869,7 @@ function EventRegistrationWizard(props2) {
31649
31869
  } = props2;
31650
31870
  const maxTicketsNum = parseInt(maxTickets, 10) || 5;
31651
31871
  const showSpamProtection = spamProtectionEnabled ?? isSpamProtectionEnabled();
31652
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
31872
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
31653
31873
  const wizard = useEventRegistrationWizard({
31654
31874
  anchorId: EVENT_REGISTRATION_ANCHOR_ID,
31655
31875
  occurrenceContext: occurrenceContext ?? null,
@@ -31786,7 +32006,7 @@ var init_EventRegistrationWizard = __esm({
31786
32006
  init_useEventRegistrationWizard();
31787
32007
  init_MagicLinkForm();
31788
32008
  init_spinner();
31789
- init_themedButtonClass();
32009
+ init_buttons();
31790
32010
  init_event_registration2();
31791
32011
  EVENT_REGISTRATION_ANCHOR_ID = "event-registration";
31792
32012
  EVENT_PORTAL_AUTH_COPY = {
@@ -32232,7 +32452,7 @@ function ErrorStep2({
32232
32452
  buttonVariant = "primary",
32233
32453
  onRetry
32234
32454
  }) {
32235
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
32455
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
32236
32456
  return /* @__PURE__ */ jsxs73("div", { className: "cr-error", role: "alert", children: [
32237
32457
  /* @__PURE__ */ jsx100(StateIcon, { variant: "error", children: /* @__PURE__ */ jsx100(CrossIcon, {}) }),
32238
32458
  /* @__PURE__ */ jsx100("h3", { className: "cr-error__title", children: "Enrollment Failed" }),
@@ -32244,7 +32464,7 @@ var init_ErrorStep2 = __esm({
32244
32464
  "../blocks/src/system/runtime/nodes/course-registration/ErrorStep.tsx"() {
32245
32465
  "use strict";
32246
32466
  init_shared6();
32247
- init_themedButtonClass();
32467
+ init_buttons();
32248
32468
  }
32249
32469
  });
32250
32470
 
@@ -32256,7 +32476,7 @@ function VerifyingTimeoutStep2({
32256
32476
  onCheckAgain,
32257
32477
  supportEmail
32258
32478
  }) {
32259
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
32479
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
32260
32480
  return /* @__PURE__ */ jsxs74("div", { className: "cr-error", role: "alert", children: [
32261
32481
  /* @__PURE__ */ jsx101(StateIcon, { variant: "warning", children: /* @__PURE__ */ jsx101(ClockIcon, {}) }),
32262
32482
  /* @__PURE__ */ jsx101("h3", { className: "cr-error__title", children: "Payment Verification Taking Longer" }),
@@ -32273,7 +32493,7 @@ var init_VerifyingTimeoutStep2 = __esm({
32273
32493
  "../blocks/src/system/runtime/nodes/course-registration/VerifyingTimeoutStep.tsx"() {
32274
32494
  "use strict";
32275
32495
  init_shared6();
32276
- init_themedButtonClass();
32496
+ init_buttons();
32277
32497
  }
32278
32498
  });
32279
32499
 
@@ -32285,7 +32505,7 @@ function PaymentFailedStep2({
32285
32505
  buttonVariant = "primary",
32286
32506
  onRetry
32287
32507
  }) {
32288
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
32508
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
32289
32509
  return /* @__PURE__ */ jsxs75("div", { className: "cr-payment-failed", role: "alert", children: [
32290
32510
  /* @__PURE__ */ jsx102(StateIcon, { variant: "error", children: /* @__PURE__ */ jsx102(CrossIcon, {}) }),
32291
32511
  /* @__PURE__ */ jsx102("h3", { className: "cr-payment-failed__title", children: "Payment Failed" }),
@@ -32297,7 +32517,7 @@ var init_PaymentFailedStep2 = __esm({
32297
32517
  "../blocks/src/system/runtime/nodes/course-registration/PaymentFailedStep.tsx"() {
32298
32518
  "use strict";
32299
32519
  init_shared6();
32300
- init_themedButtonClass();
32520
+ init_buttons();
32301
32521
  }
32302
32522
  });
32303
32523
 
@@ -33299,7 +33519,7 @@ function CourseRegistrationWizard(props2) {
33299
33519
  handleRetry,
33300
33520
  handleBookingModeChange
33301
33521
  } = useCourseRegistrationWizard(props2);
33302
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
33522
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
33303
33523
  if (scopedCourses.length === 0) {
33304
33524
  return /* @__PURE__ */ jsx106(
33305
33525
  "div",
@@ -33709,7 +33929,7 @@ var init_CourseRegistrationWizard = __esm({
33709
33929
  init_PaymentFailedStep2();
33710
33930
  init_VerifyingTimeoutStep2();
33711
33931
  init_spinner();
33712
- init_themedButtonClass();
33932
+ init_buttons();
33713
33933
  }
33714
33934
  });
33715
33935
 
@@ -33741,7 +33961,7 @@ var init_course_registration_client = __esm({
33741
33961
  import { useEffect as useEffect19, useRef as useRef10, useState as useState15 } from "react";
33742
33962
  import { jsx as jsx108 } from "react/jsx-runtime";
33743
33963
  function isLeafletApi(value) {
33744
- if (!isRecord2(value)) return false;
33964
+ if (!isRecord3(value)) return false;
33745
33965
  return typeof value.map === "function" && typeof value.tileLayer === "function" && typeof value.marker === "function";
33746
33966
  }
33747
33967
  function loadLeaflet() {
@@ -34443,7 +34663,11 @@ function PassesMembershipsController({ render }) {
34443
34663
  "button",
34444
34664
  {
34445
34665
  type: "button",
34446
- className: "secondary btn-sm shop__return-dismiss",
34666
+ className: themeButtonClassName({
34667
+ variant: "secondary",
34668
+ size: "sm",
34669
+ extraClassName: "shop__return-dismiss"
34670
+ }),
34447
34671
  onClick: () => dispatch({ type: "clearReturnNotice" }),
34448
34672
  children: "Dismiss"
34449
34673
  }
@@ -34460,7 +34684,11 @@ function PassesMembershipsController({ render }) {
34460
34684
  "button",
34461
34685
  {
34462
34686
  type: "button",
34463
- className: "default shop__cta",
34687
+ className: themeButtonClassName({
34688
+ variant: "default",
34689
+ size: "md",
34690
+ extraClassName: "shop__cta"
34691
+ }),
34464
34692
  onClick: () => handleBuyPass(pass),
34465
34693
  children: passDisplay.actionLabel
34466
34694
  }
@@ -34487,7 +34715,11 @@ function PassesMembershipsController({ render }) {
34487
34715
  "button",
34488
34716
  {
34489
34717
  type: "button",
34490
- className: "default shop__cta",
34718
+ className: themeButtonClassName({
34719
+ variant: "default",
34720
+ size: "md",
34721
+ extraClassName: "shop__cta"
34722
+ }),
34491
34723
  onClick: () => handleSubscribe(membership),
34492
34724
  children: membershipDisplay.actionLabel
34493
34725
  }
@@ -34531,12 +34763,20 @@ function PassesMembershipsController({ render }) {
34531
34763
  ] }) : null
34532
34764
  ] }),
34533
34765
  /* @__PURE__ */ jsxs83(ActionRow, { className: "shop__modal-warning-actions", children: [
34534
- /* @__PURE__ */ jsx112("button", { type: "button", className: "secondary", onClick: closeCheckout, children: "Cancel" }),
34535
34766
  /* @__PURE__ */ jsx112(
34536
34767
  "button",
34537
34768
  {
34538
34769
  type: "button",
34539
- className: "default",
34770
+ className: themeButtonClassName({ variant: "secondary", size: "md" }),
34771
+ onClick: closeCheckout,
34772
+ children: "Cancel"
34773
+ }
34774
+ ),
34775
+ /* @__PURE__ */ jsx112(
34776
+ "button",
34777
+ {
34778
+ type: "button",
34779
+ className: themeButtonClassName({ variant: "default", size: "md" }),
34540
34780
  onClick: handleConfirmDuplicate,
34541
34781
  disabled: checkout2.submitting,
34542
34782
  children: checkout2.submitting ? "Processing..." : "Subscribe Anyway"
@@ -34579,8 +34819,25 @@ function PassesMembershipsController({ render }) {
34579
34819
  ] }),
34580
34820
  checkout2.formError ? /* @__PURE__ */ jsx112("p", { className: "shop__modal-error", role: "alert", children: checkout2.formError }) : null,
34581
34821
  /* @__PURE__ */ jsxs83(ActionRow, { className: "shop__modal-actions", children: [
34582
- /* @__PURE__ */ jsx112("button", { type: "button", className: "secondary", onClick: closeCheckout, disabled: checkout2.submitting, children: "Cancel" }),
34583
- /* @__PURE__ */ jsx112("button", { type: "submit", className: "default", disabled: checkout2.submitting, children: checkout2.submitting ? "Processing..." : "Continue to Payment" })
34822
+ /* @__PURE__ */ jsx112(
34823
+ "button",
34824
+ {
34825
+ type: "button",
34826
+ className: themeButtonClassName({ variant: "secondary", size: "md" }),
34827
+ onClick: closeCheckout,
34828
+ disabled: checkout2.submitting,
34829
+ children: "Cancel"
34830
+ }
34831
+ ),
34832
+ /* @__PURE__ */ jsx112(
34833
+ "button",
34834
+ {
34835
+ type: "submit",
34836
+ className: themeButtonClassName({ variant: "default", size: "md" }),
34837
+ disabled: checkout2.submitting,
34838
+ children: checkout2.submitting ? "Processing..." : "Continue to Payment"
34839
+ }
34840
+ )
34584
34841
  ] })
34585
34842
  ] })
34586
34843
  ] })
@@ -34593,6 +34850,7 @@ var init_shop_client = __esm({
34593
34850
  "../blocks/src/system/runtime/nodes/shop.client.tsx"() {
34594
34851
  "use strict";
34595
34852
  "use client";
34853
+ init_buttons();
34596
34854
  init_api();
34597
34855
  init_ModalShell();
34598
34856
  init_shared6();
@@ -34807,7 +35065,7 @@ var init_embla_carousel_autoplay_esm = __esm({
34807
35065
  function isObject(subject) {
34808
35066
  return Object.prototype.toString.call(subject) === "[object Object]";
34809
35067
  }
34810
- function isRecord3(subject) {
35068
+ function isRecord4(subject) {
34811
35069
  return isObject(subject) || Array.isArray(subject);
34812
35070
  }
34813
35071
  function canUseDOM() {
@@ -34824,7 +35082,7 @@ function areOptionsEqual(optionsA, optionsB) {
34824
35082
  const valueA = optionsA[key];
34825
35083
  const valueB = optionsB[key];
34826
35084
  if (typeof valueA === "function") return `${valueA}` === `${valueB}`;
34827
- if (!isRecord3(valueA) || !isRecord3(valueB)) return valueA === valueB;
35085
+ if (!isRecord4(valueA) || !isRecord4(valueB)) return valueA === valueB;
34828
35086
  return areOptionsEqual(valueA, valueB);
34829
35087
  });
34830
35088
  }
@@ -36918,7 +37176,7 @@ function ProductListController(props2) {
36918
37176
  "button",
36919
37177
  {
36920
37178
  type: "button",
36921
- className: "default",
37179
+ className: themeButtonClassName({ variant: "default", size: "md" }),
36922
37180
  onClick: () => {
36923
37181
  const product = props2.render.hydration.products.find((candidate) => candidate.id === card.productId);
36924
37182
  if (!product) return;
@@ -36934,7 +37192,14 @@ function ProductListController(props2) {
36934
37192
  children: card.soldOut ? "Sold out" : card.actionLabel
36935
37193
  }
36936
37194
  ),
36937
- card.path ? /* @__PURE__ */ jsx114("a", { href: card.path, className: "secondary btn-sm", children: "View details" }) : null
37195
+ card.path ? /* @__PURE__ */ jsx114(
37196
+ "a",
37197
+ {
37198
+ href: card.path,
37199
+ className: themeButtonClassName({ variant: "secondary", size: "sm" }),
37200
+ children: "View details"
37201
+ }
37202
+ ) : null
36938
37203
  ] }),
36939
37204
  feedback: /* @__PURE__ */ jsx114(
36940
37205
  ShopAddFeedback,
@@ -37000,7 +37265,7 @@ function ProductDetailController(props2) {
37000
37265
  "button",
37001
37266
  {
37002
37267
  type: "button",
37003
- className: "default",
37268
+ className: themeButtonClassName({ variant: "default", size: "md" }),
37004
37269
  disabled: display.soldOut,
37005
37270
  onClick: () => {
37006
37271
  if (!selectedProduct) return;
@@ -37050,15 +37315,31 @@ function CartController(props2) {
37050
37315
  onChange: item.quantityEditable ? (event) => cart2.updateQuantity(item.key, Number(event.target.value)) : void 0
37051
37316
  }
37052
37317
  ),
37053
- /* @__PURE__ */ jsx114("button", { type: "button", className: "secondary btn-sm", onClick: () => cart2.removeItem(item.key), children: "Remove" })
37318
+ /* @__PURE__ */ jsx114(
37319
+ "button",
37320
+ {
37321
+ type: "button",
37322
+ className: themeButtonClassName({ variant: "secondary", size: "sm" }),
37323
+ onClick: () => cart2.removeItem(item.key),
37324
+ children: "Remove"
37325
+ }
37326
+ )
37054
37327
  ] }),
37055
37328
  footerActions: /* @__PURE__ */ jsxs85(Fragment19, { children: [
37056
- /* @__PURE__ */ jsx114("button", { type: "button", className: "secondary btn-sm", onClick: () => cart2.clear(), children: display.clearButtonText }),
37057
37329
  /* @__PURE__ */ jsx114(
37058
37330
  "button",
37059
37331
  {
37060
37332
  type: "button",
37061
- className: "default",
37333
+ className: themeButtonClassName({ variant: "secondary", size: "sm" }),
37334
+ onClick: () => cart2.clear(),
37335
+ children: display.clearButtonText
37336
+ }
37337
+ ),
37338
+ /* @__PURE__ */ jsx114(
37339
+ "button",
37340
+ {
37341
+ type: "button",
37342
+ className: themeButtonClassName({ variant: "default", size: "md" }),
37062
37343
  onClick: () => {
37063
37344
  window.location.href = resolveDedicatedCheckoutPath(window.location.pathname);
37064
37345
  },
@@ -37164,7 +37445,15 @@ function CheckoutController(props2) {
37164
37445
  )
37165
37446
  ] }),
37166
37447
  state.feedback.tag === "error" ? /* @__PURE__ */ jsx114("p", { className: "rb-caption status-muted", children: state.feedback.message }) : null,
37167
- /* @__PURE__ */ jsx114("button", { type: "submit", className: "default", disabled: state.submission === "submitting", children: state.submission === "submitting" ? "Loading\u2026" : display.submitButtonText })
37448
+ /* @__PURE__ */ jsx114(
37449
+ "button",
37450
+ {
37451
+ type: "submit",
37452
+ className: themeButtonClassName({ variant: "default", size: "md" }),
37453
+ disabled: state.submission === "submitting",
37454
+ children: state.submission === "submitting" ? "Loading\u2026" : display.submitButtonText
37455
+ }
37456
+ )
37168
37457
  ] })
37169
37458
  }
37170
37459
  );
@@ -37174,6 +37463,7 @@ var init_shop_commerce = __esm({
37174
37463
  "../blocks/src/system/runtime/nodes/shop-commerce.tsx"() {
37175
37464
  "use strict";
37176
37465
  "use client";
37466
+ init_buttons();
37177
37467
  init_api();
37178
37468
  init_RichText();
37179
37469
  init_carousel_client();
@@ -38870,7 +39160,7 @@ function HeaderCartDrawerItems(props2) {
38870
39160
  "button",
38871
39161
  {
38872
39162
  type: "button",
38873
- className: "secondary btn-sm",
39163
+ className: themeButtonClassName({ variant: "secondary", size: "sm" }),
38874
39164
  onClick: () => props2.cart.removeItem(item.key),
38875
39165
  children: "Remove"
38876
39166
  }
@@ -38963,7 +39253,7 @@ function HeaderCartDrawer(props2) {
38963
39253
  "button",
38964
39254
  {
38965
39255
  type: "button",
38966
- className: "secondary",
39256
+ className: themeButtonClassName({ variant: "secondary", size: "md" }),
38967
39257
  onClick: () => props2.cart.clear(),
38968
39258
  disabled: display.state === "empty",
38969
39259
  children: display.clearButtonText
@@ -38972,12 +39262,20 @@ function HeaderCartDrawer(props2) {
38972
39262
  props2.checkoutHref && display.state === "ready" ? /* @__PURE__ */ jsx129(
38973
39263
  "a",
38974
39264
  {
38975
- className: "default",
39265
+ className: themeButtonClassName({ variant: "default", size: "md" }),
38976
39266
  href: props2.checkoutHref,
38977
39267
  onClick: props2.onClose,
38978
39268
  children: display.checkoutButtonText
38979
39269
  }
38980
- ) : /* @__PURE__ */ jsx129("button", { type: "button", className: "default", disabled: true, children: display.checkoutButtonText })
39270
+ ) : /* @__PURE__ */ jsx129(
39271
+ "button",
39272
+ {
39273
+ type: "button",
39274
+ className: themeButtonClassName({ variant: "default", size: "md" }),
39275
+ disabled: true,
39276
+ children: display.checkoutButtonText
39277
+ }
39278
+ )
38981
39279
  ] })
38982
39280
  ]
38983
39281
  }
@@ -38990,6 +39288,7 @@ var init_HeaderCartDrawer = __esm({
38990
39288
  "../blocks/src/system/runtime/header/HeaderCartDrawer.tsx"() {
38991
39289
  "use strict";
38992
39290
  "use client";
39291
+ init_buttons();
38993
39292
  init_display();
38994
39293
  init_ModalShell();
38995
39294
  }
@@ -39763,7 +40062,7 @@ var init_EventPaginatedListView_client = __esm({
39763
40062
  init_EventCompactRow();
39764
40063
  init_EmptyState();
39765
40064
  init_EventListing_view();
39766
- init_themedButtonClass();
40065
+ init_buttons();
39767
40066
  EventPaginatedListView = ({
39768
40067
  filters,
39769
40068
  display,
@@ -39806,7 +40105,7 @@ var init_EventPaginatedListView_client = __esm({
39806
40105
  {
39807
40106
  type: "button",
39808
40107
  onClick: loadMore,
39809
- className: themedButtonClass({
40108
+ className: themeButtonClassName({
39810
40109
  variant: display.buttonVariant,
39811
40110
  size: "md"
39812
40111
  }),
@@ -39820,7 +40119,7 @@ var init_EventPaginatedListView_client = __esm({
39820
40119
  type: "button",
39821
40120
  onClick: loadMore,
39822
40121
  disabled: loading,
39823
- className: themedButtonClass({
40122
+ className: themeButtonClassName({
39824
40123
  variant: display.buttonVariant,
39825
40124
  size: "md",
39826
40125
  extraClassName: loading ? "rb-opacity-50 rb-cursor-wait" : null
@@ -39832,7 +40131,7 @@ var init_EventPaginatedListView_client = __esm({
39832
40131
  "a",
39833
40132
  {
39834
40133
  href: seeAllUrl,
39835
- className: themedButtonClass({
40134
+ className: themeButtonClassName({
39836
40135
  variant: display.buttonVariant,
39837
40136
  size: "md"
39838
40137
  }),
@@ -41182,7 +41481,7 @@ var init_EventCombined_client = __esm({
41182
41481
  init_EventModalContext();
41183
41482
  init_EventModals();
41184
41483
  init_utils();
41185
- init_themedButtonClass();
41484
+ init_buttons();
41186
41485
  EventCombinedClient = ({
41187
41486
  events: initialEvents,
41188
41487
  siteId,
@@ -41508,7 +41807,7 @@ var init_EventCombined_client = __esm({
41508
41807
  {
41509
41808
  type: "button",
41510
41809
  onClick: goToToday,
41511
- className: themedButtonClass({ variant: buttonVariant, size: "sm" }),
41810
+ className: themeButtonClassName({ variant: buttonVariant, size: "sm" }),
41512
41811
  children: "Today"
41513
41812
  }
41514
41813
  )
@@ -41825,7 +42124,7 @@ var init_EventCalendar_client = __esm({
41825
42124
  init_EventModalContext();
41826
42125
  init_EventModals();
41827
42126
  init_WeekTimetableView();
41828
- init_themedButtonClass();
42127
+ init_buttons();
41829
42128
  EventCalendarClient = ({
41830
42129
  render
41831
42130
  }) => {
@@ -42114,7 +42413,7 @@ var init_EventCalendar_client = __esm({
42114
42413
  {
42115
42414
  type: "button",
42116
42415
  onClick: onToday,
42117
- className: themedButtonClass({
42416
+ className: themeButtonClassName({
42118
42417
  variant: display.buttonVariant,
42119
42418
  size: "sm"
42120
42419
  }),
@@ -42130,7 +42429,7 @@ var init_EventCalendar_client = __esm({
42130
42429
  {
42131
42430
  type: "button",
42132
42431
  onClick: onToday,
42133
- className: themedButtonClass({
42432
+ className: themeButtonClassName({
42134
42433
  variant: display.buttonVariant,
42135
42434
  size: "sm"
42136
42435
  }),
@@ -42228,7 +42527,7 @@ var init_form_client = __esm({
42228
42527
  init_client2();
42229
42528
  init_src3();
42230
42529
  init_useFormSubmission();
42231
- init_themedButtonClass();
42530
+ init_buttons();
42232
42531
  FormNodeClient = ({
42233
42532
  render
42234
42533
  }) => {
@@ -42370,7 +42669,7 @@ var init_form_client = __esm({
42370
42669
  "button",
42371
42670
  {
42372
42671
  type: "submit",
42373
- className: themedButtonClass({
42672
+ className: themeButtonClassName({
42374
42673
  variant: "primary",
42375
42674
  size: "md",
42376
42675
  extraClassName: "rb-w-full rb-sm-w-auto"
@@ -42597,7 +42896,7 @@ function NewsletterFormClient({
42597
42896
  "button",
42598
42897
  {
42599
42898
  type: "submit",
42600
- className: themedButtonClass({ variant: "primary", size: "md" }),
42899
+ className: themeButtonClassName({ variant: "primary", size: "md" }),
42601
42900
  disabled: isSubmitting,
42602
42901
  children: isSubmitting ? "Subscribing..." : render.display.buttonLabel
42603
42902
  }
@@ -42616,14 +42915,14 @@ var init_newsletter_form_client = __esm({
42616
42915
  init_client2();
42617
42916
  init_src3();
42618
42917
  init_api();
42619
- init_themedButtonClass();
42918
+ init_buttons();
42620
42919
  newsletter_form_client_default = NewsletterFormClient;
42621
42920
  }
42622
42921
  });
42623
42922
 
42624
42923
  // ../blocks/src/system/runtime/components/registry.client.tsx
42625
42924
  import React53 from "react";
42626
- function isRecord4(value) {
42925
+ function isRecord5(value) {
42627
42926
  return typeof value === "object" && value !== null;
42628
42927
  }
42629
42928
  function buildRenderFromLooseProps(runtime, mode, props2) {
@@ -42642,14 +42941,14 @@ function withRuntimeBackedEnvelope(source, runtime, render) {
42642
42941
  function normalizeLegacyInteractiveRenderProps(runtime, mode, props2) {
42643
42942
  const source = props2;
42644
42943
  const render = props2["render"];
42645
- if (!isRecord4(render)) {
42944
+ if (!isRecord5(render)) {
42646
42945
  return withRuntimeBackedEnvelope(
42647
42946
  source,
42648
42947
  runtime,
42649
42948
  buildRenderFromLooseProps(runtime, mode, props2)
42650
42949
  );
42651
42950
  }
42652
- if (isRecord4(render["hydration"])) {
42951
+ if (isRecord5(render["hydration"])) {
42653
42952
  return withRuntimeBackedEnvelope(
42654
42953
  source,
42655
42954
  runtime,
@@ -42659,7 +42958,7 @@ function normalizeLegacyInteractiveRenderProps(runtime, mode, props2) {
42659
42958
  }
42660
42959
  );
42661
42960
  }
42662
- if (!isRecord4(render["display"])) {
42961
+ if (!isRecord5(render["display"])) {
42663
42962
  return withRuntimeBackedEnvelope(
42664
42963
  source,
42665
42964
  runtime,