@riverbankcms/sdk 0.70.2 → 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 (89) hide show
  1. package/README.md +29 -0
  2. package/dist/_dts/api/src/contentTypes.d.ts +2 -1
  3. package/dist/_dts/block-form/src/client/index.d.ts +1 -1
  4. package/dist/_dts/block-form/src/fields/types.d.ts +14 -2
  5. package/dist/_dts/block-form/src/registry/schemas.d.ts +2 -0
  6. package/dist/_dts/block-form/src/widgets/MediaField/mediaFieldDefaults.d.ts +2 -2
  7. package/dist/_dts/block-form/src/widgets/MediaField/mediaFieldSchema.d.ts +2 -2
  8. package/dist/_dts/blocks/src/lib/media.d.ts +1 -1
  9. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +1829 -149
  10. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +1829 -149
  11. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +1829 -149
  12. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +1829 -149
  13. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +1829 -149
  14. package/dist/_dts/blocks/src/system/blocks/cta-full.d.ts +1 -30727
  15. package/dist/_dts/blocks/src/system/blocks/events/event-spotlight.d.ts +11 -30827
  16. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +1829 -149
  17. package/dist/_dts/blocks/src/system/blocks/file-download.d.ts +3 -3
  18. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +1829 -149
  19. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +106 -1
  20. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +1829 -149
  21. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +1829 -149
  22. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +1829 -149
  23. package/dist/_dts/blocks/src/system/defineBlock.d.ts +3 -3
  24. package/dist/_dts/blocks/src/system/fragments/library/card.d.ts +2 -30793
  25. package/dist/_dts/blocks/src/system/fragments/library/ctaRow.d.ts +2 -30727
  26. package/dist/_dts/blocks/src/system/fragments/library/feedbackCallout.d.ts +2 -30779
  27. package/dist/_dts/blocks/src/system/fragments/library/heroCtaRow.d.ts +33 -30743
  28. package/dist/_dts/blocks/src/system/fragments/library/sectionState.d.ts +2 -30770
  29. package/dist/_dts/blocks/src/system/fragments/types.d.ts +8 -7
  30. package/dist/_dts/blocks/src/system/manifest/derivedContent.d.ts +7 -5
  31. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +1 -1
  32. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +192 -3
  33. package/dist/_dts/blocks/src/system/runtime/nodes/file-download.d.ts +1 -1
  34. package/dist/_dts/content-model/src/content-types/schema.d.ts +7 -0
  35. package/dist/_dts/content-model/src/contentManifest.d.ts +4 -1
  36. package/dist/_dts/content-model/src/templates/bindingTypeCompatibility.d.ts +1 -1
  37. package/dist/_dts/core/src/index.d.ts +1 -1
  38. package/dist/_dts/core/src/planner.d.ts +4 -0
  39. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +53 -20
  40. package/dist/_dts/editor-blocks/src/index.d.ts +1 -1
  41. package/dist/_dts/editor-blocks/src/media/MediaField.d.ts +6 -5
  42. package/dist/_dts/media-core/src/videoSlotPolicy.d.ts +0 -1
  43. package/dist/_dts/media-editor/src/context.d.ts +4 -1
  44. package/dist/_dts/media-react/src/hooks/useApiMediaUploader.d.ts +8 -1
  45. package/dist/_dts/media-react/src/index.d.ts +1 -5
  46. package/dist/_dts/preview-next/src/client/widgets/PreviewMediaField.d.ts +2 -1
  47. package/dist/_dts/preview-next/src/client/widgets/widgetOverrides.d.ts +1 -0
  48. package/dist/_dts/sdk/src/cli/commands/delete.d.ts +3 -0
  49. package/dist/_dts/sdk/src/cli/commands/style.d.ts +18 -0
  50. package/dist/_dts/sdk/src/cli/helpers.d.ts +8 -33
  51. package/dist/_dts/sdk/src/cli/site-commands/oneOffCommands.d.ts +81 -0
  52. package/dist/_dts/sdk/src/components.d.ts +2 -1
  53. package/dist/_dts/sdk/src/config/field-definitions.d.ts +6 -2
  54. package/dist/_dts/sdk/src/config/typed-entries.d.ts +4 -2
  55. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +2 -1
  56. package/dist/_dts/sdk/src/manifest/prompt/examples/cta.d.ts +5 -5
  57. package/dist/_dts/sdk/src/manifest/prompt/examples/features-grid.d.ts +2 -2
  58. package/dist/_dts/sdk/src/manifest/prompt/examples/hero.d.ts +2 -2
  59. package/dist/_dts/sdk/src/manifest/prompt/examples/pricing.d.ts +10 -10
  60. package/dist/_dts/sdk/src/manifest/prompt/examples/testimonials.d.ts +4 -4
  61. package/dist/_dts/sdk/src/manifest/validation/output-schema.d.ts +11 -1
  62. package/dist/_dts/sdk/src/next/types.d.ts +4 -2
  63. package/dist/_dts/sdk/src/public-api/contracts.d.ts +2 -1
  64. package/dist/_dts/sdk/src/rendering/index.d.ts +2 -1
  65. package/dist/_dts/sdk/src/rendering/overrideResolution.d.ts +10 -0
  66. package/dist/_dts/sdk/src/rendering/overrides.d.ts +12 -0
  67. package/dist/_dts/sdk/src/version.d.ts +1 -1
  68. package/dist/cli/index.mjs +1072 -289
  69. package/dist/cli/init-docs/content/workflow-preview-mode.md +167 -0
  70. package/dist/client/client.mjs +443 -403
  71. package/dist/client/hooks.mjs +172 -121
  72. package/dist/client/rendering/client.mjs +148 -112
  73. package/dist/client/rendering/islands.mjs +80 -31
  74. package/dist/client/rendering.mjs +25531 -25481
  75. package/dist/preview-next/client/runtime.mjs +394 -1136
  76. package/dist/server/components.mjs +229 -171
  77. package/dist/server/config-template-validation.mjs +31 -1
  78. package/dist/server/config-validation.mjs +172 -121
  79. package/dist/server/config.mjs +172 -121
  80. package/dist/server/data.mjs +172 -121
  81. package/dist/server/index.mjs +1 -1
  82. package/dist/server/next.mjs +301 -174
  83. package/dist/server/page-converter.mjs +379 -185
  84. package/dist/server/prebuild.mjs +1 -1
  85. package/dist/server/rendering/server.mjs +219 -171
  86. package/dist/server/rendering.mjs +229 -171
  87. package/dist/server/routing.mjs +175 -124
  88. package/dist/server/server.mjs +173 -122
  89. package/package.json +5 -3
