@riverbankcms/sdk 0.152.0 → 0.153.0

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 (178) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/{EventEmbeddedCheckoutStep-DVQXWFm6.mjs → EventEmbeddedCheckoutStep-veN-QiAE.mjs} +1 -1
  3. package/dist/{PreviewEditorSidebar-Dr4NJi3Q.mjs → PreviewEditorSidebar-jI_4DTZY.mjs} +4 -4
  4. package/dist/{PreviewEditorUI-DSZXQbyh.mjs → PreviewEditorUI-ORkVZhfu.mjs} +3 -3
  5. package/dist/{SdkPreviewModeRuntime-Dl4GyMc3.mjs → SdkPreviewModeRuntime-DaNqevI1.mjs} +221 -115
  6. package/dist/{SiteChromeCustomizeContext-DgBe-FlM.mjs → SiteChromeCustomizeContext-CgNuBHC0.mjs} +1798 -2024
  7. package/dist/{ThemedButton-B8ViBnLK.mjs → ThemedButton-X2UxhW6F.mjs} +213 -38
  8. package/dist/_dts/ai/src/contracts/proposals.d.ts +52 -52
  9. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +2357 -7859
  10. package/dist/_dts/api/src/communications.d.ts +19 -5
  11. package/dist/_dts/api/src/indexExtendedTypes.d.ts +1 -1
  12. package/dist/_dts/api/src/sdkThemeWire.d.ts +186 -1434
  13. package/dist/_dts/api/src/shared-contracts.d.ts +10 -0
  14. package/dist/_dts/api/src/siteInfrastructure.d.ts +2 -1
  15. package/dist/_dts/api/src/teamMembers.d.ts +2 -27
  16. package/dist/_dts/block-form/src/widgets/RepeaterField/components/layoutGridDomain.d.ts +3 -13
  17. package/dist/_dts/blocks/src/contracts/index.d.ts +1 -0
  18. package/dist/_dts/blocks/src/index.d.ts +1 -0
  19. package/dist/_dts/blocks/src/lib/media.d.ts +1 -0
  20. package/dist/_dts/blocks/src/lib/picsum.d.ts +2 -2
  21. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +2 -1
  22. package/dist/_dts/blocks/src/system/blocks/events/eventSelectionFields.d.ts +1 -1
  23. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +196 -804
  24. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +2 -2
  25. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  26. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +45 -45
  27. package/dist/_dts/blocks/src/system/blocks/shared/teamMembers.d.ts +4 -7
  28. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +2 -2
  29. package/dist/_dts/blocks/src/system/customize/backgrounds.d.ts +6 -6
  30. package/dist/_dts/blocks/src/system/fields/backgroundContent.d.ts +377 -1
  31. package/dist/_dts/blocks/src/system/helpers/backgroundMedia.d.ts +6 -2
  32. package/dist/_dts/blocks/src/system/helpers/resolveBackground.d.ts +3 -3
  33. package/dist/_dts/blocks/src/system/layout/repeaterGrid.d.ts +12 -5
  34. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +3 -3
  35. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +24 -24
  36. package/dist/_dts/blocks/src/system/manifest/validation.d.ts +2 -0
  37. package/dist/_dts/blocks/src/system/node/fragments/lookSlot.d.ts +1 -1
  38. package/dist/_dts/blocks/src/system/runtime/hooks/useBookingFlowController.d.ts +1 -1
  39. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.d.ts +2 -0
  40. package/dist/_dts/blocks/src/system/runtime/lookSurfaces.d.ts +2 -2
  41. package/dist/_dts/blocks/src/system/runtime/nodes/ImageResolveContext.d.ts +1 -1
  42. package/dist/_dts/blocks/src/system/runtime/nodes/appointment-services.d.ts +50 -202
  43. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +28 -1
  44. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/lookPresentation.d.ts +2 -2
  45. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/presentation.d.ts +1 -1
  46. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/CardListItem.d.ts +1 -1
  47. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +276 -884
  48. package/dist/_dts/blocks/src/system/runtime/nodes/file-download.d.ts +3 -2
  49. package/dist/_dts/blocks/src/system/runtime/nodes/media.d.ts +22 -90
  50. package/dist/_dts/blocks/src/system/runtime/nodes/mediaContext.d.ts +69 -0
  51. package/dist/_dts/blocks/src/system/transforms/registry/index.d.ts +1 -0
  52. package/dist/_dts/blocks/src/system/transforms/registry/links.d.ts +3 -3
  53. package/dist/_dts/content-model/src/content-types/schema.d.ts +3 -3
  54. package/dist/_dts/core/src/mailing-list-runtime.d.ts +2 -2
  55. package/dist/_dts/core/src/mailing-list-setup-parser.d.ts +9 -1
  56. package/dist/_dts/core/src/mailing-list-setup.d.ts +9 -1
  57. package/dist/_dts/core/src/mailing-list-submission.d.ts +1 -1
  58. package/dist/_dts/core/src/mailing-list-targeting.d.ts +9 -1
  59. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +55 -4
  60. package/dist/_dts/editor-blocks/src/index.d.ts +1 -0
  61. package/dist/_dts/editor-blocks/src/media/MediaField.d.ts +2 -2
  62. package/dist/_dts/editor-blocks/src/media/admitEditorMediaField.d.ts +4 -0
  63. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/targetingState.d.ts +2 -2
  64. package/dist/_dts/media-core/src/assetsInUseSummary.d.ts +6 -0
  65. package/dist/_dts/media-core/src/contentMediaAudit.d.ts +3 -2
  66. package/dist/_dts/media-core/src/index.d.ts +4 -0
  67. package/dist/_dts/media-core/src/media.d.ts +406 -0
  68. package/dist/_dts/media-core/src/mediaIdentifierSchema.d.ts +3 -0
  69. package/dist/_dts/media-core/src/mediaKinds.d.ts +2 -0
  70. package/dist/_dts/media-core/src/mediaUsageProjection.d.ts +13 -1
  71. package/dist/_dts/media-core/src/mediaWriteNormalizer.d.ts +2 -6
  72. package/dist/_dts/media-core/src/portableMediaReferences.d.ts +8 -21
  73. package/dist/_dts/media-core/src/renderableMediaAsset.d.ts +28 -14
  74. package/dist/_dts/media-core/src/renderableMediaAssetAdmission.d.ts +15 -0
  75. package/dist/_dts/media-editor/src/CropDialog.d.ts +6 -3
  76. package/dist/_dts/media-editor/src/MediaEditor.d.ts +2 -1
  77. package/dist/_dts/media-editor/src/MediaPreview.d.ts +3 -3
  78. package/dist/_dts/media-editor/src/cropEditorSource.d.ts +5 -7
  79. package/dist/_dts/media-editor/src/editorMediaState.d.ts +29 -0
  80. package/dist/_dts/media-editor/src/mediaSelection.d.ts +1 -2
  81. package/dist/_dts/media-editor/src/runtimeMediaAssetState.d.ts +4 -5
  82. package/dist/_dts/media-editor/src/types.d.ts +1 -1
  83. package/dist/_dts/media-editor/src/utils.d.ts +0 -1
  84. package/dist/_dts/media-react/src/components/cropChangePolicy.d.ts +4 -1
  85. package/dist/_dts/media-react/src/components/cropGeometry.d.ts +1 -0
  86. package/dist/_dts/media-react/src/components/useImageCropperController.d.ts +1 -0
  87. package/dist/_dts/preview-next/src/client/blocks/BlockBackgroundChooser.d.ts +2 -1
  88. package/dist/_dts/preview-next/src/client/blocks/previewCustomizeSelectedMedia.d.ts +11 -12
  89. package/dist/_dts/sdk/src/contracts/content.d.ts +2 -45
  90. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  91. package/dist/_dts/sdk/src/contracts/rendering.d.ts +3 -3
  92. package/dist/_dts/sdk/src/index.d.ts +1 -0
  93. package/dist/_dts/sdk/src/rendering/image.d.ts +5 -5
  94. package/dist/_dts/sdk/src/rendering/index.d.ts +2 -1
  95. package/dist/_dts/sdk/src/rendering/link.d.ts +3 -7
  96. package/dist/_dts/sdk/src/rendering/mediaAssets.d.ts +2 -4
  97. package/dist/_dts/sdk/src/version.d.ts +1 -1
  98. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -1
  99. package/dist/_dts/theme-core/src/boxBackgroundSchema.d.ts +397 -26
  100. package/dist/_dts/theme-core/src/buttons/types.d.ts +21 -21
  101. package/dist/_dts/theme-core/src/cards/types.d.ts +34 -34
  102. package/dist/_dts/theme-core/src/inputs/types.d.ts +3 -3
  103. package/dist/_dts/theme-core/src/lib/media.d.ts +2 -616
  104. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +261 -2619
  105. package/dist/_dts/theme-core/src/palette/curated/types.d.ts +1 -1
  106. package/dist/_dts/theme-core/src/schema.d.ts +548 -3187
  107. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  108. package/dist/_dts/theme-core/src/site-styles/runtimeBackgroundResolution.d.ts +9 -9
  109. package/dist/_dts/theme-core/src/site-styles/styleTags.d.ts +1 -1
  110. package/dist/_dts/theme-core/src/site-styles/tokenRecipes.d.ts +1 -1
  111. package/dist/_dts/theme-core/src/styles/skinTokens.d.ts +2 -2
  112. package/dist/_dts/theme-core/src/typography/schema.d.ts +2 -2
  113. package/dist/client/{BookingMailingListNote-CBuMKN0w.mjs → BookingMailingListNote-DrchYW1m.mjs} +2 -2
  114. package/dist/client/{CardListItem-Dc9XTXhB.mjs → CardListItem-CC_GVmF6.mjs} +5 -4
  115. package/dist/client/{CheckboxChoice-CIqx_o0E.mjs → CheckboxChoice-Dq30m3DO.mjs} +1 -1
  116. package/dist/client/{DemoBookingPortalAccess-D3VQ_kLj.mjs → DemoBookingPortalAccess-ojwbVUmx.mjs} +2 -2
  117. package/dist/client/{EventCombined.client-BHGEKise.mjs → EventCombined.client-DyN0v0Xk.mjs} +5 -6
  118. package/dist/client/{EventEmbeddedCheckoutStep-Bo1Cm23R.mjs → EventEmbeddedCheckoutStep-CgfpKc3n.mjs} +2 -2
  119. package/dist/client/{EventListing.client-D5OQgVPr.mjs → EventListing.client-CuOuvYMz.mjs} +2 -2
  120. package/dist/client/{LeafletStaticMap-CLL5cWrr.mjs → LeafletStaticMap-B0WhRr3j.mjs} +1 -1
  121. package/dist/client/{RichText-BoDmnopf.mjs → RichText-C1fIXBzA.mjs} +45 -32
  122. package/dist/client/{ThemedButton-Ciltp0IK.mjs → ThemedButton-B7HFqFBg.mjs} +1 -2
  123. package/dist/client/{accordion-DOkRS64-.mjs → accordion-DCDVWSye.mjs} +1 -1
  124. package/dist/client/{bookingForm-wlMVwo9h.mjs → bookingForm-BJ3C4GlM.mjs} +42 -15
  125. package/dist/client/bookings.mjs +116989 -22191
  126. package/dist/client/{carousel-CGWk-Z0u.mjs → carousel-BSCBhfHY.mjs} +2 -2
  127. package/dist/client/{carousel.client-kX5mN1Eg.mjs → carousel.client-GEtOGsxo.mjs} +1 -1
  128. package/dist/client/{cart-OBBPlaH4.mjs → cart-Yv-aAtck.mjs} +3 -3
  129. package/dist/client/{checkout-Bmw2WjQX.mjs → checkout-B9xDkl30.mjs} +3 -3
  130. package/dist/client/client.mjs +17577 -17361
  131. package/dist/client/{context-BI77UFAn.mjs → context-BOGe3rIA.mjs} +1 -1
  132. package/dist/client/{eventCalendar-qkej2Edn.mjs → eventCalendar-D6M0T9hs.mjs} +8 -9
  133. package/dist/client/{eventCombined-DApKHvat.mjs → eventCombined-NM4UFBq8.mjs} +4 -4
  134. package/dist/client/{eventDetails-BQyUDPH0.mjs → eventDetails-f_FhV4O8.mjs} +3 -3
  135. package/dist/client/{eventListing-CeAnshlZ.mjs → eventListing-WLkfAROh.mjs} +4 -4
  136. package/dist/client/{eventRegistration-C3A3NyBO.mjs → eventRegistration-D3ejfLvW.mjs} +10 -10
  137. package/dist/client/{form-DW8rU7jO.mjs → form-D5Or2Jyu.mjs} +4 -5
  138. package/dist/client/{headerSection-CkIhsoNm.mjs → headerSection-hWgnv27V.mjs} +3 -3
  139. package/dist/client/hooks.mjs +16014 -15751
  140. package/dist/client/{locationMap-D4O8wbli.mjs → locationMap-Di1K0O2S.mjs} +3 -4
  141. package/dist/client/{media-C5K_0xPd.mjs → media-D29-F1u_.mjs} +183 -362
  142. package/dist/client/mediaContext-CwbbimYB.mjs +135 -0
  143. package/dist/client/{newsletterForm-B7IxSPuz.mjs → newsletterForm-CwxcwTNO.mjs} +4 -4
  144. package/dist/client/{productDetail-Bqxpwy5N.mjs → productDetail-BLSnhPdA.mjs} +3 -3
  145. package/dist/client/{productList-u9Lz8V15.mjs → productList-oGytONOX.mjs} +3 -3
  146. package/dist/client/{propsDecoder-Bf1jucUp.mjs → propsDecoder-lf_dTeZS.mjs} +1467 -125
  147. package/dist/client/renderableMediaAssetAdmission-CHkXYDC_.mjs +143 -0
  148. package/dist/client/rendering/client.mjs +10855 -10689
  149. package/dist/client/rendering/islands.mjs +20 -23
  150. package/dist/client/rendering.mjs +18411 -18181
  151. package/dist/client/{routeIslandApiConfig-BgP-aPMl.mjs → routeIslandApiConfig-Bc_WVPS8.mjs} +1 -1
  152. package/dist/client/{shop-B_eykR-_.mjs → shop-BQ3bR7fA.mjs} +7 -7
  153. package/dist/client/{shop-commerce-CT0APkFV.mjs → shop-commerce-DDPll6ZC.mjs} +8 -8
  154. package/dist/client/{shop-commerce-store-DcvZxdEK.mjs → shop-commerce-store-DO-e1pTe.mjs} +1 -1
  155. package/dist/client/{shopShared-BVJOiUiJ.mjs → shopShared-BylM9jh1.mjs} +5 -5
  156. package/dist/client/{useDiscountCodeUi-DPmYDunz.mjs → useDiscountCodeUi-B1Puub2v.mjs} +1 -1
  157. package/dist/client/{useEventPagination-8-U55vH5.mjs → useEventPagination-BBhkmQaT.mjs} +6 -7
  158. package/dist/preview-next/before-render.mjs +89 -4
  159. package/dist/preview-next/client/runtime.mjs +3 -3
  160. package/dist/{sdk-runtime-C5jPdSrk.mjs → sdk-runtime-DWCvhJGu.mjs} +1 -1
  161. package/dist/server/components.mjs +18663 -18510
  162. package/dist/server/config-validation.mjs +450 -215
  163. package/dist/server/config.mjs +450 -215
  164. package/dist/server/data.mjs +15940 -15705
  165. package/dist/server/index.mjs +227 -2
  166. package/dist/server/next.mjs +18643 -18490
  167. package/dist/server/page-converter.mjs +12588 -12477
  168. package/dist/server/prebuild.mjs +1 -1
  169. package/dist/server/rendering/server.mjs +18007 -17855
  170. package/dist/server/rendering.mjs +18677 -18516
  171. package/dist/server/routing.mjs +17747 -17469
  172. package/dist/server/server.mjs +539 -276
  173. package/dist/server/theme-bridge.mjs +154 -37
  174. package/dist/server/theme.mjs +154 -37
  175. package/dist/{spinner-B-ab2rJp.mjs → spinner-BYM-Y81w.mjs} +1 -1
  176. package/package.json +1 -1
  177. package/dist/client/aspectTransforms-D-TnDdq4.mjs +0 -93
  178. package/dist/client/colorStyles-ECDNPE_P.mjs +0 -1253
