@riverbankcms/sdk 0.77.0 → 0.78.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 (237) hide show
  1. package/README.md +69 -0
  2. package/dist/{PreviewEditorSidebar-XSX7QKHQ.mjs → PreviewEditorSidebar-RIKFQ72L.mjs} +4916 -4847
  3. package/dist/{PreviewEditorUI-YZNEZ3QD.mjs → PreviewEditorUI-XO7TUWKK.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-LAGYMPNF.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +194 -184
  6. package/dist/_dts/api/src/accessAdmin.d.ts +5 -0
  7. package/dist/_dts/api/src/billing.d.ts +3 -26
  8. package/dist/_dts/api/src/bookingVerticals.d.ts +4 -0
  9. package/dist/_dts/api/src/content-editor.d.ts +1 -0
  10. package/dist/_dts/api/src/demoDashboardMutationSurfaces.d.ts +46 -0
  11. package/dist/_dts/api/src/endpoints.d.ts +8 -0
  12. package/dist/_dts/api/src/index.d.ts +14 -2
  13. package/dist/_dts/api/src/navigation/dashboardBookingsNav.d.ts +87 -0
  14. package/dist/_dts/api/src/navigation/dashboardDemoNav.d.ts +5 -0
  15. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +45 -0
  16. package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +42 -0
  17. package/dist/_dts/api/src/navigation/dashboardTeamMemberNav.d.ts +24 -0
  18. package/dist/_dts/api/src/navigation/linkUrlType.d.ts +3 -0
  19. package/dist/_dts/api/src/navigation.d.ts +12 -0
  20. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +55 -26
  21. package/dist/_dts/api/src/staffAccess.d.ts +79 -0
  22. package/dist/_dts/api/src/types.d.ts +3 -1
  23. package/dist/_dts/api/src/workflows/automaticWorkflowTriggers.d.ts +21 -0
  24. package/dist/_dts/blocks/src/client/site-chrome.d.ts +4 -1
  25. package/dist/_dts/blocks/src/customBlockRegistry.d.ts +20 -1
  26. package/dist/_dts/blocks/src/index.d.ts +3 -2
  27. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
  28. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
  29. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
  30. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
  31. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
  32. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +2 -2
  33. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +294 -289
  34. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
  35. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  36. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +21 -21
  37. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
  38. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
  39. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
  40. package/dist/_dts/blocks/src/system/blocks/site-header.d.ts +2 -2
  41. package/dist/_dts/blocks/src/system/data/index.d.ts +5 -3
  42. package/dist/_dts/blocks/src/system/data/previewResolvedDataState.d.ts +45 -0
  43. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +2 -1
  44. package/dist/_dts/blocks/src/system/fragments/library/faqAccordion.d.ts +5 -0
  45. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +5 -0
  46. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +29 -29
  47. package/dist/_dts/blocks/src/system/node/fragments/headingDecoration.d.ts +10 -0
  48. package/dist/_dts/blocks/src/system/node/fragments/index.d.ts +1 -0
  49. package/dist/_dts/blocks/src/system/node/fragments/styledSection.d.ts +9 -0
  50. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +3 -2
  51. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +8 -0
  52. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  53. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +43 -8
  54. package/dist/_dts/blocks/src/system/runtime/components/multi-step/runtimeFormValidation.d.ts +28 -0
  55. package/dist/_dts/blocks/src/system/runtime/header/shared.d.ts +8 -7
  56. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventCompactRow.d.ts +1 -4
  57. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +7 -0
  58. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.client.d.ts +2 -8
  59. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.server.d.ts +2 -9
  60. package/dist/_dts/blocks/src/system/runtime/nodes/shop-cart-discount-ui.d.ts +5 -0
  61. package/dist/_dts/blocks/src/system/runtime/nodes/shop-checkout-form.d.ts +76 -0
  62. package/dist/_dts/blocks/src/system/runtime/nodes/shop-checkout.state.d.ts +1 -4
  63. package/dist/_dts/blocks/src/system/runtime/nodes/shop-commerce-store.d.ts +2 -0
  64. package/dist/_dts/blocks/src/system/runtime/nodes/shop-commerce.shared.d.ts +1 -0
  65. package/dist/_dts/blocks/src/system/runtime/nodes/shop-discount-apply.state.d.ts +52 -0
  66. package/dist/_dts/blocks/src/system/runtime/nodes/shop.state.d.ts +2 -4
  67. package/dist/_dts/blocks/src/system/runtime/nodes/useDiscountApply.d.ts +21 -0
  68. package/dist/_dts/blocks/src/system/runtime/shared/components/DiscountCodeDisclosure.d.ts +54 -0
  69. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -0
  70. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +2 -2
  71. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +4 -4
  72. package/dist/_dts/blocks/src/system/transforms/registry/ui.d.ts +1 -1
  73. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +1 -1
  74. package/dist/_dts/content-editor/src/contentTypeEditorContentState.d.ts +26 -0
  75. package/dist/_dts/content-editor/src/definitions/factory.d.ts +75 -0
  76. package/dist/_dts/content-editor/src/entryWorkflows.d.ts +2 -0
  77. package/dist/_dts/content-editor/src/footerBlocksEditorState.d.ts +76 -0
  78. package/dist/_dts/content-editor/src/index.d.ts +5 -0
  79. package/dist/_dts/content-editor/src/pageWorkflowContent.d.ts +29 -0
  80. package/dist/_dts/content-model/src/content-types/schema.d.ts +3 -3
  81. package/dist/_dts/content-model/src/index.d.ts +1 -0
  82. package/dist/_dts/content-model/src/routeTemplate.d.ts +4 -0
  83. package/dist/_dts/content-model/src/templates/editorState.d.ts +25 -0
  84. package/dist/_dts/core/src/csv-cells.d.ts +10 -0
  85. package/dist/_dts/core/src/csv-date-filter.d.ts +27 -0
  86. package/dist/_dts/core/src/csv-escape.d.ts +1 -0
  87. package/dist/_dts/core/src/csv-filename.d.ts +18 -0
  88. package/dist/_dts/core/src/csv-render.d.ts +4 -0
  89. package/dist/_dts/core/src/csv-types.d.ts +116 -0
  90. package/dist/_dts/core/src/currency-format.d.ts +4 -0
  91. package/dist/_dts/core/src/demo-capability-policy.d.ts +29 -0
  92. package/dist/_dts/core/src/demo-claim-access.d.ts +14 -0
  93. package/dist/_dts/core/src/demo-lifecycle-status.d.ts +11 -0
  94. package/dist/_dts/core/src/demo-runtime.d.ts +47 -0
  95. package/dist/_dts/core/src/duration.d.ts +14 -0
  96. package/dist/_dts/core/src/email-format.d.ts +10 -0
  97. package/dist/_dts/core/src/field-errors.d.ts +1 -0
  98. package/dist/_dts/core/src/form-submission-preview.d.ts +24 -0
  99. package/dist/_dts/core/src/index.d.ts +20 -0
  100. package/dist/_dts/core/src/number-input.d.ts +22 -0
  101. package/dist/_dts/core/src/public-url-validation.d.ts +12 -0
  102. package/dist/_dts/core/src/slug.d.ts +39 -0
  103. package/dist/_dts/core/src/string.d.ts +19 -0
  104. package/dist/_dts/core/src/uuid.d.ts +6 -0
  105. package/dist/_dts/db/src/schemas/forms.d.ts +50 -50
  106. package/dist/_dts/media-core/src/assetsInUseSummary.d.ts +34 -0
  107. package/dist/_dts/media-core/src/bulkDeletePlanning.d.ts +24 -0
  108. package/dist/_dts/media-core/src/canonicalCropReview.d.ts +66 -0
  109. package/dist/_dts/media-core/src/classifyAllPlanning.d.ts +48 -0
  110. package/dist/_dts/media-core/src/filename.d.ts +1 -0
  111. package/dist/_dts/media-core/src/index.d.ts +10 -0
  112. package/dist/_dts/media-core/src/mediaAssetUsageStatus.d.ts +47 -0
  113. package/dist/_dts/media-core/src/mediaSettingsState.d.ts +3 -0
  114. package/dist/_dts/media-core/src/portableMediaReferences.d.ts +38 -0
  115. package/dist/_dts/media-core/src/uploadVerificationContract.d.ts +28 -0
  116. package/dist/_dts/media-core/src/videoAssetRepair.d.ts +38 -0
  117. package/dist/_dts/media-editor/src/mediaEditorDebug.d.ts +1 -0
  118. package/dist/_dts/path-utils/src/index.d.ts +8 -0
  119. package/dist/_dts/path-utils/src/redirectPaths.d.ts +26 -0
  120. package/dist/_dts/path-utils/src/safeAppPath.d.ts +26 -0
  121. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeButton.d.ts +2 -1
  122. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +4 -0
  123. package/dist/_dts/preview-next/src/client/preview/previewDocumentFrame.d.ts +31 -0
  124. package/dist/_dts/sdk/src/client/error.d.ts +3 -0
  125. package/dist/_dts/sdk/src/client/index.d.ts +2 -2
  126. package/dist/_dts/sdk/src/client/types.d.ts +37 -19
  127. package/dist/_dts/sdk/src/contracts/theme.d.ts +1 -1
  128. package/dist/_dts/sdk/src/index.d.ts +2 -2
  129. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +16 -16
  130. package/dist/_dts/sdk/src/next/content-load-failure.d.ts +51 -0
  131. package/dist/_dts/sdk/src/next/index.d.ts +2 -1
  132. package/dist/_dts/sdk/src/next/types.d.ts +19 -0
  133. package/dist/_dts/sdk/src/portal/redirects.d.ts +1 -1
  134. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +2 -2
  135. package/dist/_dts/sdk/src/routing/index.d.ts +3 -2
  136. package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +71 -6
  137. package/dist/_dts/sdk/src/version.d.ts +1 -1
  138. package/dist/_dts/site-commands/src/commands.d.ts +12 -12
  139. package/dist/_dts/site-commands/src/index.d.ts +1 -0
  140. package/dist/_dts/site-commands/src/pagePaths.d.ts +6 -0
  141. package/dist/_dts/theme-core/src/accordions/siteStyleDefaults.d.ts +26 -0
  142. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -0
  143. package/dist/_dts/theme-core/src/blocks/vars/index.d.ts +1 -0
  144. package/dist/_dts/theme-core/src/fonts/index.d.ts +1 -0
  145. package/dist/_dts/theme-core/src/fonts/uploadFormat.d.ts +44 -0
  146. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  147. package/dist/_dts/theme-core/src/index.d.ts +3 -1
  148. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +63 -51
  149. package/dist/_dts/theme-core/src/navigation/generateNavLinkCSS.d.ts +6 -1
  150. package/dist/_dts/theme-core/src/navigation/types.d.ts +12 -0
  151. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +3 -3
  152. package/dist/_dts/theme-core/src/runtime/themeCssVarNames.d.ts +7 -0
  153. package/dist/_dts/theme-core/src/schema.d.ts +90 -48
  154. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +214 -34
  155. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +5 -2
  156. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +214 -34
  157. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +25 -1
  158. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +35 -7
  159. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -4
  160. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +96 -34
  161. package/dist/_dts/theme-core/src/site-styles/rawStyleFields.d.ts +4 -2
  162. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +9 -1
  163. package/dist/_dts/theme-core/src/site-styles/types.d.ts +27 -2
  164. package/dist/_dts/theme-core/src/siteChrome.d.ts +17 -34
  165. package/dist/_dts/theme-core/src/siteChromeOverlayClearance.d.ts +22 -0
  166. package/dist/_dts/theme-core/src/siteChromePlacement.d.ts +22 -0
  167. package/dist/_dts/theme-core/src/siteChromePlanning.d.ts +32 -0
  168. package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +2 -2
  169. package/dist/{chunk-EAWHBECW.mjs → chunk-F7RTCZYN.mjs} +229 -50
  170. package/dist/{chunk-GSQX43EZ.mjs → chunk-NIDXI46P.mjs} +22 -41
  171. package/dist/{chunk-WLQBJN2Z.mjs → chunk-OECWLDHN.mjs} +4538 -1911
  172. package/dist/{chunk-VX7B5VAC.mjs → chunk-SVMMM2NA.mjs} +8 -0
  173. package/dist/{chunk-6SMUFTXD.mjs → chunk-SXOLGNMX.mjs} +1 -1
  174. package/dist/{chunk-ANKDYZ2E.mjs → chunk-TXDES5P2.mjs} +2 -2
  175. package/dist/cli/index.mjs +2036 -594
  176. package/dist/client/{accordion-RZMQSYLR.mjs → accordion-EVDEOUPR.mjs} +2 -2
  177. package/dist/client/{bookingForm-NF4ASVNV.mjs → bookingForm-DIHBLC64.mjs} +27 -30
  178. package/dist/client/bookings.mjs +3707 -259
  179. package/dist/client/{carousel-LDX47ZIK.mjs → carousel-FEBQHIWI.mjs} +3 -4
  180. package/dist/client/{cart-RGXDS5F4.mjs → cart-7CKSXAE4.mjs} +8 -8
  181. package/dist/client/{checkout-P7WWSNNY.mjs → checkout-WKYCANLV.mjs} +8 -8
  182. package/dist/client/{chunk-JNC7CGHX.mjs → chunk-2SAVKN2M.mjs} +2 -2
  183. package/dist/client/{chunk-TQ5MSPDX.mjs → chunk-36WJCERQ.mjs} +1 -1
  184. package/dist/client/{chunk-R56FQ3RR.mjs → chunk-65F47D7Y.mjs} +280 -71
  185. package/dist/client/{chunk-L3DNHIJX.mjs → chunk-GUK2FPXQ.mjs} +23 -45
  186. package/dist/client/{chunk-PMAIXMAB.mjs → chunk-IVNCUVAV.mjs} +26 -21
  187. package/dist/client/{chunk-II7O4XN3.mjs → chunk-OFMSCGNY.mjs} +2 -2
  188. package/dist/client/chunk-PD6NBCEY.mjs +66 -0
  189. package/dist/client/{chunk-GMVTOKYG.mjs → chunk-RV6FX7UH.mjs} +510 -64
  190. package/dist/client/{chunk-E2TDNXCL.mjs → chunk-RZDWX7QW.mjs} +2 -1
  191. package/dist/client/{chunk-M3L3KYYR.mjs → chunk-UDNSI5PY.mjs} +12 -0
  192. package/dist/client/{chunk-JEZECJ3W.mjs → chunk-VPPMNXCF.mjs} +129 -3
  193. package/dist/client/{chunk-UFSWADAO.mjs → chunk-YDSEG6GZ.mjs} +5 -66
  194. package/dist/client/client.mjs +8983 -6152
  195. package/dist/client/{courseRegistration-7F65K5ZR.mjs → courseRegistration-5QF2PHKM.mjs} +14 -11
  196. package/dist/client/{eventCalendar-GLSC5KTL.mjs → eventCalendar-4ZOSETDU.mjs} +9 -9
  197. package/dist/client/{eventCombined-ZHK4WKUR.mjs → eventCombined-WQGU7JUX.mjs} +9 -9
  198. package/dist/client/{eventDetails-E3PJYBIN.mjs → eventDetails-AYWVUJ5Y.mjs} +9 -9
  199. package/dist/client/{eventListing-EMS3WC3E.mjs → eventListing-NT7C6UT5.mjs} +9 -9
  200. package/dist/client/{eventRegistration-NZOTVNPI.mjs → eventRegistration-OH24F4ZJ.mjs} +9 -9
  201. package/dist/client/{form-ETFZFATW.mjs → form-7L42SRBB.mjs} +6 -6
  202. package/dist/client/{headerSection-4LBP7ULT.mjs → headerSection-OZRZNZ52.mjs} +3 -3
  203. package/dist/client/hooks.mjs +1388 -427
  204. package/dist/client/{locationMap-5M655YSJ.mjs → locationMap-ZBXRPQ7C.mjs} +2 -2
  205. package/dist/client/{newsletterForm-QOUYW44O.mjs → newsletterForm-SNAGFF2I.mjs} +3 -3
  206. package/dist/client/{productDetail-O4DOCWQG.mjs → productDetail-I46BOFGV.mjs} +8 -8
  207. package/dist/client/{productList-A5RO5WIS.mjs → productList-BOYHTYI6.mjs} +8 -8
  208. package/dist/client/rendering/client.mjs +7090 -2645
  209. package/dist/client/rendering/islands.mjs +19 -19
  210. package/dist/client/rendering.mjs +7395 -4767
  211. package/dist/client/{shop-L4MZH4I2.mjs → shop-XTXPZTKR.mjs} +8 -8
  212. package/dist/preview-next/before-render.mjs +8 -0
  213. package/dist/preview-next/client/runtime.mjs +5 -5
  214. package/dist/preview-next/editor-chrome.css +10 -0
  215. package/dist/preview-next/middleware.mjs +8 -0
  216. package/dist/{sdk-runtime-Q6MTR4KL.mjs → sdk-runtime-ZJLKC6DR.mjs} +6 -6
  217. package/dist/server/components.mjs +4175 -2480
  218. package/dist/server/config-validation.mjs +1619 -658
  219. package/dist/server/config.mjs +1619 -658
  220. package/dist/server/data.mjs +1388 -427
  221. package/dist/server/index.mjs +488 -246
  222. package/dist/server/next.mjs +5607 -3354
  223. package/dist/server/page-converter.mjs +912 -259
  224. package/dist/server/prebuild.mjs +1 -1
  225. package/dist/server/rendering/server.mjs +4176 -2481
  226. package/dist/server/rendering.mjs +4194 -2486
  227. package/dist/server/routing.mjs +2078 -639
  228. package/dist/server/server.mjs +1886 -685
  229. package/dist/server/theme-bridge.mjs +4441 -1300
  230. package/dist/server/theme.mjs +89 -12
  231. package/dist/styles/index.css +1576 -1083
  232. package/package.json +2 -1
  233. package/dist/SdkPreviewModeRuntime-5FS5E6BI.mjs +0 -8
  234. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/DiscountCodeSection.d.ts +0 -7
  235. package/dist/_dts/preview-next/src/client/widgets/PreviewMediaField.d.ts +0 -4
  236. package/dist/client/chunk-OJPZEZU2.mjs +0 -31
  237. package/dist/client/chunk-RTZ3JKKX.mjs +0 -178
@@ -0,0 +1,25 @@
1
+ import type { TemplateBindingValue } from './types';
2
+ export type TemplateEditorBindingDescriptor = TemplateBindingValue | Record<string, unknown>;
3
+ export type TemplateEditorBindings = Record<string, TemplateEditorBindingDescriptor>;
4
+ export type TemplateEditorBlockBindings = Record<string, TemplateEditorBindings>;
5
+ export type TemplateEditorBlockBindingSource = Readonly<{
6
+ id: string;
7
+ scope: string;
8
+ bindings?: Record<string, unknown> | null;
9
+ }>;
10
+ export type ParsedTemplateEditorBindings = Readonly<{
11
+ ok: true;
12
+ bindings: TemplateEditorBindings;
13
+ }> | Readonly<{
14
+ ok: false;
15
+ message: string;
16
+ }>;
17
+ export declare function normalizeTemplateEditorBindings(bindings: Record<string, unknown> | null | undefined): TemplateEditorBindings;
18
+ export declare function serializeTemplateEditorBindingsJson(bindings: TemplateEditorBindings): string;
19
+ export declare function parseTemplateEditorBindingsJson(jsonValue: string): ParsedTemplateEditorBindings;
20
+ export declare function mergeTemplateBindingEdits(currentBindings: TemplateEditorBindings, editedBindings: TemplateEditorBindings): TemplateEditorBindings;
21
+ export declare function setTemplateEditorBinding(bindings: TemplateEditorBindings, propId: string, binding: TemplateEditorBindingDescriptor): TemplateEditorBindings;
22
+ export declare function removeTemplateEditorBinding(bindings: TemplateEditorBindings, propId: string): TemplateEditorBindings;
23
+ export declare function createEntryTemplateBindingRecords(blocks: readonly TemplateEditorBlockBindingSource[]): TemplateEditorBlockBindings;
24
+ export declare function setTemplateBlockBinding(allBindings: TemplateEditorBlockBindings, blockId: string, propId: string, binding: TemplateEditorBindingDescriptor): TemplateEditorBlockBindings;
25
+ export declare function removeTemplateBlockBinding(allBindings: TemplateEditorBlockBindings, blockId: string, propId: string): TemplateEditorBlockBindings;
@@ -0,0 +1,10 @@
1
+ import type { CsvCell } from './csv-types';
2
+ export declare const csvEmptyCell: () => CsvCell;
3
+ export declare const csvTextCell: (value: string | null | undefined) => CsvCell;
4
+ export declare const csvIntegerCell: (value: number | null | undefined) => CsvCell;
5
+ export declare const csvDecimalCell: (value: number | null | undefined, decimals: number) => CsvCell;
6
+ export declare const csvMoneyCentsCell: (cents: number | null | undefined, currency: string | null | undefined) => CsvCell;
7
+ export declare const csvIsoDateCell: (value: string | null | undefined) => CsvCell;
8
+ export declare const csvIsoDateTimeCell: (value: string | null | undefined) => CsvCell;
9
+ export declare const csvBooleanCell: (value: boolean | null | undefined) => CsvCell;
10
+ export declare function formatCsvCell(cell: CsvCell): string;
@@ -0,0 +1,27 @@
1
+ import type { CsvExportDatePolicy, CsvExportId, ExportDateBasis, ExportDateFilterError, ExportDateRange, ResolvedExportDateWindow } from './csv-types';
2
+ export type ResolveExportDateWindowInput = Readonly<{
3
+ exportId: CsvExportId;
4
+ policy: CsvExportDatePolicy;
5
+ range: ExportDateRange;
6
+ requestedBasis?: ExportDateBasis;
7
+ timeZone: string;
8
+ today?: Date;
9
+ }>;
10
+ export type ResolveExportDateWindowInputFor<Basis extends ExportDateBasis> = Readonly<{
11
+ exportId: CsvExportId;
12
+ policy: CsvExportDatePolicy<Basis>;
13
+ range: ExportDateRange;
14
+ requestedBasis?: Basis;
15
+ timeZone: string;
16
+ today?: Date;
17
+ }>;
18
+ export type ResolveExportDateWindowResult<Basis extends ExportDateBasis = ExportDateBasis> = Readonly<{
19
+ ok: true;
20
+ window: ResolvedExportDateWindow<Basis>;
21
+ }> | Readonly<{
22
+ ok: false;
23
+ error: ExportDateFilterError;
24
+ }>;
25
+ export declare function resolveExportDateWindow<Basis extends ExportDateBasis>(input: ResolveExportDateWindowInputFor<Basis>): ResolveExportDateWindowResult<Basis>;
26
+ export declare function resolveExportDateWindow(input: ResolveExportDateWindowInput): ResolveExportDateWindowResult;
27
+ export declare function describeExportDateBasis(basis: ExportDateBasis): string;
@@ -0,0 +1 @@
1
+ export declare function csvEscape(value: string): string;
@@ -0,0 +1,18 @@
1
+ import type { SafeCsvFilename } from './csv-types';
2
+ export type SafeCsvFilenameResult = Readonly<{
3
+ ok: true;
4
+ filename: SafeCsvFilename;
5
+ }> | Readonly<{
6
+ ok: false;
7
+ filename: string;
8
+ }>;
9
+ export declare function toSafeCsvFilename(value: string): SafeCsvFilenameResult;
10
+ export declare function assertSafeCsvFilename(value: string): SafeCsvFilename;
11
+ export declare const unsafeCsvFilename: typeof assertSafeCsvFilename;
12
+ export declare function csvFilenameDateRange(input: Readonly<{
13
+ from?: string | null;
14
+ to?: string | null;
15
+ fallback?: string | null;
16
+ prefix?: string | null;
17
+ }>): string;
18
+ export declare function contentDispositionForCsv(filename: SafeCsvFilename): string;
@@ -0,0 +1,4 @@
1
+ import type { CsvColumn, CsvColumnSensitivity, CsvRenderResult, RenderCsvInput, RenderCsvError } from './csv-types';
2
+ export declare function renderCsvExport<Row, Options>(input: RenderCsvInput<Row, Options>): CsvRenderResult;
3
+ export declare function collectCsvColumnSensitivities<Row>(columns: readonly CsvColumn<Row>[]): ReadonlySet<CsvColumnSensitivity>;
4
+ export declare function describeRenderCsvError(error: RenderCsvError): string;
@@ -0,0 +1,116 @@
1
+ import type { Brand, MoneyDateString } from './branded';
2
+ export type CsvExportId = Brand<string, 'CsvExportId'>;
3
+ export type CsvColumnKey = Brand<string, 'CsvColumnKey'>;
4
+ export type SafeCsvFilename = Brand<string, 'SafeCsvFilename'>;
5
+ export type ExportRowLimit = Brand<number, 'ExportRowLimit'>;
6
+ export type CsvColumnSensitivity = 'standard' | 'personal' | 'financial' | 'sensitive';
7
+ export type CsvCell = Readonly<{
8
+ kind: 'empty';
9
+ }> | Readonly<{
10
+ kind: 'text';
11
+ value: string;
12
+ }> | Readonly<{
13
+ kind: 'integer';
14
+ value: number;
15
+ }> | Readonly<{
16
+ kind: 'decimal';
17
+ value: number;
18
+ decimals: number;
19
+ }> | Readonly<{
20
+ kind: 'moneyCents';
21
+ cents: number;
22
+ currency: string;
23
+ }> | Readonly<{
24
+ kind: 'isoDate';
25
+ value: string;
26
+ }> | Readonly<{
27
+ kind: 'isoDateTime';
28
+ value: string;
29
+ }> | Readonly<{
30
+ kind: 'boolean';
31
+ value: boolean;
32
+ }>;
33
+ export type CsvColumn<Row> = Readonly<{
34
+ key: CsvColumnKey;
35
+ header: string;
36
+ sensitivity: CsvColumnSensitivity;
37
+ cell: (row: Row) => CsvCell;
38
+ }>;
39
+ export type CsvExportDefinition<Row, Options> = Readonly<{
40
+ id: CsvExportId;
41
+ filename: (options: Options) => string;
42
+ columns: (options: Options) => readonly CsvColumn<Row>[];
43
+ maxRows: ExportRowLimit;
44
+ }>;
45
+ export type RenderCsvInput<Row, Options> = Readonly<{
46
+ definition: CsvExportDefinition<Row, Options>;
47
+ rows: readonly Row[];
48
+ options: Options;
49
+ }>;
50
+ export type RenderCsvError = Readonly<{
51
+ tag: 'too_many_rows';
52
+ maxRows: number;
53
+ actualRows: number;
54
+ }> | Readonly<{
55
+ tag: 'duplicate_column_key';
56
+ key: string;
57
+ }> | Readonly<{
58
+ tag: 'invalid_filename';
59
+ filename: string;
60
+ }>;
61
+ export type CsvRenderResult = Readonly<{
62
+ ok: true;
63
+ csv: string;
64
+ filename: SafeCsvFilename;
65
+ rowCount: number;
66
+ sensitivities: ReadonlySet<CsvColumnSensitivity>;
67
+ }> | Readonly<{
68
+ ok: false;
69
+ error: RenderCsvError;
70
+ }>;
71
+ export type ExportDateBasis = 'created_at' | 'scheduled_at' | 'cancelled_at' | 'paid_at' | 'processed_at';
72
+ export type ExportDatePreset = '7d' | '30d' | '90d' | '365d' | 'all';
73
+ export type ExportDateRange = Readonly<{
74
+ kind: 'preset';
75
+ preset: ExportDatePreset;
76
+ }> | Readonly<{
77
+ kind: 'custom';
78
+ from?: string;
79
+ to?: string;
80
+ }>;
81
+ export type ResolvedExportDateWindow<Basis extends ExportDateBasis = ExportDateBasis> = Readonly<{
82
+ basis: Basis;
83
+ from: MoneyDateString;
84
+ to: MoneyDateString;
85
+ timeZone: string;
86
+ }>;
87
+ export type CsvExportDatePolicy<Basis extends ExportDateBasis = ExportDateBasis> = Readonly<{
88
+ supportedDateBases: readonly Basis[];
89
+ defaultDateBasis: Basis;
90
+ }>;
91
+ export type ExportDateFilterError = Readonly<{
92
+ tag: 'unsupported_date_basis';
93
+ basis: ExportDateBasis;
94
+ exportId: CsvExportId;
95
+ }> | Readonly<{
96
+ tag: 'invalid_date';
97
+ field: 'from' | 'to';
98
+ value: string;
99
+ }> | Readonly<{
100
+ tag: 'partial_custom_range';
101
+ }> | Readonly<{
102
+ tag: 'invalid_date_range';
103
+ from: MoneyDateString;
104
+ to: MoneyDateString;
105
+ }>;
106
+ export type MoneyExportCurrencyPolicy = Readonly<{
107
+ kind: 'single_currency';
108
+ currency: string;
109
+ }> | Readonly<{
110
+ kind: 'group_by_currency';
111
+ }> | Readonly<{
112
+ kind: 'reject_mixed_currency';
113
+ }>;
114
+ export declare function asCsvExportId(value: string): CsvExportId;
115
+ export declare function asCsvColumnKey(value: string): CsvColumnKey;
116
+ export declare function asExportRowLimit(value: number): ExportRowLimit;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Format minor currency units using the locale customers expect for that code.
3
+ */
4
+ export declare function formatCurrencyAmount(amountCents: number, currency: string): string;
@@ -0,0 +1,29 @@
1
+ import { type DemoCapability } from './index';
2
+ export declare const demoSurfaceClassificationValues: readonly ["allowed", "blocked-hidden", "blocked-disabled", "internal-only", "needs-classification"];
3
+ export type DemoSurfaceClassification = (typeof demoSurfaceClassificationValues)[number];
4
+ export type DemoRestrictionReason = 'surface_not_classified' | 'dangerous_surface' | 'internal_only' | 'claim_not_active';
5
+ export type DemoCapabilityDecision = Readonly<{
6
+ allowed: true;
7
+ classification: Extract<DemoSurfaceClassification, 'allowed'>;
8
+ }> | Readonly<{
9
+ allowed: false;
10
+ classification: DemoSurfaceClassification;
11
+ reason: DemoRestrictionReason;
12
+ surface: DemoCapability;
13
+ }>;
14
+ export type DemoClaimAccessState = Readonly<{
15
+ kind: 'active';
16
+ }> | Readonly<{
17
+ kind: 'expired';
18
+ }> | Readonly<{
19
+ kind: 'released';
20
+ }> | Readonly<{
21
+ kind: 'missing';
22
+ }>;
23
+ export type DemoCapabilityPolicyInput = Readonly<{
24
+ surface: DemoCapability;
25
+ classification: DemoSurfaceClassification;
26
+ claim: DemoClaimAccessState;
27
+ }>;
28
+ /** Evaluates a classified demo mutation surface and fails closed for inactive claims or unknown surfaces. */
29
+ export declare function evaluateDemoCapability(input: DemoCapabilityPolicyInput): DemoCapabilityDecision;
@@ -0,0 +1,14 @@
1
+ import type { DemoClaimAccessState } from './demo-capability-policy';
2
+ import type { DemoClaimStatus, DemoInstanceStatus } from './demo-lifecycle-status';
3
+ export type DemoClaimAccessInstance = Readonly<{
4
+ status: DemoInstanceStatus;
5
+ }>;
6
+ export type DemoClaimAccessClaim = Readonly<{
7
+ status: DemoClaimStatus;
8
+ expiresAt: string;
9
+ }> | null;
10
+ export declare function deriveDemoClaimAccessState(input: Readonly<{
11
+ instance: DemoClaimAccessInstance;
12
+ claim: DemoClaimAccessClaim;
13
+ now: Date;
14
+ }>): DemoClaimAccessState;
@@ -0,0 +1,11 @@
1
+ export declare const demoBlueprintStatusValues: readonly ["draft", "published", "archived"];
2
+ export type DemoBlueprintStatus = (typeof demoBlueprintStatusValues)[number];
3
+ export declare const demoInstanceStatusValues: readonly ["warming", "available", "claimed", "expired", "recycling", "failed"];
4
+ export type DemoInstanceStatus = (typeof demoInstanceStatusValues)[number];
5
+ export declare const demoClaimStatusValues: readonly ["active", "expired", "released"];
6
+ export type DemoClaimStatus = (typeof demoClaimStatusValues)[number];
7
+ export declare const demoBlueprintArtifactKindValues: readonly ["site_backup", "manual_snapshot"];
8
+ export type DemoBlueprintArtifactKind = (typeof demoBlueprintArtifactKindValues)[number];
9
+ export declare function narrowDemoInstanceStatus(value: string): DemoInstanceStatus;
10
+ export declare function narrowDemoClaimStatus(value: string): DemoClaimStatus;
11
+ export declare function narrowDemoBlueprintArtifactKind(value: string): DemoBlueprintArtifactKind;
@@ -0,0 +1,47 @@
1
+ export declare const RIVERBANK_RUNTIME_ENV_VAR = "RIVERBANK_RUNTIME_ENV";
2
+ export declare const riverbankRuntimeEnvValues: readonly ["production", "staging", "demo"];
3
+ export type RiverbankRuntimeEnv = (typeof riverbankRuntimeEnvValues)[number];
4
+ export type RiverbankRuntime = Readonly<{
5
+ kind: 'production';
6
+ demoAllowed: false;
7
+ }> | Readonly<{
8
+ kind: 'staging';
9
+ demoAllowed: false;
10
+ }> | Readonly<{
11
+ kind: 'demo';
12
+ demoAllowed: true;
13
+ }>;
14
+ export type RiverbankRuntimeResolution = Readonly<{
15
+ kind: 'resolved';
16
+ runtime: RiverbankRuntime;
17
+ }> | Readonly<{
18
+ kind: 'invalid';
19
+ error: RiverbankRuntimeResolutionError;
20
+ }>;
21
+ export type RiverbankRuntimeResolutionError = Readonly<{
22
+ kind: 'missing_runtime_env';
23
+ envVar: typeof RIVERBANK_RUNTIME_ENV_VAR;
24
+ }> | Readonly<{
25
+ kind: 'unsupported_runtime_env';
26
+ envVar: typeof RIVERBANK_RUNTIME_ENV_VAR;
27
+ rawValue: string;
28
+ normalizedValue: string;
29
+ supportedValues: readonly RiverbankRuntimeEnv[];
30
+ }>;
31
+ export type DemoRuntimeRequirement = Readonly<{
32
+ allowed: true;
33
+ runtime: Extract<RiverbankRuntime, {
34
+ kind: 'demo';
35
+ }>;
36
+ }> | Readonly<{
37
+ allowed: false;
38
+ reason: DemoRuntimeRequirementDenialReason;
39
+ runtime?: Exclude<RiverbankRuntime, {
40
+ kind: 'demo';
41
+ }>;
42
+ error?: RiverbankRuntimeResolutionError;
43
+ }>;
44
+ export type DemoRuntimeRequirementDenialReason = 'missing_runtime_env' | 'unsupported_runtime_env' | 'not_demo_runtime';
45
+ export declare function parseRiverbankRuntimeEnv(rawValue: string | null | undefined): RiverbankRuntimeResolution;
46
+ export declare function resolveRiverbankRuntimeEnv(env: Readonly<Record<string, string | undefined>>): RiverbankRuntimeResolution;
47
+ export declare function requireDemoRuntime(resolution: RiverbankRuntimeResolution): DemoRuntimeRequirement;
@@ -0,0 +1,14 @@
1
+ export type DurationUnit = 'minutes' | 'hours' | 'days' | 'weeks';
2
+ export declare const DURATION_UNIT_MINUTES: Record<DurationUnit, number>;
3
+ export declare function formatDurationUnitLabel(unit: DurationUnit, count: number): string;
4
+ /**
5
+ * Picks the coarsest allowed unit that cleanly divides `minutes`. Falls back
6
+ * to the smallest allowed unit when no clean divisor exists.
7
+ */
8
+ export declare function pickDurationDisplayUnit(minutes: number, allowed: readonly DurationUnit[]): DurationUnit;
9
+ /**
10
+ * Guarantees the widget invariant `displayValue x unit === storedMinutes` is
11
+ * representable by prepending minutes when no caller-provided unit divides.
12
+ */
13
+ export declare function expandAllowedDurationUnits(value: number, base: readonly DurationUnit[]): readonly DurationUnit[];
14
+ export declare function clampDurationMinutes(value: number, min: number | undefined, max: number | undefined): number;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Mask an email address for display purposes.
3
+ * Shows first and last characters of the local part with asterisks in between.
4
+ * Example: "john.doe@example.com" -> "j******e@example.com"
5
+ * For 1-2 character local parts, preserve only the first character and append "***"
6
+ * so very short addresses do not leak disproportionate detail.
7
+ */
8
+ export declare function maskEmail(email: string): string;
9
+ export declare function maskEmail(email: null): null;
10
+ export declare function maskEmail(email: string | null): string | null;
@@ -0,0 +1 @@
1
+ export declare function clearFieldError<TField extends string, TErrors extends Partial<Record<TField, string>>>(errors: TErrors, field: TField): TErrors;
@@ -0,0 +1,24 @@
1
+ type SchemaField = {
2
+ id: string;
3
+ label?: string | null;
4
+ type?: string | null;
5
+ required?: boolean | null;
6
+ };
7
+ type SubmissionRow = {
8
+ dataJson: Record<string, unknown> | null;
9
+ };
10
+ export type SubmissionPreviewField = {
11
+ id: string;
12
+ label: string;
13
+ type: string;
14
+ };
15
+ export declare const FORM_SUBMISSION_PSEUDO_FIELD_ID = "submission";
16
+ export declare const HIDDEN_FIELD_IDS: Set<string>;
17
+ export declare function selectSubmissionPreviewFields(schemaFields: unknown, submissions: SubmissionRow[]): SubmissionPreviewField[];
18
+ export declare function humanizeSubmissionFieldKey(input: string): string;
19
+ export declare function orderSubmissionFields(schemaFields: SchemaField[] | undefined, data: Record<string, unknown> | null): {
20
+ id: string;
21
+ label: string;
22
+ value: unknown;
23
+ }[];
24
+ export {};
@@ -1,5 +1,10 @@
1
1
  export * from "./branded";
2
2
  export * from "./date-math";
3
+ export * from "./duration";
4
+ export * from "./demo-capability-policy";
5
+ export * from "./demo-claim-access";
6
+ export * from "./demo-lifecycle-status";
7
+ export * from "./demo-runtime";
3
8
  export * from "./collections";
4
9
  export * from "./event-pricing";
5
10
  export * from "./money-input";
@@ -21,5 +26,20 @@ export * from "./sensitive-collection";
21
26
  export * from "./assertNever";
22
27
  export * from "./participants";
23
28
  export * from "./participant-identity";
29
+ export * from "./public-url-validation";
30
+ export * from "./number-input";
31
+ export * from "./field-errors";
32
+ export * from "./form-submission-preview";
33
+ export * from "./csv-cells";
34
+ export * from "./csv-date-filter";
35
+ export * from "./csv-escape";
36
+ export * from "./csv-filename";
37
+ export * from "./csv-render";
38
+ export * from "./csv-types";
39
+ export * from "./currency-format";
40
+ export * from "./email-format";
41
+ export * from "./slug";
42
+ export * from "./string";
43
+ export * from "./uuid";
24
44
  export { disabledSelection, enabledSelection, plannerNoChange, plannerPatch, plannerUpdate, resolvePlanningDateInput, resolvePlanningNow, resolvePlanningNowDate, systemPlanningClock, } from "./planner";
25
45
  export type { DisabledSelection, EnabledSelection, OptionalSelection, PlannerNoChange, PlannerPatch, PlannerUpdate, PlanningClock, PlanningDateInput, PlanningTimeOptions, } from "./planner";
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Numeric form-input parsing helpers with preserve-prev semantics on
3
+ * NaN/empty/negative. Use these in `NumberInput.onChange` so empty input
4
+ * doesn't silently rewrite the user's value to 0.
5
+ *
6
+ * The caller skips the dispatch when `null` is returned; the input box
7
+ * keeps showing whatever the user typed (it's an uncontrolled native
8
+ * input from React's perspective until the next state change), and the
9
+ * dirty/saved state stays consistent.
10
+ */
11
+ /**
12
+ * Parse a `valueAsNumber` (from `<input type="number">`) into a finite
13
+ * non-negative integer, or `null` if the value is empty / NaN / negative.
14
+ * Fractional input is `Math.trunc`'d to an integer.
15
+ */
16
+ export declare function parseFiniteNonNegativeInt(value: number): number | null;
17
+ /**
18
+ * Parse a `valueAsNumber` into an integer bounded inclusive by `[min, max]`.
19
+ * Returns `null` for out-of-range or non-finite input — same preserve-prev
20
+ * pattern as `parseFiniteNonNegativeInt`.
21
+ */
22
+ export declare function parseBoundedInt(value: number, min: number, max: number): number | null;
@@ -0,0 +1,12 @@
1
+ export type PublicUrlProtocol = 'http:' | 'https:';
2
+ export type PublicUrlPortPolicy = 'standard-only' | 'any-valid';
3
+ export type PublicUrlValidationOptions = Readonly<{
4
+ allowedProtocols: readonly PublicUrlProtocol[];
5
+ portPolicy: PublicUrlPortPolicy;
6
+ errorFactory?: (message: string) => Error;
7
+ }>;
8
+ export declare function buildPublicUrlValidationError(message: string, errorFactory?: (message: string) => Error): Error;
9
+ export declare function isIpAddress(value: string): boolean;
10
+ export declare function isPrivateIp(ip: string): boolean;
11
+ export declare function assertAllowedPublicHostname(hostname: string, errorFactory?: (message: string) => Error): void;
12
+ export declare function assertAllowedPublicUrl(raw: string, options: PublicUrlValidationOptions): URL;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Convert a string to a URL-safe slug
3
+ *
4
+ * @param text - The text to slugify
5
+ * @returns URL-safe slug (lowercase, alphanumeric + hyphens)
6
+ *
7
+ * @example
8
+ * slugify("Initial Consultation") // "initial-consultation"
9
+ * slugify("90-Minute Deep Tissue") // "90-minute-deep-tissue"
10
+ * slugify("Reiki & Energy Healing") // "reiki-energy-healing"
11
+ */
12
+ export declare function slugify(text: string): string;
13
+ /**
14
+ * Generate a unique slug by appending a number if needed
15
+ *
16
+ * @param baseSlug - The base slug to make unique
17
+ * @param existingSlugs - Array of slugs already in use
18
+ * @returns Unique slug (adds -2, -3, etc. if needed)
19
+ *
20
+ * @example
21
+ * makeUniqueSlug("consultation", ["consultation"])
22
+ * // Returns: "consultation-2"
23
+ *
24
+ * makeUniqueSlug("consultation", ["consultation", "consultation-2"])
25
+ * // Returns: "consultation-3"
26
+ */
27
+ export declare function makeUniqueSlug(baseSlug: string, existingSlugs: string[]): string;
28
+ /**
29
+ * Generate a slug from text and ensure it's unique
30
+ *
31
+ * @param text - The text to slugify
32
+ * @param existingSlugs - Array of slugs already in use
33
+ * @returns Unique URL-safe slug
34
+ *
35
+ * @example
36
+ * generateUniqueSlug("Initial Consultation", ["initial-consultation"])
37
+ * // Returns: "initial-consultation-2"
38
+ */
39
+ export declare function generateUniqueSlug(text: string, existingSlugs: string[]): string;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * String utilities
3
+ */
4
+ /**
5
+ * Return the string value when the input is already a string, otherwise null.
6
+ */
7
+ export declare function asNullableString(value: unknown): string | null;
8
+ /**
9
+ * Return a non-empty string value, otherwise null.
10
+ */
11
+ export declare function asNonEmptyStringOrNull(value: unknown): string | null;
12
+ /**
13
+ * Trim a user-entered string and collapse blank values to null.
14
+ */
15
+ export declare function trimmedStringOrNull(value: string | null | undefined): string | null;
16
+ /**
17
+ * Capitalize the first character of a string
18
+ */
19
+ export declare function capitalize(str: string): string;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Validates whether a string matches UUID v4 format
3
+ * Format: 8-4-4-4-12 hexadecimal digits
4
+ * Example: 550e8400-e29b-41d4-a716-446655440000
5
+ */
6
+ export declare function isValidUuid(str: string): boolean;