@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.
@@ -1335,6 +1335,9 @@ function validationContext(options = {}) {
1335
1335
  allowIncomplete: isDraft || (options.allowIncomplete ?? false)
1336
1336
  };
1337
1337
  }
1338
+ function formatFieldPath(path) {
1339
+ return path.map((segment) => String(segment)).join(".");
1340
+ }
1338
1341
  function fieldIssueToMessage(issue2) {
1339
1342
  switch (issue2.kind) {
1340
1343
  case "required":
@@ -1558,7 +1561,7 @@ function normalizeRepeaterItems(plan, value, ctx) {
1558
1561
  return normalizeObjectChildren(fields3, itemRecord, ctx);
1559
1562
  });
1560
1563
  }
1561
- function normalizeNumberInput(value, allowNull) {
1564
+ function normalizeNumberInput(value, _allowNull) {
1562
1565
  if (value === "") return void 0;
1563
1566
  if (typeof value === "string" && value.trim() !== "") return Number(value);
1564
1567
  return value;
@@ -1690,7 +1693,7 @@ function validateRepeaterItem(plan, item, index, ctx) {
1690
1693
  const fields3 = plan.repeatedItemVariants ? plan.repeatedItemVariants.find((variant) => variant.typeId === itemType)?.fields : plan.repeatedItemPlan;
1691
1694
  if (!fields3) return [];
1692
1695
  return fields3.flatMap((childPlan) => {
1693
- const indexedPlan = withIndexedPath(childPlan, plan.path, index);
1696
+ const indexedPlan = materializeRepeaterItemPlan(childPlan, plan.path, index);
1694
1697
  return validateNormalizedFieldValue(indexedPlan, item[childPlan.fieldId], ctx);
1695
1698
  });
1696
1699
  }
@@ -1702,12 +1705,58 @@ function validateGroupPlan(plan, value, ctx) {
1702
1705
  function childValidationContext(plan, ctx) {
1703
1706
  return plan.allowNullChildren ? { ...ctx, allowNull: true } : ctx;
1704
1707
  }
1705
- function withIndexedPath(plan, parentPath, index) {
1706
- const suffix = plan.path.slice(parentPath.length + 1);
1707
- return {
1708
- ...plan,
1709
- path: [...parentPath, index, plan.fieldId, ...suffix]
1710
- };
1708
+ function materializeRepeaterItemPlan(plan, parentPath, index) {
1709
+ return rebaseFieldPlanPath(plan, [...parentPath, 0], [...parentPath, index]);
1710
+ }
1711
+ function rebaseFieldPlanPath(plan, fromPrefix, toPrefix) {
1712
+ const path = rebaseFieldPath(plan.path, fromPrefix, toPrefix);
1713
+ switch (plan.kind) {
1714
+ case "group":
1715
+ return {
1716
+ ...plan,
1717
+ path,
1718
+ children: plan.children.map((childPlan) => rebaseFieldPlanPath(childPlan, fromPrefix, toPrefix))
1719
+ };
1720
+ case "repeater":
1721
+ return {
1722
+ ...plan,
1723
+ path,
1724
+ ...plan.repeatedItemVariants ? {
1725
+ repeatedItemVariants: plan.repeatedItemVariants.map((variant) => ({
1726
+ ...variant,
1727
+ fields: variant.fields.map((fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix))
1728
+ }))
1729
+ } : {},
1730
+ ...plan.repeatedItemPlan ? {
1731
+ repeatedItemPlan: plan.repeatedItemPlan.map(
1732
+ (fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix)
1733
+ )
1734
+ } : {}
1735
+ };
1736
+ case "string":
1737
+ case "number":
1738
+ case "boolean":
1739
+ case "richText":
1740
+ case "media":
1741
+ case "link":
1742
+ case "select":
1743
+ case "passthrough":
1744
+ return {
1745
+ ...plan,
1746
+ path
1747
+ };
1748
+ default:
1749
+ return assertNever2(plan);
1750
+ }
1751
+ }
1752
+ function rebaseFieldPath(path, fromPrefix, toPrefix) {
1753
+ if (!startsWithFieldPath(path, fromPrefix)) {
1754
+ throw new Error(`Cannot rebase field path ${formatFieldPath(path)} from ${formatFieldPath(fromPrefix)}`);
1755
+ }
1756
+ return [...toPrefix, ...path.slice(fromPrefix.length)];
1757
+ }
1758
+ function startsWithFieldPath(path, prefix) {
1759
+ return prefix.every((segment, index) => path[index] === segment);
1711
1760
  }
1712
1761
  function issue(plan, kind, extra) {
1713
1762
  return {
@@ -2218,6 +2267,15 @@ var VARIANT_ROLES = [
2218
2267
  "tertiary",
2219
2268
  "accent"
2220
2269
  ];
2270
+ function isVariantRole(value) {
2271
+ return VARIANT_ROLES.includes(value);
2272
+ }
2273
+ function asSpecialVariantId(value) {
2274
+ if (value.length === 0) {
2275
+ throw new Error("SpecialVariantId must be a non-empty string");
2276
+ }
2277
+ return value;
2278
+ }
2221
2279
  var DEFAULT_VARIANT_ALIAS_ID = "default";
2222
2280
  var cornerStyleSchema = z6.enum(["square", "rounded", "pill"]);
2223
2281
  var shadowSizeSchema = z6.enum(["none", "low", "medium", "high"]);
@@ -2968,6 +3026,42 @@ var mediaSchema = z9.object({
2968
3026
  transform: transformSchema.optional()
2969
3027
  });
2970
3028
 
3029
+ // ../theme-core/src/buttons/classNames.ts
3030
+ function parseThemeButtonVariantId(value) {
3031
+ const normalized = value?.trim() ?? "";
3032
+ if (normalized.length === 0) {
3033
+ return null;
3034
+ }
3035
+ if (normalized === DEFAULT_VARIANT_ALIAS_ID) {
3036
+ return DEFAULT_VARIANT_ALIAS_ID;
3037
+ }
3038
+ return isVariantRole(normalized) ? normalized : asSpecialVariantId(normalized);
3039
+ }
3040
+ function themeButtonVariantClassNames(variant) {
3041
+ if (variant === DEFAULT_VARIANT_ALIAS_ID) {
3042
+ return [variant];
3043
+ }
3044
+ return [variant, `button-${variant}`];
3045
+ }
3046
+ function themeButtonSizeClassName(size) {
3047
+ return `btn-${size}`;
3048
+ }
3049
+ function themeButtonSelector(variant, size) {
3050
+ const baseSelector = `.${variant}`;
3051
+ if (!size) {
3052
+ return baseSelector;
3053
+ }
3054
+ return `${baseSelector}.${themeButtonSizeClassName(size)}`;
3055
+ }
3056
+ function themeButtonClassName(spec) {
3057
+ const classes = [
3058
+ ...themeButtonVariantClassNames(spec.variant),
3059
+ themeButtonSizeClassName(spec.size),
3060
+ spec.extraClassName
3061
+ ];
3062
+ return classes.filter(Boolean).join(" ");
3063
+ }
3064
+
2971
3065
  // ../theme-core/src/tokens/resolver.ts
2972
3066
  var TokenResolver = class {
2973
3067
  constructor(theme) {
@@ -4539,17 +4633,25 @@ function resolveAliasSource(enabled) {
4539
4633
  }
4540
4634
  function variantChunks(variant, global, themeSizes, themeId, tokens, theme) {
4541
4635
  const out = [];
4542
- out.push(variantBaseRule(variant, global, themeId, tokens, theme));
4543
- const hoverBg = variantHoverBackgroundRule(variant, global, themeId, tokens);
4636
+ const variantId = parseButtonVariantIdForCss(variant.id);
4637
+ out.push(variantBaseRule(variant, variantId, global, themeId, tokens, theme));
4638
+ const hoverBg = variantHoverBackgroundRule(variant, variantId, global, themeId, tokens);
4544
4639
  if (hoverBg) out.push(hoverBg);
4545
4640
  const effects = variantEffectsCss(variant, themeId, tokens, theme);
4546
4641
  if (effects) out.push({ raw: effects });
4547
- out.push(...variantDisabledRules(variant, themeId));
4548
- out.push(...variantSizeRules(variant, themeSizes, themeId));
4642
+ out.push(...variantDisabledRules(variantId, themeId));
4643
+ out.push(...variantSizeRules(variant, variantId, themeSizes, themeId));
4549
4644
  return out;
4550
4645
  }
4551
- function variantBaseRule(variant, global, themeId, tokens, theme) {
4552
- const selector = `:where([data-theme-scope="${themeId}"]) .${variant.id}`;
4646
+ function parseButtonVariantIdForCss(value) {
4647
+ const variantId = parseThemeButtonVariantId(value);
4648
+ if (!variantId) {
4649
+ throw new Error("Button variant id must be a non-empty string");
4650
+ }
4651
+ return variantId;
4652
+ }
4653
+ function variantBaseRule(variant, variantId, global, themeId, tokens, theme) {
4654
+ const selector = `:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}`;
4553
4655
  const decls = [];
4554
4656
  decls.push(["font-weight", String(global.fontWeight)]);
4555
4657
  decls.push(["font-family", resolveFontFamily(global)]);
@@ -4582,13 +4684,13 @@ function variantBaseRule(variant, global, themeId, tokens, theme) {
4582
4684
  }
4583
4685
  return rule(selector, decls);
4584
4686
  }
4585
- function variantHoverBackgroundRule(variant, global, themeId, tokens) {
4687
+ function variantHoverBackgroundRule(variant, variantId, global, themeId, tokens) {
4586
4688
  let hoverToken = variant.hoverBackgroundToken;
4587
4689
  if (!hoverToken && global.hoverColor === "token" && global.hoverColorToken) {
4588
4690
  hoverToken = global.hoverColorToken;
4589
4691
  }
4590
4692
  if (!hoverToken) return null;
4591
- return rule(`:where([data-theme-scope="${themeId}"]) .${variant.id}:hover`, [
4693
+ return rule(`:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}:hover`, [
4592
4694
  ["background-color", tokens.getColor(hoverToken)]
4593
4695
  ]);
4594
4696
  }
@@ -4608,8 +4710,8 @@ function variantEffectsCss(variant, themeId, tokens, theme) {
4608
4710
  theme
4609
4711
  });
4610
4712
  }
4611
- function variantDisabledRules(variant, themeId) {
4612
- const base = `:where([data-theme-scope="${themeId}"]) .${variant.id}:disabled`;
4713
+ function variantDisabledRules(variantId, themeId) {
4714
+ const base = `:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}:disabled`;
4613
4715
  const disabledSelectors = [base, `${base}:hover`, `${base}:active`, `${base}:focus`];
4614
4716
  const pseudoSelectors = [`${base}::before`, `${base}::after`];
4615
4717
  return [
@@ -4627,12 +4729,12 @@ function variantDisabledRules(variant, themeId) {
4627
4729
  ])
4628
4730
  ];
4629
4731
  }
4630
- function variantSizeRules(variant, themeSizes, themeId) {
4732
+ function variantSizeRules(variant, variantId, themeSizes, themeId) {
4631
4733
  const borderWidth = variant.border ? BORDER_WIDTH_MAP[variant.border.widthClass] || "1px" : "0px";
4632
4734
  const rules = [];
4633
4735
  for (const sizeName of BUTTON_SIZE_NAMES) {
4634
4736
  const config = resolveSizeConfig(variant, sizeName, themeSizes);
4635
- const selector = `:where([data-theme-scope="${themeId}"]) .${variant.id}.btn-${sizeName}`;
4737
+ const selector = `:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId, sizeName)}`;
4636
4738
  const decls = [];
4637
4739
  for (const decl of paddingDeclarations(config.padding, borderWidth)) decls.push(decl);
4638
4740
  if (config.fontSize) {
@@ -19705,14 +19807,6 @@ function CalendarIcon({
19705
19807
  );
19706
19808
  }
19707
19809
 
19708
- // ../blocks/src/system/runtime/shared/themedButtonClass.ts
19709
- function themedButtonClass(spec) {
19710
- const { variant, size, extraClassName } = spec;
19711
- const normalizedVariant = variant.trim();
19712
- const variantClasses = normalizedVariant ? [normalizedVariant, `button-${normalizedVariant}`] : [];
19713
- return [...variantClasses, `btn-${size}`, extraClassName].filter(Boolean).join(" ");
19714
- }
19715
-
19716
19810
  // ../blocks/src/system/runtime/nodes/events/shared/EventCard.tsx
19717
19811
  import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
19718
19812
  var EventCard = ({
@@ -19740,7 +19834,7 @@ var EventCard = ({
19740
19834
  const isSoldOut = cta.hidden;
19741
19835
  const { available: spotsLeft } = getEventAvailability(event);
19742
19836
  const cardClass = `card-${cardVariant}`;
19743
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
19837
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
19744
19838
  const title = event.title;
19745
19839
  const summary = event.presentation?.summary ?? event.description;
19746
19840
  const image = event.presentation?.image ?? null;
@@ -19859,7 +19953,7 @@ var EventCompactRow = ({
19859
19953
  const price = formatEventPrice(event);
19860
19954
  const teacherLine = formatEventTeacherLine(event);
19861
19955
  const cta = resolveEventCta(event, buttonText);
19862
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "sm" });
19956
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "sm" });
19863
19957
  return /* @__PURE__ */ jsxs3("div", { className: "event-compact-row", children: [
19864
19958
  /* @__PURE__ */ jsxs3("div", { className: "event-compact-row-content", children: [
19865
19959
  /* @__PURE__ */ jsxs3("div", { className: "event-compact-row-top", children: [
@@ -26549,11 +26643,12 @@ var ButtonNode = ({
26549
26643
  }
26550
26644
  return null;
26551
26645
  }
26552
- const resolvedVariantId = typeof variantId === "string" ? variantId.trim() : "";
26553
- const normalizedVariantId = resolvedVariantId === DEFAULT_VARIANT_ALIAS_ID ? "" : resolvedVariantId;
26554
- const variantClasses = normalizedVariantId ? [normalizedVariantId, `button-${normalizedVariantId}`] : [];
26555
- const sizeClass = `btn-${size}`;
26556
- const combinedClassName = [...variantClasses, sizeClass, className].filter(Boolean).join(" ");
26646
+ const resolvedVariantId = parseThemeButtonVariantId(variantId);
26647
+ const combinedClassName = resolvedVariantId ? themeButtonClassName({
26648
+ variant: resolvedVariantId,
26649
+ size,
26650
+ extraClassName: className
26651
+ }) : className;
26557
26652
  if (resolvedHref) {
26558
26653
  return /* @__PURE__ */ jsx15(
26559
26654
  "a",
@@ -27127,7 +27222,7 @@ function FileDownloadNode({
27127
27222
  {
27128
27223
  href,
27129
27224
  download: filename,
27130
- className: themedButtonClass({
27225
+ className: themeButtonClassName({
27131
27226
  variant,
27132
27227
  size: "md",
27133
27228
  extraClassName: "rb-inline-flex rb-shrink-0 rb-items-center rb-justify-center rb-gap-2"
@@ -28819,7 +28914,7 @@ var EventSpotlight = ({
28819
28914
  }
28820
28915
  const containerClass = getContainerClass(layout, columns);
28821
28916
  const cardOrientation = getCardOrientation(layout);
28822
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
28917
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
28823
28918
  return /* @__PURE__ */ jsxs19("div", { className: `event-spotlight-section ${className || ""}`, "data-block": "event-spotlight", children: [
28824
28919
  /* @__PURE__ */ jsx32("div", { className: `event-spotlight ${containerClass}`, children: normalizedEvents.map((event) => /* @__PURE__ */ jsx32(
28825
28920
  EventCard,
@@ -29312,7 +29407,16 @@ function CheckoutShellView(props2) {
29312
29407
  import { Fragment as Fragment5, jsx as jsx36, jsxs as jsxs22 } from "react/jsx-runtime";
29313
29408
  function renderServerPendingAction(label, soldOut) {
29314
29409
  return /* @__PURE__ */ jsxs22(Fragment5, { children: [
29315
- /* @__PURE__ */ jsx36("button", { type: "button", className: "default", disabled: true, "aria-disabled": "true", children: soldOut ? "Sold out" : label }),
29410
+ /* @__PURE__ */ jsx36(
29411
+ "button",
29412
+ {
29413
+ type: "button",
29414
+ className: themeButtonClassName({ variant: "default", size: "md" }),
29415
+ disabled: true,
29416
+ "aria-disabled": "true",
29417
+ children: soldOut ? "Sold out" : label
29418
+ }
29419
+ ),
29316
29420
  !soldOut ? /* @__PURE__ */ jsx36("p", { className: "rb-caption status-muted", children: "Cart actions become interactive after page load." }) : null
29317
29421
  ] });
29318
29422
  }
@@ -29332,7 +29436,14 @@ function ProductListServerContent(props2) {
29332
29436
  ),
29333
29437
  actions: /* @__PURE__ */ jsxs22(Fragment5, { children: [
29334
29438
  renderServerPendingAction(card.actionLabel, card.soldOut),
29335
- card.path ? /* @__PURE__ */ jsx36("a", { href: card.path, className: "secondary btn-sm", children: "View details" }) : null
29439
+ card.path ? /* @__PURE__ */ jsx36(
29440
+ "a",
29441
+ {
29442
+ href: card.path,
29443
+ className: themeButtonClassName({ variant: "secondary", size: "sm" }),
29444
+ children: "View details"
29445
+ }
29446
+ ) : null
29336
29447
  ] })
29337
29448
  },
29338
29449
  card.productId
@@ -29865,7 +29976,7 @@ function renderCalendarGrid(display) {
29865
29976
  "button",
29866
29977
  {
29867
29978
  type: "button",
29868
- className: themedButtonClass({
29979
+ className: themeButtonClassName({
29869
29980
  variant: display.buttonVariant,
29870
29981
  size: "sm"
29871
29982
  }),
@@ -29951,7 +30062,7 @@ function renderTimetableSsr(display) {
29951
30062
  "button",
29952
30063
  {
29953
30064
  type: "button",
29954
- className: themedButtonClass({
30065
+ className: themeButtonClassName({
29955
30066
  variant: display.buttonVariant,
29956
30067
  size: "sm"
29957
30068
  }),
@@ -30308,7 +30419,7 @@ var FormNodeSSR = ({
30308
30419
  "button",
30309
30420
  {
30310
30421
  type: "submit",
30311
- className: themedButtonClass({
30422
+ className: themeButtonClassName({
30312
30423
  variant: "primary",
30313
30424
  size: "md",
30314
30425
  extraClassName: "rb-w-full rb-sm-w-auto"
@@ -30399,7 +30510,7 @@ function NewsletterFormSSR({
30399
30510
  "button",
30400
30511
  {
30401
30512
  type: "submit",
30402
- className: themedButtonClass({ variant: "primary", size: "md" }),
30513
+ className: themeButtonClassName({ variant: "primary", size: "md" }),
30403
30514
  children: display.buttonLabel
30404
30515
  }
30405
30516
  ) })
@@ -30519,7 +30630,16 @@ function ShopSSR({
30519
30630
  PassCardView,
30520
30631
  {
30521
30632
  display: pass,
30522
- action: /* @__PURE__ */ jsx49("button", { type: "button", className: "default", disabled: true, "aria-disabled": "true", children: pass.actionLabel })
30633
+ action: /* @__PURE__ */ jsx49(
30634
+ "button",
30635
+ {
30636
+ type: "button",
30637
+ className: themeButtonClassName({ variant: "default", size: "md" }),
30638
+ disabled: true,
30639
+ "aria-disabled": "true",
30640
+ children: pass.actionLabel
30641
+ }
30642
+ )
30523
30643
  },
30524
30644
  pass.id
30525
30645
  )),
@@ -30527,7 +30647,16 @@ function ShopSSR({
30527
30647
  MembershipCardView,
30528
30648
  {
30529
30649
  display: membership,
30530
- action: /* @__PURE__ */ jsx49("button", { type: "button", className: "default", disabled: true, "aria-disabled": "true", children: membership.actionLabel })
30650
+ action: /* @__PURE__ */ jsx49(
30651
+ "button",
30652
+ {
30653
+ type: "button",
30654
+ className: themeButtonClassName({ variant: "default", size: "md" }),
30655
+ disabled: true,
30656
+ "aria-disabled": "true",
30657
+ children: membership.actionLabel
30658
+ }
30659
+ )
30531
30660
  },
30532
30661
  membership.id
30533
30662
  ))
@@ -6229,7 +6229,7 @@ var SimpleCache = class {
6229
6229
  };
6230
6230
 
6231
6231
  // src/version.ts
6232
- var SDK_VERSION = "0.60.9";
6232
+ var SDK_VERSION = "0.60.11";
6233
6233
 
6234
6234
  // src/client/error.ts
6235
6235
  var RiverbankApiError = class _RiverbankApiError extends Error {