@@ -514,7 +514,108 @@ const footerModeSchema = z.enum([
514
514
  "none"
515
515
  ]);
516
516
  //#endregion
517
- //#region ../theme-core/src/lib/media.ts
517
+ //#region ../core/src/result.ts
518
+ function ok(value) {
519
+ return {
520
+ ok: true,
521
+ value
522
+ };
523
+ }
524
+ function err(error) {
525
+ return {
526
+ ok: false,
527
+ error
528
+ };
529
+ }
530
+ //#endregion
531
+ //#region ../core/src/branded.ts
532
+ const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
533
+ function parseUuidBrand(value, unsafeConstructor) {
534
+ if (typeof value !== "string") return err({ kind: "not_string" });
535
+ const normalized = value.trim().toLowerCase();
536
+ if (normalized.length === 0) return err({ kind: "empty_string" });
537
+ if (!UUID_PATTERN.test(normalized)) return err({ kind: "invalid_uuid" });
538
+ return ok(unsafeConstructor(normalized));
539
+ }
540
+ const unsafeAsMediaAssetId = (id) => id;
541
+ const parseMediaAssetId = (value) => parseUuidBrand(value, unsafeAsMediaAssetId);
542
+ //#endregion
543
+ //#region ../media-core/src/identifiers.ts
544
+ function slugifyMediaIdentifier(value) {
545
+ return value.toLowerCase().trim().replace(/[^a-z0-9\s-]/g, "").replace(/\s+/g, "-").replace(/-+/g, "-");
546
+ }
547
+ function parseMediaIdentifier(value) {
548
+ if (typeof value !== "string") return err({ kind: "not_string" });
549
+ const trimmed = value.trim();
550
+ if (trimmed.length === 0) return err({ kind: "empty_identifier" });
551
+ const normalized = slugifyMediaIdentifier(trimmed);
552
+ if (normalized.length === 0) return err({
553
+ kind: "empty_after_normalization",
554
+ value
555
+ });
556
+ return ok(normalized);
557
+ }
558
+ /**
559
+ * Admits identifiers read from trusted persistence without repairing dirty data in memory.
560
+ * User input should use parseMediaIdentifier, which intentionally canonicalizes it.
561
+ */
562
+ function parseCanonicalMediaIdentifier(value) {
563
+ if (typeof value !== "string") return err({ kind: "not_string" });
564
+ const parsed = parseMediaIdentifier(value);
565
+ if (!parsed.ok) return parsed;
566
+ if (value !== parsed.value) return err({
567
+ kind: "non_canonical_identifier",
568
+ value,
569
+ canonical: parsed.value
570
+ });
571
+ return parsed;
572
+ }
573
+ //#endregion
574
+ //#region ../media-core/src/mediaIdentifierSchema.ts
575
+ /** Strict stored-reference admission delegates the canonical identifier decision. */
576
+ const mediaIdentifierSchema = z.string().transform((value, context) => {
577
+ const parsed = parseCanonicalMediaIdentifier(value);
578
+ if (parsed.ok) return parsed.value;
579
+ context.addIssue({
580
+ code: "custom",
581
+ message: "Expected a canonical media identifier"
582
+ });
583
+ return z.NEVER;
584
+ });
585
+ //#endregion
586
+ //#region ../media-core/src/mediaKinds.ts
587
+ const mediaTypeDiscriminants = [
588
+ "image",
589
+ "video",
590
+ "audio",
591
+ "document",
592
+ "spreadsheet",
593
+ "archive"
594
+ ];
595
+ //#endregion
596
+ //#region ../media-core/src/renderableMediaAssetAdmission.ts
597
+ const mediaAssetIdSchema = z.string().transform((value, context) => {
598
+ const parsed = parseMediaAssetId(value);
599
+ if (parsed.ok) return parsed.value;
600
+ context.addIssue({
601
+ code: "custom",
602
+ message: "Expected a media asset ID"
603
+ });
604
+ return z.NEVER;
605
+ });
606
+ const nonemptyStorageValue = z.string().refine((value) => value.trim().length > 0);
607
+ const renderableMediaAssetSchema = z.object({
608
+ id: mediaAssetIdSchema,
609
+ identifier: mediaIdentifierSchema,
610
+ storageBucket: nonemptyStorageValue,
611
+ storagePath: nonemptyStorageValue,
612
+ mimeType: nonemptyStorageValue,
613
+ filename: z.string().optional(),
614
+ width: z.number().positive().nullable(),
615
+ height: z.number().positive().nullable()
616
+ });
617
+ //#endregion
618
+ //#region ../media-core/src/media.ts
518
619
  const hotspotSchema = z.object({
519
620
  x: z.number().min(0).max(1),
520
621
  y: z.number().min(0).max(1),
@@ -548,54 +649,56 @@ const transformSchema = z.object({
548
649
  rotation: rotationSchema.optional()
549
650
  });
550
651
  const mediaPosterSchema = z.discriminatedUnion("tag", [z.object({
551
- tag: z.literal("storage"),
552
- assetId: z.string().optional(),
553
- storageBucket: z.string().min(1),
554
- storagePath: z.string().min(1)
555
- }), z.object({
652
+ tag: z.literal("media"),
653
+ identifier: mediaIdentifierSchema
654
+ }).strict(), z.object({
556
655
  tag: z.literal("external-src"),
557
- assetId: z.string().optional(),
558
656
  src: z.string().url()
559
- })]);
560
- const mediaBaseSchema = z.object({
657
+ }).strict()]);
658
+ const mediaUsageShape = {
561
659
  purpose: z.string().optional(),
562
660
  placeholder: z.boolean().default(true).optional(),
563
- assetId: z.string().optional(),
564
- identifier: z.string().optional(),
565
- src: z.string().optional(),
566
661
  alt: z.string().optional(),
567
662
  filename: z.string().optional(),
568
- mimeType: z.string().optional(),
569
663
  width: z.number().optional(),
570
664
  height: z.number().optional(),
571
- storageBucket: z.string().optional(),
572
- storagePath: z.string().optional(),
573
665
  poster: mediaPosterSchema.optional(),
574
666
  transform: transformSchema.optional()
575
- });
576
- const mediaIdentifierSchema = z.string().trim().min(1).brand();
667
+ };
668
+ const environmentExclusions = {
669
+ assetId: z.never().optional(),
670
+ id: z.never().optional(),
671
+ src: z.never().optional(),
672
+ storageBucket: z.never().optional(),
673
+ storagePath: z.never().optional(),
674
+ mimeType: z.never().optional()
675
+ };
676
+ const mediaBaseSchema = z.object({
677
+ ...mediaUsageShape,
678
+ ...environmentExclusions,
679
+ identifier: mediaIdentifierSchema
680
+ }).strict();
577
681
  const imageMediaSchema = mediaBaseSchema.extend({ type: z.literal("image") });
