@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.
@@ -8374,6 +8374,9 @@ function validationContext(options = {}) {
8374
8374
  allowIncomplete: isDraft || (options.allowIncomplete ?? false)
8375
8375
  };
8376
8376
  }
8377
+ function formatFieldPath(path) {
8378
+ return path.map((segment) => String(segment)).join(".");
8379
+ }
8377
8380
  function fieldIssueToMessage(issue2) {
8378
8381
  switch (issue2.kind) {
8379
8382
  case "required":
@@ -8597,7 +8600,7 @@ function normalizeRepeaterItems(plan, value, ctx) {
8597
8600
  return normalizeObjectChildren(fields3, itemRecord, ctx);
8598
8601
  });
8599
8602
  }
8600
- function normalizeNumberInput(value, allowNull) {
8603
+ function normalizeNumberInput(value, _allowNull) {
8601
8604
  if (value === "") return void 0;
8602
8605
  if (typeof value === "string" && value.trim() !== "") return Number(value);
8603
8606
  return value;
@@ -8729,7 +8732,7 @@ function validateRepeaterItem(plan, item, index, ctx) {
8729
8732
  const fields3 = plan.repeatedItemVariants ? plan.repeatedItemVariants.find((variant) => variant.typeId === itemType)?.fields : plan.repeatedItemPlan;
8730
8733
  if (!fields3) return [];
8731
8734
  return fields3.flatMap((childPlan) => {
8732
- const indexedPlan = withIndexedPath(childPlan, plan.path, index);
8735
+ const indexedPlan = materializeRepeaterItemPlan(childPlan, plan.path, index);
8733
8736
  return validateNormalizedFieldValue(indexedPlan, item[childPlan.fieldId], ctx);
8734
8737
  });
8735
8738
  }
@@ -8741,12 +8744,58 @@ function validateGroupPlan(plan, value, ctx) {
8741
8744
  function childValidationContext(plan, ctx) {
8742
8745
  return plan.allowNullChildren ? { ...ctx, allowNull: true } : ctx;
8743
8746
  }
8744
- function withIndexedPath(plan, parentPath, index) {
8745
- const suffix = plan.path.slice(parentPath.length + 1);
8746
- return {
8747
- ...plan,
8748
- path: [...parentPath, index, plan.fieldId, ...suffix]
8749
- };
8747
+ function materializeRepeaterItemPlan(plan, parentPath, index) {
8748
+ return rebaseFieldPlanPath(plan, [...parentPath, 0], [...parentPath, index]);
8749
+ }
8750
+ function rebaseFieldPlanPath(plan, fromPrefix, toPrefix) {
8751
+ const path = rebaseFieldPath(plan.path, fromPrefix, toPrefix);
8752
+ switch (plan.kind) {
8753
+ case "group":
8754
+ return {
8755
+ ...plan,
8756
+ path,
8757
+ children: plan.children.map((childPlan) => rebaseFieldPlanPath(childPlan, fromPrefix, toPrefix))
8758
+ };
8759
+ case "repeater":
8760
+ return {
8761
+ ...plan,
8762
+ path,
8763
+ ...plan.repeatedItemVariants ? {
8764
+ repeatedItemVariants: plan.repeatedItemVariants.map((variant) => ({
8765
+ ...variant,
8766
+ fields: variant.fields.map((fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix))
8767
+ }))
8768
+ } : {},
8769
+ ...plan.repeatedItemPlan ? {
8770
+ repeatedItemPlan: plan.repeatedItemPlan.map(
8771
+ (fieldPlan) => rebaseFieldPlanPath(fieldPlan, fromPrefix, toPrefix)
8772
+ )
8773
+ } : {}
8774
+ };
8775
+ case "string":
8776
+ case "number":
8777
+ case "boolean":
8778
+ case "richText":
8779
+ case "media":
8780
+ case "link":
8781
+ case "select":
8782
+ case "passthrough":
8783
+ return {
8784
+ ...plan,
8785
+ path
8786
+ };
8787
+ default:
8788
+ return assertNever2(plan);
8789
+ }
8790
+ }
8791
+ function rebaseFieldPath(path, fromPrefix, toPrefix) {
8792
+ if (!startsWithFieldPath(path, fromPrefix)) {
8793
+ throw new Error(`Cannot rebase field path ${formatFieldPath(path)} from ${formatFieldPath(fromPrefix)}`);
8794
+ }
8795
+ return [...toPrefix, ...path.slice(fromPrefix.length)];
8796
+ }
8797
+ function startsWithFieldPath(path, prefix) {
8798
+ return prefix.every((segment, index) => path[index] === segment);
8750
8799
  }
8751
8800
  function issue(plan, kind, extra) {
8752
8801
  return {
@@ -9257,6 +9306,15 @@ var VARIANT_ROLES = [
9257
9306
  "tertiary",
9258
9307
  "accent"
9259
9308
  ];
9309
+ function isVariantRole(value) {
9310
+ return VARIANT_ROLES.includes(value);
9311
+ }
9312
+ function asSpecialVariantId(value) {
9313
+ if (value.length === 0) {
9314
+ throw new Error("SpecialVariantId must be a non-empty string");
9315
+ }
9316
+ return value;
9317
+ }
9260
9318
  var DEFAULT_VARIANT_ALIAS_ID = "default";
9261
9319
  var cornerStyleSchema = z11.enum(["square", "rounded", "pill"]);
9262
9320
  var shadowSizeSchema = z11.enum(["none", "low", "medium", "high"]);
@@ -10007,6 +10065,42 @@ var mediaSchema = z14.object({
10007
10065
  transform: transformSchema.optional()
10008
10066
  });
10009
10067
 
10068
+ // ../theme-core/src/buttons/classNames.ts
10069
+ function parseThemeButtonVariantId(value) {
10070
+ const normalized = value?.trim() ?? "";
10071
+ if (normalized.length === 0) {
10072
+ return null;
10073
+ }
10074
+ if (normalized === DEFAULT_VARIANT_ALIAS_ID) {
10075
+ return DEFAULT_VARIANT_ALIAS_ID;
10076
+ }
10077
+ return isVariantRole(normalized) ? normalized : asSpecialVariantId(normalized);
10078
+ }
10079
+ function themeButtonVariantClassNames(variant) {
10080
+ if (variant === DEFAULT_VARIANT_ALIAS_ID) {
10081
+ return [variant];
10082
+ }
10083
+ return [variant, `button-${variant}`];
10084
+ }
10085
+ function themeButtonSizeClassName(size) {
10086
+ return `btn-${size}`;
10087
+ }
10088
+ function themeButtonSelector(variant, size) {
10089
+ const baseSelector = `.${variant}`;
10090
+ if (!size) {
10091
+ return baseSelector;
10092
+ }
10093
+ return `${baseSelector}.${themeButtonSizeClassName(size)}`;
10094
+ }
10095
+ function themeButtonClassName(spec) {
10096
+ const classes = [
10097
+ ...themeButtonVariantClassNames(spec.variant),
10098
+ themeButtonSizeClassName(spec.size),
10099
+ spec.extraClassName
10100
+ ];
10101
+ return classes.filter(Boolean).join(" ");
10102
+ }
10103
+
10010
10104
  // ../theme-core/src/tokens/resolver.ts
10011
10105
  var TokenResolver = class {
10012
10106
  constructor(theme) {
@@ -11578,17 +11672,25 @@ function resolveAliasSource(enabled) {
11578
11672
  }
11579
11673
  function variantChunks(variant, global, themeSizes, themeId, tokens, theme) {
11580
11674
  const out = [];
11581
- out.push(variantBaseRule(variant, global, themeId, tokens, theme));
11582
- const hoverBg = variantHoverBackgroundRule(variant, global, themeId, tokens);
11675
+ const variantId = parseButtonVariantIdForCss(variant.id);
11676
+ out.push(variantBaseRule(variant, variantId, global, themeId, tokens, theme));
11677
+ const hoverBg = variantHoverBackgroundRule(variant, variantId, global, themeId, tokens);
11583
11678
  if (hoverBg) out.push(hoverBg);
11584
11679
  const effects = variantEffectsCss(variant, themeId, tokens, theme);
11585
11680
  if (effects) out.push({ raw: effects });
11586
- out.push(...variantDisabledRules(variant, themeId));
11587
- out.push(...variantSizeRules(variant, themeSizes, themeId));
11681
+ out.push(...variantDisabledRules(variantId, themeId));
11682
+ out.push(...variantSizeRules(variant, variantId, themeSizes, themeId));
11588
11683
  return out;
11589
11684
  }
11590
- function variantBaseRule(variant, global, themeId, tokens, theme) {
11591
- const selector = `:where([data-theme-scope="${themeId}"]) .${variant.id}`;
11685
+ function parseButtonVariantIdForCss(value) {
11686
+ const variantId = parseThemeButtonVariantId(value);
11687
+ if (!variantId) {
11688
+ throw new Error("Button variant id must be a non-empty string");
11689
+ }
11690
+ return variantId;
11691
+ }
11692
+ function variantBaseRule(variant, variantId, global, themeId, tokens, theme) {
11693
+ const selector = `:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}`;
11592
11694
  const decls = [];
11593
11695
  decls.push(["font-weight", String(global.fontWeight)]);
11594
11696
  decls.push(["font-family", resolveFontFamily(global)]);
@@ -11621,13 +11723,13 @@ function variantBaseRule(variant, global, themeId, tokens, theme) {
11621
11723
  }
11622
11724
  return rule(selector, decls);
11623
11725
  }
11624
- function variantHoverBackgroundRule(variant, global, themeId, tokens) {
11726
+ function variantHoverBackgroundRule(variant, variantId, global, themeId, tokens) {
11625
11727
  let hoverToken = variant.hoverBackgroundToken;
11626
11728
  if (!hoverToken && global.hoverColor === "token" && global.hoverColorToken) {
11627
11729
  hoverToken = global.hoverColorToken;
11628
11730
  }
11629
11731
  if (!hoverToken) return null;
11630
- return rule(`:where([data-theme-scope="${themeId}"]) .${variant.id}:hover`, [
11732
+ return rule(`:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}:hover`, [
11631
11733
  ["background-color", tokens.getColor(hoverToken)]
11632
11734
  ]);
11633
11735
  }
@@ -11647,8 +11749,8 @@ function variantEffectsCss(variant, themeId, tokens, theme) {
11647
11749
  theme
11648
11750
  });
11649
11751
  }
11650
- function variantDisabledRules(variant, themeId) {
11651
- const base = `:where([data-theme-scope="${themeId}"]) .${variant.id}:disabled`;
11752
+ function variantDisabledRules(variantId, themeId) {
11753
+ const base = `:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}:disabled`;
11652
11754
  const disabledSelectors = [base, `${base}:hover`, `${base}:active`, `${base}:focus`];
11653
11755
  const pseudoSelectors = [`${base}::before`, `${base}::after`];
11654
11756
  return [
@@ -11666,12 +11768,12 @@ function variantDisabledRules(variant, themeId) {
11666
11768
  ])
11667
11769
  ];
11668
11770
  }
11669
- function variantSizeRules(variant, themeSizes, themeId) {
11771
+ function variantSizeRules(variant, variantId, themeSizes, themeId) {
11670
11772
  const borderWidth = variant.border ? BORDER_WIDTH_MAP[variant.border.widthClass] || "1px" : "0px";
11671
11773
  const rules = [];
11672
11774
  for (const sizeName of BUTTON_SIZE_NAMES) {
11673
11775
  const config = resolveSizeConfig(variant, sizeName, themeSizes);
11674
- const selector = `:where([data-theme-scope="${themeId}"]) .${variant.id}.btn-${sizeName}`;
11776
+ const selector = `:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId, sizeName)}`;
11675
11777
  const decls = [];
11676
11778
  for (const decl of paddingDeclarations(config.padding, borderWidth)) decls.push(decl);
11677
11779
  if (config.fontSize) {
@@ -26741,14 +26843,6 @@ function CalendarIcon({
26741
26843
  );
26742
26844
  }
26743
26845
 
26744
- // ../blocks/src/system/runtime/shared/themedButtonClass.ts
26745
- function themedButtonClass(spec) {
26746
- const { variant, size, extraClassName } = spec;
26747
- const normalizedVariant = variant.trim();
26748
- const variantClasses = normalizedVariant ? [normalizedVariant, `button-${normalizedVariant}`] : [];
26749
- return [...variantClasses, `btn-${size}`, extraClassName].filter(Boolean).join(" ");
26750
- }
26751
-
26752
26846
  // ../blocks/src/system/runtime/nodes/events/shared/EventCard.tsx
26753
26847
  import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
26754
26848
  var EventCard = ({
@@ -26776,7 +26870,7 @@ var EventCard = ({
26776
26870
  const isSoldOut = cta.hidden;
26777
26871
  const { available: spotsLeft } = getEventAvailability(event);
26778
26872
  const cardClass = `card-${cardVariant}`;
26779
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
26873
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
26780
26874
  const title = event.title;
26781
26875
  const summary = event.presentation?.summary ?? event.description;
26782
26876
  const image = event.presentation?.image ?? null;
@@ -26895,7 +26989,7 @@ var EventCompactRow = ({
26895
26989
  const price = formatEventPrice(event);
26896
26990
  const teacherLine = formatEventTeacherLine(event);
26897
26991
  const cta = resolveEventCta(event, buttonText);
26898
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "sm" });
26992
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "sm" });
26899
26993
  return /* @__PURE__ */ jsxs3("div", { className: "event-compact-row", children: [
26900
26994
  /* @__PURE__ */ jsxs3("div", { className: "event-compact-row-content", children: [
26901
26995
  /* @__PURE__ */ jsxs3("div", { className: "event-compact-row-top", children: [
@@ -33582,11 +33676,12 @@ var ButtonNode = ({
33582
33676
  }
33583
33677
  return null;
33584
33678
  }
33585
- const resolvedVariantId = typeof variantId === "string" ? variantId.trim() : "";
33586
- const normalizedVariantId = resolvedVariantId === DEFAULT_VARIANT_ALIAS_ID ? "" : resolvedVariantId;
33587
- const variantClasses = normalizedVariantId ? [normalizedVariantId, `button-${normalizedVariantId}`] : [];
33588
- const sizeClass = `btn-${size}`;
33589
- const combinedClassName = [...variantClasses, sizeClass, className].filter(Boolean).join(" ");
33679
+ const resolvedVariantId = parseThemeButtonVariantId(variantId);
33680
+ const combinedClassName = resolvedVariantId ? themeButtonClassName({
33681
+ variant: resolvedVariantId,
33682
+ size,
33683
+ extraClassName: className
33684
+ }) : className;
33590
33685
  if (resolvedHref) {
33591
33686
  return /* @__PURE__ */ jsx15(
33592
33687
  "a",
@@ -34160,7 +34255,7 @@ function FileDownloadNode({
34160
34255
  {
34161
34256
  href,
34162
34257
  download: filename,
34163
- className: themedButtonClass({
34258
+ className: themeButtonClassName({
34164
34259
  variant,
34165
34260
  size: "md",
34166
34261
  extraClassName: "rb-inline-flex rb-shrink-0 rb-items-center rb-justify-center rb-gap-2"
@@ -35852,7 +35947,7 @@ var EventSpotlight = ({
35852
35947
  }
35853
35948
  const containerClass = getContainerClass(layout, columns);
35854
35949
  const cardOrientation = getCardOrientation(layout);
35855
- const buttonClass = themedButtonClass({ variant: buttonVariant, size: "md" });
35950
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
35856
35951
  return /* @__PURE__ */ jsxs19("div", { className: `event-spotlight-section ${className || ""}`, "data-block": "event-spotlight", children: [
35857
35952
  /* @__PURE__ */ jsx32("div", { className: `event-spotlight ${containerClass}`, children: normalizedEvents.map((event) => /* @__PURE__ */ jsx32(
35858
35953
  EventCard,
@@ -36345,7 +36440,16 @@ function CheckoutShellView(props2) {
36345
36440
  import { Fragment as Fragment5, jsx as jsx36, jsxs as jsxs22 } from "react/jsx-runtime";
36346
36441
  function renderServerPendingAction(label, soldOut) {
36347
36442
  return /* @__PURE__ */ jsxs22(Fragment5, { children: [
36348
- /* @__PURE__ */ jsx36("button", { type: "button", className: "default", disabled: true, "aria-disabled": "true", children: soldOut ? "Sold out" : label }),
36443
+ /* @__PURE__ */ jsx36(
36444
+ "button",
36445
+ {
36446
+ type: "button",
36447
+ className: themeButtonClassName({ variant: "default", size: "md" }),
36448
+ disabled: true,
36449
+ "aria-disabled": "true",
36450
+ children: soldOut ? "Sold out" : label
36451
+ }
36452
+ ),
36349
36453
  !soldOut ? /* @__PURE__ */ jsx36("p", { className: "rb-caption status-muted", children: "Cart actions become interactive after page load." }) : null
36350
36454
  ] });
36351
36455
  }
@@ -36365,7 +36469,14 @@ function ProductListServerContent(props2) {
36365
36469
  ),
36366
36470
  actions: /* @__PURE__ */ jsxs22(Fragment5, { children: [
36367
36471
  renderServerPendingAction(card.actionLabel, card.soldOut),
36368
- card.path ? /* @__PURE__ */ jsx36("a", { href: card.path, className: "secondary btn-sm", children: "View details" }) : null
36472
+ card.path ? /* @__PURE__ */ jsx36(
36473
+ "a",
36474
+ {
36475
+ href: card.path,
36476
+ className: themeButtonClassName({ variant: "secondary", size: "sm" }),
36477
+ children: "View details"
36478
+ }
36479
+ ) : null
36369
36480
  ] })
36370
36481
  },
36371
36482
  card.productId
@@ -36898,7 +37009,7 @@ function renderCalendarGrid(display) {
36898
37009
  "button",
36899
37010
  {
36900
37011
  type: "button",
36901
- className: themedButtonClass({
37012
+ className: themeButtonClassName({
36902
37013
  variant: display.buttonVariant,
36903
37014
  size: "sm"
36904
37015
  }),
@@ -36984,7 +37095,7 @@ function renderTimetableSsr(display) {
36984
37095
  "button",
36985
37096
  {
36986
37097
  type: "button",
36987
- className: themedButtonClass({
37098
+ className: themeButtonClassName({
36988
37099
  variant: display.buttonVariant,
36989
37100
  size: "sm"
36990
37101
  }),
@@ -37341,7 +37452,7 @@ var FormNodeSSR = ({
37341
37452
  "button",
37342
37453
  {
37343
37454
  type: "submit",
37344
- className: themedButtonClass({
37455
+ className: themeButtonClassName({
37345
37456
  variant: "primary",
37346
37457
  size: "md",
37347
37458
  extraClassName: "rb-w-full rb-sm-w-auto"
@@ -37432,7 +37543,7 @@ function NewsletterFormSSR({
37432
37543
  "button",
37433
37544
  {
37434
37545
  type: "submit",
37435
- className: themedButtonClass({ variant: "primary", size: "md" }),
37546
+ className: themeButtonClassName({ variant: "primary", size: "md" }),
37436
37547
  children: display.buttonLabel
37437
37548
  }
37438
37549
  ) })
@@ -37552,7 +37663,16 @@ function ShopSSR({
37552
37663
  PassCardView,
37553
37664
  {
37554
37665
  display: pass,
37555
- action: /* @__PURE__ */ jsx49("button", { type: "button", className: "default", disabled: true, "aria-disabled": "true", children: pass.actionLabel })
37666
+ action: /* @__PURE__ */ jsx49(
37667
+ "button",
37668
+ {
37669
+ type: "button",
37670
+ className: themeButtonClassName({ variant: "default", size: "md" }),
37671
+ disabled: true,
37672
+ "aria-disabled": "true",
37673
+ children: pass.actionLabel
37674
+ }
37675
+ )
37556
37676
  },
37557
37677
  pass.id
37558
37678
  )),
@@ -37560,7 +37680,16 @@ function ShopSSR({
37560
37680
  MembershipCardView,
37561
37681
  {
37562
37682
  display: membership,
37563
- action: /* @__PURE__ */ jsx49("button", { type: "button", className: "default", disabled: true, "aria-disabled": "true", children: membership.actionLabel })
37683
+ action: /* @__PURE__ */ jsx49(
37684
+ "button",
37685
+ {
37686
+ type: "button",
37687
+ className: themeButtonClassName({ variant: "default", size: "md" }),
37688
+ disabled: true,
37689
+ "aria-disabled": "true",
37690
+ children: membership.actionLabel
37691
+ }
37692
+ )
37564
37693
  },
37565
37694
  membership.id
37566
37695
  ))
@@ -41893,13 +42022,13 @@ function hydrateValue(value, context) {
41893
42022
  return isUnchanged ? value : resolvedItems;
41894
42023
  }
41895
42024
  if (isRecord3(value)) {
41896
- if (isInternalLink2(value)) {
42025
+ if (isInternalLink(value)) {
41897
42026
  return hydrateInternalLink(value, context.routes);
41898
42027
  }
41899
- if (isPageLink2(value)) {
42028
+ if (isPageLink(value)) {
41900
42029
  return hydratePageLink(value, context);
41901
42030
  }
41902
- if (isEntryLink2(value)) {
42031
+ if (isEntryLink(value)) {
41903
42032
  return hydrateEntryLink(value, context);
41904
42033
  }
41905
42034
  const resolvedEntries = Object.entries(value).map(([key, entry]) => [key, hydrateValue(entry, context)]);
@@ -41929,7 +42058,7 @@ function hydrateInternalLink(link2, routes) {
41929
42058
  }
41930
42059
  return Object.keys(updates).length > 0 ? { ...link2, ...updates } : link2;
41931
42060
  }
41932
- function isInternalLink2(value) {
42061
+ function isInternalLink(value) {
41933
42062
  if (value.kind !== "internal") {
41934
42063
  return false;
41935
42064
  }
@@ -41938,7 +42067,7 @@ function isInternalLink2(value) {
41938
42067
  }
41939
42068
  return true;
41940
42069
  }
41941
- function isPageLink2(value) {
42070
+ function isPageLink(value) {
41942
42071
  if (value.kind !== "page") {
41943
42072
  return false;
41944
42073
  }
@@ -41954,7 +42083,7 @@ function hydratePageLink(link2, context) {
41954
42083
  }
41955
42084
  return { ...link2, href: resolved.href, routeId: resolved.routeId };
41956
42085
  }
41957
- function isEntryLink2(value) {
42086
+ function isEntryLink(value) {
41958
42087
  if (value.kind !== "entry") {
41959
42088
  return false;
41960
42089
  }
@@ -53760,7 +53889,7 @@ var SimpleCache = class {
53760
53889
  };
53761
53890
 
53762
53891
  // src/version.ts
53763
- var SDK_VERSION = "0.60.9";
53892
+ var SDK_VERSION = "0.60.11";
53764
53893
 
53765
53894
  // src/client/error.ts
53766
53895
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -4,7 +4,7 @@ import * as path from "path";
4
4
  import * as crypto from "crypto";
5
5
 
6
6
  // src/version.ts
7
- var SDK_VERSION = "0.60.9";
7
+ var SDK_VERSION = "0.60.11";
8
8
 
9
9
  // src/constants.ts
10
10
  var PREBUILD_PAGE_SIZE = 50;