@riverbankcms/sdk 0.70.3 → 0.70.4

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 (79) hide show
  1. package/dist/_dts/api/src/contentTypes.d.ts +2 -1
  2. package/dist/_dts/block-form/src/client/index.d.ts +1 -1
  3. package/dist/_dts/block-form/src/fields/types.d.ts +14 -2
  4. package/dist/_dts/block-form/src/registry/schemas.d.ts +2 -0
  5. package/dist/_dts/block-form/src/widgets/MediaField/mediaFieldDefaults.d.ts +2 -2
  6. package/dist/_dts/block-form/src/widgets/MediaField/mediaFieldSchema.d.ts +2 -2
  7. package/dist/_dts/blocks/src/lib/media.d.ts +1 -1
  8. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +1829 -149
  9. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +1829 -149
  10. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +1829 -149
  11. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +1829 -149
  12. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +1829 -149
  13. package/dist/_dts/blocks/src/system/blocks/cta-full.d.ts +1 -30727
  14. package/dist/_dts/blocks/src/system/blocks/events/event-spotlight.d.ts +11 -30827
  15. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +1829 -149
  16. package/dist/_dts/blocks/src/system/blocks/file-download.d.ts +3 -3
  17. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +1829 -149
  18. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +106 -1
  19. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +1829 -149
  20. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +1829 -149
  21. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +1829 -149
  22. package/dist/_dts/blocks/src/system/defineBlock.d.ts +3 -3
  23. package/dist/_dts/blocks/src/system/fragments/library/card.d.ts +2 -30793
  24. package/dist/_dts/blocks/src/system/fragments/library/ctaRow.d.ts +2 -30727
  25. package/dist/_dts/blocks/src/system/fragments/library/feedbackCallout.d.ts +2 -30779
  26. package/dist/_dts/blocks/src/system/fragments/library/heroCtaRow.d.ts +33 -30743
  27. package/dist/_dts/blocks/src/system/fragments/library/sectionState.d.ts +2 -30770
  28. package/dist/_dts/blocks/src/system/fragments/types.d.ts +8 -7
  29. package/dist/_dts/blocks/src/system/manifest/derivedContent.d.ts +7 -5
  30. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +1 -1
  31. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +192 -3
  32. package/dist/_dts/blocks/src/system/runtime/nodes/file-download.d.ts +1 -1
  33. package/dist/_dts/content-model/src/content-types/schema.d.ts +7 -0
  34. package/dist/_dts/content-model/src/contentManifest.d.ts +4 -1
  35. package/dist/_dts/content-model/src/templates/bindingTypeCompatibility.d.ts +1 -1
  36. package/dist/_dts/core/src/index.d.ts +1 -1
  37. package/dist/_dts/core/src/planner.d.ts +4 -0
  38. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +53 -20
  39. package/dist/_dts/editor-blocks/src/index.d.ts +1 -1
  40. package/dist/_dts/editor-blocks/src/media/MediaField.d.ts +6 -5
  41. package/dist/_dts/media-core/src/videoSlotPolicy.d.ts +0 -1
  42. package/dist/_dts/media-editor/src/context.d.ts +4 -1
  43. package/dist/_dts/media-react/src/hooks/useApiMediaUploader.d.ts +8 -1
  44. package/dist/_dts/media-react/src/index.d.ts +1 -5
  45. package/dist/_dts/preview-next/src/client/widgets/PreviewMediaField.d.ts +2 -1
  46. package/dist/_dts/preview-next/src/client/widgets/widgetOverrides.d.ts +1 -0
  47. package/dist/_dts/sdk/src/config/field-definitions.d.ts +6 -2
  48. package/dist/_dts/sdk/src/config/typed-entries.d.ts +4 -2
  49. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +2 -1
  50. package/dist/_dts/sdk/src/manifest/prompt/examples/cta.d.ts +5 -5
  51. package/dist/_dts/sdk/src/manifest/prompt/examples/features-grid.d.ts +2 -2
  52. package/dist/_dts/sdk/src/manifest/prompt/examples/hero.d.ts +2 -2
  53. package/dist/_dts/sdk/src/manifest/prompt/examples/pricing.d.ts +10 -10
  54. package/dist/_dts/sdk/src/manifest/prompt/examples/testimonials.d.ts +4 -4
  55. package/dist/_dts/sdk/src/manifest/validation/output-schema.d.ts +11 -1
  56. package/dist/_dts/sdk/src/public-api/contracts.d.ts +2 -1
  57. package/dist/_dts/sdk/src/version.d.ts +1 -1
  58. package/dist/cli/index.mjs +395 -190
  59. package/dist/cli/init-docs/content/workflow-preview-mode.md +167 -0
  60. package/dist/client/client.mjs +243 -203
  61. package/dist/client/hooks.mjs +172 -121
  62. package/dist/client/rendering/client.mjs +148 -112
  63. package/dist/client/rendering/islands.mjs +80 -31
  64. package/dist/client/rendering.mjs +242 -202
  65. package/dist/preview-next/client/runtime.mjs +386 -1135
  66. package/dist/server/components.mjs +219 -171
  67. package/dist/server/config-template-validation.mjs +31 -1
  68. package/dist/server/config-validation.mjs +172 -121
  69. package/dist/server/config.mjs +172 -121
  70. package/dist/server/data.mjs +172 -121
  71. package/dist/server/index.mjs +1 -1
  72. package/dist/server/next.mjs +220 -172
  73. package/dist/server/page-converter.mjs +379 -185
  74. package/dist/server/prebuild.mjs +1 -1
  75. package/dist/server/rendering/server.mjs +219 -171
  76. package/dist/server/rendering.mjs +219 -171
  77. package/dist/server/routing.mjs +175 -124
  78. package/dist/server/server.mjs +173 -122
  79. package/package.json +2 -1