578
682
  const videoMediaSchema = mediaBaseSchema.extend({ type: z.literal("video") });
579
- const audioMediaSchema = mediaBaseSchema.extend({ type: z.literal("audio") });
580
- const documentMediaSchema = mediaBaseSchema.extend({ type: z.literal("document") });
581
- const spreadsheetMediaSchema = mediaBaseSchema.extend({ type: z.literal("spreadsheet") });
582
- const archiveMediaSchema = mediaBaseSchema.extend({ type: z.literal("archive") });
583
- const mediaSchema = z.discriminatedUnion("type", [
584
- imageMediaSchema,
585
- videoMediaSchema,
586
- audioMediaSchema,
587
- documentMediaSchema,
588
- spreadsheetMediaSchema,
589
- archiveMediaSchema
590
- ]);
591
- const persistableMediaBaseSchema = mediaBaseSchema.extend({ identifier: mediaIdentifierSchema });
592
- z.discriminatedUnion("type", [
593
- persistableMediaBaseSchema.extend({ type: z.literal("image") }),
594
- persistableMediaBaseSchema.extend({ type: z.literal("video") }),
595
- persistableMediaBaseSchema.extend({ type: z.literal("audio") }),
596
- persistableMediaBaseSchema.extend({ type: z.literal("document") }),
597
- persistableMediaBaseSchema.extend({ type: z.literal("spreadsheet") }),
598
- persistableMediaBaseSchema.extend({ type: z.literal("archive") })
683
+ const mediaSchema = mediaBaseSchema.extend({ type: z.enum(mediaTypeDiscriminants) });
684
+ const externalMediaSchema = z.object({
685
+ ...mediaUsageShape,
686
+ ...environmentExclusions,
687
+ type: z.enum(mediaTypeDiscriminants),
688
+ src: z.string().min(1),
689
+ identifier: z.never().optional()
690
+ }).strict();
691
+ const assetMediaSchema = z.object({
692
+ ...mediaUsageShape,
693
+ ...environmentExclusions,
694
+ type: z.enum(mediaTypeDiscriminants),
695
+ asset: renderableMediaAssetSchema,
696
+ identifier: z.never().optional()
697
+ }).strict();
698
+ z.union([
699
+ mediaSchema,
700
+ externalMediaSchema,
701
+ assetMediaSchema
599
702
  ]);
600
703
  //#endregion
601
704
  //#region ../theme-core/src/palette/colors.ts
@@ -9828,6 +9931,20 @@ const boxBackgroundSchema = z.discriminatedUnion("type", [
9828
9931
  showVideoOnMobile: z.boolean().nullable().optional()
9829
9932
  })
9830
9933
  ]);