@@ -745,6 +745,28 @@ function resolveRepeaterGridColumnFieldId(options) {
745
745
 
746
746
  // ../blocks/src/system/manifest/schema.ts
747
747
  var visibilityLevels = ["admin", "designer", "author"];
748
+ var MEDIA_KINDS = [
749
+ "image",
750
+ "video",
751
+ "audio",
752
+ "document",
753
+ "spreadsheet",
754
+ "archive"
755
+ ];
756
+ var DISPLAY_MEDIA_KINDS = [
757
+ "image",
758
+ "video",
759
+ "audio"
760
+ ];
761
+ var PUBLIC_FILE_FIELD_KINDS = [
762
+ "document",
763
+ "spreadsheet",
764
+ "archive",
765
+ "audio"
766
+ ];
767
+ function isDisplayMediaKind(kind) {
768
+ return DISPLAY_MEDIA_KINDS.includes(kind);
769
+ }
748
770
  var siteOptionSources = [
749
771
  "eventCategories",
750
772
  "venues",
@@ -908,11 +930,19 @@ var richTextFieldSchema = baseFieldSchema.extend({
908
930
  });
909
931
  var mediaFieldSchema = baseFieldSchema.extend({
910
932
  type: z3.literal("media"),
911
- mediaKinds: z3.array(
912
- z3.enum(["image", "video", "audio", "document", "spreadsheet", "archive"])
913
- ).default(["image"]),
933
+ // Keep full MEDIA_KINDS parse compatibility for pre-file-field manifests.
934
+ // New authoring surfaces should use `file.fileKinds` for document/archive
935
+ // style assets, but old saved schemas must not fail to open.
936
+ mediaKinds: z3.array(z3.enum(MEDIA_KINDS)).default(["image"]).transform((kinds) => {
937
+ const displayKinds = kinds.filter(isDisplayMediaKind);
938
+ return displayKinds.length > 0 ? displayKinds : ["image"];
939
+ }),
914
940
  aspectRatio: z3.string().optional()
915
941
  });
942
+ var fileFieldSchema = baseFieldSchema.extend({
943
+ type: z3.literal("file"),
944
+ fileKinds: z3.array(z3.enum(PUBLIC_FILE_FIELD_KINDS)).default([...PUBLIC_FILE_FIELD_KINDS])
945
+ });
916
946
  var booleanFieldSchema = baseFieldSchema.extend({
917
947
  type: z3.literal("boolean")
918
948
  });
@@ -1218,6 +1248,7 @@ function getFieldSchemaInternal() {
1218
1248
  textFieldSchema,
1219
1249
  richTextFieldSchema,
1220
1250
  mediaFieldSchema,
1251
+ fileFieldSchema,
1221
1252
  booleanFieldSchema,
1222
1253
  numberFieldSchema,
1223
1254
  dateFieldSchema,
@@ -1496,6 +1527,7 @@ function deriveFieldValidationPlan(field, path = [field.id]) {
1496
1527
  case "richText":
1497
1528
  return makePlan("richText", "object", field, path, required, commonConstraints(required, { kind: "richTextDoc" }));
1498
1529
  case "media":
1530
+ case "file":
1499
1531
  return makePlan("media", "object", field, path, required, commonConstraints(required, { kind: "mediaObject" }));
1500
1532
  case "link":
1501
1533
  return makePlan("link", "object", field, path, required, commonConstraints(required, { kind: "linkObject" }));
@@ -11387,13 +11419,18 @@ var fragmentDataSchema = z28.object({
11387
11419
  loader: dataLoaderSchema.optional()
11388
11420
  });
11389
11421
  var fragmentConfigSchema = z28.object({
11390
- id: z28.string().min(1, "Fragment id is required").regex(FRAGMENT_ID_PATTERN, "Fragment id must be alphanumeric with optional . _ - separators"),
11422
+ id: z28.string().min(1, "Fragment id is required").regex(
11423
+ FRAGMENT_ID_PATTERN,
11424
+ "Fragment id must be alphanumeric with optional . _ - separators"
11425
+ ),
11391
11426
  title: z28.string().optional(),
11392
11427
  description: z28.string().optional(),
11393
11428
  category: z28.enum(["content", "media", "interactive", "layout"]).optional(),
11394
11429
  icon: z28.string().optional(),
11395
11430
  fields: fieldSchema.array().default([]),
11396
- layout: z28.union([NodeSchema, NodeSchema.array()]).transform((value) => Array.isArray(value) ? value : [value]),
11431
+ layout: z28.union([NodeSchema, NodeSchema.array()]).transform(
11432
+ (value) => Array.isArray(value) ? value : [value]
11433
+ ),
11397
11434
  data: fragmentDataSchema.optional()
11398
11435
  });
11399
11436
  var FragmentConfigError = class extends Error {
@@ -11415,13 +11452,19 @@ function defineFragment(config) {
11415
11452
  function scopeFragmentFields(fragment, scope) {
11416
11453
  const normalizedScope = scope.trim();
11417
11454
  if (!normalizedScope) {
11418
- return fragment.fields.map((field) => cloneFieldDefinition2(field));
11455
+ return fragment.fields.map(
11456
+ (field) => cloneFieldDefinition2(field)
11457
+ );
11419
11458
  }
11420
- return fragment.fields.map((field) => prefixFieldId(field, normalizedScope));
11459
+ return fragment.fields.map(
11460
+ (field) => prefixFieldId(field, normalizedScope)
11461
+ );
11421
11462
  }
11422
11463
  function scopeFragmentLayout(fragment, scope) {
11423
11464
  const normalizedScope = scope.trim();
11424
- return fragment.layout.map((node) => cloneAndScopeNode(node, normalizedScope));
11465
+ return fragment.layout.map(
11466
+ (node) => cloneAndScopeNode(node, normalizedScope)
11467
+ );
11425
11468
  }
11426
11469
  function validateFieldDefinitions(fields3, fragmentId) {
11427
11470
  const seen = /* @__PURE__ */ new Set();
@@ -11503,7 +11546,9 @@ function cloneAndScopeNode(node, scope) {
11503
11546
  ...node
11504
11547
  };
11505
11548
  if (node.children) {
11506
- cloned.children = node.children.map((child) => cloneAndScopeNode(child, scope));
11549
+ cloned.children = node.children.map(
11550
+ (child) => cloneAndScopeNode(child, scope)
11551
+ );
11507
11552
  }
11508
11553
  if (node.props) {
11509
11554
  cloned.props = scopePropBindings(node.props, scope);
@@ -11529,7 +11574,9 @@ function scopeBinding(binding, scope) {
11529
11574
  const cloned = {
11530
11575
  ...binding,
11531
11576
  transforms: binding.transforms?.map(
11532
- (step) => ({ ...step })
11577
+ (step) => ({
11578
+ ...step
11579
+ })
11533
11580
  ) ?? []
11534
11581
  };
11535
11582
  cloned.from = scopeContentPath(binding.from, scope);
@@ -11573,7 +11620,9 @@ function scopePropValue(value, scope) {
11573
11620
  };
11574
11621
  }
11575
11622
  const result = {};
11576
- for (const [key, entry] of Object.entries(value)) {
11623
+ for (const [key, entry] of Object.entries(
11624
+ value
11625
+ )) {
11577
11626
  result[key] = scopePropValue(entry, scope);
11578
11627
  }
11579
11628
  return result;
@@ -12022,28 +12071,29 @@ var ctaRowFragment = defineFragment({
12022
12071
  });
12023
12072
 
12024
12073
  // ../blocks/src/system/fragments/library/heroCtaRow.ts
12074
+ var heroCtaFields = [
12075
+ createCtasRepeater({
12076
+ label: "Calls to action",
12077
+ itemLabel: "CTA",
12078
+ maxItems: 3,
12079
+ button: {
12080
+ variants: [
12081
+ { value: "default", label: "Default" },
12082
+ { value: "primary", label: "Primary" },
12083
+ { value: "secondary", label: "Secondary" },
12084
+ { value: "outline", label: "Outline" }
12085
+ ],
12086
+ defaultVariant: "default",
12087
+ includeSize: true,
12088
+ defaultSize: "lg"
12089
+ }
12090
+ })
12091
+ ];
12025
12092
  var heroCtaRowFragment = defineFragment({
12026
12093
  id: "heroCtaRow",
12027
12094
  title: "Hero CTAs",
12028
12095
  description: "Repeatable hero calls to action rendered inline.",
12029
- fields: [
12030
- createCtasRepeater({
12031
- label: "Calls to action",
12032
- itemLabel: "CTA",
12033
- maxItems: 3,
12034
- button: {
12035
- variants: [
12036
- { value: "default", label: "Default" },
12037
- { value: "primary", label: "Primary" },
12038
- { value: "secondary", label: "Secondary" },
12039
- { value: "outline", label: "Outline" }
12040
- ],
12041
- defaultVariant: "default",
12042
- includeSize: true,
12043
- defaultSize: "lg"
12044
- }
12045
- })
12046
- ],
12096
+ fields: heroCtaFields,
12047
12097
  layout: [
12048
12098
  ctaRow({
12049
12099
  collectionPath: "content.ctas",
@@ -18048,8 +18098,7 @@ var PUBLIC_DOWNLOAD_MEDIA_TYPES = [
18048
18098
  "document",
18049
18099
  "spreadsheet",
18050
18100
  "archive",
18051
- "audio",
18052
- "video"
18101
+ "audio"
18053
18102
  ];
18054
18103
  var hotspotSchema2 = z39.object({
18055
18104
  x: z39.number().min(0).max(1),
@@ -19785,104 +19834,107 @@ var courseDetailsBlockDefinition = {
19785
19834
  };
19786
19835
 
19787
19836
  // ../blocks/src/system/blocks/events/event-spotlight.ts
19788
- var eventSpotlightManifest = createBlockManifest({
19837
+ var eventSpotlightFields = [
19838
+ ...sectionHeaderFields("Upcoming Events"),
19839
+ {
19840
+ id: "maxEvents",
19841
+ type: "select",
19842
+ label: "Events to display",
19843
+ description: "Number of events to show",
19844
+ required: false,
19845
+ multiple: false,
19846
+ defaultValue: "3",
19847
+ options: [
19848
+ { value: "1", label: "1 event" },
19849
+ { value: "2", label: "2 events" },
19850
+ { value: "3", label: "3 events" },
19851
+ { value: "4", label: "4 events" },
19852
+ { value: "5", label: "5 events" },
19853
+ { value: "6", label: "6 events" }
19854
+ ],
19855
+ ui: { intent: "display" }
19856
+ },
19857
+ {
19858
+ id: "ctaLabel",
19859
+ type: "text",
19860
+ label: "Section button text",
19861
+ description: "Optional button shown below the spotlight cards",
19862
+ required: false,
19863
+ multiline: false,
19864
+ maxLength: 40,
19865
+ ui: { intent: "content" }
19866
+ },
19867
+ {
19868
+ id: "ctaUrl",
19869
+ type: "link",
19870
+ label: "Section button destination",
19871
+ required: false,
19872
+ ui: { intent: "display" }
19873
+ },
19874
+ layoutField,
19875
+ columnsField(["2", "3"]),
19876
+ ...cardStylingFields,
19877
+ ...eventDisplayFields,
19878
+ emptyStateField,
19879
+ sectionStylesField({
19880
+ id: "_sectionStyles",
19881
+ label: "Section styles"
19882
+ })
19883
+ ];
19884
+ var eventSpotlightLayout = [
19885
+ styledSection({
19886
+ children: sectionContainer([
19887
+ // Optional heading
19888
+ text(
19889
+ { as: "h2" },
19890
+ bind("content.heading"),
19891
+ when("content.heading")
19892
+ ),
19893
+ // Optional description
19894
+ richText(
19895
+ { className: "rb-prose rb-max-w-none" },
19896
+ bind("content.description"),
19897
+ when("content.description")
19898
+ ),
19899
+ // Event spotlight component
19900
+ el("event-spotlight", {
19901
+ events: { $bind: { from: "data.events" } },
19902
+ layout: { $bind: { from: "content.layout", fallback: "grid" } },
19903
+ columns: { $bind: { from: "content.columns", fallback: "3" } },
19904
+ cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
19905
+ buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
19906
+ buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
19907
+ ctaLabel: { $bind: { from: "content.ctaLabel" } },
19908
+ ctaUrl: { $bind: { from: "content.ctaUrl", transforms: [{ id: "links.resolve" }] } },
19909
+ showVenue: { $bind: { from: "content.showVenue" } },
19910
+ showMap: { $bind: { from: "content.showMap" } },
19911
+ showCapacity: { $bind: { from: "content.showCapacity" } },
19912
+ emptyMessage: { $bind: { from: "content.emptyMessage" } }
19913
+ })
19914
+ ], {
19915
+ gap: "lg"
19916
+ }),
19917
+ // sectionContainer (rb-container) already provides horizontal padding
19918
+ baseClass: "",
19919
+ spacing: "comfortable"
19920
+ })
19921
+ ];
19922
+ var eventSpotlightConfig = {
19789
19923
  id: "block.event-spotlight",
19790
19924
  version: "1.1.0",
19791
19925
  title: "Event Spotlight",
19792
19926
  titleSource: "heading",
19793
19927
  description: "Feature a few upcoming events on your homepage",
19794
19928
  skipSectionStyles: true,
19795
- additionalFields: [
19796
- ...sectionHeaderFields("Upcoming Events"),
19797
- {
19798
- id: "maxEvents",
19799
- type: "select",
19800
- label: "Events to display",
19801
- description: "Number of events to show",
19802
- required: false,
19803
- multiple: false,
19804
- defaultValue: "3",
19805
- options: [
19806
- { value: "1", label: "1 event" },
19807
- { value: "2", label: "2 events" },
19808
- { value: "3", label: "3 events" },
19809
- { value: "4", label: "4 events" },
19810
- { value: "5", label: "5 events" },
19811
- { value: "6", label: "6 events" }
19812
- ],
19813
- ui: { intent: "display" }
19814
- },
19815
- {
19816
- id: "ctaLabel",
19817
- type: "text",
19818
- label: "Section button text",
19819
- description: "Optional button shown below the spotlight cards",
19820
- required: false,
19821
- multiline: false,
19822
- maxLength: 40,
19823
- ui: { intent: "content" }
19824
- },
19825
- {
19826
- id: "ctaUrl",
19827
- type: "link",
19828
- label: "Section button destination",
19829
- required: false,
19830
- ui: { intent: "display" }
19831
- },
19832
- layoutField,
19833
- columnsField(["2", "3"]),
19834
- ...cardStylingFields,
19835
- ...eventDisplayFields,
19836
- emptyStateField,
19837
- sectionStylesField({
19838
- id: "_sectionStyles",
19839
- label: "Section styles"
19840
- })
19841
- ],
19929
+ additionalFields: eventSpotlightFields,
19842
19930
  styleTokens: { background: "surface", typography: "body", spacing: "md" },
19843
19931
  behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },
19844
19932
  category: "content",
19845
19933
  tags: ["events", "featured", "homepage", "spotlight", "upcoming"],
19846
19934
  icon: "Star",
19847
- layout: [
19848
- styledSection({
19849
- children: sectionContainer([
19850
- // Optional heading
19851
- text(
19852
- { as: "h2" },
19853
- bind("content.heading"),
19854
- when("content.heading")
19855
- ),
19856
- // Optional description
19857
- richText(
19858
- { className: "rb-prose rb-max-w-none" },
19859
- bind("content.description"),
19860
- when("content.description")
19861
- ),
19862
- // Event spotlight component
19863
- el("event-spotlight", {
19864
- events: { $bind: { from: "data.events" } },
19865
- layout: { $bind: { from: "content.layout", fallback: "grid" } },
19866
- columns: { $bind: { from: "content.columns", fallback: "3" } },
19867
- cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
19868
- buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
19869
- buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
19870
- ctaLabel: { $bind: { from: "content.ctaLabel" } },
19871
- ctaUrl: { $bind: { from: "content.ctaUrl", transforms: [{ id: "links.resolve" }] } },
19872
- showVenue: { $bind: { from: "content.showVenue" } },
19873
- showMap: { $bind: { from: "content.showMap" } },
19874
- showCapacity: { $bind: { from: "content.showCapacity" } },
19875
- emptyMessage: { $bind: { from: "content.emptyMessage" } }
19876
- })
19877
- ], {
19878
- gap: "lg"
19879
- }),
19880
- // sectionContainer (rb-container) already provides horizontal padding
19881
- baseClass: "",
19882
- spacing: "comfortable"
19883
- })
19884
- ]
19885
- });
19935
+ layout: eventSpotlightLayout
19936
+ };
19937
+ var eventSpotlightManifest = createBlockManifest(eventSpotlightConfig);
19886
19938
  var eventSpotlightBlockDefinition = {
19887
19939
  manifest: eventSpotlightManifest,
19888
19940
  dataSchemas: {
@@ -24610,18 +24662,18 @@ var fileDownloadManifest = createBlockManifest({
24610
24662
  title: "File Download",
24611
24663
  titleSource: ["title", "file.filename"],
24612
24664
  category: "media",
24613
- description: "Add a simple public download link for a document, ZIP, audio, or video file.",
24665
+ description: "Add a simple public download link for a document, ZIP, or audio file.",
24614
24666
  tags: ["file", "download", "document", "zip", "media"],
24615
24667
  icon: "Download",
24616
24668
  includeContainerStyles: true,
24617
24669
  additionalFields: [
24618
24670
  {
24619
24671
  id: "file",
24620
- type: "media",
24672
+ type: "file",
24621
24673
  label: "Download file",
24622
24674
  description: "Choose the file visitors can download.",
24623
24675
  required: false,
24624
- mediaKinds: [...PUBLIC_DOWNLOAD_MEDIA_TYPES],
24676
+ fileKinds: [...PUBLIC_DOWNLOAD_MEDIA_TYPES],
24625
24677
  ui: { intent: "content" }
24626
24678
  },
24627
24679
  {
@@ -29133,28 +29185,8 @@ var __iconNode15 = [
29133
29185
  ];
29134
29186
  var FileHeadphone = createLucideIcon("file-headphone", __iconNode15);
29135
29187
 
29136
- // ../../node_modules/.pnpm/lucide-react@0.563.0_react@19.2.4/node_modules/lucide-react/dist/esm/icons/file-play.js
29137
- var __iconNode16 = [
29138
- [
29139
- "path",
29140
- {
29141
- d: "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",
29142
- key: "1oefj6"
29143
- }
29144
- ],
29145
- ["path", { d: "M14 2v5a1 1 0 0 0 1 1h5", key: "wfsgrz" }],
29146
- [
29147
- "path",
29148
- {
29149
- d: "M15.033 13.44a.647.647 0 0 1 0 1.12l-4.065 2.352a.645.645 0 0 1-.968-.56v-4.704a.645.645 0 0 1 .967-.56z",
29150
- key: "1tzo1f"
29151
- }
29152
- ]
29153
- ];
29154
- var FilePlay = createLucideIcon("file-play", __iconNode16);
29155
-
29156
29188
  // ../../node_modules/.pnpm/lucide-react@0.563.0_react@19.2.4/node_modules/lucide-react/dist/esm/icons/file-spreadsheet.js
29157
- var __iconNode17 = [
29189
+ var __iconNode16 = [
29158
29190
  [
29159
29191
  "path",
29160
29192
  {
@@ -29168,10 +29200,10 @@ var __iconNode17 = [
29168
29200
  ["path", { d: "M8 17h2", key: "2yhykz" }],
29169
29201
  ["path", { d: "M14 17h2", key: "10kma7" }]
29170
29202
  ];
29171
- var FileSpreadsheet = createLucideIcon("file-spreadsheet", __iconNode17);
29203
+ var FileSpreadsheet = createLucideIcon("file-spreadsheet", __iconNode16);
29172
29204
 
29173
29205
  // ../../node_modules/.pnpm/lucide-react@0.563.0_react@19.2.4/node_modules/lucide-react/dist/esm/icons/file-text.js
29174
- var __iconNode18 = [
29206
+ var __iconNode17 = [
29175
29207
  [
29176
29208
  "path",
29177
29209
  {
@@ -29184,25 +29216,25 @@ var __iconNode18 = [
29184
29216
  ["path", { d: "M16 13H8", key: "t4e002" }],
29185
29217
  ["path", { d: "M16 17H8", key: "z1uh3a" }]
29186
29218
  ];
29187
- var FileText = createLucideIcon("file-text", __iconNode18);
29219
+ var FileText = createLucideIcon("file-text", __iconNode17);
29188
29220
 
29189
29221
  // ../../node_modules/.pnpm/lucide-react@0.563.0_react@19.2.4/node_modules/lucide-react/dist/esm/icons/info.js
29190
- var __iconNode19 = [
29222
+ var __iconNode18 = [
29191
29223
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
29192
29224
  ["path", { d: "M12 16v-4", key: "1dtifu" }],
29193
29225
  ["path", { d: "M12 8h.01", key: "e9boi3" }]
29194
29226
  ];
29195
- var Info = createLucideIcon("info", __iconNode19);
29227
+ var Info = createLucideIcon("info", __iconNode18);
29196
29228
 
29197
29229
  // ../../node_modules/.pnpm/lucide-react@0.563.0_react@19.2.4/node_modules/lucide-react/dist/esm/icons/mail.js
29198
- var __iconNode20 = [
29230
+ var __iconNode19 = [
29199
29231
  ["path", { d: "m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7", key: "132q7q" }],
29200
29232
  ["rect", { x: "2", y: "4", width: "20", height: "16", rx: "2", key: "izxlao" }]
29201
29233
  ];
29202
- var Mail = createLucideIcon("mail", __iconNode20);
29234
+ var Mail = createLucideIcon("mail", __iconNode19);
29203
29235
 
29204
29236
  // ../../node_modules/.pnpm/lucide-react@0.563.0_react@19.2.4/node_modules/lucide-react/dist/esm/icons/map-pin.js
29205
- var __iconNode21 = [
29237
+ var __iconNode20 = [
29206
29238
  [
29207
29239
  "path",
29208
29240
  {
@@ -29212,14 +29244,14 @@ var __iconNode21 = [
29212
29244
  ],
29213
29245
  ["circle", { cx: "12", cy: "10", r: "3", key: "ilqhr7" }]
29214
29246
  ];
29215
- var MapPin = createLucideIcon("map-pin", __iconNode21);
29247
+ var MapPin = createLucideIcon("map-pin", __iconNode20);
29216
29248
 
29217
29249
  // ../../node_modules/.pnpm/lucide-react@0.563.0_react@19.2.4/node_modules/lucide-react/dist/esm/icons/minus.js
29218
- var __iconNode22 = [["path", { d: "M5 12h14", key: "1ays0h" }]];
29219
- var Minus = createLucideIcon("minus", __iconNode22);
29250
+ var __iconNode21 = [["path", { d: "M5 12h14", key: "1ays0h" }]];
29251
+ var Minus = createLucideIcon("minus", __iconNode21);
29220
29252
 
29221
29253
  // ../../node_modules/.pnpm/lucide-react@0.563.0_react@19.2.4/node_modules/lucide-react/dist/esm/icons/phone.js
29222
- var __iconNode23 = [
29254
+ var __iconNode22 = [
29223
29255
  [
29224
29256
  "path",
29225
29257
  {
@@ -29228,10 +29260,10 @@ var __iconNode23 = [
29228
29260
  }
29229
29261
  ]
29230
29262
  ];
29231
- var Phone = createLucideIcon("phone", __iconNode23);
29263
+ var Phone = createLucideIcon("phone", __iconNode22);
29232
29264
 
29233
29265
  // ../../node_modules/.pnpm/lucide-react@0.563.0_react@19.2.4/node_modules/lucide-react/dist/esm/icons/play.js
29234
- var __iconNode24 = [
29266
+ var __iconNode23 = [
29235
29267
  [
29236
29268
  "path",
29237
29269
  {
@@ -29240,17 +29272,17 @@ var __iconNode24 = [
29240
29272
  }
29241
29273
  ]
29242
29274
  ];
29243
- var Play = createLucideIcon("play", __iconNode24);
29275
+ var Play = createLucideIcon("play", __iconNode23);
29244
29276
 
29245
29277
  // ../../node_modules/.pnpm/lucide-react@0.563.0_react@19.2.4/node_modules/lucide-react/dist/esm/icons/plus.js
29246
- var __iconNode25 = [
29278
+ var __iconNode24 = [
29247
29279
  ["path", { d: "M5 12h14", key: "1ays0h" }],
29248
29280
  ["path", { d: "M12 5v14", key: "s699le" }]
29249
29281
  ];
29250
- var Plus = createLucideIcon("plus", __iconNode25);
29282
+ var Plus = createLucideIcon("plus", __iconNode24);
29251
29283
 
29252
29284
  // ../../node_modules/.pnpm/lucide-react@0.563.0_react@19.2.4/node_modules/lucide-react/dist/esm/icons/shopping-cart.js
29253
- var __iconNode26 = [
29285
+ var __iconNode25 = [
29254
29286
  ["circle", { cx: "8", cy: "21", r: "1", key: "jimo8o" }],
29255
29287
  ["circle", { cx: "19", cy: "21", r: "1", key: "13723u" }],
29256
29288
  [
@@ -29261,22 +29293,22 @@ var __iconNode26 = [
29261
29293
  }
29262
29294
  ]
29263
29295
  ];
29264
- var ShoppingCart = createLucideIcon("shopping-cart", __iconNode26);
29296
+ var ShoppingCart = createLucideIcon("shopping-cart", __iconNode25);
29265
29297
 
29266
29298
  // ../../node_modules/.pnpm/lucide-react@0.563.0_react@19.2.4/node_modules/lucide-react/dist/esm/icons/upload.js
29267
- var __iconNode27 = [
29299
+ var __iconNode26 = [
29268
29300
  ["path", { d: "M12 3v12", key: "1x0j5s" }],
29269
29301
  ["path", { d: "m17 8-5-5-5 5", key: "7q97r8" }],
29270
29302
  ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }]
29271
29303
  ];
29272
- var Upload = createLucideIcon("upload", __iconNode27);
29304
+ var Upload = createLucideIcon("upload", __iconNode26);
29273
29305
 
29274
29306
  // ../../node_modules/.pnpm/lucide-react@0.563.0_react@19.2.4/node_modules/lucide-react/dist/esm/icons/x.js
29275
- var __iconNode28 = [
29307
+ var __iconNode27 = [
29276
29308
  ["path", { d: "M18 6 6 18", key: "1bl5f8" }],
29277
29309
  ["path", { d: "m6 6 12 12", key: "d8bk6v" }]
29278
29310
  ];
29279
- var X = createLucideIcon("x", __iconNode28);
29311
+ var X = createLucideIcon("x", __iconNode27);
29280
29312
 
29281
29313
  // ../blocks/src/system/icons/cta.ts
29282
29314
  var CTA_ICON_NAMES = [
@@ -29368,7 +29400,12 @@ var IconNode = ({
29368
29400
 
29369
29401
  // ../blocks/src/system/runtime/nodes/file-download.tsx
29370
29402
  import { jsx as jsx17, jsxs as jsxs6 } from "react/jsx-runtime";
29371
- var FILE_DOWNLOAD_BUTTON_VARIANTS = ["primary", "secondary", "outline", "link"];
29403
+ var FILE_DOWNLOAD_BUTTON_VARIANTS = [
29404
+ "primary",
29405
+ "secondary",
29406
+ "outline",
29407
+ "link"
29408
+ ];
29372
29409
  function isDownloadableMediaType(type) {
29373
29410
  return typeof type === "string" && PUBLIC_DOWNLOAD_MEDIA_TYPES.includes(type);
29374
29411
  }
@@ -29383,8 +29420,6 @@ function iconForMediaType(type) {
29383
29420
  switch (type) {
29384
29421
  case "audio":
29385
29422
  return /* @__PURE__ */ jsx17(FileHeadphone, { "aria-hidden": "true" });
29386
- case "video":
29387
- return /* @__PURE__ */ jsx17(FilePlay, { "aria-hidden": "true" });
29388
29423
  case "document":
29389
29424
  return /* @__PURE__ */ jsx17(FileText, { "aria-hidden": "true" });
29390
29425
  case "spreadsheet":
@@ -29423,8 +29458,22 @@ function FileDownloadNode({
29423
29458
  }
29424
29459
  ),
29425
29460
  /* @__PURE__ */ jsxs6("div", { className: "rb-min-w-0 rb-space-y-1", children: [
29426
- /* @__PURE__ */ jsx17("h2", { className: "rb-m-0 rb-text-lg rb-font-semibold", style: textColorStyle("heading"), children: heading }),
29427
- body ? /* @__PURE__ */ jsx17("p", { className: "rb-m-0 rb-text-sm", style: textColorStyle("mutedText"), children: body }) : null,
29461
+ /* @__PURE__ */ jsx17(
29462
+ "h2",
29463
+ {
29464
+ className: "rb-m-0 rb-text-lg rb-font-semibold",
29465
+ style: textColorStyle("heading"),
29466
+ children: heading
29467
+ }
29468
+ ),
29469
+ body ? /* @__PURE__ */ jsx17(
29470
+ "p",
29471
+ {
29472
+ className: "rb-m-0 rb-text-sm",
29473
+ style: textColorStyle("mutedText"),
29474
+ children: body
29475
+ }
29476
+ ) : null,
29428
29477
  /* @__PURE__ */ jsx17(
29429
29478
  "p",
29430
29479
  {
@@ -56249,6 +56298,15 @@ function resolveImageUrlWithContext2(value, options, context, transformAspectRat
56249
56298
  function resolveImageSourceSetWithContext2(value, options, context) {
56250
56299
  return resolveImageSourceSetWithContext(value, options, context);
56251
56300
  }
56301
+
56302
+ // src/rendering/overrides.ts
56303
+ var lazyBlockOverrideSymbol = /* @__PURE__ */ Symbol.for("riverbankcms.sdk.lazyBlockOverride");
56304
+ function defineLazyBlockOverride(load) {
56305
+ return {
56306
+ [lazyBlockOverrideSymbol]: true,
56307
+ load
56308
+ };
56309
+ }
56252
56310
  export {
56253
56311
  ImagePresets2 as ImagePresets,
56254
56312
  Layout,
@@ -56257,6 +56315,7 @@ export {
56257
56315
  RichText3 as RichText,
56258
56316
  ThemeScope2 as ThemeScope,
56259
56317
  buildThemeRuntime2 as buildThemeRuntime,
56318
+ defineLazyBlockOverride,
56260
56319
  resolveImageSourceSetWithContext2 as resolveImageSourceSetWithContext,
56261
56320
  resolveImageUrl2 as resolveImageUrl,
56262
56321
  resolveImageUrlWithContext2 as resolveImageUrlWithContext
@@ -56286,7 +56345,6 @@ lucide-react/dist/esm/icons/download.js:
56286
56345
  lucide-react/dist/esm/icons/external-link.js:
56287
56346
  lucide-react/dist/esm/icons/file-archive.js:
56288
56347
  lucide-react/dist/esm/icons/file-headphone.js:
56289
- lucide-react/dist/esm/icons/file-play.js:
56290
56348
  lucide-react/dist/esm/icons/file-spreadsheet.js:
56291
56349
  lucide-react/dist/esm/icons/file-text.js:
56292
56350
  lucide-react/dist/esm/icons/info.js: