@riverbankcms/sdk 0.8.0 → 0.9.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 (226) hide show
  1. package/README.md +298 -2
  2. package/dist/cli/index.js +2409 -595
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/cli/init-docs/content/agents-section.md +11 -0
  5. package/dist/cli/init-docs/content/cli-reference.md +15 -1
  6. package/dist/cli/init-docs/content/workflow-add-block.md +7 -0
  7. package/dist/cli/init-docs/content/workflow-block-extensions.md +361 -0
  8. package/dist/cli/init-docs/content/workflow-cmsify-page.md +357 -0
  9. package/dist/cli/init-docs/content/workflow-content-types.md +328 -0
  10. package/dist/cli/init-docs/content/workflow-create-page.md +9 -0
  11. package/dist/cli/init-docs/content/workflow-custom-block.md +446 -0
  12. package/dist/client/client.d.mts +2 -2
  13. package/dist/client/client.d.ts +2 -2
  14. package/dist/client/client.js +386 -45
  15. package/dist/client/client.js.map +1 -1
  16. package/dist/client/client.mjs +386 -45
  17. package/dist/client/client.mjs.map +1 -1
  18. package/dist/client/hooks.d.mts +2 -2
  19. package/dist/client/hooks.d.ts +2 -2
  20. package/dist/client/hooks.js +40 -26
  21. package/dist/client/hooks.js.map +1 -1
  22. package/dist/client/hooks.mjs +40 -26
  23. package/dist/client/hooks.mjs.map +1 -1
  24. package/dist/client/rendering/client.js +210 -128
  25. package/dist/client/rendering/client.js.map +1 -1
  26. package/dist/client/rendering/client.mjs +202 -114
  27. package/dist/client/rendering/client.mjs.map +1 -1
  28. package/dist/client/usePage--LiGLbVz.d.mts +7195 -0
  29. package/dist/client/usePage-BwQJlxpe.d.mts +7218 -0
  30. package/dist/client/usePage-Ds-ow1-d.d.ts +7195 -0
  31. package/dist/client/usePage-Dsi39Exp.d.ts +6915 -0
  32. package/dist/client/usePage-Duc2GC-H.d.ts +7218 -0
  33. package/dist/client/usePage-DyzrgxqR.d.mts +7215 -0
  34. package/dist/client/usePage-Im82JRRe.d.mts +6915 -0
  35. package/dist/client/usePage-lTWkuVMZ.d.ts +7215 -0
  36. package/dist/server/{Layout-l2v4Qa6E.d.ts → Layout-BHGokJmV.d.ts} +1 -1
  37. package/dist/server/{Layout-D4J009eS.d.mts → Layout-CXkMcTR4.d.mts} +1 -1
  38. package/dist/server/chunk-274Y2CUE.js +341 -0
  39. package/dist/server/chunk-274Y2CUE.js.map +1 -0
  40. package/dist/server/{chunk-RVDS7VSP.js → chunk-2WL52ZOE.js} +8 -8
  41. package/dist/server/{chunk-RVDS7VSP.js.map → chunk-2WL52ZOE.js.map} +1 -1
  42. package/dist/server/{chunk-TT5JWA4X.js → chunk-5HGVBSWA.js} +9 -9
  43. package/dist/server/{chunk-TT5JWA4X.js.map → chunk-5HGVBSWA.js.map} +1 -1
  44. package/dist/server/{chunk-YXA4GAAQ.mjs → chunk-6VTKALLN.mjs} +2 -6
  45. package/dist/server/{chunk-YXA4GAAQ.mjs.map → chunk-6VTKALLN.mjs.map} +1 -1
  46. package/dist/server/chunk-7WJGJY3B.js +7 -0
  47. package/dist/server/chunk-7WJGJY3B.js.map +1 -0
  48. package/dist/server/chunk-AGAOKSPY.mjs +22 -0
  49. package/dist/server/chunk-AGAOKSPY.mjs.map +1 -0
  50. package/dist/server/{chunk-BYBJA6SP.mjs → chunk-BOYBN4KN.mjs} +37 -23
  51. package/dist/server/chunk-BOYBN4KN.mjs.map +1 -0
  52. package/dist/server/{chunk-LNOUXALA.mjs → chunk-CKZDJBMC.mjs} +126 -17
  53. package/dist/server/chunk-CKZDJBMC.mjs.map +1 -0
  54. package/dist/server/{chunk-RBJFXNDM.mjs → chunk-E4R5ILRE.mjs} +4 -4
  55. package/dist/server/{chunk-WM646WI3.js → chunk-EC2AA2IP.js} +275 -297
  56. package/dist/server/chunk-EC2AA2IP.js.map +1 -0
  57. package/dist/server/{chunk-2KCF2DNK.js → chunk-F4U4LC5D.js} +8 -8
  58. package/dist/server/{chunk-2KCF2DNK.js.map → chunk-F4U4LC5D.js.map} +1 -1
  59. package/dist/server/{chunk-ARNCLSQT.mjs → chunk-H44G72AB.mjs} +2 -2
  60. package/dist/server/{chunk-7BVRA5MY.js → chunk-JVLQDZTZ.js} +9 -9
  61. package/dist/server/{chunk-7BVRA5MY.js.map → chunk-JVLQDZTZ.js.map} +1 -1
  62. package/dist/server/{chunk-OSF34JTQ.mjs → chunk-KKUR3PDT.mjs} +4 -4
  63. package/dist/server/chunk-NTG7XP3E.js +264 -0
  64. package/dist/server/chunk-NTG7XP3E.js.map +1 -0
  65. package/dist/server/{chunk-P4K63SBZ.mjs → chunk-OSTUHBFE.mjs} +3 -3
  66. package/dist/server/{chunk-EIVISR62.js → chunk-P4O3WSAR.js} +2 -6
  67. package/dist/server/chunk-P4O3WSAR.js.map +1 -0
  68. package/dist/server/chunk-PAHSKNY5.mjs +264 -0
  69. package/dist/server/chunk-PAHSKNY5.mjs.map +1 -0
  70. package/dist/server/chunk-PSN6HXUD.js +22 -0
  71. package/dist/server/chunk-PSN6HXUD.js.map +1 -0
  72. package/dist/server/{chunk-65A5HAUZ.mjs → chunk-QS6ZTLLB.mjs} +243 -265
  73. package/dist/server/chunk-QS6ZTLLB.mjs.map +1 -0
  74. package/dist/server/{chunk-P3NNN73G.js → chunk-R6T3Z4W5.js} +3 -3
  75. package/dist/server/{chunk-P3NNN73G.js.map → chunk-R6T3Z4W5.js.map} +1 -1
  76. package/dist/server/{chunk-EIJ27EZQ.js → chunk-RIROJYPX.js} +10 -6
  77. package/dist/server/chunk-RIROJYPX.js.map +1 -0
  78. package/dist/server/chunk-SVEQVEA5.mjs +341 -0
  79. package/dist/server/chunk-SVEQVEA5.mjs.map +1 -0
  80. package/dist/server/{chunk-AEFWG657.mjs → chunk-TBN35TGI.mjs} +6 -6
  81. package/dist/server/{chunk-AEFWG657.mjs.map → chunk-TBN35TGI.mjs.map} +1 -1
  82. package/dist/server/{chunk-4YQJUL5W.mjs → chunk-TBX6CXBM.mjs} +8 -4
  83. package/dist/server/chunk-TBX6CXBM.mjs.map +1 -0
  84. package/dist/server/{chunk-YYO3RIFO.js → chunk-U2F4BWKW.js} +37 -23
  85. package/dist/server/chunk-U2F4BWKW.js.map +1 -0
  86. package/dist/server/{chunk-NFEGQTCC.mjs → chunk-WMJKH4XE.mjs} +8 -1
  87. package/dist/server/chunk-WWGVFOLS.mjs +7 -0
  88. package/dist/server/chunk-WWGVFOLS.mjs.map +1 -0
  89. package/dist/server/{chunk-T26N3P26.js → chunk-X4REO3S7.js} +4 -4
  90. package/dist/server/{chunk-T26N3P26.js.map → chunk-X4REO3S7.js.map} +1 -1
  91. package/dist/server/{chunk-C6FIJC7T.mjs → chunk-YUD7ONZG.mjs} +2 -2
  92. package/dist/server/{chunk-4CV4JOE5.js → chunk-Z6ZWNWWR.js} +9 -2
  93. package/dist/server/chunk-Z6ZWNWWR.js.map +1 -0
  94. package/dist/server/{chunk-7UPVCT3K.js → chunk-ZJXFRSTC.js} +270 -161
  95. package/dist/server/chunk-ZJXFRSTC.js.map +1 -0
  96. package/dist/server/{components-vtYEmmPF.d.mts → components-Bqn4xmR6.d.mts} +75 -6
  97. package/dist/server/{components-D2uCKCj7.d.ts → components-C7j9yzAt.d.ts} +75 -6
  98. package/dist/server/components.d.mts +6 -6
  99. package/dist/server/components.d.ts +6 -6
  100. package/dist/server/components.js +9 -7
  101. package/dist/server/components.js.map +1 -1
  102. package/dist/server/components.mjs +8 -6
  103. package/dist/server/config-validation.d.mts +3 -3
  104. package/dist/server/config-validation.d.ts +3 -3
  105. package/dist/server/config-validation.js +6 -6
  106. package/dist/server/config-validation.mjs +5 -5
  107. package/dist/server/config.d.mts +5 -5
  108. package/dist/server/config.d.ts +5 -5
  109. package/dist/server/config.js +6 -6
  110. package/dist/server/config.mjs +5 -5
  111. package/dist/server/data.d.mts +3 -3
  112. package/dist/server/data.d.ts +3 -3
  113. package/dist/server/data.js +4 -4
  114. package/dist/server/data.mjs +3 -3
  115. package/dist/server/env.js +1 -1
  116. package/dist/server/env.mjs +1 -1
  117. package/dist/server/{index-BxrAuL9K.d.ts → index-Bns_1a4N.d.ts} +2 -2
  118. package/dist/server/{index-CH_dvF6n.d.ts → index-CHp2kyp0.d.ts} +2 -2
  119. package/dist/server/{index-2qnY7VH_.d.mts → index-CPDT8kn9.d.mts} +2 -2
  120. package/dist/server/{index-DfWg1Qle.d.mts → index-Cm9nMPkf.d.mts} +2 -2
  121. package/dist/server/index.d.mts +195 -217
  122. package/dist/server/index.d.ts +195 -217
  123. package/dist/server/index.js +10 -289
  124. package/dist/server/index.js.map +1 -1
  125. package/dist/server/index.mjs +11 -290
  126. package/dist/server/index.mjs.map +1 -1
  127. package/dist/server/{loadContent-DECnsp4k.d.ts → loadContent-DD7J5_WO.d.ts} +26 -4
  128. package/dist/server/{loadContent-Du5kS8UM.d.mts → loadContent-DTEgYI-l.d.mts} +26 -4
  129. package/dist/server/{loadPage-VBorKlWv.d.mts → loadPage-B578Xg2W.d.mts} +3 -3
  130. package/dist/server/{loadPage-BZohBxxf.d.ts → loadPage-Dkiimbsg.d.ts} +3 -3
  131. package/dist/server/loadPage-IBX7FXGH.mjs +11 -0
  132. package/dist/server/loadPage-KG74OG4V.js +11 -0
  133. package/dist/server/{loadPage-AXNAERDS.js.map → loadPage-KG74OG4V.js.map} +1 -1
  134. package/dist/server/metadata.d.mts +5 -5
  135. package/dist/server/metadata.d.ts +5 -5
  136. package/dist/server/metadata.js +1 -1
  137. package/dist/server/metadata.mjs +1 -1
  138. package/dist/server/navigation.d.mts +4 -8
  139. package/dist/server/navigation.d.ts +4 -8
  140. package/dist/server/navigation.js +3 -7
  141. package/dist/server/navigation.js.map +1 -1
  142. package/dist/server/navigation.mjs +2 -6
  143. package/dist/server/next/revalidate.js +1 -1
  144. package/dist/server/next/revalidate.mjs +1 -1
  145. package/dist/server/next/tags.js +1 -1
  146. package/dist/server/next/tags.mjs +1 -1
  147. package/dist/server/next.d.mts +7 -7
  148. package/dist/server/next.d.ts +7 -7
  149. package/dist/server/next.js +23 -16
  150. package/dist/server/next.js.map +1 -1
  151. package/dist/server/next.mjs +15 -8
  152. package/dist/server/next.mjs.map +1 -1
  153. package/dist/server/prebuild-loader.d.mts +87 -0
  154. package/dist/server/prebuild-loader.d.ts +87 -0
  155. package/dist/server/prebuild-loader.js +15 -0
  156. package/dist/server/prebuild-loader.js.map +1 -0
  157. package/dist/server/prebuild-loader.mjs +15 -0
  158. package/dist/server/prebuild-loader.mjs.map +1 -0
  159. package/dist/server/prebuild-types.d.mts +201 -0
  160. package/dist/server/prebuild-types.d.ts +201 -0
  161. package/dist/server/prebuild-types.js +1 -0
  162. package/dist/server/prebuild-types.js.map +1 -0
  163. package/dist/server/prebuild-types.mjs +1 -0
  164. package/dist/server/prebuild-types.mjs.map +1 -0
  165. package/dist/server/prebuild.d.mts +46 -0
  166. package/dist/server/prebuild.d.ts +46 -0
  167. package/dist/server/prebuild.js +10 -0
  168. package/dist/server/prebuild.js.map +1 -0
  169. package/dist/server/prebuild.mjs +10 -0
  170. package/dist/server/prebuild.mjs.map +1 -0
  171. package/dist/server/rendering/server.d.mts +5 -5
  172. package/dist/server/rendering/server.d.ts +5 -5
  173. package/dist/server/rendering/server.js +9 -9
  174. package/dist/server/rendering/server.mjs +8 -8
  175. package/dist/server/rendering.d.mts +9 -9
  176. package/dist/server/rendering.d.ts +9 -9
  177. package/dist/server/rendering.js +13 -11
  178. package/dist/server/rendering.js.map +1 -1
  179. package/dist/server/rendering.mjs +12 -10
  180. package/dist/server/routing.d.mts +5 -5
  181. package/dist/server/routing.d.ts +5 -5
  182. package/dist/server/routing.js +2 -2
  183. package/dist/server/routing.mjs +2 -2
  184. package/dist/server/{schema-Z6-afHJG.d.mts → schema-DYtW0zEu.d.mts} +40 -0
  185. package/dist/server/{schema-Z6-afHJG.d.ts → schema-DYtW0zEu.d.ts} +40 -0
  186. package/dist/server/server.d.mts +6 -6
  187. package/dist/server/server.d.ts +6 -6
  188. package/dist/server/server.js +10 -7
  189. package/dist/server/server.js.map +1 -1
  190. package/dist/server/server.mjs +9 -6
  191. package/dist/server/theme-bridge.js +9 -9
  192. package/dist/server/theme-bridge.mjs +3 -3
  193. package/dist/server/theme.js +1 -1
  194. package/dist/server/theme.mjs +1 -1
  195. package/dist/server/{types-DT30Qy7x.d.mts → types-B6P_iaDz.d.mts} +296 -2
  196. package/dist/server/{types-CgSO0yxg.d.ts → types-C4jfCjaP.d.ts} +296 -2
  197. package/dist/server/{types-D0rPF8l5.d.ts → types-CSvCkmYi.d.mts} +13 -4
  198. package/dist/server/{types-D8XqwoVd.d.ts → types-DVesWaB7.d.ts} +1 -1
  199. package/dist/server/{types-CJfJwcuL.d.mts → types-M0CviVW2.d.mts} +1 -1
  200. package/dist/server/{types-BRQ_6yOc.d.mts → types-gKcrQV09.d.ts} +13 -4
  201. package/dist/server/{validation-Pv3Zs6dP.d.mts → validation-BA1TKthZ.d.mts} +2 -2
  202. package/dist/server/{validation-D1LaY1kQ.d.ts → validation-js7BCPN8.d.ts} +2 -2
  203. package/dist/server/webhooks.js +1 -1
  204. package/dist/server/webhooks.mjs +1 -1
  205. package/dist/styles/index.css +419 -0
  206. package/package.json +17 -3
  207. package/dist/server/chunk-4CV4JOE5.js.map +0 -1
  208. package/dist/server/chunk-4YQJUL5W.mjs.map +0 -1
  209. package/dist/server/chunk-65A5HAUZ.mjs.map +0 -1
  210. package/dist/server/chunk-7UPVCT3K.js.map +0 -1
  211. package/dist/server/chunk-BYBJA6SP.mjs.map +0 -1
  212. package/dist/server/chunk-EIJ27EZQ.js.map +0 -1
  213. package/dist/server/chunk-EIVISR62.js.map +0 -1
  214. package/dist/server/chunk-LNOUXALA.mjs.map +0 -1
  215. package/dist/server/chunk-WM646WI3.js.map +0 -1
  216. package/dist/server/chunk-YYO3RIFO.js.map +0 -1
  217. package/dist/server/loadPage-AXNAERDS.js +0 -11
  218. package/dist/server/loadPage-XR7ORQ2E.mjs +0 -11
  219. package/src/styles/index.css +0 -10
  220. /package/dist/server/{chunk-RBJFXNDM.mjs.map → chunk-E4R5ILRE.mjs.map} +0 -0
  221. /package/dist/server/{chunk-ARNCLSQT.mjs.map → chunk-H44G72AB.mjs.map} +0 -0
  222. /package/dist/server/{chunk-OSF34JTQ.mjs.map → chunk-KKUR3PDT.mjs.map} +0 -0
  223. /package/dist/server/{chunk-P4K63SBZ.mjs.map → chunk-OSTUHBFE.mjs.map} +0 -0
  224. /package/dist/server/{chunk-NFEGQTCC.mjs.map → chunk-WMJKH4XE.mjs.map} +0 -0
  225. /package/dist/server/{chunk-C6FIJC7T.mjs.map → chunk-YUD7ONZG.mjs.map} +0 -0
  226. /package/dist/server/{loadPage-XR7ORQ2E.mjs.map → loadPage-IBX7FXGH.mjs.map} +0 -0
