@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
@@ -6603,6 +6603,28 @@ function resolveRepeaterGridColumnFieldId(options) {
6603
6603
 
6604
6604
  // ../blocks/src/system/manifest/schema.ts
6605
6605
  var visibilityLevels = ["admin", "designer", "author"];
6606
+ var MEDIA_KINDS = [
6607
+ "image",
6608
+ "video",
6609
+ "audio",
6610
+ "document",
6611
+ "spreadsheet",
6612
+ "archive"
6613
+ ];
6614
+ var DISPLAY_MEDIA_KINDS = [
6615
+ "image",
6616
+ "video",
6617
+ "audio"
6618
+ ];
6619
+ var PUBLIC_FILE_FIELD_KINDS = [
6620
+ "document",
6621
+ "spreadsheet",
6622
+ "archive",
6623
+ "audio"
6624
+ ];
6625
+ function isDisplayMediaKind(kind) {
6626
+ return DISPLAY_MEDIA_KINDS.includes(kind);
6627
+ }
6606
6628
  var siteOptionSources = [
6607
6629
  "eventCategories",
6608
6630
  "venues",
@@ -6766,11 +6788,19 @@ var richTextFieldSchema = baseFieldSchema.extend({
6766
6788
  });
6767
6789
  var mediaFieldSchema = baseFieldSchema.extend({
6768
6790
  type: z4.literal("media"),
6769
- mediaKinds: z4.array(
6770
- z4.enum(["image", "video", "audio", "document", "spreadsheet", "archive"])
6771
- ).default(["image"]),
6791
+ // Keep full MEDIA_KINDS parse compatibility for pre-file-field manifests.
6792
+ // New authoring surfaces should use `file.fileKinds` for document/archive
6793
+ // style assets, but old saved schemas must not fail to open.
6794
+ mediaKinds: z4.array(z4.enum(MEDIA_KINDS)).default(["image"]).transform((kinds) => {
6795
+ const displayKinds = kinds.filter(isDisplayMediaKind);
6796
+ return displayKinds.length > 0 ? displayKinds : ["image"];
6797
+ }),
6772
6798
  aspectRatio: z4.string().optional()
6773
6799
  });
6800
+ var fileFieldSchema = baseFieldSchema.extend({
6801
+ type: z4.literal("file"),
6802
+ fileKinds: z4.array(z4.enum(PUBLIC_FILE_FIELD_KINDS)).default([...PUBLIC_FILE_FIELD_KINDS])
6803
+ });
6774
6804
  var booleanFieldSchema = baseFieldSchema.extend({
6775
6805
  type: z4.literal("boolean")
6776
6806
  });
@@ -7076,6 +7106,7 @@ function getFieldSchemaInternal() {
7076
7106
  textFieldSchema,
7077
7107
  richTextFieldSchema,
7078
7108
  mediaFieldSchema,
7109
+ fileFieldSchema,
7079
7110
  booleanFieldSchema,
7080
7111
  numberFieldSchema,
7081
7112
  dateFieldSchema,
@@ -14212,13 +14243,18 @@ var fragmentDataSchema = z27.object({
14212
14243
  loader: dataLoaderSchema.optional()
14213
14244
  });
14214
14245
  var fragmentConfigSchema = z27.object({
14215
- id: z27.string().min(1, "Fragment id is required").regex(FRAGMENT_ID_PATTERN, "Fragment id must be alphanumeric with optional . _ - separators"),
14246
+ id: z27.string().min(1, "Fragment id is required").regex(
14247
+ FRAGMENT_ID_PATTERN,
14248
+ "Fragment id must be alphanumeric with optional . _ - separators"
14249
+ ),
14216
14250
  title: z27.string().optional(),
14217
14251
  description: z27.string().optional(),
14218
14252
  category: z27.enum(["content", "media", "interactive", "layout"]).optional(),
14219
14253
  icon: z27.string().optional(),
14220
14254
  fields: fieldSchema.array().default([]),
14221
- layout: z27.union([NodeSchema, NodeSchema.array()]).transform((value) => Array.isArray(value) ? value : [value]),
14255
+ layout: z27.union([NodeSchema, NodeSchema.array()]).transform(
14256
+ (value) => Array.isArray(value) ? value : [value]
14257
+ ),
14222
14258
  data: fragmentDataSchema.optional()
14223
14259
  });
14224
14260
  var FragmentConfigError = class extends Error {
@@ -14240,13 +14276,19 @@ function defineFragment(config) {
14240
14276
  function scopeFragmentFields(fragment, scope) {
14241
14277
  const normalizedScope = scope.trim();
14242
14278
  if (!normalizedScope) {
14243
- return fragment.fields.map((field) => cloneFieldDefinition2(field));
14279
+ return fragment.fields.map(
14280
+ (field) => cloneFieldDefinition2(field)
14281
+ );
14244
14282
  }
14245
- return fragment.fields.map((field) => prefixFieldId(field, normalizedScope));
14283
+ return fragment.fields.map(
14284
+ (field) => prefixFieldId(field, normalizedScope)
14285
+ );
14246
14286
  }
14247
14287
  function scopeFragmentLayout(fragment, scope) {
14248
14288
  const normalizedScope = scope.trim();
14249
- return fragment.layout.map((node) => cloneAndScopeNode(node, normalizedScope));
14289
+ return fragment.layout.map(
14290
+ (node) => cloneAndScopeNode(node, normalizedScope)
14291
+ );
14250
14292
  }
14251
14293
  function validateFieldDefinitions(fields3, fragmentId) {
14252
14294
  const seen = /* @__PURE__ */ new Set();
@@ -14328,7 +14370,9 @@ function cloneAndScopeNode(node, scope) {
14328
14370
  ...node
14329
14371
  };
14330
14372
  if (node.children) {
14331
- cloned.children = node.children.map((child) => cloneAndScopeNode(child, scope));
14373
+ cloned.children = node.children.map(
14374
+ (child) => cloneAndScopeNode(child, scope)
14375
+ );
14332
14376
  }
14333
14377
  if (node.props) {
14334
14378
  cloned.props = scopePropBindings(node.props, scope);
@@ -14354,7 +14398,9 @@ function scopeBinding(binding, scope) {
14354
14398
  const cloned = {
14355
14399
  ...binding,
14356
14400
  transforms: binding.transforms?.map(
14357
- (step) => ({ ...step })
14401
+ (step) => ({
14402
+ ...step
14403
+ })
14358
14404
  ) ?? []
14359
14405
  };
14360
14406
  cloned.from = scopeContentPath(binding.from, scope);
@@ -14398,7 +14444,9 @@ function scopePropValue(value, scope) {
14398
14444
  };
14399
14445
  }
14400
14446
  const result = {};
14401
- for (const [key, entry] of Object.entries(value)) {
14447
+ for (const [key, entry] of Object.entries(
14448
+ value
14449
+ )) {
14402
14450
  result[key] = scopePropValue(entry, scope);
14403
14451
  }
14404
14452
  return result;
@@ -14847,28 +14895,29 @@ var ctaRowFragment = defineFragment({
14847
14895
  });
14848
14896
 
14849
14897
  // ../blocks/src/system/fragments/library/heroCtaRow.ts
14898
+ var heroCtaFields = [
14899
+ createCtasRepeater({
14900
+ label: "Calls to action",
14901
+ itemLabel: "CTA",
14902
+ maxItems: 3,
14903
+ button: {
14904
+ variants: [
14905
+ { value: "default", label: "Default" },
14906
+ { value: "primary", label: "Primary" },
14907
+ { value: "secondary", label: "Secondary" },
14908
+ { value: "outline", label: "Outline" }
14909
+ ],
14910
+ defaultVariant: "default",
14911
+ includeSize: true,
14912
+ defaultSize: "lg"
14913
+ }
14914
+ })
14915
+ ];
14850
14916
  var heroCtaRowFragment = defineFragment({
14851
14917
  id: "heroCtaRow",
14852
14918
  title: "Hero CTAs",
14853
14919
  description: "Repeatable hero calls to action rendered inline.",
14854
- fields: [
14855
- createCtasRepeater({
14856
- label: "Calls to action",
14857
- itemLabel: "CTA",
14858
- maxItems: 3,
14859
- button: {
14860
- variants: [
14861
- { value: "default", label: "Default" },
14862
- { value: "primary", label: "Primary" },
14863
- { value: "secondary", label: "Secondary" },
14864
- { value: "outline", label: "Outline" }
14865
- ],
14866
- defaultVariant: "default",
14867
- includeSize: true,
14868
- defaultSize: "lg"
14869
- }
14870
- })
14871
- ],
14920
+ fields: heroCtaFields,
14872
14921
  layout: [
14873
14922
  ctaRow({
14874
14923
  collectionPath: "content.ctas",
@@ -20728,8 +20777,7 @@ var PUBLIC_DOWNLOAD_MEDIA_TYPES = [
20728
20777
  "document",
20729
20778
  "spreadsheet",
20730
20779
  "archive",
20731
- "audio",
20732
- "video"
20780
+ "audio"
20733
20781
  ];
20734
20782
  var hotspotSchema2 = z38.object({
20735
20783
  x: z38.number().min(0).max(1),
@@ -22304,104 +22352,107 @@ var courseDetailsBlockDefinition = {
22304
22352
  };
22305
22353
 
22306
22354
  // ../blocks/src/system/blocks/events/event-spotlight.ts
22307
- var eventSpotlightManifest = createBlockManifest({
22355
+ var eventSpotlightFields = [
22356
+ ...sectionHeaderFields("Upcoming Events"),
22357
+ {
22358
+ id: "maxEvents",
22359
+ type: "select",
22360
+ label: "Events to display",
22361
+ description: "Number of events to show",
22362
+ required: false,
22363
+ multiple: false,
22364
+ defaultValue: "3",
22365
+ options: [
22366
+ { value: "1", label: "1 event" },
22367
+ { value: "2", label: "2 events" },
22368
+ { value: "3", label: "3 events" },
22369
+ { value: "4", label: "4 events" },
22370
+ { value: "5", label: "5 events" },
22371
+ { value: "6", label: "6 events" }
22372
+ ],
22373
+ ui: { intent: "display" }
22374
+ },
22375
+ {
22376
+ id: "ctaLabel",
22377
+ type: "text",
22378
+ label: "Section button text",
22379
+ description: "Optional button shown below the spotlight cards",
22380
+ required: false,
22381
+ multiline: false,
22382
+ maxLength: 40,
22383
+ ui: { intent: "content" }
22384
+ },
22385
+ {
22386
+ id: "ctaUrl",
22387
+ type: "link",
22388
+ label: "Section button destination",
22389
+ required: false,
22390
+ ui: { intent: "display" }
22391
+ },
22392
+ layoutField,
22393
+ columnsField(["2", "3"]),
22394
+ ...cardStylingFields,
22395
+ ...eventDisplayFields,
22396
+ emptyStateField,
22397
+ sectionStylesField({
22398
+ id: "_sectionStyles",
22399
+ label: "Section styles"
22400
+ })
22401
+ ];
22402
+ var eventSpotlightLayout = [
22403
+ styledSection({
22404
+ children: sectionContainer([
22405
+ // Optional heading
22406
+ text(
22407
+ { as: "h2" },
22408
+ bind("content.heading"),
22409
+ when("content.heading")
22410
+ ),
22411
+ // Optional description
22412
+ richText(
22413
+ { className: "rb-prose rb-max-w-none" },
22414
+ bind("content.description"),
22415
+ when("content.description")
22416
+ ),
22417
+ // Event spotlight component
22418
+ el("event-spotlight", {
22419
+ events: { $bind: { from: "data.events" } },
22420
+ layout: { $bind: { from: "content.layout", fallback: "grid" } },
22421
+ columns: { $bind: { from: "content.columns", fallback: "3" } },
22422
+ cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
22423
+ buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
22424
+ buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
22425
+ ctaLabel: { $bind: { from: "content.ctaLabel" } },
22426
+ ctaUrl: { $bind: { from: "content.ctaUrl", transforms: [{ id: "links.resolve" }] } },
22427
+ showVenue: { $bind: { from: "content.showVenue" } },
22428
+ showMap: { $bind: { from: "content.showMap" } },
22429
+ showCapacity: { $bind: { from: "content.showCapacity" } },
22430
+ emptyMessage: { $bind: { from: "content.emptyMessage" } }
22431
+ })
22432
+ ], {
22433
+ gap: "lg"
22434
+ }),
22435
+ // sectionContainer (rb-container) already provides horizontal padding
22436
+ baseClass: "",
22437
+ spacing: "comfortable"
22438
+ })
22439
+ ];
22440
+ var eventSpotlightConfig = {
22308
22441
  id: "block.event-spotlight",
22309
22442
  version: "1.1.0",
22310
22443
  title: "Event Spotlight",
22311
22444
  titleSource: "heading",
22312
22445
  description: "Feature a few upcoming events on your homepage",
22313
22446
  skipSectionStyles: true,
22314
- additionalFields: [
22315
- ...sectionHeaderFields("Upcoming Events"),
22316
- {
22317
- id: "maxEvents",
22318
- type: "select",
22319
- label: "Events to display",
22320
- description: "Number of events to show",
22321
- required: false,
22322
- multiple: false,
22323
- defaultValue: "3",
22324
- options: [
22325
- { value: "1", label: "1 event" },
22326
- { value: "2", label: "2 events" },
22327
- { value: "3", label: "3 events" },
22328
- { value: "4", label: "4 events" },
22329
- { value: "5", label: "5 events" },
22330
- { value: "6", label: "6 events" }
22331
- ],
22332
- ui: { intent: "display" }
22333
- },
22334
- {
22335
- id: "ctaLabel",
22336
- type: "text",
22337
- label: "Section button text",
22338
- description: "Optional button shown below the spotlight cards",
22339
- required: false,
22340
- multiline: false,
22341
- maxLength: 40,
22342
- ui: { intent: "content" }
22343
- },
22344
- {
22345
- id: "ctaUrl",
22346
- type: "link",
22347
- label: "Section button destination",
22348
- required: false,
22349
- ui: { intent: "display" }
22350
- },
22351
- layoutField,
22352
- columnsField(["2", "3"]),
22353
- ...cardStylingFields,
22354
- ...eventDisplayFields,
22355
- emptyStateField,
22356
- sectionStylesField({
22357
- id: "_sectionStyles",
22358
- label: "Section styles"
22359
- })
22360
- ],
22447
+ additionalFields: eventSpotlightFields,
22361
22448
  styleTokens: { background: "surface", typography: "body", spacing: "md" },
22362
22449
  behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },
22363
22450
  category: "content",
22364
22451
  tags: ["events", "featured", "homepage", "spotlight", "upcoming"],
22365
22452
  icon: "Star",
22366
- layout: [
22367
- styledSection({
22368
- children: sectionContainer([
22369
- // Optional heading
22370
- text(
22371
- { as: "h2" },
22372
- bind("content.heading"),
22373
- when("content.heading")
22374
- ),
22375
- // Optional description
22376
- richText(
22377
- { className: "rb-prose rb-max-w-none" },
22378
- bind("content.description"),
22379
- when("content.description")
22380
- ),
22381
- // Event spotlight component
22382
- el("event-spotlight", {
22383
- events: { $bind: { from: "data.events" } },
22384
- layout: { $bind: { from: "content.layout", fallback: "grid" } },
22385
- columns: { $bind: { from: "content.columns", fallback: "3" } },
22386
- cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
22387
- buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
22388
- buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
22389
- ctaLabel: { $bind: { from: "content.ctaLabel" } },
22390
- ctaUrl: { $bind: { from: "content.ctaUrl", transforms: [{ id: "links.resolve" }] } },
22391
- showVenue: { $bind: { from: "content.showVenue" } },
22392
- showMap: { $bind: { from: "content.showMap" } },
22393
- showCapacity: { $bind: { from: "content.showCapacity" } },
22394
- emptyMessage: { $bind: { from: "content.emptyMessage" } }
22395
- })
22396
- ], {
22397
- gap: "lg"
22398
- }),
22399
- // sectionContainer (rb-container) already provides horizontal padding
22400
- baseClass: "",
22401
- spacing: "comfortable"
22402
- })
22403
- ]
22404
- });
22453
+ layout: eventSpotlightLayout
22454
+ };
22455
+ var eventSpotlightManifest = createBlockManifest(eventSpotlightConfig);
22405
22456
  var eventSpotlightBlockDefinition = {
22406
22457
  manifest: eventSpotlightManifest,
22407
22458
  dataSchemas: {
@@ -25091,18 +25142,18 @@ var fileDownloadManifest = createBlockManifest({
25091
25142
  title: "File Download",
25092
25143
  titleSource: ["title", "file.filename"],
25093
25144
  category: "media",
25094
- description: "Add a simple public download link for a document, ZIP, audio, or video file.",
25145
+ description: "Add a simple public download link for a document, ZIP, or audio file.",
25095
25146
  tags: ["file", "download", "document", "zip", "media"],
25096
25147
  icon: "Download",
25097
25148
  includeContainerStyles: true,
25098
25149
  additionalFields: [
25099
25150
  {
25100
25151
  id: "file",
25101
- type: "media",
25152
+ type: "file",
25102
25153
  label: "Download file",
25103
25154
  description: "Choose the file visitors can download.",
25104
25155
  required: false,
25105
- mediaKinds: [...PUBLIC_DOWNLOAD_MEDIA_TYPES],
25156
+ fileKinds: [...PUBLIC_DOWNLOAD_MEDIA_TYPES],
25106
25157
  ui: { intent: "content" }
25107
25158
  },
25108
25159
  {