9934
+ z.discriminatedUnion("type", [
9935
+ boxBackgroundSchema.options[0],
9936
+ boxBackgroundSchema.options[1],
9937
+ boxBackgroundSchema.options[2].extend({ image: z.union([
9938
+ imageMediaSchema,
9939
+ externalMediaSchema.extend({ type: z.literal("image") }),
9940
+ assetMediaSchema.extend({ type: z.literal("image") })
9941
+ ]).nullable().optional() }),
9942
+ boxBackgroundSchema.options[3].extend({ image: z.union([
9943
+ videoMediaSchema,
9944
+ externalMediaSchema.extend({ type: z.literal("video") }),
9945
+ assetMediaSchema.extend({ type: z.literal("video") })
9946
+ ]).nullable().optional() })
9947
+ ]);
9831
9948
  function normalizeAuthoringOpacity(value) {
9832
9949
  if (!isRecord(value)) return value;
9833
9950
  return {
@@ -969,7 +969,108 @@ const footerModeSchema = z.enum([
969
969
  "none"
970
970
  ]);
971
971
  //#endregion
972
- //#region ../theme-core/src/lib/media.ts
972
+ //#region ../core/src/result.ts
973
+ function ok(value) {
974
+ return {
975
+ ok: true,
976
+ value
977
+ };
978
+ }
979
+ function err(error) {
980
+ return {
981
+ ok: false,
982
+ error
983
+ };
984
+ }
985
+ //#endregion
986
+ //#region ../core/src/branded.ts
987
+ const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
988
+ function parseUuidBrand(value, unsafeConstructor) {
989
+ if (typeof value !== "string") return err({ kind: "not_string" });
990
+ const normalized = value.trim().toLowerCase();
991
+ if (normalized.length === 0) return err({ kind: "empty_string" });
992
+ if (!UUID_PATTERN.test(normalized)) return err({ kind: "invalid_uuid" });
993
+ return ok(unsafeConstructor(normalized));
994
+ }
995
+ const unsafeAsMediaAssetId = (id) => id;
996
+ const parseMediaAssetId = (value) => parseUuidBrand(value, unsafeAsMediaAssetId);
997
+ //#endregion
998
+ //#region ../media-core/src/identifiers.ts
999
+ function slugifyMediaIdentifier(value) {
1000
+ return value.toLowerCase().trim().replace(/[^a-z0-9\s-]/g, "").replace(/\s+/g, "-").replace(/-+/g, "-");
1001
+ }
1002
+ function parseMediaIdentifier(value) {
1003
+ if (typeof value !== "string") return err({ kind: "not_string" });
1004
+ const trimmed = value.trim();
1005
+ if (trimmed.length === 0) return err({ kind: "empty_identifier" });
1006
+ const normalized = slugifyMediaIdentifier(trimmed);
1007
+ if (normalized.length === 0) return err({
1008
+ kind: "empty_after_normalization",
1009
+ value
1010
+ });
1011
+ return ok(normalized);
1012
+ }
1013
+ /**
1014
+ * Admits identifiers read from trusted persistence without repairing dirty data in memory.
1015
+ * User input should use parseMediaIdentifier, which intentionally canonicalizes it.
1016
+ */
1017
+ function parseCanonicalMediaIdentifier(value) {
1018
+ if (typeof value !== "string") return err({ kind: "not_string" });
1019
+ const parsed = parseMediaIdentifier(value);
1020
+ if (!parsed.ok) return parsed;
1021
+ if (value !== parsed.value) return err({
1022
+ kind: "non_canonical_identifier",
1023
+ value,
1024
+ canonical: parsed.value
1025
+ });
1026
+ return parsed;
1027
+ }
1028
+ //#endregion
1029
+ //#region ../media-core/src/mediaIdentifierSchema.ts
1030
+ /** Strict stored-reference admission delegates the canonical identifier decision. */
1031
+ const mediaIdentifierSchema = z.string().transform((value, context) => {
1032
+ const parsed = parseCanonicalMediaIdentifier(value);
1033
+ if (parsed.ok) return parsed.value;
1034
+ context.addIssue({
1035
+ code: "custom",
1036
+ message: "Expected a canonical media identifier"
1037
+ });
1038
+ return z.NEVER;
1039
+ });
1040
+ //#endregion
1041
+ //#region ../media-core/src/mediaKinds.ts
1042
+ const mediaTypeDiscriminants = [
1043
+ "image",
1044
+ "video",
1045
+ "audio",
1046
+ "document",
1047
+ "spreadsheet",
1048
+ "archive"
1049
+ ];
1050
+ //#endregion
1051
+ //#region ../media-core/src/renderableMediaAssetAdmission.ts
1052
+ const mediaAssetIdSchema = z.string().transform((value, context) => {
1053
+ const parsed = parseMediaAssetId(value);
1054
+ if (parsed.ok) return parsed.value;
1055
+ context.addIssue({
1056
+ code: "custom",
1057
+ message: "Expected a media asset ID"
1058
+ });
1059
+ return z.NEVER;
1060
+ });
1061
+ const nonemptyStorageValue = z.string().refine((value) => value.trim().length > 0);
1062
+ const renderableMediaAssetSchema = z.object({
1063
+ id: mediaAssetIdSchema,
1064
+ identifier: mediaIdentifierSchema,
1065
+ storageBucket: nonemptyStorageValue,
1066
+ storagePath: nonemptyStorageValue,
1067
+ mimeType: nonemptyStorageValue,
1068
+ filename: z.string().optional(),
1069
+ width: z.number().positive().nullable(),
1070
+ height: z.number().positive().nullable()
1071
+ });
1072
+ //#endregion
1073
+ //#region ../media-core/src/media.ts
973
1074
  const hotspotSchema = z.object({
974
1075
  x: z.number().min(0).max(1),
975
1076
  y: z.number().min(0).max(1),
@@ -1003,54 +1104,56 @@ const transformSchema = z.object({
1003
1104
  rotation: rotationSchema.optional()
1004
1105
  });
1005
1106
  const mediaPosterSchema = z.discriminatedUnion("tag", [z.object({
1006
- tag: z.literal("storage"),
1007
- assetId: z.string().optional(),
1008
- storageBucket: z.string().min(1),
1009
- storagePath: z.string().min(1)
1010
- }), z.object({
1107
+ tag: z.literal("media"),
1108
+ identifier: mediaIdentifierSchema
1109
+ }).strict(), z.object({
1011
1110
  tag: z.literal("external-src"),
1012
- assetId: z.string().optional(),
1013
1111
  src: z.string().url()
1014
- })]);
1015
- const mediaBaseSchema = z.object({
1112
+ }).strict()]);
1113
+ const mediaUsageShape = {
1016
1114
  purpose: z.string().optional(),
1017
1115
  placeholder: z.boolean().default(true).optional(),
1018
- assetId: z.string().optional(),
1019
- identifier: z.string().optional(),
1020
- src: z.string().optional(),
1021
1116
  alt: z.string().optional(),
1022
1117
  filename: z.string().optional(),
1023
- mimeType: z.string().optional(),
1024
1118
  width: z.number().optional(),
1025
1119
  height: z.number().optional(),
1026
- storageBucket: z.string().optional(),
1027
- storagePath: z.string().optional(),
1028
1120
  poster: mediaPosterSchema.optional(),
1029
1121
  transform: transformSchema.optional()
1030
- });
1031
- const mediaIdentifierSchema = z.string().trim().min(1).brand();
1122
+ };
1123
+ const environmentExclusions = {
1124
+ assetId: z.never().optional(),
1125
+ id: z.never().optional(),
1126
+ src: z.never().optional(),
1127
+ storageBucket: z.never().optional(),
1128
+ storagePath: z.never().optional(),
1129
+ mimeType: z.never().optional()
1130
+ };
1131
+ const mediaBaseSchema = z.object({
1132
+ ...mediaUsageShape,
1133
+ ...environmentExclusions,
1134
+ identifier: mediaIdentifierSchema
1135
+ }).strict();
1032
1136
  const imageMediaSchema = mediaBaseSchema.extend({ type: z.literal("image") });