@@ -6743,6 +6743,28 @@ function resolveRepeaterGridColumnFieldId(options) {
6743
6743
 
6744
6744
  // ../blocks/src/system/manifest/schema.ts
6745
6745
  var visibilityLevels = ["admin", "designer", "author"];
6746
+ var MEDIA_KINDS = [
6747
+ "image",
6748
+ "video",
6749
+ "audio",
6750
+ "document",
6751
+ "spreadsheet",
6752
+ "archive"
6753
+ ];
6754
+ var DISPLAY_MEDIA_KINDS = [
6755
+ "image",
6756
+ "video",
6757
+ "audio"
6758
+ ];
6759
+ var PUBLIC_FILE_FIELD_KINDS = [
6760
+ "document",
6761
+ "spreadsheet",
6762
+ "archive",
6763
+ "audio"
6764
+ ];
6765
+ function isDisplayMediaKind(kind) {
6766
+ return DISPLAY_MEDIA_KINDS.includes(kind);
6767
+ }
6746
6768
  var siteOptionSources = [
6747
6769
  "eventCategories",
6748
6770
  "venues",
@@ -6906,11 +6928,19 @@ var richTextFieldSchema = baseFieldSchema.extend({
6906
6928
  });
6907
6929
  var mediaFieldSchema = baseFieldSchema.extend({
6908
6930
  type: z4.literal("media"),
6909
- mediaKinds: z4.array(
6910
- z4.enum(["image", "video", "audio", "document", "spreadsheet", "archive"])
6911
- ).default(["image"]),
6931
+ // Keep full MEDIA_KINDS parse compatibility for pre-file-field manifests.
6932
+ // New authoring surfaces should use `file.fileKinds` for document/archive
6933
+ // style assets, but old saved schemas must not fail to open.
6934
+ mediaKinds: z4.array(z4.enum(MEDIA_KINDS)).default(["image"]).transform((kinds) => {
6935
+ const displayKinds = kinds.filter(isDisplayMediaKind);
6936
+ return displayKinds.length > 0 ? displayKinds : ["image"];
6937
+ }),
6912
6938
  aspectRatio: z4.string().optional()
6913
6939
  });
6940
+ var fileFieldSchema = baseFieldSchema.extend({
6941
+ type: z4.literal("file"),
6942
+ fileKinds: z4.array(z4.enum(PUBLIC_FILE_FIELD_KINDS)).default([...PUBLIC_FILE_FIELD_KINDS])
6943
+ });
6914
6944
  var booleanFieldSchema = baseFieldSchema.extend({
6915
6945
  type: z4.literal("boolean")
6916
6946
  });
@@ -7216,6 +7246,7 @@ function getFieldSchemaInternal() {
7216
7246
  textFieldSchema,
7217
7247
  richTextFieldSchema,
7218
7248
  mediaFieldSchema,
7249
+ fileFieldSchema,
7219
7250
  booleanFieldSchema,
7220
7251
  numberFieldSchema,
7221
7252
  dateFieldSchema,
@@ -14341,13 +14372,18 @@ var fragmentDataSchema = z27.object({
14341
14372
  loader: dataLoaderSchema.optional()
14342
14373
  });
14343
14374
  var fragmentConfigSchema = z27.object({
14344
- id: z27.string().min(1, "Fragment id is required").regex(FRAGMENT_ID_PATTERN, "Fragment id must be alphanumeric with optional . _ - separators"),
14375
+ id: z27.string().min(1, "Fragment id is required").regex(
14376
+ FRAGMENT_ID_PATTERN,
14377
+ "Fragment id must be alphanumeric with optional . _ - separators"
14378
+ ),
14345
14379
  title: z27.string().optional(),
14346
14380
  description: z27.string().optional(),
14347
14381
  category: z27.enum(["content", "media", "interactive", "layout"]).optional(),
14348
14382
  icon: z27.string().optional(),
14349
14383
  fields: fieldSchema.array().default([]),
14350
- layout: z27.union([NodeSchema, NodeSchema.array()]).transform((value) => Array.isArray(value) ? value : [value]),
14384
+ layout: z27.union([NodeSchema, NodeSchema.array()]).transform(
14385
+ (value) => Array.isArray(value) ? value : [value]
14386
+ ),
14351
14387
  data: fragmentDataSchema.optional()
14352
14388
  });
14353
14389
  var FragmentConfigError = class extends Error {
@@ -14369,13 +14405,19 @@ function defineFragment(config) {
14369
14405
  function scopeFragmentFields(fragment, scope) {
14370
14406
  const normalizedScope = scope.trim();
14371
14407
  if (!normalizedScope) {
14372
- return fragment.fields.map((field) => cloneFieldDefinition2(field));
14408
+ return fragment.fields.map(
14409
+ (field) => cloneFieldDefinition2(field)
14410
+ );
14373
14411
  }
14374
- return fragment.fields.map((field) => prefixFieldId(field, normalizedScope));
14412
+ return fragment.fields.map(
14413
+ (field) => prefixFieldId(field, normalizedScope)
14414
+ );
14375
14415
  }
14376
14416
  function scopeFragmentLayout(fragment, scope) {
14377
14417
  const normalizedScope = scope.trim();
14378
- return fragment.layout.map((node) => cloneAndScopeNode(node, normalizedScope));
14418
+ return fragment.layout.map(
14419
+ (node) => cloneAndScopeNode(node, normalizedScope)
14420
+ );
14379
14421
  }
14380
14422
  function validateFieldDefinitions(fields3, fragmentId) {
14381
14423
  const seen = /* @__PURE__ */ new Set();
@@ -14457,7 +14499,9 @@ function cloneAndScopeNode(node, scope) {
14457
14499
  ...node
14458
14500
  };
14459
14501
  if (node.children) {
14460
- cloned.children = node.children.map((child) => cloneAndScopeNode(child, scope));
14502
+ cloned.children = node.children.map(
14503
+ (child) => cloneAndScopeNode(child, scope)
14504
+ );
14461
14505
  }
14462
14506
  if (node.props) {
14463
14507
  cloned.props = scopePropBindings(node.props, scope);
@@ -14483,7 +14527,9 @@ function scopeBinding(binding, scope) {
14483
14527
  const cloned = {
14484
14528
  ...binding,
14485
14529
  transforms: binding.transforms?.map(
14486
- (step) => ({ ...step })
14530
+ (step) => ({
14531
+ ...step
14532
+ })
14487
14533
  ) ?? []
14488
14534
  };
14489
14535
  cloned.from = scopeContentPath(binding.from, scope);
@@ -14527,7 +14573,9 @@ function scopePropValue(value, scope) {
14527
14573
  };
14528
14574
  }
14529
14575
  const result = {};
14530
- for (const [key, entry] of Object.entries(value)) {
14576
+ for (const [key, entry] of Object.entries(
14577
+ value
14578
+ )) {
14531
14579
  result[key] = scopePropValue(entry, scope);
14532
14580
  }
14533
14581
  return result;
@@ -14976,28 +15024,29 @@ var ctaRowFragment = defineFragment({
14976
15024
  });
14977
15025
 
14978
15026
  // ../blocks/src/system/fragments/library/heroCtaRow.ts
15027
+ var heroCtaFields = [
15028
+ createCtasRepeater({
15029
+ label: "Calls to action",
15030
+ itemLabel: "CTA",
15031
+ maxItems: 3,
15032
+ button: {
15033
+ variants: [
15034
+ { value: "default", label: "Default" },
15035
+ { value: "primary", label: "Primary" },
15036
+ { value: "secondary", label: "Secondary" },
15037
+ { value: "outline", label: "Outline" }
15038
+ ],
15039
+ defaultVariant: "default",
15040
+ includeSize: true,
15041
+ defaultSize: "lg"
15042
+ }
15043
+ })
15044
+ ];
14979
15045
  var heroCtaRowFragment = defineFragment({
14980
15046
  id: "heroCtaRow",
14981
15047
  title: "Hero CTAs",
14982
15048
  description: "Repeatable hero calls to action rendered inline.",
14983
- fields: [
14984
- createCtasRepeater({
14985
- label: "Calls to action",
14986
- itemLabel: "CTA",
14987
- maxItems: 3,
14988
- button: {
14989
- variants: [
14990
- { value: "default", label: "Default" },
14991
- { value: "primary", label: "Primary" },
14992
- { value: "secondary", label: "Secondary" },
14993
- { value: "outline", label: "Outline" }
14994
- ],
14995
- defaultVariant: "default",
14996
- includeSize: true,
14997
- defaultSize: "lg"
14998
- }
14999
- })
15000
- ],
15049
+ fields: heroCtaFields,
15001
15050
  layout: [
15002
15051
  ctaRow({
15003
15052
  collectionPath: "content.ctas",
@@ -20854,8 +20903,7 @@ var PUBLIC_DOWNLOAD_MEDIA_TYPES = [
20854
20903
  "document",
20855
20904
  "spreadsheet",
20856
20905
  "archive",
20857
- "audio",
20858
- "video"
20906
+ "audio"
20859
20907
  ];
20860
20908
  var hotspotSchema2 = z38.object({
20861
20909
  x: z38.number().min(0).max(1),
@@ -22430,104 +22478,107 @@ var courseDetailsBlockDefinition = {
22430
22478
  };
22431
22479
 
22432
22480
  // ../blocks/src/system/blocks/events/event-spotlight.ts
22433
- var eventSpotlightManifest = createBlockManifest({
22481
+ var eventSpotlightFields = [
22482
+ ...sectionHeaderFields("Upcoming Events"),
22483
+ {
22484
+ id: "maxEvents",
22485
+ type: "select",
22486
+ label: "Events to display",
22487
+ description: "Number of events to show",
22488
+ required: false,
22489
+ multiple: false,
22490
+ defaultValue: "3",
22491
+ options: [
22492
+ { value: "1", label: "1 event" },
22493
+ { value: "2", label: "2 events" },
22494
+ { value: "3", label: "3 events" },
22495
+ { value: "4", label: "4 events" },
22496
+ { value: "5", label: "5 events" },
22497
+ { value: "6", label: "6 events" }
22498
+ ],
22499
+ ui: { intent: "display" }
22500
+ },
22501
+ {
22502
+ id: "ctaLabel",
22503
+ type: "text",
22504
+ label: "Section button text",
22505
+ description: "Optional button shown below the spotlight cards",
22506
+ required: false,
22507
+ multiline: false,
22508
+ maxLength: 40,
22509
+ ui: { intent: "content" }
22510
+ },
22511
+ {
22512
+ id: "ctaUrl",
22513
+ type: "link",
22514
+ label: "Section button destination",
22515
+ required: false,
22516
+ ui: { intent: "display" }
22517
+ },
22518
+ layoutField,
22519
+ columnsField(["2", "3"]),
22520
+ ...cardStylingFields,
22521
+ ...eventDisplayFields,
22522
+ emptyStateField,
22523
+ sectionStylesField({
22524
+ id: "_sectionStyles",
22525
+ label: "Section styles"
22526
+ })
22527
+ ];
22528
+ var eventSpotlightLayout = [
22529
+ styledSection({
22530
+ children: sectionContainer([
22531
+ // Optional heading
22532
+ text(
22533
+ { as: "h2" },
22534
+ bind("content.heading"),
22535
+ when("content.heading")
22536
+ ),
22537
+ // Optional description
22538
+ richText(
22539
+ { className: "rb-prose rb-max-w-none" },
22540
+ bind("content.description"),
22541
+ when("content.description")
22542
+ ),
22543
+ // Event spotlight component
22544
+ el("event-spotlight", {
22545
+ events: { $bind: { from: "data.events" } },
22546
+ layout: { $bind: { from: "content.layout", fallback: "grid" } },
22547
+ columns: { $bind: { from: "content.columns", fallback: "3" } },
22548
+ cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
22549
+ buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
22550
+ buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
22551
+ ctaLabel: { $bind: { from: "content.ctaLabel" } },
22552
+ ctaUrl: { $bind: { from: "content.ctaUrl", transforms: [{ id: "links.resolve" }] } },
22553
+ showVenue: { $bind: { from: "content.showVenue" } },
22554
+ showMap: { $bind: { from: "content.showMap" } },
22555
+ showCapacity: { $bind: { from: "content.showCapacity" } },
22556
+ emptyMessage: { $bind: { from: "content.emptyMessage" } }
22557
+ })
22558
+ ], {
22559
+ gap: "lg"
22560
+ }),
22561
+ // sectionContainer (rb-container) already provides horizontal padding
22562
+ baseClass: "",
22563
+ spacing: "comfortable"
22564
+ })
22565
+ ];
22566
+ var eventSpotlightConfig = {
22434
22567
  id: "block.event-spotlight",
22435
22568
  version: "1.1.0",
22436
22569
  title: "Event Spotlight",
22437
22570
  titleSource: "heading",
22438
22571
  description: "Feature a few upcoming events on your homepage",
22439
22572
  skipSectionStyles: true,
22440
- additionalFields: [
22441
- ...sectionHeaderFields("Upcoming Events"),
22442
- {
22443
- id: "maxEvents",
22444
- type: "select",
22445
- label: "Events to display",
22446
- description: "Number of events to show",
22447
- required: false,
22448
- multiple: false,
22449
- defaultValue: "3",
22450
- options: [
22451
- { value: "1", label: "1 event" },
22452
- { value: "2", label: "2 events" },
22453
- { value: "3", label: "3 events" },
22454
- { value: "4", label: "4 events" },
22455
- { value: "5", label: "5 events" },
22456
- { value: "6", label: "6 events" }
22457
- ],
22458
- ui: { intent: "display" }
22459
- },
22460
- {
22461
- id: "ctaLabel",
22462
- type: "text",
22463
- label: "Section button text",
22464
- description: "Optional button shown below the spotlight cards",
22465
- required: false,
22466
- multiline: false,
22467
- maxLength: 40,
22468
- ui: { intent: "content" }
22469
- },
22470
- {
22471
- id: "ctaUrl",
22472
- type: "link",
22473
- label: "Section button destination",
22474
- required: false,
22475
- ui: { intent: "display" }
22476
- },
22477
- layoutField,
22478
- columnsField(["2", "3"]),
22479
- ...cardStylingFields,
22480
- ...eventDisplayFields,
22481
- emptyStateField,
22482
- sectionStylesField({
22483
- id: "_sectionStyles",
22484
- label: "Section styles"
22485
- })
22486
- ],
22573
+ additionalFields: eventSpotlightFields,
22487
22574
  styleTokens: { background: "surface", typography: "body", spacing: "md" },
22488
22575
  behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },
22489
22576
  category: "content",
22490
22577
  tags: ["events", "featured", "homepage", "spotlight", "upcoming"],
22491
22578
  icon: "Star",
22492
- layout: [
22493
- styledSection({
22494
- children: sectionContainer([
22495
- // Optional heading
22496
- text(
22497
- { as: "h2" },
22498
- bind("content.heading"),
22499
- when("content.heading")
22500
- ),
22501
- // Optional description
22502
- richText(
22503
- { className: "rb-prose rb-max-w-none" },
22504
- bind("content.description"),
22505
- when("content.description")
22506
- ),
22507
- // Event spotlight component
22508
- el("event-spotlight", {
22509
- events: { $bind: { from: "data.events" } },
22510
- layout: { $bind: { from: "content.layout", fallback: "grid" } },
22511
- columns: { $bind: { from: "content.columns", fallback: "3" } },
22512
- cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
22513
- buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
22514
- buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
22515
- ctaLabel: { $bind: { from: "content.ctaLabel" } },
22516
- ctaUrl: { $bind: { from: "content.ctaUrl", transforms: [{ id: "links.resolve" }] } },
22517
- showVenue: { $bind: { from: "content.showVenue" } },
22518
- showMap: { $bind: { from: "content.showMap" } },
22519
- showCapacity: { $bind: { from: "content.showCapacity" } },
22520
- emptyMessage: { $bind: { from: "content.emptyMessage" } }
22521
- })
22522
- ], {
22523
- gap: "lg"
22524
- }),
22525
- // sectionContainer (rb-container) already provides horizontal padding
22526
- baseClass: "",
22527
- spacing: "comfortable"
22528
- })
22529
- ]
22530
- });
22579
+ layout: eventSpotlightLayout
22580
+ };
22581
+ var eventSpotlightManifest = createBlockManifest(eventSpotlightConfig);
22531
22582
  var eventSpotlightBlockDefinition = {
22532
22583
  manifest: eventSpotlightManifest,
22533
22584
  dataSchemas: {
@@ -25217,18 +25268,18 @@ var fileDownloadManifest = createBlockManifest({
25217
25268
  title: "File Download",
25218
25269
  titleSource: ["title", "file.filename"],
25219
25270
  category: "media",
25220
- description: "Add a simple public download link for a document, ZIP, audio, or video file.",
25271
+ description: "Add a simple public download link for a document, ZIP, or audio file.",
25221
25272
  tags: ["file", "download", "document", "zip", "media"],
25222
25273
  icon: "Download",
25223
25274
  includeContainerStyles: true,
25224
25275
  additionalFields: [
25225
25276
  {
25226
25277
  id: "file",
25227
- type: "media",
25278
+ type: "file",
25228
25279
  label: "Download file",
25229
25280
  description: "Choose the file visitors can download.",
25230
25281
  required: false,
25231
- mediaKinds: [...PUBLIC_DOWNLOAD_MEDIA_TYPES],
25282
+ fileKinds: [...PUBLIC_DOWNLOAD_MEDIA_TYPES],
25232
25283
  ui: { intent: "content" }
25233
25284
  },
25234
25285
  {