@@ -1,4 +1,4 @@
1
- import { F as FieldDefinition, S as SdkCustomBlock } from './schema-Z6-afHJG.js';
1
+ import { F as FieldDefinition, S as SdkCustomBlock } from './schema-DYtW0zEu.js';
2
2
  import { B as BlockKind } from './blockKinds-B6MWzNWp.js';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { F as FieldDefinition, S as SdkCustomBlock } from './schema-Z6-afHJG.mjs';
1
+ import { F as FieldDefinition, S as SdkCustomBlock } from './schema-DYtW0zEu.mjs';
2
2
  import { B as BlockKind } from './blockKinds-B6MWzNWp.mjs';
3
3
 
4
4
  /**
@@ -1,11 +1,12 @@
1
- import { A as APIEndpoints } from './types-DT30Qy7x.mjs';
2
- import './schema-Z6-afHJG.mjs';
1
+ import { A as APIEndpoints } from './types-C4jfCjaP.js';
2
+ import './schema-DYtW0zEu.js';
3
3
 
4
4
  type SiteResponse = NonNullable<APIEndpoints['getSite']['response']>;
5
5
  type PageResponse = NonNullable<APIEndpoints['getContentByPath']['response']>;
6
6
  type EntriesResponse = NonNullable<APIEndpoints['listPublishedEntries']['response']>;
7
7
  type EntryResponse = NonNullable<APIEndpoints['getPublishedEntryPreview']['response']>;
8
8
  type PublicFormResponse = NonNullable<APIEndpoints['getPublicFormById']['response']>;
9
+ type PublicFormsResponse = NonNullable<APIEndpoints['listPublicForms']['response']>;
9
10
  type PublicBookingServicesResponse = NonNullable<APIEndpoints['getPublicBookingServices']['response']>;
10
11
  type PublicEventsResponse = NonNullable<APIEndpoints['listPublicEvents']['response']>;
11
12
  type ResolveEventOccurrenceResponse = NonNullable<APIEndpoints['resolveEventOccurrence']['response']>;
@@ -287,11 +288,19 @@ interface RiverbankClient {
287
288
  slug: string;
288
289
  } & SdkMethodOptions): Promise<EntryResponse>;
289
290
  /**
290
- * Fetch a public form definition by ID
291
+ * Fetch a public form definition by ID or slug.
292
+ * When using slug, siteId is required for lookup.
291
293
  */
