@riverbankcms/sdk 0.60.9 → 0.60.11

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.
@@ -1332,6 +1332,9 @@ function validationContext(options = {}) {
1332
1332
  allowIncomplete: isDraft || (options.allowIncomplete ?? false)
1333
1333
  };
1334
1334
  }
1335
+ function formatFieldPath(path) {
1336
+ return path.map((segment) => String(segment)).join(".");
1337
+ }
1335
1338
  function fieldIssueToMessage(issue2) {
1336
1339
  switch (issue2.kind) {
1337
1340
  case "required":
@@ -1555,7 +1558,7 @@ function normalizeRepeaterItems(plan, value, ctx) {
1555
1558
  return normalizeObjectChildren(fields3, itemRecord, ctx);
1556
1559
  });
1557
1560
  }
1558
- function normalizeNumberInput(value, allowNull) {
1561
+ function normalizeNumberInput(value, _allowNull) {
1559
1562
  if (value === "") return void 0;
1560
1563
  if (typeof value === "string" && value.trim() !== "") return Number(value);
1561
1564
  return value;
@@ -1687,7 +1690,7 @@ function validateRepeaterItem(plan, item, index, ctx) {
1687
1690
  const fields3 = plan.repeatedItemVariants ? plan.repeatedItemVariants.find((variant) => variant.typeId === itemType)?.fields : plan.repeatedItemPlan;
1688
1691
  if (!fields3) return [];
1689
1692
  return fields3.flatMap((childPlan) => {
1690
- const indexedPlan = withIndexedPath(childPlan, plan.path, index);
1693
+ const indexedPlan = materializeRepeaterItemPlan(childPlan, plan.path, index);
1691
1694
  return validateNormalizedFieldValue(indexedPlan, item[childPlan.fieldId], ctx);
1692
1695
  });
1693
1696
  }
@@ -1699,12 +1702,58 @@ function validateGroupPlan(plan, value, ctx) {
1699
1702
  function childValidationContext(plan, ctx) {
1700
1703
  return plan.allowNullChildren ? { ...ctx, allowNull: true } : ctx;
1701
1704
  }
1702
- function withIndexedPath(plan, parentPath, index) {
1703
- const suffix = plan.path.slice(parentPath.length + 1);
1704
- return {
1705
- ...plan,
1706
- path: [...parentPath, index, plan.fieldId, ...suffix]
1707
- };
1705
+ function materializeRepeaterItemPlan(plan, parentPath, index) {
1706
+ return rebaseFieldPlanPath(plan, [...parentPath, 0], [...parentPath, index]);
1707
+ }
1708
+ function rebaseFieldPlanPath(plan, fromPrefix, toPrefix) {
1709
+ const path = rebaseFieldPath(plan.path, fromPrefix, toPrefix);
1710
+ switch (plan.kind) {
1711
+ case "group":
1712
+ return {
1713
+ ...plan,
1714
+ path,
1715
+ children: plan.children.map((childPlan) => rebaseFieldPlanPath(childPlan, fromPrefix, toPrefix))
1716
+ };
1717
+ case "repeater":
1718
+ return {
1719
+ ...plan,
1720
+ path,
1721
+ ...plan.repeatedItemVariants ? {
1722
+ repeatedItemVariants: plan.repeatedItemVariants.map((variant) => ({
1723
+ ...variant,
1724
+ fields: variant.fields.map((fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix))
1725
+ }))
1726
+ } : {},
1727
+ ...plan.repeatedItemPlan ? {
1728
+ repeatedItemPlan: plan.repeatedItemPlan.map(
1729
+ (fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix)
1730
+ )
1731
+ } : {}
1732
+ };
1733
+ case "string":
1734
+ case "number":
1735
+ case "boolean":
1736
+ case "richText":
1737
+ case "media":
1738
+ case "link":
1739
+ case "select":
1740
+ case "passthrough":
1741
+ return {
1742
+ ...plan,
1743
+ path
1744
+ };
1745
+ default:
1746
+ return assertNever2(plan);
1747
+ }
1748
+ }
1749
+ function rebaseFieldPath(path, fromPrefix, toPrefix) {
1750
+ if (!startsWithFieldPath(path, fromPrefix)) {
1751
+ throw new Error(`Cannot rebase field path ${formatFieldPath(path)} from ${formatFieldPath(fromPrefix)}`);
1752
+ }
1753
+ return [...toPrefix, ...path.slice(fromPrefix.length)];
1754
+ }
1755
+ function startsWithFieldPath(path, prefix) {
1756
+ return prefix.every((segment, index) => path[index] === segment);
1708
1757
  }
1709
1758
  function issue(plan, kind, extra) {
1710
1759
  return {
@@ -2215,6 +2264,15 @@ var VARIANT_ROLES = [
2215
2264
  "tertiary",
2216
2265
  "accent"
2217
2266
  ];
2267
+ function isVariantRole(value) {
2268
+ return VARIANT_ROLES.includes(value);
2269
+ }
2270
+ function asSpecialVariantId(value) {
2271
+ if (value.length === 0) {
2272
+ throw new Error("SpecialVariantId must be a non-empty string");
2273
+ }
2274
+ return value;
2275
+ }
2218
2276
  var DEFAULT_VARIANT_ALIAS_ID = "default";
2219
2277
  var cornerStyleSchema = z6.enum(["square", "rounded", "pill"]);
2220
2278
  var shadowSizeSchema = z6.enum(["none", "low", "medium", "high"]);
@@ -2965,6 +3023,42 @@ var mediaSchema = z9.object({
2965
3023
  transform: transformSchema.optional()
2966
3024
  });
2967
3025
 
3026
+ // ../theme-core/src/buttons/classNames.ts
3027
+ function parseThemeButtonVariantId(value) {
3028
+ const normalized = value?.trim() ?? "";
3029
+ if (normalized.length === 0) {
3030
+ return null;
3031
+ }
3032
+ if (normalized === DEFAULT_VARIANT_ALIAS_ID) {
3033
+ return DEFAULT_VARIANT_ALIAS_ID;
3034
+ }
3035
+ return isVariantRole(normalized) ? normalized : asSpecialVariantId(normalized);
3036
+ }
3037
+ function themeButtonVariantClassNames(variant) {
3038
+ if (variant === DEFAULT_VARIANT_ALIAS_ID) {
3039
+ return [variant];
3040
+ }
3041
+ return [variant, `button-${variant}`];
3042
+ }
3043
+ function themeButtonSizeClassName(size) {
3044
+ return `btn-${size}`;
3045
+ }
3046
+ function themeButtonSelector(variant, size) {
3047
+ const baseSelector = `.${variant}`;
3048
+ if (!size) {
3049
+ return baseSelector;
3050
+ }
3051
+ return `${baseSelector}.${themeButtonSizeClassName(size)}`;
3052
+ }
3053
+ function themeButtonClassName(spec) {
3054
+ const classes = [
3055
+ ...themeButtonVariantClassNames(spec.variant),
3056
+ themeButtonSizeClassName(spec.size),
3057
+ spec.extraClassName
3058
+ ];
3059
+ return classes.filter(Boolean).join(" ");
3060
+ }
3061
+
2968
3062
  // ../theme-core/src/tokens/resolver.ts
2969
3063
  var TokenResolver = class {
2970
3064
  constructor(theme) {
@@ -4536,17 +4630,25 @@ function resolveAliasSource(enabled) {
4536
4630
  }
4537
4631
  function variantChunks(variant, global, themeSizes, themeId, tokens, theme) {
4538
4632
  const out = [];
4539
- out.push(variantBaseRule(variant, global, themeId, tokens, theme));
4540
- const hoverBg = variantHoverBackgroundRule(variant, global, themeId, tokens);
4633
+ const variantId = parseButtonVariantIdForCss(variant.id);
4634
+ out.push(variantBaseRule(variant, variantId, global, themeId, tokens, theme));
4635
+ const hoverBg = variantHoverBackgroundRule(variant, variantId, global, themeId, tokens);
4541
4636
  if (hoverBg) out.push(hoverBg);
4542
4637
  const effects = variantEffectsCss(variant, themeId, tokens, theme);
4543
4638
  if (effects) out.push({ raw: effects });
4544
- out.push(...variantDisabledRules(variant, themeId));
4545
- out.push(...variantSizeRules(variant, themeSizes, themeId));
4639
+ out.push(...variantDisabledRules(variantId, themeId));
4640
+ out.push(...variantSizeRules(variant, variantId, themeSizes, themeId));
4546
4641
  return out;
4547
4642
  }
4548
- function variantBaseRule(variant, global, themeId, tokens, theme) {
4549
- const selector = `:where([data-theme-scope="${themeId}"]) .${variant.id}`;
4643
+ function parseButtonVariantIdForCss(value) {
4644
+ const variantId = parseThemeButtonVariantId(value);
4645
+ if (!variantId) {
4646
+ throw new Error("Button variant id must be a non-empty string");
4647
+ }
4648
+ return variantId;
4649
+ }
4650
+ function variantBaseRule(variant, variantId, global, themeId, tokens, theme) {
4651
+ const selector = `:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}`;
4550
4652
  const decls = [];
4551
4653
  decls.push(["font-weight", String(global.fontWeight)]);
4552
4654
  decls.push(["font-family", resolveFontFamily(global)]);
@@ -4579,13 +4681,13 @@ function variantBaseRule(variant, global, themeId, tokens, theme) {
4579
4681
  }
4580
4682
  return rule(selector, decls);
4581
4683
  }
4582
- function variantHoverBackgroundRule(variant, global, themeId, tokens) {
4684
+ function variantHoverBackgroundRule(variant, variantId, global, themeId, tokens) {
4583
4685
  let hoverToken = variant.hoverBackgroundToken;
4584
4686
  if (!hoverToken && global.hoverColor === "token" && global.hoverColorToken) {
4585
4687
  hoverToken = global.hoverColorToken;
4586
4688
  }
4587
4689
  if (!hoverToken) return null;
4588
- return rule(`:where([data-theme-scope="${themeId}"]) .${variant.id}:hover`, [
4690
+ return rule(`:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}:hover`, [
4589
4691
  ["background-color", tokens.getColor(hoverToken)]
4590
4692
  ]);
4591
4693
  }
@@ -4605,8 +4707,8 @@ function variantEffectsCss(variant, themeId, tokens, theme) {
4605
4707
  theme
4606
4708
  });
4607
4709
  }
4608
- function variantDisabledRules(variant, themeId) {
4609
- const base = `:where([data-theme-scope="${themeId}"]) .${variant.id}:disabled`;
4710
+ function variantDisabledRules(variantId, themeId) {
4711
+ const base = `:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}:disabled`;
4610
4712
  const disabledSelectors = [base, `${base}:hover`, `${base}:active`, `${base}:focus`];
4611
4713
  const pseudoSelectors = [`${base}::before`, `${base}::after`];
4612
4714
  return [
@@ -4624,12 +4726,12 @@ function variantDisabledRules(variant, themeId) {
4624
4726
  ])
4625
4727
  ];
4626
4728
  }
4627
- function variantSizeRules(variant, themeSizes, themeId) {
4729
+ function variantSizeRules(variant, variantId, themeSizes, themeId) {
4628
4730
  const borderWidth = variant.border ? BORDER_WIDTH_MAP[variant.border.widthClass] || "1px" : "0px";
4629
4731
  const rules = [];
4630
4732
  for (const sizeName of BUTTON_SIZE_NAMES) {
4631
4733
  const config = resolveSizeConfig(variant, sizeName, themeSizes);
4632
- const selector = `:where([data-theme-scope="${themeId}"]) .${variant.id}.btn-${sizeName}`;
4734
+ const selector = `:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId, sizeName)}`;
4633
4735
  const decls = [];
4634
4736
  for (const decl of paddingDeclarations(config.padding, borderWidth)) decls.push(decl);
4635
4737
  if (config.fontSize) {
@@ -19699,14 +19801,6 @@ function CalendarIcon({
19699
19801
  );
19700
19802
  }
19701
19803
 
19702
- // ../blocks/src/system/runtime/shared/themedButtonClass.ts
19703
- function themedButtonClass(spec) {
19704
- const { variant, size, extraClassName } = spec;
19705
- const normalizedVariant = variant.trim();
19706
- const variantClasses = normalizedVariant ? [normalizedVariant, `button-${normalizedVariant}`] : [];
19707
- return [...variantClasses, `btn-${size}`, extraClassName].filter(Boolean).join(" ");
19708
- }
19709
-
19710
19804
  // ../blocks/src/system/runtime/nodes/events/shared/EventCard.tsx
19711
19805
  import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
19712
19806
  var EventCard = ({
@@ -19734,7 +19828,7 @@ var EventCard = ({
19734
19828
  const isSoldOut = cta.hidden;
19735
19829
  const { available: spotsLeft } = getEventAvailability(event);
19736
19830
  const cardClass = `card-${cardVariant}`;
19737
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
19831
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
19738
19832
  const title = event.title;
19739
19833
  const summary = event.presentation?.summary ?? event.description;
19740
19834
  const image = event.presentation?.image ?? null;
@@ -19853,7 +19947,7 @@ var EventCompactRow = ({
19853
19947
  const price = formatEventPrice(event);
19854
19948
  const teacherLine = formatEventTeacherLine(event);
19855
19949
  const cta = resolveEventCta(event, buttonText);
19856
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "sm" });
19950
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "sm" });
19857
19951
  return /* @__PURE__ */ jsxs3("div", { className: "event-compact-row", children: [
19858
19952
  /* @__PURE__ */ jsxs3("div", { className: "event-compact-row-content", children: [
19859
19953
  /* @__PURE__ */ jsxs3("div", { className: "event-compact-row-top", children: [
@@ -26543,11 +26637,12 @@ var ButtonNode = ({
26543
26637
  }
26544
26638
  return null;
26545
26639
  }
26546
- const resolvedVariantId = typeof variantId === "string" ? variantId.trim() : "";
26547
- const normalizedVariantId = resolvedVariantId === DEFAULT_VARIANT_ALIAS_ID ? "" : resolvedVariantId;
26548
- const variantClasses = normalizedVariantId ? [normalizedVariantId, `button-${normalizedVariantId}`] : [];
26549
- const sizeClass = `btn-${size}`;
26550
- const combinedClassName = [...variantClasses, sizeClass, className].filter(Boolean).join(" ");
26640
+ const resolvedVariantId = parseThemeButtonVariantId(variantId);
26641
+ const combinedClassName = resolvedVariantId ? themeButtonClassName({
26642
+ variant: resolvedVariantId,
26643
+ size,
26644
+ extraClassName: className
26645
+ }) : className;
26551
26646
  if (resolvedHref) {
26552
26647
  return /* @__PURE__ */ jsx15(
26553
26648
  "a",
@@ -27121,7 +27216,7 @@ function FileDownloadNode({
27121
27216
  {
27122
27217
  href,
27123
27218
  download: filename,
27124
- className: themedButtonClass({
27219
+ className: themeButtonClassName({
27125
27220
  variant,
27126
27221
  size: "md",
27127
27222
  extraClassName: "rb-inline-flex rb-shrink-0 rb-items-center rb-justify-center rb-gap-2"
@@ -28813,7 +28908,7 @@ var EventSpotlight = ({
28813
28908
  }
28814
28909
  const containerClass = getContainerClass(layout, columns);
28815
28910
  const cardOrientation = getCardOrientation(layout);
28816
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
28911
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
28817
28912
  return /* @__PURE__ */ jsxs19("div", { className: `event-spotlight-section ${className || ""}`, "data-block": "event-spotlight", children: [
28818
28913
  /* @__PURE__ */ jsx32("div", { className: `event-spotlight ${containerClass}`, children: normalizedEvents.map((event) => /* @__PURE__ */ jsx32(
28819
28914
  EventCard,
@@ -29306,7 +29401,16 @@ function CheckoutShellView(props2) {
29306
29401
  import { Fragment as Fragment5, jsx as jsx36, jsxs as jsxs22 } from "react/jsx-runtime";
29307
29402
  function renderServerPendingAction(label, soldOut) {
29308
29403
  return /* @__PURE__ */ jsxs22(Fragment5, { children: [
29309
- /* @__PURE__ */ jsx36("button", { type: "button", className: "default", disabled: true, "aria-disabled": "true", children: soldOut ? "Sold out" : label }),
29404
+ /* @__PURE__ */ jsx36(
29405
+ "button",
29406
+ {
29407
+ type: "button",
29408
+ className: themeButtonClassName({ variant: "default", size: "md" }),
29409
+ disabled: true,
29410
+ "aria-disabled": "true",
29411
+ children: soldOut ? "Sold out" : label
29412
+ }
29413
+ ),
29310
29414
  !soldOut ? /* @__PURE__ */ jsx36("p", { className: "rb-caption status-muted", children: "Cart actions become interactive after page load." }) : null
29311
29415
  ] });
29312
29416
  }
@@ -29326,7 +29430,14 @@ function ProductListServerContent(props2) {
29326
29430
  ),
29327
29431
  actions: /* @__PURE__ */ jsxs22(Fragment5, { children: [
29328
29432
  renderServerPendingAction(card.actionLabel, card.soldOut),
29329
- card.path ? /* @__PURE__ */ jsx36("a", { href: card.path, className: "secondary btn-sm", children: "View details" }) : null
29433
+ card.path ? /* @__PURE__ */ jsx36(
29434
+ "a",
29435
+ {
29436
+ href: card.path,
29437
+ className: themeButtonClassName({ variant: "secondary", size: "sm" }),
29438
+ children: "View details"
29439
+ }
29440
+ ) : null
29330
29441
  ] })
29331
29442
  },
29332
29443
  card.productId
@@ -29859,7 +29970,7 @@ function renderCalendarGrid(display) {
29859
29970
  "button",
29860
29971
  {
29861
29972
  type: "button",
29862
- className: themedButtonClass({
29973
+ className: themeButtonClassName({
29863
29974
  variant: display.buttonVariant,
29864
29975
  size: "sm"
29865
29976
  }),
@@ -29945,7 +30056,7 @@ function renderTimetableSsr(display) {
29945
30056
  "button",
29946
30057
  {
29947
30058
  type: "button",
29948
- className: themedButtonClass({
30059
+ className: themeButtonClassName({
29949
30060
  variant: display.buttonVariant,
29950
30061
  size: "sm"
29951
30062
  }),
@@ -30302,7 +30413,7 @@ var FormNodeSSR = ({
30302
30413
  "button",
30303
30414
  {
30304
30415
  type: "submit",
30305
- className: themedButtonClass({
30416
+ className: themeButtonClassName({
30306
30417
  variant: "primary",
30307
30418
  size: "md",
30308
30419
  extraClassName: "rb-w-full rb-sm-w-auto"
@@ -30393,7 +30504,7 @@ function NewsletterFormSSR({
30393
30504
  "button",
30394
30505
  {
30395
30506
  type: "submit",
30396
- className: themedButtonClass({ variant: "primary", size: "md" }),
30507
+ className: themeButtonClassName({ variant: "primary", size: "md" }),
30397
30508
  children: display.buttonLabel
30398
30509
  }
30399
30510
  ) })
@@ -30513,7 +30624,16 @@ function ShopSSR({
30513
30624
  PassCardView,
30514
30625
  {
30515
30626
  display: pass,
30516
- action: /* @__PURE__ */ jsx49("button", { type: "button", className: "default", disabled: true, "aria-disabled": "true", children: pass.actionLabel })
30627
+ action: /* @__PURE__ */ jsx49(
30628
+ "button",
30629
+ {
30630
+ type: "button",
30631
+ className: themeButtonClassName({ variant: "default", size: "md" }),
30632
+ disabled: true,
30633
+ "aria-disabled": "true",
30634
+ children: pass.actionLabel
30635
+ }
30636
+ )
30517
30637
  },
30518
30638
  pass.id
30519
30639
  )),
@@ -30521,7 +30641,16 @@ function ShopSSR({
30521
30641
  MembershipCardView,
30522
30642
  {
30523
30643
  display: membership,
30524
- action: /* @__PURE__ */ jsx49("button", { type: "button", className: "default", disabled: true, "aria-disabled": "true", children: membership.actionLabel })
30644
+ action: /* @__PURE__ */ jsx49(
30645
+ "button",
30646
+ {
30647
+ type: "button",
30648
+ className: themeButtonClassName({ variant: "default", size: "md" }),
30649
+ disabled: true,
30650
+ "aria-disabled": "true",
30651
+ children: membership.actionLabel
30652
+ }
30653
+ )
30525
30654
  },
30526
30655
  membership.id
30527
30656
  ))