@riverbankcms/sdk 0.78.2 → 0.79.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 (159) hide show
  1. package/README.md +80 -0
  2. package/dist/{PreviewEditorSidebar-4DXLYX2V.mjs → PreviewEditorSidebar-56NMJMIK.mjs} +724 -47
  3. package/dist/{PreviewEditorUI-CS5P4N3P.mjs → PreviewEditorUI-27KJVEET.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-H4BSP6E7.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +36 -0
  6. package/dist/_dts/api/src/endpoints.d.ts +55 -0
  7. package/dist/_dts/api/src/index.d.ts +5 -3
  8. package/dist/_dts/api/src/media.d.ts +8 -1
  9. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +1 -1
  10. package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +8 -8
  11. package/dist/_dts/api/src/navigation/identity.d.ts +59 -0
  12. package/dist/_dts/api/src/navigation.d.ts +2 -0
  13. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +4 -0
  14. package/dist/_dts/api/src/sdkContracts.d.ts +1 -0
  15. package/dist/_dts/api/src/siteIcons.d.ts +128 -0
  16. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +16 -0
  17. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +7 -0
  18. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +6 -1
  19. package/dist/_dts/api/src/types.d.ts +1 -1
  20. package/dist/_dts/api/src/webhooks.d.ts +239 -0
  21. package/dist/_dts/blocks/src/index.d.ts +4 -0
  22. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
  23. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
  24. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
  25. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
  26. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
  27. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +294 -289
  28. package/dist/_dts/blocks/src/system/blocks/feature-card-icons.d.ts +57 -0
  29. package/dist/_dts/blocks/src/system/blocks/feature-cards.d.ts +4 -0
  30. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
  31. package/dist/_dts/blocks/src/system/blocks/index.d.ts +1 -0
  32. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  33. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +22 -22
  34. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
  35. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
  36. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
  37. package/dist/_dts/blocks/src/system/blocks/testimonials.d.ts +7 -1
  38. package/dist/_dts/blocks/src/system/customize/backgrounds.d.ts +170 -0
  39. package/dist/_dts/blocks/src/system/fragments/library/testimonialsCarousel.d.ts +5 -0
  40. package/dist/_dts/blocks/src/system/helpers/resolveBackground.d.ts +3 -1
  41. package/dist/_dts/blocks/src/system/icons/ids.d.ts +13 -0
  42. package/dist/_dts/blocks/src/system/icons/index.d.ts +6 -0
  43. package/dist/_dts/blocks/src/system/icons/presets.d.ts +4 -0
  44. package/dist/_dts/blocks/src/system/icons/registry.d.ts +18 -0
  45. package/dist/_dts/blocks/src/system/icons/semantic.d.ts +239 -0
  46. package/dist/_dts/blocks/src/system/icons/value.d.ts +94 -0
  47. package/dist/_dts/blocks/src/system/index.d.ts +1 -0
  48. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +4 -1
  49. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +23 -0
  50. package/dist/_dts/blocks/src/system/runtime/nodes/feature-card-icon.d.ts +13 -0
  51. package/dist/_dts/content-model/src/contentManifest.d.ts +3 -1
  52. package/dist/_dts/core/src/branded.d.ts +6 -0
  53. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +191 -0
  54. package/dist/_dts/editor-blocks/src/block-editor/BlockCard.d.ts +12 -1
  55. package/dist/_dts/editor-blocks/src/block-editor/BlockCardBody.d.ts +12 -1
  56. package/dist/_dts/editor-blocks/src/block-editor/BlockCardHeader.d.ts +12 -2
  57. package/dist/_dts/editor-blocks/src/block-editor/FeatureCardIconsPanel.d.ts +21 -0
  58. package/dist/_dts/editor-blocks/src/block-editor/GeneratedIconSetDialog.d.ts +40 -0
  59. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +11 -1
  60. package/dist/_dts/editor-blocks/src/block-editor/featureCardIconActions.d.ts +82 -0
  61. package/dist/_dts/editor-blocks/src/widgets/icon-picker/IconPickerField.d.ts +1 -1
  62. package/dist/_dts/media-core/src/fileDomain.d.ts +8 -1
  63. package/dist/_dts/media-editor/src/MediaEditor.d.ts +3 -2
  64. package/dist/_dts/media-react/src/components/MediaLibrary.d.ts +2 -1
  65. package/dist/_dts/media-react/src/components/MediaPickerMini.d.ts +2 -1
  66. package/dist/_dts/preview-next/src/client/blocks/previewCustomizeActions.d.ts +17 -0
  67. package/dist/_dts/preview-next/src/client/preview/PageDesignEditorStateContext.d.ts +4 -0
  68. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +3 -2
  69. package/dist/_dts/preview-next/src/client/preview/previewCustomizeHistory.d.ts +6 -0
  70. package/dist/_dts/sdk/src/cli/navigationIdentity.d.ts +11 -0
  71. package/dist/_dts/sdk/src/cli/site-commands/navigationCommands.d.ts +4 -0
  72. package/dist/_dts/sdk/src/cli/site-commands/oneOffCommands.d.ts +1 -0
  73. package/dist/_dts/sdk/src/cli/sync/diff.d.ts +9 -0
  74. package/dist/_dts/sdk/src/client/management/types.d.ts +2 -0
  75. package/dist/_dts/sdk/src/config/field-definitions.d.ts +3 -1
  76. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  77. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +19 -2
  78. package/dist/_dts/sdk/src/next/index.d.ts +1 -1
  79. package/dist/_dts/sdk/src/next/revalidate.d.ts +26 -5
  80. package/dist/_dts/sdk/src/next/static-params.d.ts +28 -3
  81. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -1
  82. package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
  83. package/dist/_dts/sdk/src/version.d.ts +1 -1
  84. package/dist/_dts/sdk/src/webhooks/index.d.ts +1 -1
  85. package/dist/_dts/sdk/src/webhooks/verify.d.ts +6 -102
  86. package/dist/_dts/site-commands/src/commands.d.ts +3 -0
  87. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  88. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +3 -3
  89. package/dist/_dts/theme-core/src/schema.d.ts +5 -5
  90. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +25 -2
  91. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +5 -5
  92. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  93. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +4 -4
  94. package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +2 -0
  95. package/dist/_dts/ui/src/combobox.d.ts +1 -0
  96. package/dist/{chunk-RGTOD4AJ.mjs → chunk-4HCW7FHJ.mjs} +491 -56
  97. package/dist/{chunk-OKMBEAXY.mjs → chunk-A3HHFKVT.mjs} +1 -1
  98. package/dist/{chunk-6HYXHRAI.mjs → chunk-GP555I66.mjs} +177 -7
  99. package/dist/{chunk-CR5HKAGU.mjs → chunk-K2IIF34C.mjs} +55 -0
  100. package/dist/{chunk-4QEGTLK6.mjs → chunk-LCY32PXF.mjs} +1 -1
  101. package/dist/{chunk-MCRQMPET.mjs → chunk-V47ZU33I.mjs} +1745 -157
  102. package/dist/cli/index.mjs +1169 -171
  103. package/dist/cli/init-docs/content/workflow-editor-workflows.md +2 -0
  104. package/dist/cli/init-docs/content/workflow-isr-revalidation.md +138 -0
  105. package/dist/client/{accordion-PLYNJIIM.mjs → accordion-QLA7KBYO.mjs} +1 -1
  106. package/dist/client/{bookingForm-BXAP6AO7.mjs → bookingForm-PYZIPA5G.mjs} +3 -3
  107. package/dist/client/bookings.mjs +110 -2
  108. package/dist/client/{carousel-TRBXDHGF.mjs → carousel-5EIULWBI.mjs} +2 -2
  109. package/dist/client/{cart-Z7H3HJRS.mjs → cart-DOP3FNI4.mjs} +5 -5
  110. package/dist/client/{checkout-WAFCUBIX.mjs → checkout-BVMF6FBV.mjs} +5 -5
  111. package/dist/client/{chunk-JRDUHZCT.mjs → chunk-44K2U3QI.mjs} +4 -4
  112. package/dist/client/{chunk-UVQEJJTN.mjs → chunk-CCNTDRCF.mjs} +1 -1
  113. package/dist/client/{chunk-ZI3LLBPZ.mjs → chunk-GG4M2NP6.mjs} +1 -1
  114. package/dist/client/{chunk-JGXPTEI2.mjs → chunk-R5ESWNKX.mjs} +6 -3
  115. package/dist/client/{chunk-CWGTG37I.mjs → chunk-TYONZMST.mjs} +1 -1
  116. package/dist/client/{chunk-75OUS5MT.mjs → chunk-UDS3NTWA.mjs} +1 -1
  117. package/dist/client/{chunk-DNRGY432.mjs → chunk-V6M5FCR5.mjs} +1 -1
  118. package/dist/client/{chunk-FUXW6VW2.mjs → chunk-YLDYVRZL.mjs} +4 -4
  119. package/dist/client/client.mjs +21329 -19729
  120. package/dist/client/{courseRegistration-AHFQHWIJ.mjs → courseRegistration-E6EAA6NL.mjs} +3 -3
  121. package/dist/client/{eventCalendar-LDXTV5R7.mjs → eventCalendar-HBG3HAK6.mjs} +5 -5
  122. package/dist/client/{eventCombined-A4JGTNJO.mjs → eventCombined-6K5ZZWAK.mjs} +5 -5
  123. package/dist/client/{eventDetails-4YXTZ7EG.mjs → eventDetails-Q75ICXLT.mjs} +5 -5
  124. package/dist/client/{eventListing-P72TPFFM.mjs → eventListing-27P5F7DZ.mjs} +5 -5
  125. package/dist/client/{eventRegistration-LSYJHGMT.mjs → eventRegistration-IQ7AMASR.mjs} +5 -5
  126. package/dist/client/{form-AOPYOKOW.mjs → form-JRTD65FN.mjs} +1 -1
  127. package/dist/client/{headerSection-5TFYDFVQ.mjs → headerSection-7FPSSZHS.mjs} +2 -2
  128. package/dist/client/hooks.mjs +350 -35
  129. package/dist/client/{locationMap-QSZ3ZVAZ.mjs → locationMap-7NGFNYBH.mjs} +1 -1
  130. package/dist/client/{newsletterForm-KTRHZY52.mjs → newsletterForm-F3BADCI2.mjs} +1 -1
  131. package/dist/client/{productDetail-N4E775RG.mjs → productDetail-V3HP7ITJ.mjs} +5 -5
  132. package/dist/client/{productList-UGUQ2S45.mjs → productList-L3EGJUF2.mjs} +5 -5
  133. package/dist/client/rendering/client.mjs +2713 -1382
  134. package/dist/client/rendering/islands.mjs +18 -18
  135. package/dist/client/rendering.mjs +2014 -414
  136. package/dist/client/{shop-VHSZEEQ2.mjs → shop-DQUB5E2C.mjs} +5 -5
  137. package/dist/preview-next/before-render.mjs +55 -0
  138. package/dist/preview-next/client/runtime.mjs +5 -5
  139. package/dist/preview-next/middleware.mjs +55 -0
  140. package/dist/{sdk-runtime-WHPJEF5G.mjs → sdk-runtime-AF6KXJU4.mjs} +6 -6
  141. package/dist/server/components.mjs +2169 -781
  142. package/dist/server/config-validation.mjs +350 -35
  143. package/dist/server/config.mjs +350 -35
  144. package/dist/server/data.mjs +350 -35
  145. package/dist/server/index.mjs +64 -1
  146. package/dist/server/next/revalidate.mjs +229 -34
  147. package/dist/server/next.mjs +2307 -818
  148. package/dist/server/page-converter.mjs +275 -34
  149. package/dist/server/prebuild.mjs +1 -1
  150. package/dist/server/rendering/server.mjs +2174 -786
  151. package/dist/server/rendering.mjs +2187 -799
  152. package/dist/server/routing.mjs +767 -50
  153. package/dist/server/server.mjs +351 -36
  154. package/dist/server/theme-bridge.mjs +164 -2
  155. package/dist/server/theme.mjs +2 -2
  156. package/dist/server/webhooks.mjs +129 -25
  157. package/dist/styles/index.css +55 -0
  158. package/package.json +2 -1
  159. package/dist/SdkPreviewModeRuntime-IJDHTW4W.mjs +0 -8
@@ -146,7 +146,7 @@ var themeColorBaseTokenNames = [
146
146
  "accentForeground"
147
147
  ];
148
148
  var themeColorBaseTokenSet = new Set(themeColorBaseTokenNames);
149
- var SHADE_STEPS = [
149
+ var themeColorShadeSteps = [
150
150
  "50",
151
151
  "100",
152
152
  "200",
@@ -159,7 +159,7 @@ var SHADE_STEPS = [
159
159
  "900",
160
160
  "950"
161
161
  ];
162
- var shadeStepSet = new Set(SHADE_STEPS);
162
+ var shadeStepSet = new Set(themeColorShadeSteps);
163
163
  function isKnownBaseToken(value) {
164
164
  return themeColorBaseTokenSet.has(value);
165
165
  }
@@ -4718,6 +4718,114 @@ var curatedSiteStyles = [
4718
4718
  paletteChoice("warm-neutral-clay")
4719
4719
  ]
4720
4720
  }),
4721
+ defineCuratedSiteStyle({
4722
+ id: "site-style:clarity-zen-blue",
4723
+ name: "Clarity Zen",
4724
+ description: "Calm, editorial, and reassuring for therapy, counselling, and wellbeing support practices.",
4725
+ generationBrief: "Use a calm, soft palette, editorial serif headings, warm grounded copy, rounded cards, calm proof sections, and clear booking routes. Keep the tone compassionate and straightforward, with professional trust rather than hard-sell wellness language.",
4726
+ siteCreatorSelection: {
4727
+ kind: "site_creator_keyword_heuristic",
4728
+ priority: 25
4729
+ },
4730
+ selectionKeywordRules: [
4731
+ { kind: "substring", value: "psychotherap" },
4732
+ { kind: "phrase", value: "mental health" },
4733
+ { kind: "phrase", value: "talk therapy" },
4734
+ { kind: "phrase", value: "therapy and wellbeing" }
4735
+ ],
4736
+ tokenRecipes: {
4737
+ palette: "brand-led",
4738
+ contrast: "standard",
4739
+ radius: "rounded",
4740
+ shadow: "subtle",
4741
+ typography: "serif-editorial",
4742
+ spacing: "airy",
4743
+ motion: "subtle"
4744
+ },
4745
+ compositionBudget: balancedBudget,
4746
+ themeOverrides: {
4747
+ typography: {
4748
+ body: {
4749
+ family: "Inter, system-ui, sans-serif",
4750
+ size: "md",
4751
+ weight: "regular",
4752
+ lineHeight: "relaxed",
4753
+ letterSpacing: "normal"
4754
+ },
4755
+ headings: {
4756
+ default: {
4757
+ family: '"Cormorant Garamond", Georgia, serif',
4758
+ weight: "regular",
4759
+ lineHeight: "normal",
4760
+ letterSpacing: "normal",
4761
+ colorToken: "text",
4762
+ italic: null,
4763
+ case: null
4764
+ },
4765
+ h1: {
4766
+ size: "xl",
4767
+ weight: "regular",
4768
+ lineHeight: "normal",
4769
+ letterSpacing: "normal",
4770
+ italic: null
4771
+ },
4772
+ h2: {
4773
+ size: "lg",
4774
+ weight: "regular",
4775
+ lineHeight: "normal",
4776
+ letterSpacing: "normal",
4777
+ italic: null
4778
+ },
4779
+ h3: {
4780
+ size: "md",
4781
+ weight: "regular",
4782
+ lineHeight: "normal",
4783
+ letterSpacing: "normal",
4784
+ italic: null
4785
+ }
4786
+ },
4787
+ scale: "majorThird"
4788
+ },
4789
+ bodyText: {
4790
+ intro: {
4791
+ paragraphSize: "default",
4792
+ headingSize: "editorial"
4793
+ }
4794
+ }
4795
+ },
4796
+ defaultBlockVariants: {
4797
+ "block.faq": "split-heading-columns"
4798
+ },
4799
+ recommendedAppearancePresetIds: [
4800
+ "hero-split-editorial",
4801
+ "intro-organic-statement",
4802
+ "feature-cards-raised-rule",
4803
+ "media-text-quiet-story",
4804
+ "testimonials-brand-background-quotes",
4805
+ "faq-contained-help",
4806
+ "contact-form-panel"
4807
+ ],
4808
+ recommendedHeaderLookIds: [
4809
+ "centered-calm",
4810
+ "serif-line",
4811
+ "minimal-transparent"
4812
+ ],
4813
+ recommendedFooterLookIds: [
4814
+ "footer-muted-grounding",
4815
+ "site-footer-brand-two-band"
4816
+ ],
4817
+ buttonPersonalityChoices: [
4818
+ buttonChoice("soft-pill"),
4819
+ buttonChoice("pebble"),
4820
+ buttonChoice("editorial-link")
4821
+ ],
4822
+ paletteVariantChoices: [
4823
+ paletteChoice("brand-led-cool"),
4824
+ paletteChoice("soft-natural-watercolor"),
4825
+ paletteChoice("soft-natural-stone"),
4826
+ paletteChoice("warm-neutral-cream")
4827
+ ]
4828
+ }),
4721
4829
  defineCuratedSiteStyle({
4722
4830
  id: "site-style:personal-retreat-journal",
4723
4831
  name: "Personal Retreat Journal",
@@ -15396,6 +15504,60 @@ var containerResponsiveThemeCss = `/*
15396
15504
 
15397
15505
  :where(.theme-scope) .rb-heading-decoration-color-muted {
15398
15506
  color: rgb(var(--tb-mutedText));
15507
+ }
15508
+
15509
+ /* =============================================================================
15510
+ * Block: Feature Card Icons
15511
+ * =============================================================================
15512
+ */
15513
+
15514
+ :where(.theme-scope) .rb-feature-card-icon-zone {
15515
+ display: inline-flex;
15516
+ align-items: center;
15517
+ justify-content: center;
15518
+ flex: 0 0 auto;
15519
+ margin-bottom: 0.125rem;
15520
+ color: rgb(var(--tb-primary));
15521
+ }
15522
+
15523
+ :where(.theme-scope) .rb-feature-card-icon-zone--empty {
15524
+ visibility: hidden;
15525
+ }
15526
+
15527
+ :where(.theme-scope) .rb-feature-card-icon-zone--plain {
15528
+ width: 1.5rem;
15529
+ height: 1.5rem;
15530
+ }
15531
+
15532
+ :where(.theme-scope) .rb-feature-card-icon-zone--soft-badge,
15533
+ :where(.theme-scope) .rb-feature-card-icon-zone--utility-badge {
15534
+ width: 2.5rem;
15535
+ height: 2.5rem;
15536
+ border-radius: var(--rb-block-radius, 0.75rem);
15537
+ }
15538
+
15539
+ :where(.theme-scope) .rb-feature-card-icon-zone--soft-badge {
15540
+ background-color: rgb(var(--tb-primary) / 10%);
15541
+ }
15542
+
15543
+ :where(.theme-scope) .rb-feature-card-icon-zone--utility-badge {
15544
+ background-color: rgb(var(--tb-surface));
15545
+ border: 1px solid rgb(var(--tb-border));
15546
+ box-shadow: 0 1px 2px rgba(var(--tb-shadow), 0.08);
15547
+ }
15548
+
15549
+ :where(.theme-scope) .rb-feature-card-icon {
15550
+ width: 1.25rem;
15551
+ height: 1.25rem;
15552
+ }
15553
+
15554
+ :where(.theme-scope) .rb-feature-card-icon--generated {
15555
+ object-fit: contain;
15556
+ }
15557
+
15558
+ :where(.theme-scope) .rb-feature-card-icon-zone--plain .rb-feature-card-icon {
15559
+ width: 1.5rem;
15560
+ height: 1.5rem;
15399
15561
  }`;
15400
15562
 
15401
15563
  // ../theme-core/src/ThemeScopeCore.tsx
@@ -174,7 +174,7 @@ var themeColorBaseTokenNames = [
174
174
  "accentForeground"
175
175
  ];
176
176
  var themeColorBaseTokenSet = new Set(themeColorBaseTokenNames);
177
- var SHADE_STEPS = [
177
+ var themeColorShadeSteps = [
178
178
  "50",
179
179
  "100",
180
180
  "200",
@@ -187,7 +187,7 @@ var SHADE_STEPS = [
187
187
  "900",
188
188
  "950"
189
189
  ];
190
- var shadeStepSet = new Set(SHADE_STEPS);
190
+ var shadeStepSet = new Set(themeColorShadeSteps);
191
191
  function isKnownBaseToken(value) {
192
192
  return themeColorBaseTokenSet.has(value);
193
193
  }
@@ -1,53 +1,151 @@
1
1
  // src/webhooks/verify.ts
2
2
  import crypto from "crypto";
3
+
4
+ // ../api/src/webhooks.ts
3
5
  import { z } from "zod";
4
- var WebhookEventSchema = z.enum([
6
+ var RIVERBANK_SIGNATURE_PREFIX = "sha256=";
7
+ var SUPPORTED_WEBHOOK_EVENTS = [
5
8
  "page.published",
9
+ "page.unpublished",
10
+ "page.deleted",
11
+ "page.path_changed",
6
12
  "entry.published",
13
+ "entry.unpublished",
14
+ "entry.deleted",
15
+ "entry.path_changed",
7
16
  "navigation.updated",
8
17
  "theme.updated",
9
18
  "site.settings_updated"
10
- ]);
19
+ ];
20
+ var WebhookEventSchema = z.enum(SUPPORTED_WEBHOOK_EVENTS);
21
+ function asRevalidationPath(path) {
22
+ return path;
23
+ }
24
+ function parseRevalidationPath(input) {
25
+ const trimmed = input.trim();
26
+ if (!trimmed) {
27
+ return { success: false, error: { tag: "EMPTY_PATH", input } };
28
+ }
29
+ if (/^[a-z][a-z\d+.-]*:/i.test(trimmed) || trimmed.startsWith("//") || !trimmed.startsWith("/")) {
30
+ return { success: false, error: { tag: "ABSOLUTE_OR_PROTOCOL_PATH", input } };
31
+ }
32
+ if (/[\u0000-\u001F\u007F]/.test(trimmed) || trimmed.includes("\\") || trimmed.includes("?") || trimmed.includes("#")) {
33
+ return { success: false, error: { tag: "MALFORMED_PATH", input } };
34
+ }
35
+ const collapsed = trimmed.replace(/\/{2,}/g, "/");
36
+ const normalized = collapsed === "/" ? "/" : collapsed.replace(/\/+$/g, "");
37
+ return { success: true, path: asRevalidationPath(normalized) };
38
+ }
39
+ function normalizeRevalidationPath(input) {
40
+ const result = parseRevalidationPath(input);
41
+ return result.success ? result.path : null;
42
+ }
43
+ function unwrapRevalidationPath(path) {
44
+ return path;
45
+ }
11
46
  var PagePublishedDataSchema = z.object({
12
47
  pageId: z.string(),
13
48
  path: z.string(),
14
49
  slug: z.string().optional()
15
- });
50
+ }).strict();
51
+ var PageRemovedDataSchema = z.object({
52
+ pageId: z.string(),
53
+ path: z.string(),
54
+ slug: z.string().optional()
55
+ }).strict();
56
+ var PagePathChangedDataSchema = z.object({
57
+ pageId: z.string(),
58
+ previousPath: z.string(),
59
+ path: z.string(),
60
+ slug: z.string().optional()
61
+ }).strict();
16
62
  var EntryPublishedDataSchema = z.object({
17
63
  entryId: z.string(),
18
64
  path: z.string(),
19
65
  contentType: z.string()
20
- });
66
+ }).strict();
67
+ var EntryRemovedDataSchema = z.object({
68
+ entryId: z.string(),
69
+ path: z.string(),
70
+ contentType: z.string()
71
+ }).strict();
72
+ var EntryPathChangedDataSchema = z.object({
73
+ entryId: z.string(),
74
+ previousPath: z.string(),
75
+ path: z.string(),
76
+ contentType: z.string()
77
+ }).strict();
21
78
  var NavigationUpdatedDataSchema = z.object({
22
79
  menuId: z.string().optional()
23
- });
24
- var EmptyDataSchema = z.object({});
25
- var WebhookDataSchema = z.union([
26
- PagePublishedDataSchema,
27
- EntryPublishedDataSchema,
28
- NavigationUpdatedDataSchema,
29
- EmptyDataSchema
30
- ]);
31
- var WebhookPayloadSchema = z.object({
32
- /** Event type */
33
- event: WebhookEventSchema,
34
- /** ISO timestamp of when the event occurred */
80
+ }).strict();
81
+ var EmptyWebhookDataSchema = z.object({}).strict();
82
+ var WebhookPayloadBaseSchema = z.object({
35
83
  timestamp: z.string(),
36
- /** Site ID that triggered the event */
84
+ dispatchId: z.string().optional(),
37
85
  siteId: z.string(),
38
- /** Event-specific data (shape depends on event type) */
39
- data: z.record(z.string(), z.unknown()),
40
- /** Cache invalidation tags (for tag-based revalidation) */
41
- tags: z.array(z.string()).optional()
86
+ tags: z.array(z.string()).optional(),
87
+ paths: z.array(z.string()).optional()
42
88
  });
89
+ var WebhookPayloadSchema = z.discriminatedUnion("event", [
90
+ WebhookPayloadBaseSchema.extend({
91
+ event: z.literal("page.published"),
92
+ data: PagePublishedDataSchema
93
+ }),
94
+ WebhookPayloadBaseSchema.extend({
95
+ event: z.literal("page.unpublished"),
96
+ data: PageRemovedDataSchema
97
+ }),
98
+ WebhookPayloadBaseSchema.extend({
99
+ event: z.literal("page.deleted"),
100
+ data: PageRemovedDataSchema
101
+ }),
102
+ WebhookPayloadBaseSchema.extend({
103
+ event: z.literal("page.path_changed"),
104
+ data: PagePathChangedDataSchema
105
+ }),
106
+ WebhookPayloadBaseSchema.extend({
107
+ event: z.literal("entry.published"),
108
+ data: EntryPublishedDataSchema
109
+ }),
110
+ WebhookPayloadBaseSchema.extend({
111
+ event: z.literal("entry.unpublished"),
112
+ data: EntryRemovedDataSchema
113
+ }),
114
+ WebhookPayloadBaseSchema.extend({
115
+ event: z.literal("entry.deleted"),
116
+ data: EntryRemovedDataSchema
117
+ }),
118
+ WebhookPayloadBaseSchema.extend({
119
+ event: z.literal("entry.path_changed"),
120
+ data: EntryPathChangedDataSchema
121
+ }),
122
+ WebhookPayloadBaseSchema.extend({
123
+ event: z.literal("navigation.updated"),
124
+ data: NavigationUpdatedDataSchema
125
+ }),
126
+ WebhookPayloadBaseSchema.extend({
127
+ event: z.literal("theme.updated"),
128
+ data: EmptyWebhookDataSchema
129
+ }),
130
+ WebhookPayloadBaseSchema.extend({
131
+ event: z.literal("site.settings_updated"),
132
+ data: EmptyWebhookDataSchema
133
+ })
134
+ ]);
135
+
136
+ // src/webhooks/verify.ts
43
137
  function verifyWebhookSignature(payload, signature, secret) {
44
- const expectedSignature = crypto.createHmac("sha256", secret).update(payload).digest("hex");
45
- if (signature.length !== expectedSignature.length) {
138
+ if (!signature.startsWith(RIVERBANK_SIGNATURE_PREFIX)) {
46
139
  return false;
47
140
  }
141
+ const signatureDigest = signature.slice(RIVERBANK_SIGNATURE_PREFIX.length);
142
+ if (!/^[a-f0-9]{64}$/.test(signatureDigest)) {
143
+ return false;
144
+ }
145
+ const expectedSignature = crypto.createHmac("sha256", secret).update(payload).digest("hex");
48
146
  return crypto.timingSafeEqual(
49
- Buffer.from(signature),
50
- Buffer.from(expectedSignature)
147
+ Buffer.from(signatureDigest, "hex"),
148
+ Buffer.from(expectedSignature, "hex")
51
149
  );
52
150
  }
53
151
  function parseWebhookPayload(body) {
@@ -64,7 +162,13 @@ function parseWebhookPayload(body) {
64
162
  return { success: true, payload: result.data };
65
163
  }
66
164
  export {
165
+ RIVERBANK_SIGNATURE_PREFIX,
166
+ SUPPORTED_WEBHOOK_EVENTS,
167
+ WebhookEventSchema,
67
168
  WebhookPayloadSchema,
169
+ normalizeRevalidationPath,
170
+ parseRevalidationPath,
68
171
  parseWebhookPayload,
172
+ unwrapRevalidationPath,
69
173
  verifyWebhookSignature
70
174
  };
@@ -9432,3 +9432,58 @@
9432
9432
  }
9433
9433
 
9434
9434
 
9435
+ /* =============================================================================
9436
+ * Block: Feature Card Icons
9437
+ * =============================================================================
9438
+ */
9439
+
9440
+ :where(.theme-scope) .rb-feature-card-icon-zone {
9441
+ display: inline-flex;
9442
+ align-items: center;
9443
+ justify-content: center;
9444
+ flex: 0 0 auto;
9445
+ margin-bottom: 0.125rem;
9446
+ color: rgb(var(--tb-primary));
9447
+ }
9448
+
9449
+ :where(.theme-scope) .rb-feature-card-icon-zone--empty {
9450
+ visibility: hidden;
9451
+ }
9452
+
9453
+ :where(.theme-scope) .rb-feature-card-icon-zone--plain {
9454
+ width: 1.5rem;
9455
+ height: 1.5rem;
9456
+ }
9457
+
9458
+ :where(.theme-scope) .rb-feature-card-icon-zone--soft-badge,
9459
+ :where(.theme-scope) .rb-feature-card-icon-zone--utility-badge {
9460
+ width: 2.5rem;
9461
+ height: 2.5rem;
9462
+ border-radius: var(--rb-block-radius, 0.75rem);
9463
+ }
9464
+
9465
+ :where(.theme-scope) .rb-feature-card-icon-zone--soft-badge {
9466
+ background-color: rgb(var(--tb-primary) / 10%);
9467
+ }
9468
+
9469
+ :where(.theme-scope) .rb-feature-card-icon-zone--utility-badge {
9470
+ background-color: rgb(var(--tb-surface));
9471
+ border: 1px solid rgb(var(--tb-border));
9472
+ box-shadow: 0 1px 2px rgba(var(--tb-shadow), 0.08);
9473
+ }
9474
+
9475
+ :where(.theme-scope) .rb-feature-card-icon {
9476
+ width: 1.25rem;
9477
+ height: 1.25rem;
9478
+ }
9479
+
9480
+ :where(.theme-scope) .rb-feature-card-icon--generated {
9481
+ object-fit: contain;
9482
+ }
9483
+
9484
+ :where(.theme-scope) .rb-feature-card-icon-zone--plain .rb-feature-card-icon {
9485
+ width: 1.5rem;
9486
+ height: 1.5rem;
9487
+ }
9488
+
9489
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riverbankcms/sdk",
3
- "version": "0.78.2",
3
+ "version": "0.79.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",
@@ -234,6 +234,7 @@
234
234
  "test:lazy-overrides-smoke": "node scripts/lazy-overrides-smoke.mjs",
235
235
  "test:layout-page-hydration-smoke": "node scripts/layout-page-hydration-smoke.mjs",
236
236
  "test:content-load-failure-status-smoke": "node scripts/content-load-failure-status-smoke.mjs",
237
+ "test:isr-catch-all-revalidate-smoke": "node scripts/isr-catch-all-revalidate-smoke.mjs",
237
238
  "verify": "./verify.sh",
238
239
  "cli": "tsx src/cli/index.ts"
239
240
  },
@@ -1,8 +0,0 @@
1
- "use client";
2
- export { SdkPreviewModeRuntime } from './chunk-RGTOD4AJ.mjs';
3
- import './chunk-OKMBEAXY.mjs';
4
- import './chunk-4QEGTLK6.mjs';
5
- import './chunk-6HYXHRAI.mjs';
6
- import './chunk-MCRQMPET.mjs';
7
- import './chunk-CR5HKAGU.mjs';
8
- import './chunk-R7POPVJR.mjs';