1033
1137
  const videoMediaSchema = mediaBaseSchema.extend({ type: z.literal("video") });
1034
- const audioMediaSchema = mediaBaseSchema.extend({ type: z.literal("audio") });
1035
- const documentMediaSchema = mediaBaseSchema.extend({ type: z.literal("document") });
1036
- const spreadsheetMediaSchema = mediaBaseSchema.extend({ type: z.literal("spreadsheet") });
1037
- const archiveMediaSchema = mediaBaseSchema.extend({ type: z.literal("archive") });
1038
- const mediaSchema = z.discriminatedUnion("type", [
1039
- imageMediaSchema,
1040
- videoMediaSchema,
1041
- audioMediaSchema,
1042
- documentMediaSchema,
1043
- spreadsheetMediaSchema,
1044
- archiveMediaSchema
1045
- ]);
1046
- const persistableMediaBaseSchema = mediaBaseSchema.extend({ identifier: mediaIdentifierSchema });
1047
- z.discriminatedUnion("type", [
1048
- persistableMediaBaseSchema.extend({ type: z.literal("image") }),
1049
- persistableMediaBaseSchema.extend({ type: z.literal("video") }),
1050
- persistableMediaBaseSchema.extend({ type: z.literal("audio") }),
1051
- persistableMediaBaseSchema.extend({ type: z.literal("document") }),
1052
- persistableMediaBaseSchema.extend({ type: z.literal("spreadsheet") }),
1053
- persistableMediaBaseSchema.extend({ type: z.literal("archive") })
1138
+ const mediaSchema = mediaBaseSchema.extend({ type: z.enum(mediaTypeDiscriminants) });
1139
+ const externalMediaSchema = z.object({
1140
+ ...mediaUsageShape,
1141
+ ...environmentExclusions,
1142
+ type: z.enum(mediaTypeDiscriminants),
1143
+ src: z.string().min(1),
1144
+ identifier: z.never().optional()
1145
+ }).strict();
1146
+ const assetMediaSchema = z.object({
1147
+ ...mediaUsageShape,
1148
+ ...environmentExclusions,
1149
+ type: z.enum(mediaTypeDiscriminants),
1150
+ asset: renderableMediaAssetSchema,
1151
+ identifier: z.never().optional()
1152
+ }).strict();
1153
+ z.union([
1154
+ mediaSchema,
1155
+ externalMediaSchema,
1156
+ assetMediaSchema
1054
1157
  ]);
1055
1158
  //#endregion
1056
1159
  //#region ../theme-core/src/palette/schema.ts
@@ -8156,6 +8259,20 @@ const boxBackgroundSchema = z.discriminatedUnion("type", [
8156
8259
  showVideoOnMobile: z.boolean().nullable().optional()
8157
8260
  })
8158
8261
  ]);