292
294
  getPublicFormById(params: {
293
295
  formId: string;
296
+ siteId?: string;
294
297
  } & SdkMethodOptions): Promise<PublicFormResponse>;
298
+ /**
299
+ * Fetch all forms for a site (used for prebuild cache)
300
+ */
301
+ getForms(params: {
302
+ siteId: string;
303
+ } & SdkMethodOptions): Promise<PublicFormsResponse>;
295
304
  /**
296
305
  * Fetch public booking services for a site
297
306
  */
@@ -411,4 +420,4 @@ interface RiverbankClient {
411
420
  getCircuitState(): CircuitState;
412
421
  }
413
422
 
414
- export type { CircuitState as C, EntriesResponse as E, GetEntriesBaseParams as G, PageResponse as P, RiverbankClient as R, SiteResponse as S, RiverbankClientConfig as a, EntryResponse as b, ResolveEventOccurrenceResponse as c, EntriesResponseWithMeta as d, PaginationMeta as e, ResilienceConfig as f, ResilienceStatus as g, ResilienceSource as h, RetryConfig as i, CircuitBreakerConfig as j };
423
+ export type { CircuitState as C, EntriesResponse as E, GetEntriesBaseParams as G, PageResponse as P, RiverbankClient as R, SiteResponse as S, RiverbankClientConfig as a, EntryResponse as b, EntriesResponseWithMeta as c, PaginationMeta as d, ResilienceConfig as e, ResilienceStatus as f, ResilienceSource as g, RetryConfig as h, CircuitBreakerConfig as i, ResolveEventOccurrenceResponse as j };
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
- import { S as SdkCustomBlock } from './schema-Z6-afHJG.mjs';
3
- import { a as ContentConfig, C as ContentTypeConfig, R as RiverbankSiteConfig, j as BlockFieldOptionsMap, k as BlockFieldExtension, l as BlockFieldExtensionsMap, q as SyncConfig } from './types-CJfJwcuL.mjs';
2
+ import { S as SdkCustomBlock } from './schema-DYtW0zEu.mjs';
3
+ import { a as ContentConfig, C as ContentTypeConfig, R as RiverbankSiteConfig, j as BlockFieldOptionsMap, k as BlockFieldExtension, l as BlockFieldExtensionsMap, q as SyncConfig } from './types-M0CviVW2.mjs';
4
4
 
5
5
  /**
6
6
  * SDK Content Config Validation
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
- import { S as SdkCustomBlock } from './schema-Z6-afHJG.js';
3
- import { a as ContentConfig, C as ContentTypeConfig, R as RiverbankSiteConfig, j as BlockFieldOptionsMap, k as BlockFieldExtension, l as BlockFieldExtensionsMap, q as SyncConfig } from './types-D8XqwoVd.js';
2
+ import { S as SdkCustomBlock } from './schema-DYtW0zEu.js';
3
+ import { a as ContentConfig, C as ContentTypeConfig, R as RiverbankSiteConfig, j as BlockFieldOptionsMap, k as BlockFieldExtension, l as BlockFieldExtensionsMap, q as SyncConfig } from './types-DVesWaB7.js';
4
4
 
5
5
  /**
6
6
  * SDK Content Config Validation
@@ -3,7 +3,7 @@
3
3
 
4
4
 
5
5
  var _chunkNBTRDLCMjs = require('./chunk-NBTRDLCM.js');
6
- require('./chunk-4CV4JOE5.js');
6
+ require('./chunk-Z6ZWNWWR.js');
7
7
 
8
8
 
9
9
 
@@ -3,7 +3,7 @@ import {
3
3
  parseWebhookPayload,
4
4
  verifyWebhookSignature
5
5
  } from "./chunk-5LRR64Y6.mjs";
6
- import "./chunk-NFEGQTCC.mjs";
6
+ import "./chunk-WMJKH4XE.mjs";
7
7
  export {
8
8
  WebhookPayloadSchema,
9
9
  parseWebhookPayload,
@@ -0,0 +1,419 @@
1
+ /**
2
+ * Builder SDK Base Styles
3
+ *
4
+ * These styles are required for Builder blocks to render correctly.
5
+ * Import this in your app's global CSS file:
6
+ *
7
+ * @import "@riverbankcms/sdk/styles.css";
8
+ */
9
+
10
+ /* === @riverbankcms/blocks theme === */
11
+ /* Fallback defaults so preview doesn't look broken before ThemeScope injects vars */
12
+ :root {
13
+ /* --tb-primary: 17 24 39;
14
+ --tb-text: 17 24 39;
15
+ --tb-muted: 107 114 128;
16
+ --tb-bg: 255 255 255;
17
+ --tb-surface: 248 250 252;
18
+ --tb-border: 229 231 235;
19
+
20
+ --radius-control: 12px;
21
+ --radius-card: 12px;
22
+
23
+ --shadow-elev: 0 1px 2px rgba(0,0,0,.06);
24
+
25
+ --fs-h1: 32px;
26
+ --fs-h2: 24px;
27
+ --fs-h3: 20px;
28
+ --fs-body: 16px;
29
+
30
+ --font-heading: ui-sans-serif, system-ui, sans-serif;
31
+ --font-body: ui-sans-serif, system-ui, sans-serif;
32
+
33
+ --motion-duration: 180ms;
34
+ --motion-ease: cubic-bezier(.2,.8,.2,1); */
35
+ }
36
+
37
+ /*
38
+ * Theme Scope Styles
39
+ *
40
+ * IMPORTANT: All :where(.theme-scope) selectors are wrapped in :where() to give them
41
+ * zero specificity. This allows SDK site custom styles to easily override
42
+ * theme defaults without needing !important or high-specificity selectors.
43
+ *
44
+ * Example: `h4 { color: white; }` will override `:where(:where(.theme-scope)) h4`
45
+ */
46
+
47
+ :where(:where(.theme-scope)) {
48
+ font-family: var(--font-body);
49
+ letter-spacing: var(--ls-body);
50
+ line-height: var(--lh-body);
51
+ font-weight: var(--font-weight-body);
52
+
53
+ & h1, & h2, & h3, & h4, & h5, & h6 {
54
+ font-family: var(--font-heading);
55
+ color: rgb(var(--tb-text));
56
+ font-weight: var(--font-weight-heading);
57
+ text-transform: var(--tt-heading);
58
+ font-variant-caps: var(--fv-heading);
59
+ }
60
+ }
61
+
62
+ /* Heading typographic overrides (fallback to defaults when not provided) */
63
+ :where(:where(.theme-scope)) h1 { letter-spacing: var(--ls-h1, var(--ls-heading)); line-height: var(--lh-h1, var(--lh-heading)); font-weight: var(--fw-h1, var(--font-weight-heading)); }
64
+ :where(:where(.theme-scope)) h2 { letter-spacing: var(--ls-h2, var(--ls-heading)); line-height: var(--lh-h2, var(--lh-heading)); font-weight: var(--fw-h2, var(--font-weight-heading)); }
65
+ :where(:where(.theme-scope)) h3 { letter-spacing: var(--ls-h3, var(--ls-heading)); line-height: var(--lh-h3, var(--lh-heading)); font-weight: var(--fw-h3, var(--font-weight-heading)); }
66
+ :where(:where(.theme-scope)) h4, :where(:where(.theme-scope)) h5, :where(:where(.theme-scope)) h6 { letter-spacing: var(--ls-heading); line-height: var(--lh-heading); }
67
+ :where(:where(.theme-scope)) h4 { font-weight: var(--fw-h4, var(--font-weight-heading)); }
68
+ :where(:where(.theme-scope)) h5 { font-weight: var(--fw-h5, var(--font-weight-heading)); }
69
+ :where(:where(.theme-scope)) h6 { font-weight: var(--fw-h6, var(--font-weight-heading)); }
70
+
71
+ /* Rich text element spacing based on theme rhythm */
72
+ :where(.theme-scope) .prose h1 { margin-top: calc(var(--rt-space-y) * 1.6); margin-bottom: calc(var(--rt-space-y) * 0.8); }
73
+ :where(.theme-scope) .prose h2 { margin-top: calc(var(--rt-space-y) * 1.4); margin-bottom: calc(var(--rt-space-y) * 0.7); }
74
+ :where(.theme-scope) .prose h3 { margin-top: calc(var(--rt-space-y) * 1.2); margin-bottom: calc(var(--rt-space-y) * 0.6); }
75
+ :where(.theme-scope) .prose h4 { margin-top: calc(var(--rt-space-y) * 1.0); margin-bottom: calc(var(--rt-space-y) * 0.5); }
76
+ :where(.theme-scope) .prose h5 { margin-top: calc(var(--rt-space-y) * 0.9); margin-bottom: calc(var(--rt-space-y) * 0.45); }
77
+ :where(.theme-scope) .prose h6 { margin-top: calc(var(--rt-space-y) * 0.8); margin-bottom: calc(var(--rt-space-y) * 0.40); }
78
+ :where(.theme-scope) .prose p { margin: var(--rt-space-y) 0; }
79
+ :where(.theme-scope) .prose ul, :where(.theme-scope) .prose ol { margin: var(--rt-space-y) 0; padding-left: 1.25rem; }
80
+ :where(.theme-scope) .prose blockquote { margin: calc(var(--rt-space-y) * 1.0) 0; padding-left: 1rem; border-left: 3px solid rgb(var(--tb-border)); }
81
+
82
+ /* Prose color overrides - use theme CSS variables instead of hardcoded colors
83
+ * This makes prose elements automatically adapt to light/dark themes */
84
+ :where(.theme-scope) .prose {
85
+ /* Body text inherits from parent, which should already have theme color */
86
+ color: inherit;
87
+ }
88
+
89
+ :where(.theme-scope) .prose p,
90
+ :where(.theme-scope) .prose li {
91
+ /* Body text uses inherited color (set by fragment via textColorStyle) */
92
+ color: inherit;
93
+ }
94
+
95
+ :where(.theme-scope) .prose h1,
96
+ :where(.theme-scope) .prose h2,
97
+ :where(.theme-scope) .prose h3,
98
+ :where(.theme-scope) .prose h4,
99
+ :where(.theme-scope) .prose h5,
100
+ :where(.theme-scope) .prose h6 {
101
+ /* Headings inherit from parent or use theme text color */
102
+ color: inherit;
103
+ }
104
+
105
+ :where(.theme-scope) .prose strong,
106
+ :where(.theme-scope) .prose b {
107
+ /* Bold text inherits color but increases weight */
108
+ color: inherit;
109
+ font-weight: 600;
110
+ }
111
+
112
+ :where(.theme-scope) .prose em,
113
+ :where(.theme-scope) .prose i {
114
+ /* Italic text inherits color */
115
+ color: inherit;
116
+ }
117
+
118
+ :where(.theme-scope) .prose a {
119
+ /* Links use primary color from theme */
120
+ color: rgb(var(--tb-primary));
121
+ text-decoration: underline;
122
+ text-decoration-color: rgba(var(--tb-primary), 0.3);
123
+ transition: color 150ms ease, text-decoration-color 150ms ease;
124
+ }
125
+
126
+ :where(.theme-scope) .prose a:hover {
127
+ color: rgb(var(--tb-primary));
128
+ text-decoration-color: rgb(var(--tb-primary));
129
+ }
130
+
131
+ :where(.theme-scope) .prose blockquote {
132
+ /* Blockquotes use muted text color */
133
+ color: rgb(var(--tb-mutedText));
134
+ border-left-color: rgb(var(--tb-border));
135
+ }
136
+
137
+ :where(.theme-scope) .prose code {
138
+ /* Inline code uses text color with surface background */
139
+ color: inherit;
140
+ background-color: rgba(var(--tb-surface), 0.5);
141
+ padding: 0.125rem 0.25rem;
142
+ border-radius: 0.25rem;
143
+ font-size: 0.875em;
144
+ }
145
+
146
+ :where(.theme-scope) .prose pre {
147
+ /* Code blocks */
148
+ background-color: rgb(var(--tb-surface));
149
+ color: rgb(var(--tb-text));
150
+ border: 1px solid rgb(var(--tb-border));
151
+ border-radius: 0.5rem;
152
+ padding: 1rem;
153
+ overflow-x: auto;
154
+ }
155
+
156
+ :where(.theme-scope) .prose pre code {
157
+ /* Code inside pre blocks */
158
+ background-color: transparent;
159
+ padding: 0;
160
+ color: inherit;
161
+ }
162
+
163
+ :where(.theme-scope) .prose hr {
164
+ /* Horizontal rules */
165
+ border-color: rgb(var(--tb-border));
166
+ }
167
+
168
+ :where(.theme-scope) .prose ul > li::marker,
169
+ :where(.theme-scope) .prose ol > li::marker {
170
+ /* List markers use muted text color */
171
+ color: rgb(var(--tb-mutedText));
172
+ }
173
+
174
+ /*
175
+ /* Density helpers */
176
+ :where(.theme-scope) .section-pad { padding-top: 4rem; padding-bottom: 4rem; }
177
+ :where(.theme-scope)[data-density="airy"] .section-pad { padding-top: 4.5rem; padding-bottom: 4.5rem; }
178
+ :where(.theme-scope)[data-density="compact"] .section-pad { padding-top: 3rem; padding-bottom: 3rem; }
179
+
180
+ :where(.theme-scope) .rounded-control { border-radius: var(--radius-control); }
181
+ :where(.theme-scope) .rounded-card { border-radius: var(--radius-card); }
182
+
183
+ :where(.theme-scope) .shadow-elev { box-shadow: var(--shadow-elev); }
184
+
185
+ :where(.theme-scope) .font-heading { font-family: var(--font-heading); }
186
+ :where(.theme-scope) .font-body { font-family: var(--font-body); }
187
+
188
+ :where(.theme-scope) .text-h1 { font-size: var(--fs-h1); line-height: 1.1; }
189
+ :where(.theme-scope) .text-h2 { font-size: var(--fs-h2); line-height: 1.15; }
190
+ :where(.theme-scope) .text-h3 { font-size: var(--fs-h3); line-height: 1.2; }
191
+ :where(.theme-scope) .text-body-size { font-size: var(--fs-body); }
192
+
193
+ :where(.theme-scope) .transition-theme { transition: all var(--motion-duration) var(--motion-ease); }
194
+ :where(.theme-scope) .transition-theme-standard { transition: all var(--motion-duration) var(--motion-ease); }
195
+ :where(.theme-scope) .transition-theme-subtle { transition: all calc(var(--motion-duration) * 0.75) var(--motion-ease); }
196
+ :where(.theme-scope) .transition-theme-expressive { transition: all calc(var(--motion-duration) * 1.35) var(--motion-ease); }
197
+
198
+ /* Gradient utility helpers (Tailwind-compatible) */
199
+ /* These set gradient stop variables so classes like bg-gradient-to-r work with theme tokens */
200
+ /* Base tokens */
201
+ :where(.theme-scope) .from-background { --tw-gradient-from: rgb(var(--tb-background)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-background)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
202
+ :where(.theme-scope) .to-background { --tw-gradient-to: rgb(var(--tb-background)) var(--tw-gradient-to-position); }
203
+ :where(.theme-scope) .from-surface { --tw-gradient-from: rgb(var(--tb-surface)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-surface)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
204
+ :where(.theme-scope) .to-surface { --tw-gradient-to: rgb(var(--tb-surface)) var(--tw-gradient-to-position); }
205
+ :where(.theme-scope) .from-text { --tw-gradient-from: rgb(var(--tb-text)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-text)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
206
+ :where(.theme-scope) .to-text { --tw-gradient-to: rgb(var(--tb-text)) var(--tw-gradient-to-position); }
207
+ :where(.theme-scope) .from-border { --tw-gradient-from: rgb(var(--tb-border)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-border)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
208
+ :where(.theme-scope) .to-border { --tw-gradient-to: rgb(var(--tb-border)) var(--tw-gradient-to-position); }
209
+ :where(.theme-scope) .from-success { --tw-gradient-from: rgb(var(--tb-success)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-success)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
210
+ :where(.theme-scope) .to-success { --tw-gradient-to: rgb(var(--tb-success)) var(--tw-gradient-to-position); }
211
+ :where(.theme-scope) .from-warning { --tw-gradient-from: rgb(var(--tb-warning)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-warning)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
212
+ :where(.theme-scope) .to-warning { --tw-gradient-to: rgb(var(--tb-warning)) var(--tw-gradient-to-position); }
213
+ :where(.theme-scope) .from-info { --tw-gradient-from: rgb(var(--tb-info)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-info)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
214
+ :where(.theme-scope) .to-info { --tw-gradient-to: rgb(var(--tb-info)) var(--tw-gradient-to-position); }
215
+ :where(.theme-scope) .from-primary { --tw-gradient-from: rgb(var(--tb-primary)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-primary)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
216
+ :where(.theme-scope) .to-primary { --tw-gradient-to: rgb(var(--tb-primary)) var(--tw-gradient-to-position); }
217
+ :where(.theme-scope) .from-secondary { --tw-gradient-from: rgb(var(--tb-secondary)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-secondary)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
218
+ :where(.theme-scope) .to-secondary { --tw-gradient-to: rgb(var(--tb-secondary)) var(--tw-gradient-to-position); }
219
+ :where(.theme-scope) .from-accent { --tw-gradient-from: rgb(var(--tb-accent)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-accent)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
220
+ :where(.theme-scope) .to-accent { --tw-gradient-to: rgb(var(--tb-accent)) var(--tw-gradient-to-position); }
221
+
222
+ /* Shade tokens (50..950) for primary */
223
+ :where(.theme-scope) .from-primary-50 { --tw-gradient-from: rgb(var(--tb-primary-50)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-primary-50)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
224
+ :where(.theme-scope) .to-primary-50 { --tw-gradient-to: rgb(var(--tb-primary-50)) var(--tw-gradient-to-position); }
225
+ :where(.theme-scope) .from-primary-100 { --tw-gradient-from: rgb(var(--tb-primary-100)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-primary-100)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
226
+ :where(.theme-scope) .to-primary-100 { --tw-gradient-to: rgb(var(--tb-primary-100)) var(--tw-gradient-to-position); }
227
+ :where(.theme-scope) .from-primary-200 { --tw-gradient-from: rgb(var(--tb-primary-200)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-primary-200)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
228
+ :where(.theme-scope) .to-primary-200 { --tw-gradient-to: rgb(var(--tb-primary-200)) var(--tw-gradient-to-position); }
229
+ :where(.theme-scope) .from-primary-300 { --tw-gradient-from: rgb(var(--tb-primary-300)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-primary-300)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
230
+ :where(.theme-scope) .to-primary-300 { --tw-gradient-to: rgb(var(--tb-primary-300)) var(--tw-gradient-to-position); }
231
+ :where(.theme-scope) .from-primary-400 { --tw-gradient-from: rgb(var(--tb-primary-400)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-primary-400)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
232
+ :where(.theme-scope) .to-primary-400 { --tw-gradient-to: rgb(var(--tb-primary-400)) var(--tw-gradient-to-position); }
233
+ :where(.theme-scope) .from-primary-500 { --tw-gradient-from: rgb(var(--tb-primary-500)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-primary-500)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
234
+ :where(.theme-scope) .to-primary-500 { --tw-gradient-to: rgb(var(--tb-primary-500)) var(--tw-gradient-to-position); }
235
+ :where(.theme-scope) .from-primary-600 { --tw-gradient-from: rgb(var(--tb-primary-600)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-primary-600)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
236
+ :where(.theme-scope) .to-primary-600 { --tw-gradient-to: rgb(var(--tb-primary-600)) var(--tw-gradient-to-position); }
237
+ :where(.theme-scope) .from-primary-700 { --tw-gradient-from: rgb(var(--tb-primary-700)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-primary-700)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
238
+ :where(.theme-scope) .to-primary-700 { --tw-gradient-to: rgb(var(--tb-primary-700)) var(--tw-gradient-to-position); }
239
+ :where(.theme-scope) .from-primary-800 { --tw-gradient-from: rgb(var(--tb-primary-800)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-primary-800)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
240
+ :where(.theme-scope) .to-primary-800 { --tw-gradient-to: rgb(var(--tb-primary-800)) var(--tw-gradient-to-position); }
241
+ :where(.theme-scope) .from-primary-900 { --tw-gradient-from: rgb(var(--tb-primary-900)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-primary-900)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
242
+ :where(.theme-scope) .to-primary-900 { --tw-gradient-to: rgb(var(--tb-primary-900)) var(--tw-gradient-to-position); }
243
+ :where(.theme-scope) .from-primary-950 { --tw-gradient-from: rgb(var(--tb-primary-950)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-primary-950)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
244
+ :where(.theme-scope) .to-primary-950 { --tw-gradient-to: rgb(var(--tb-primary-950)) var(--tw-gradient-to-position); }
245
+
246
+ /* Shade tokens (50..950) for secondary */
247
+ :where(.theme-scope) .from-secondary-50 { --tw-gradient-from: rgb(var(--tb-secondary-50)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-secondary-50)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
248
+ :where(.theme-scope) .to-secondary-50 { --tw-gradient-to: rgb(var(--tb-secondary-50)) var(--tw-gradient-to-position); }
249
+ :where(.theme-scope) .from-secondary-100 { --tw-gradient-from: rgb(var(--tb-secondary-100)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-secondary-100)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
250
+ :where(.theme-scope) .to-secondary-100 { --tw-gradient-to: rgb(var(--tb-secondary-100)) var(--tw-gradient-to-position); }
251
+ :where(.theme-scope) .from-secondary-200 { --tw-gradient-from: rgb(var(--tb-secondary-200)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-secondary-200)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
252
+ :where(.theme-scope) .to-secondary-200 { --tw-gradient-to: rgb(var(--tb-secondary-200)) var(--tw-gradient-to-position); }
253
+ :where(.theme-scope) .from-secondary-300 { --tw-gradient-from: rgb(var(--tb-secondary-300)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-secondary-300)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
254
+ :where(.theme-scope) .to-secondary-300 { --tw-gradient-to: rgb(var(--tb-secondary-300)) var(--tw-gradient-to-position); }
255
+ :where(.theme-scope) .from-secondary-400 { --tw-gradient-from: rgb(var(--tb-secondary-400)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-secondary-400)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
256
+ :where(.theme-scope) .to-secondary-400 { --tw-gradient-to: rgb(var(--tb-secondary-400)) var(--tw-gradient-to-position); }
257
+ :where(.theme-scope) .from-secondary-500 { --tw-gradient-from: rgb(var(--tb-secondary-500)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-secondary-500)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
258
+ :where(.theme-scope) .to-secondary-500 { --tw-gradient-to: rgb(var(--tb-secondary-500)) var(--tw-gradient-to-position); }
259
+ :where(.theme-scope) .from-secondary-600 { --tw-gradient-from: rgb(var(--tb-secondary-600)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-secondary-600)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
260
+ :where(.theme-scope) .to-secondary-600 { --tw-gradient-to: rgb(var(--tb-secondary-600)) var(--tw-gradient-to-position); }
261
+ :where(.theme-scope) .from-secondary-700 { --tw-gradient-from: rgb(var(--tb-secondary-700)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-secondary-700)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
262
+ :where(.theme-scope) .to-secondary-700 { --tw-gradient-to: rgb(var(--tb-secondary-700)) var(--tw-gradient-to-position); }
263
+ :where(.theme-scope) .from-secondary-800 { --tw-gradient-from: rgb(var(--tb-secondary-800)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-secondary-800)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
264
+ :where(.theme-scope) .to-secondary-800 { --tw-gradient-to: rgb(var(--tb-secondary-800)) var(--tw-gradient-to-position); }
265
+ :where(.theme-scope) .from-secondary-900 { --tw-gradient-from: rgb(var(--tb-secondary-900)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-secondary-900)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
266
+ :where(.theme-scope) .to-secondary-900 { --tw-gradient-to: rgb(var(--tb-secondary-900)) var(--tw-gradient-to-position); }
267
+ :where(.theme-scope) .from-secondary-950 { --tw-gradient-from: rgb(var(--tb-secondary-950)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-secondary-950)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
268
+ :where(.theme-scope) .to-secondary-950 { --tw-gradient-to: rgb(var(--tb-secondary-950)) var(--tw-gradient-to-position); }
269
+
270
+ /* Shade tokens (50..950) for accent */
271
+ :where(.theme-scope) .from-accent-50 { --tw-gradient-from: rgb(var(--tb-accent-50)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-accent-50)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
272
+ :where(.theme-scope) .to-accent-50 { --tw-gradient-to: rgb(var(--tb-accent-50)) var(--tw-gradient-to-position); }
273
+ :where(.theme-scope) .from-accent-100 { --tw-gradient-from: rgb(var(--tb-accent-100)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-accent-100)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
274
+ :where(.theme-scope) .to-accent-100 { --tw-gradient-to: rgb(var(--tb-accent-100)) var(--tw-gradient-to-position); }
275
+ :where(.theme-scope) .from-accent-200 { --tw-gradient-from: rgb(var(--tb-accent-200)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-accent-200)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
276
+ :where(.theme-scope) .to-accent-200 { --tw-gradient-to: rgb(var(--tb-accent-200)) var(--tw-gradient-to-position); }
277
+ :where(.theme-scope) .from-accent-300 { --tw-gradient-from: rgb(var(--tb-accent-300)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-accent-300)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
278
+ :where(.theme-scope) .to-accent-300 { --tw-gradient-to: rgb(var(--tb-accent-300)) var(--tw-gradient-to-position); }
279
+ :where(.theme-scope) .from-accent-400 { --tw-gradient-from: rgb(var(--tb-accent-400)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-accent-400)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
280
+ :where(.theme-scope) .to-accent-400 { --tw-gradient-to: rgb(var(--tb-accent-400)) var(--tw-gradient-to-position); }
281
+ :where(.theme-scope) .from-accent-500 { --tw-gradient-from: rgb(var(--tb-accent-500)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-accent-500)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
282
+ :where(.theme-scope) .to-accent-500 { --tw-gradient-to: rgb(var(--tb-accent-500)) var(--tw-gradient-to-position); }
283
+ :where(.theme-scope) .from-accent-600 { --tw-gradient-from: rgb(var(--tb-accent-600)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-accent-600)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
284
+ :where(.theme-scope) .to-accent-600 { --tw-gradient-to: rgb(var(--tb-accent-600)) var(--tw-gradient-to-position); }
285
+ :where(.theme-scope) .from-accent-700 { --tw-gradient-from: rgb(var(--tb-accent-700)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-accent-700)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
286
+ :where(.theme-scope) .to-accent-700 { --tw-gradient-to: rgb(var(--tb-accent-700)) var(--tw-gradient-to-position); }
287
+ :where(.theme-scope) .from-accent-800 { --tw-gradient-from: rgb(var(--tb-accent-800)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-accent-800)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
288
+ :where(.theme-scope) .to-accent-800 { --tw-gradient-to: rgb(var(--tb-accent-800)) var(--tw-gradient-to-position); }
289
+ :where(.theme-scope) .from-accent-900 { --tw-gradient-from: rgb(var(--tb-accent-900)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-accent-900)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
290
+ :where(.theme-scope) .to-accent-900 { --tw-gradient-to: rgb(var(--tb-accent-900)) var(--tw-gradient-to-position); }
291
+ :where(.theme-scope) .from-accent-950 { --tw-gradient-from: rgb(var(--tb-accent-950)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-accent-950)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
292
+ :where(.theme-scope) .to-accent-950 { --tw-gradient-to: rgb(var(--tb-accent-950)) var(--tw-gradient-to-position); }
293
+
294
+ /* Shade tokens (50..950) for neutral */
295
+ :where(.theme-scope) .from-neutral-50 { --tw-gradient-from: rgb(var(--tb-neutral-50)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-neutral-50)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
296
+ :where(.theme-scope) .to-neutral-50 { --tw-gradient-to: rgb(var(--tb-neutral-50)) var(--tw-gradient-to-position); }
297
+ :where(.theme-scope) .from-neutral-100 { --tw-gradient-from: rgb(var(--tb-neutral-100)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-neutral-100)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
298
+ :where(.theme-scope) .to-neutral-100 { --tw-gradient-to: rgb(var(--tb-neutral-100)) var(--tw-gradient-to-position); }
299
+ :where(.theme-scope) .from-neutral-200 { --tw-gradient-from: rgb(var(--tb-neutral-200)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-neutral-200)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
300
+ :where(.theme-scope) .to-neutral-200 { --tw-gradient-to: rgb(var(--tb-neutral-200)) var(--tw-gradient-to-position); }
301
+ :where(.theme-scope) .from-neutral-300 { --tw-gradient-from: rgb(var(--tb-neutral-300)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-neutral-300)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
302
+ :where(.theme-scope) .to-neutral-300 { --tw-gradient-to: rgb(var(--tb-neutral-300)) var(--tw-gradient-to-position); }
303
+ :where(.theme-scope) .from-neutral-400 { --tw-gradient-from: rgb(var(--tb-neutral-400)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-neutral-400)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
304
+ :where(.theme-scope) .to-neutral-400 { --tw-gradient-to: rgb(var(--tb-neutral-400)) var(--tw-gradient-to-position); }
305
+ :where(.theme-scope) .from-neutral-500 { --tw-gradient-from: rgb(var(--tb-neutral-500)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-neutral-500)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
306
+ :where(.theme-scope) .to-neutral-500 { --tw-gradient-to: rgb(var(--tb-neutral-500)) var(--tw-gradient-to-position); }
307
+ :where(.theme-scope) .from-neutral-600 { --tw-gradient-from: rgb(var(--tb-neutral-600)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-neutral-600)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
308
+ :where(.theme-scope) .to-neutral-600 { --tw-gradient-to: rgb(var(--tb-neutral-600)) var(--tw-gradient-to-position); }
309
+ :where(.theme-scope) .from-neutral-700 { --tw-gradient-from: rgb(var(--tb-neutral-700)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-neutral-700)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
310
+ :where(.theme-scope) .to-neutral-700 { --tw-gradient-to: rgb(var(--tb-neutral-700)) var(--tw-gradient-to-position); }
311
+ :where(.theme-scope) .from-neutral-800 { --tw-gradient-from: rgb(var(--tb-neutral-800)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-neutral-800)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
312
+ :where(.theme-scope) .to-neutral-800 { --tw-gradient-to: rgb(var(--tb-neutral-800)) var(--tw-gradient-to-position); }
313
+ :where(.theme-scope) .from-neutral-900 { --tw-gradient-from: rgb(var(--tb-neutral-900)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-neutral-900)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
314
+ :where(.theme-scope) .to-neutral-900 { --tw-gradient-to: rgb(var(--tb-neutral-900)) var(--tw-gradient-to-position); }
315
+ :where(.theme-scope) .from-neutral-950 { --tw-gradient-from: rgb(var(--tb-neutral-950)) var(--tw-gradient-from-position); --tw-gradient-to: rgb(var(--tb-neutral-950)) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }
316
+ :where(.theme-scope) .to-neutral-950 { --tw-gradient-to: rgb(var(--tb-neutral-950)) var(--tw-gradient-to-position); }
317
+
318
+ :where(.theme-scope) .nav-underline-grow {
319
+ position: relative;
320
+ overflow: visible;
321
+ }
322
+ :where(.theme-scope) .nav-underline-grow::after {
323
+ content: "";
324
+ position: absolute;
325
+ left: 0;
326
+ bottom: var(--nav-underline-offset, -0.35em);
327
+ width: 100%;
328
+ height: 2px;
329
+ background-color: currentColor;
330
+ transform: scaleX(0);
331
+ transform-origin: left center;
332
+ transition: transform calc(var(--motion-duration) * 1.1) var(--motion-ease);
333
+ }
334
+ :where(.theme-scope) .nav-underline-grow:hover::after,
335
+ :where(.theme-scope) .nav-underline-grow.nav-underline-active[data-active="true"]::after {
336
+ transform: scaleX(1);
337
+ }
338
+ :where(.theme-scope) .nav-underline-offset-tight { --nav-underline-offset: -0.2em; }
339
+ :where(.theme-scope) .nav-underline-offset-normal { --nav-underline-offset: -0.3em; }
340
+ :where(.theme-scope) .nav-underline-offset-loose { --nav-underline-offset: -0.45em; }
341
+
342
+ :where(.theme-scope) .card-surface {
343
+ background: rgb(var(--tb-surface));
344
+ border: 1px solid rgb(var(--tb-border));
345
+ border-radius: var(--radius-card);
346
+ box-shadow: var(--shadow-elev);
347
+ }
348
+ :where(.theme-scope) .media-rounded { border-radius: var(--radius-card); }
349
+
350
+ :where(.theme-scope) .is-placeholder::after {
351
+ content: "Placeholder";
352
+ position: absolute; top: .5rem; left: .5rem;
353
+ font-size: 11px;
354
+ background: color-mix(in oklab, rgb(var(--tb-bg)), rgb(var(--tb-text)) 10%);
355
+ color: rgb(var(--tb-text));
356
+ padding: .15rem .35rem; border-radius: 4px;
357
+ opacity: .85;
358
+ }
359
+
360
+ /* Status badges - theme-aware styling for capacity indicators */
361
+ :where(.theme-scope) .badge-status {
362
+ display: inline-flex;
363
+ align-items: center;
364
+ padding: 0.125rem 0.625rem;
365
+ border-radius: 9999px;
366
+ font-size: 0.75rem;
367
+ font-weight: 500;
368
+ line-height: 1.25rem;
369
+ }
370
+
371
+ /* All badges use a subtle theme-aware style by default */
372
+ :where(.theme-scope) .badge-status-available {
373
+ background-color: rgba(var(--tb-secondary), 0.15);
374
+ color: rgb(var(--tb-secondary-700, var(--tb-secondary)));
375
+ }
376
+
377
+ :where(.theme-scope) .badge-status-low {
378
+ background-color: rgba(var(--tb-accent), 0.15);
379
+ color: rgb(var(--tb-accent-700, var(--tb-accent)));
380
+ }
381
+
382
+ :where(.theme-scope) .badge-status-sold-out {
383
+ background-color: rgba(var(--tb-text), 0.1);
384
+ color: rgb(var(--tb-mutedText));
385
+ }
386
+
387
+ /* Event list empty state - theme-aware */
388
+ :where(.theme-scope) .event-list-empty {
389
+ background-color: rgb(var(--tb-surface));
390
+ border-color: rgb(var(--tb-border));
391
+ }
392
+
393
+
394
+ @keyframes accordion-down {
395
+ from {
396
+ height: 0;
397
+ }
398
+ to {
399
+ height: var(--radix-accordion-content-height);
400
+ }
401
+ }
402
+
403
+ @keyframes accordion-up {
404
+ from {
405
+ height: var(--radix-accordion-content-height);
406
+ }
407
+ to {
408
+ height: 0;
409
+ }
410
+ }
411
+
412
+ .theme-scope [data-animation="accordion"][data-state="open"] {
413
+ animation: accordion-down 0.25s ease-out;
414
+ }
415
+
416
+ .theme-scope [data-animation="accordion"][data-state="closed"] {
417
+ animation: accordion-up 0.2s ease-in;
418
+ }
419
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riverbankcms/sdk",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "Riverbank CMS SDK for headless content consumption",
5
5
  "main": "./dist/server/index.js",
6
6
  "module": "./dist/server/index.mjs",
@@ -129,11 +129,25 @@
129
129
  "import": "./dist/server/webhooks.mjs",
130
130
  "require": "./dist/server/webhooks.js"
131
131
  },
132
- "./styles.css": "./src/styles/index.css"
132
+ "./prebuild": {
133
+ "types": "./dist/server/prebuild.d.ts",
134
+ "import": "./dist/server/prebuild.mjs",
135
+ "require": "./dist/server/prebuild.js"
136
+ },
137
+ "./prebuild/loader": {
138
+ "types": "./dist/server/prebuild-loader.d.ts",
139
+ "import": "./dist/server/prebuild-loader.mjs",
140
+ "require": "./dist/server/prebuild-loader.js"
141
+ },
142
+ "./prebuild/types": {
143
+ "types": "./dist/server/prebuild-types.d.ts",
144
+ "import": "./dist/server/prebuild-types.mjs",
145
+ "require": "./dist/server/prebuild-types.js"
146
+ },
147
+ "./styles.css": "./dist/styles/index.css"
133
148
  },
134
149
  "files": [
135
150
  "dist",
136
- "src/styles",
137
151
  "README.md"
138
152
  ],
139
153
  "scripts": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-4CV4JOE5.js"],"names":[],"mappings":"AAAA,6EAAI,UAAU,EAAE,MAAM,CAAC,cAAc;AACrC,IAAI,iBAAiB,EAAE,MAAM,CAAC,wBAAwB;AACtD,IAAI,kBAAkB,EAAE,MAAM,CAAC,mBAAmB;AAClD,IAAI,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,cAAc;AAClD,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,SAAS,MAAM,CAAC,EAAE;AAC3C,EAAE,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;AACrE,CAAC;AACD,IAAI,SAAS,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG;AAChC,EAAE,IAAI,CAAC,IAAI,KAAK,GAAG,GAAG;AACtB,IAAI,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;AACjE,CAAC;AACD,IAAI,YAAY,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;AAC9C,EAAE,GAAG,CAAC,KAAK,GAAG,OAAO,KAAK,IAAI,SAAS,GAAG,OAAO,KAAK,IAAI,UAAU,EAAE;AACtE,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC;AAC3C,MAAM,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,IAAI,MAAM;AACvD,QAAQ,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;AAC1H,EAAE;AACF,EAAE,OAAO,EAAE;AACX,CAAC;AACD,IAAI,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;AAC1F;AACA;AACE;AACA;AACA;AACF,wFAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-4CV4JOE5.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/rendering/helpers/loadContent.ts"],"sourcesContent":["/**\n * Server-side helper to fetch content (page or entry) by path.\n *\n * Use this for dynamic routing where a path could resolve to either\n * a page or a content entry.\n */\n\nimport type { Theme } from '@riverbankcms/blocks';\nimport type { RiverbankClient, PageResponse, SiteResponse } from '../../client/types';\nimport type { PageProps } from '../components/Page';\nimport { prefetchBlockData } from '../../data/prefetchBlockData';\nimport type { ResolvedBlockData } from '../../data/prefetchBlockData';\n\n/**\n * Site data included in content results for metadata generation.\n */\nexport type SiteData = SiteResponse['site'];\n\nexport type LoadContentParams = {\n client: RiverbankClient;\n siteId: string;\n path: string;\n /**\n * If true, fetches draft/unpublished content instead of published content.\n * This affects both pages and entries.\n * Requires API key with site access.\n *\n * @default false\n */\n preview?: boolean;\n};\n\n/**\n * Content entry data returned when a path resolves to an entry\n */\nexport type ContentEntryData = {\n id: string;\n /** Content type key (e.g., 'blog-post', 'product') */\n type: string | null;\n title: string;\n slug: string | null;\n path: string | null;\n status: string;\n publishAt: string | null;\n /** The raw content fields - use these to render your own UI */\n content: Record<string, unknown>;\n metaTitle: string | null;\n metaDescription: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\n/**\n * Result when path resolves to a page\n */\nexport type PageContentResult = {\n type: 'page';\n /** Page outline ready for rendering with <Page> component */\n page: PageProps['page'];\n /** Site theme for styling */\n theme: Theme;\n /** Site ID */\n siteId: string;\n /** Pre-fetched block data for data loaders */\n resolvedData: ResolvedBlockData;\n /** Site data for metadata generation */\n site: SiteData;\n};\n\n/**\n * Result when path resolves to a content entry\n */\nexport type EntryContentResult = {\n type: 'entry';\n /** Raw entry data - render this however you want */\n entry: ContentEntryData;\n /** Template page for rendering the entry (if available) */\n templatePage: PageProps['page'] | null;\n /** Pre-fetched block data for template page data loaders */\n resolvedData: ResolvedBlockData;\n /** Data context for template blocks (includes entry content for bindings) */\n dataContext: { contentEntry: Record<string, unknown> };\n /** Site theme for styling (useful if rendering with SDK components) */\n theme: Theme;\n /** Site ID */\n siteId: string;\n /** Site data for metadata generation */\n site: SiteData;\n};\n\n/**\n * Discriminated union result from loadContent\n */\nexport type LoadContentResult = PageContentResult | EntryContentResult;\n\n/**\n * Type guard to check if result is a page\n */\nexport function isPageContent(result: LoadContentResult): result is PageContentResult {\n return result.type === 'page';\n}\n\n/**\n * Type guard to check if result is an entry\n */\nexport function isEntryContent(result: LoadContentResult): result is EntryContentResult {\n return result.type === 'entry';\n}\n\n/**\n * Server-side helper to fetch content by path.\n *\n * Returns a discriminated union - either page data (ready for `<Page>` component)\n * or raw entry data (for custom rendering).\n *\n * @example Dynamic routing with both pages and entries\n * ```tsx\n * import { loadContent, Page, isPageContent } from '@riverbankcms/sdk';\n *\n * export default async function DynamicRoute({ params }) {\n * const content = await loadContent({\n * client,\n * siteId: 'site-123',\n * path: `/${params.slug?.join('/') || ''}`,\n * });\n *\n * if (isPageContent(content)) {\n * return <Page {...content} />;\n * }\n *\n * // Render entry with custom UI\n * return (\n * <article>\n * <h1>{content.entry.title}</h1>\n * <div>{content.entry.content.body}</div>\n * </article>\n * );\n * }\n * ```\n *\n * @example Entry-specific rendering based on content type\n * ```tsx\n * const content = await loadContent({ client, siteId, path });\n *\n * if (content.type === 'entry') {\n * switch (content.entry.type) {\n * case 'blog-post':\n * return <BlogPost entry={content.entry} theme={content.theme} />;\n * case 'product':\n * return <ProductPage entry={content.entry} theme={content.theme} />;\n * default:\n * return <GenericEntry entry={content.entry} />;\n * }\n * }\n *\n * return <Page {...content} />;\n * ```\n *\n * @example Preview mode for draft content\n * ```tsx\n * const content = await loadContent({\n * client,\n * siteId,\n * path,\n * preview: true, // Fetches draft content for both pages and entries\n * });\n * ```\n */\nexport async function loadContent(params: LoadContentParams): Promise<LoadContentResult> {\n const { client, siteId, path, preview = false } = params;\n\n // Fetch site and content in parallel\n const [site, contentResponse] = await Promise.all([\n client.getSite({ id: siteId }),\n client.getPage({ siteId, path, preview }),\n ]);\n\n // Check if response is an entry\n if (isEntryResponse(contentResponse)) {\n const entryData = contentResponse.entry;\n\n const entry: ContentEntryData = {\n id: entryData.id,\n type: entryData.type,\n title: entryData.title,\n slug: entryData.slug,\n path: entryData.path,\n status: entryData.status,\n publishAt: entryData.publishAt,\n // Use draft content in preview mode, otherwise use published content\n content: preview\n ? (entryData.draftContent ?? entryData.content)\n : entryData.content,\n metaTitle: preview\n ? (entryData.draftMetaTitle ?? entryData.metaTitle)\n : entryData.metaTitle,\n metaDescription: preview\n ? (entryData.draftMetaDescription ?? entryData.metaDescription)\n : entryData.metaDescription,\n createdAt: entryData.createdAt,\n updatedAt: entryData.updatedAt,\n };\n\n // Process template if available (uses first template from content type)\n const { templatePage, resolvedData } = await processEntryTemplate(\n contentResponse.templates as Template[] | undefined,\n entry,\n { siteId, preview },\n client\n );\n\n return {\n type: 'entry',\n entry,\n templatePage,\n resolvedData,\n dataContext: { contentEntry: entry.content },\n theme: site.theme,\n siteId,\n site: site.site,\n };\n }\n\n // Handle page response\n const { page: pageData } = contentResponse;\n\n // Convert API response blocks to PageOutline format with validation\n const blocks = pageData.blocks.map((block) => validateAndConvertBlock(block, 'page'));\n\n const pageOutline = {\n name: pageData.name,\n path: pageData.path,\n purpose: pageData.purpose,\n blocks,\n };\n\n // Prefetch block data loaders for pages\n const resolvedData = await prefetchBlockData(\n pageOutline,\n {\n siteId,\n pageId: pageData.id,\n previewStage: preview ? 'preview' : 'published',\n },\n client\n );\n\n return {\n type: 'page',\n page: pageOutline,\n theme: site.theme,\n siteId,\n resolvedData,\n site: site.site,\n };\n}\n\n/**\n * Type guard to check if API response is an entry\n */\nfunction isEntryResponse(response: PageResponse): response is Extract<PageResponse, { type: 'entry' }> {\n return 'type' in response && response.type === 'entry';\n}\n\n/**\n * Validates and converts a raw block from API response to PageOutline block format.\n * Used for both page blocks and template blocks to ensure consistent validation.\n */\nfunction validateAndConvertBlock(\n block: unknown,\n source: 'page' | 'template'\n): { id: string | null; kind: string; purpose: string; content?: Record<string, unknown> } {\n if (!block || typeof block !== 'object') {\n throw new Error(`Invalid block format in ${source} API response`);\n }\n\n const blockRecord = block as Record<string, unknown>;\n\n // Template blocks use 'blockKind', page blocks use 'kind'\n const kindField = source === 'template' ? 'blockKind' : 'kind';\n const kindValue = blockRecord[kindField];\n\n if (typeof blockRecord.id !== 'string' && blockRecord.id !== null) {\n throw new Error(`Invalid block id in ${source}: expected string or null, got ${typeof blockRecord.id}`);\n }\n if (typeof kindValue !== 'string') {\n throw new Error(`Invalid block ${kindField} in ${source}: expected string, got ${typeof kindValue}`);\n }\n\n // Template blocks derive purpose from scope, page blocks have explicit purpose\n if (source === 'page') {\n if (typeof blockRecord.purpose !== 'string') {\n throw new Error(`Invalid block purpose in ${source}: expected string, got ${typeof blockRecord.purpose}`);\n }\n // Include content for page blocks - required for data loader binding resolution\n const content = (blockRecord.content as Record<string, unknown> | null) ?? {};\n return {\n id: blockRecord.id as string | null,\n kind: kindValue,\n purpose: blockRecord.purpose,\n content,\n };\n }\n\n // Template block: derive purpose from scope, include content\n const scope = blockRecord.scope as 'entry' | 'template' | undefined;\n const content = (blockRecord.content as Record<string, unknown> | null) ?? {};\n\n return {\n id: blockRecord.id as string | null,\n kind: kindValue,\n purpose: scope === 'entry' ? 'entry-content' : 'template-layout',\n content,\n };\n}\n\n/** Template block structure from API response */\ntype TemplateBlock = {\n id: string;\n blockKind: string;\n scope: 'entry' | 'template';\n content: Record<string, unknown> | null;\n};\n\n/** Template structure from API response */\ntype Template = {\n id: string;\n name: string;\n templateKey: string;\n blocks: TemplateBlock[];\n};\n\n/**\n * Processes an entry's template into a PageOutline format and prefetches block data.\n * Returns null templatePage if no valid template with blocks is available.\n */\nasync function processEntryTemplate(\n templates: Template[] | undefined,\n entry: ContentEntryData,\n context: { siteId: string; preview: boolean },\n client: RiverbankClient\n): Promise<{ templatePage: PageProps['page'] | null; resolvedData: ResolvedBlockData }> {\n const template = templates?.[0];\n\n // Templates without blocks are treated as \"no template\" - the entry should be\n // rendered with custom UI rather than an empty template page\n if (!template || !template.blocks?.length) {\n return { templatePage: null, resolvedData: {} };\n }\n\n // Convert template blocks to PageOutline format with validation\n const blocks = template.blocks.map((block) => validateAndConvertBlock(block, 'template'));\n\n const templatePage: PageProps['page'] = {\n name: template.name || 'Entry Template',\n path: entry.path || '/',\n purpose: 'entry-template',\n blocks,\n };\n\n // Prefetch block data for template\n const resolvedData = await prefetchBlockData(\n templatePage,\n {\n siteId: context.siteId,\n pageId: template.id,\n previewStage: context.preview ? 'preview' : 'published',\n },\n client\n );\n\n return { templatePage, resolvedData };\n}\n"],"mappings":"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","names":["resolvedData","content"]}