8262
+ z.discriminatedUnion("type", [
8263
+ boxBackgroundSchema.options[0],
8264
+ boxBackgroundSchema.options[1],
8265
+ boxBackgroundSchema.options[2].extend({ image: z.union([
8266
+ imageMediaSchema,
8267
+ externalMediaSchema.extend({ type: z.literal("image") }),
8268
+ assetMediaSchema.extend({ type: z.literal("image") })
8269
+ ]).nullable().optional() }),
8270
+ boxBackgroundSchema.options[3].extend({ image: z.union([
8271
+ videoMediaSchema,
8272
+ externalMediaSchema.extend({ type: z.literal("video") }),
8273
+ assetMediaSchema.extend({ type: z.literal("video") })
8274
+ ]).nullable().optional() })
8275
+ ]);
8159
8276
  function normalizeAuthoringOpacity(value) {
8160
8277
  if (!isRecord(value)) return value;
8161
8278
  return {
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { Fo as LoaderCircle, qo as cn, yo as Primitive } from "./SiteChromeCustomizeContext-DgBe-FlM.mjs";
2
+ import { Fo as LoaderCircle, qo as cn, yo as Primitive } from "./SiteChromeCustomizeContext-CgNuBHC0.mjs";
3
3
  import * as React$1 from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region ../../node_modules/.pnpm/@radix-ui+react-separator@1.1.10_@types+react-dom@19.2.3_@types+react@19.2.17__@types+r_adfab47c9055efb8b0c4b77a2b96b053/node_modules/@radix-ui/react-separator/dist/index.mjs
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riverbankcms/sdk",
3
- "version": "0.152.0",
3
+ "version": "0.153.0",
4
4
  "description": "Riverbank CMS SDK for headless content consumption",
5
5
  "main": "./dist/server/index.mjs",
6
6
  "module": "./dist/server/index.mjs",
@@ -1,93 +0,0 @@
1
- import { N as err, P as ok } from "./colorStyles-ECDNPE_P.mjs";
2
- //#region ../core/src/branded.ts
3
- const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
4
- function parseUuidBrand(value, unsafeConstructor) {
5
- if (typeof value !== "string") return err({ kind: "not_string" });
6
- const normalized = value.trim().toLowerCase();
7
- if (normalized.length === 0) return err({ kind: "empty_string" });
8
- if (!UUID_PATTERN.test(normalized)) return err({ kind: "invalid_uuid" });
9
- return ok(unsafeConstructor(normalized));
10
- }
11
- const unsafeAsEventOfferingId = (id) => id;
12
- const unsafeAsEventSeriesId = (id) => id;
13
- const unsafeAsMediaAssetId = (id) => id;
14
- const unsafeAsStorageBucketName = (value) => value;
15
- const unsafeAsStoragePath = (value) => value;
16
- const unsafeAsFormId = (id) => id;
17
- const unsafeAsPassId = (id) => id;
18
- const unsafeAsCustomerPassId = (id) => id;
19
- const unsafeAsAppointmentServiceId = (id) => id;
20
- const unsafeAsAppointmentResourceId = (id) => id;
21
- const unsafeAsContentVersionId = (id) => id;
22
- const parseEventOfferingId = (value) => parseUuidBrand(value, unsafeAsEventOfferingId);
23
- const parseContentVersionId = (value) => parseUuidBrand(value, unsafeAsContentVersionId);
24
- const parseEventSeriesId = (value) => parseUuidBrand(value, unsafeAsEventSeriesId);
25
- //#endregion
26
- //#region ../media-core/src/transformRect.ts
27
- function isValidTransformRectStructure(rect) {
28
- if (!Array.isArray(rect) || rect.length !== 4) return false;
29
- const [left, top, width, height] = rect;
30
- return Number.isFinite(left) && Number.isFinite(top) && Number.isFinite(width) && Number.isFinite(height) && left >= 0 && top >= 0 && width > 0 && height > 0;
31
- }
32
- //#endregion
33
- //#region ../media-core/src/aspectTransforms.ts
34
- const DEFAULT_RECT_EPSILON = .5;
35
- function parseAspectRatioValue(value) {
36
- if (typeof value === "number") return Number.isFinite(value) && value > 0 ? value : void 0;
37
- if (typeof value !== "string") return void 0;
38
- const normalized = value.trim();
39
- if (!normalized) return void 0;
40
- if (normalized === "auto") return void 0;
41
- if (normalized.includes(":") || normalized.includes("/")) {
42
- const delimiter = normalized.includes(":") ? ":" : "/";
43
- const [wRaw, hRaw] = normalized.split(delimiter);
44
- const width = Number(wRaw?.trim());
45
- const height = Number(hRaw?.trim());
46
- if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) return;
47
- return width / height;
48
- }
49
- const numeric = Number(normalized);
50
- if (!Number.isFinite(numeric) || numeric <= 0) return void 0;
51
- return numeric;
52
- }
53
- const MAX_ASPECT_DISTANCE = .25;
54
- function resolveMediaTransformForAspect(transform, targetAspect) {
55
- if (!transform) return {};
56
- const base = {
57
- rect: transform.rect,
58
- hotspot: transform.hotspot,
59
- rotation: transform.rotation
60
- };
61
- const target = parseAspectRatioValue(targetAspect);
62
- const crops = transform.aspectCrops;
63
- if (!target || !crops || Object.keys(crops).length === 0) return base;
64
- let best = null;
65
- let bestDistance = Number.POSITIVE_INFINITY;
66
- for (const [key, candidate] of Object.entries(crops)) {
67
- const candidateAspect = parseAspectRatioValue(candidate.aspect ?? key);
68
- if (!candidateAspect) continue;
69
- const distance = Math.abs(Math.log(candidateAspect / target));
70
- if (distance < bestDistance) {
71
- best = candidate;
72
- bestDistance = distance;
73
- }
74
- }
75
- if (!best) return base;
76
- if (bestDistance > MAX_ASPECT_DISTANCE) return base;
77
- return {
78
- rect: best.rect ?? base.rect,
79
- hotspot: best.hotspot ?? base.hotspot,
80
- rotation: best.rotation ?? base.rotation
81
- };
82
- }
83
- function isValidTransformRect(rect) {
84
- return isValidTransformRectStructure(rect);
85
- }
86
- function isExplicitRectCrop(rect, sourceWidth, sourceHeight, epsilon = DEFAULT_RECT_EPSILON) {
87
- if (!isValidTransformRect(rect)) return false;
88
- if (!(typeof sourceWidth === "number" && Number.isFinite(sourceWidth) && sourceWidth > 0 && typeof sourceHeight === "number" && Number.isFinite(sourceHeight) && sourceHeight > 0)) return true;
89
- const [x, y, width, height] = rect;
90
- return !(Math.abs(x) <= epsilon && Math.abs(y) <= epsilon && Math.abs(width - sourceWidth) <= epsilon && Math.abs(height - sourceHeight) <= epsilon);
91
- }
92
- //#endregion
93
- export { parseEventOfferingId as a, unsafeAsAppointmentServiceId as c, unsafeAsMediaAssetId as d, unsafeAsPassId as f, parseContentVersionId as i, unsafeAsCustomerPassId as l, unsafeAsStoragePath as m, parseAspectRatioValue as n, parseEventSeriesId as o, unsafeAsStorageBucketName as p, resolveMediaTransformForAspect as r, unsafeAsAppointmentResourceId as s, isExplicitRectCrop as t, unsafeAsFormId as u };