@riverbankcms/sdk 0.60.0 → 0.60.1

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 (86) hide show
  1. package/README.md +20 -3
  2. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +1 -3
  3. package/dist/_dts/api/src/bookingRecords.d.ts +1 -0
  4. package/dist/_dts/api/src/endpoints.d.ts +1 -1
  5. package/dist/_dts/billing/src/plans/types.d.ts +27 -0
  6. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +1 -0
  7. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +173 -2
  8. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +24 -2
  9. package/dist/_dts/blocks/src/system/runtime/header/shared.d.ts +1 -0
  10. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.client.d.ts +1 -0
  11. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/AgendaEventCard.d.ts +2 -0
  12. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/DayEventsModal.d.ts +2 -1
  13. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventDetailModal.d.ts +2 -1
  14. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventModals.d.ts +2 -1
  15. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/WeekAgendaView.d.ts +1 -0
  16. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/WeekTimetableView.d.ts +1 -0
  17. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCapacity.d.ts +16 -0
  18. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/timetableModel.d.ts +2 -0
  19. package/dist/_dts/content-editor/src/index.d.ts +2 -2
  20. package/dist/_dts/content-editor/src/primitives/shared/activePreviewField.d.ts +9 -0
  21. package/dist/_dts/content-editor/src/primitives/shared/index.d.ts +1 -0
  22. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +10 -0
  23. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +3 -0
  24. package/dist/_dts/editor-blocks/src/BlockForm.d.ts +4 -0
  25. package/dist/_dts/editor-blocks/src/block-editor/BlockCard.d.ts +8 -5
  26. package/dist/_dts/editor-blocks/src/block-editor/BlockCardHeader.d.ts +7 -5
  27. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +2 -0
  28. package/dist/_dts/editor-blocks/src/block-editor/reorderControlMode.d.ts +3 -0
  29. package/dist/_dts/editor-blocks/src/block-editor/types.d.ts +4 -0
  30. package/dist/_dts/media-react/src/hooks/useApiMediaUploader.d.ts +14 -0
  31. package/dist/_dts/media-react/src/index.d.ts +1 -1
  32. package/dist/_dts/preview-next/src/client/index.d.ts +2 -0
  33. package/dist/_dts/preview-next/src/client/preview/PageDesignEditorStateContext.d.ts +11 -28
  34. package/dist/_dts/preview-next/src/client/preview/PreviewEditorUI.d.ts +1 -1
  35. package/dist/_dts/preview-next/src/client/preview/previewChromeSurface.d.ts +12 -0
  36. package/dist/_dts/preview-next/src/client/preview/previewCustomizeHistory.d.ts +41 -0
  37. package/dist/_dts/preview-next/src/client/preview/previewCustomizeRuntimePatch.d.ts +15 -0
  38. package/dist/_dts/preview-next/src/client/preview/previewCustomizeWorkflowState.d.ts +106 -0
  39. package/dist/_dts/preview-next/src/client/preview/previewUndoDomains.d.ts +34 -0
  40. package/dist/_dts/preview-next/src/client/preview/sidebarTabPreference.d.ts +2 -1
  41. package/dist/_dts/preview-next/src/client/preview/useOnboardingConfirmationCheck.d.ts +4 -9
  42. package/dist/_dts/preview-next/src/constants.d.ts +0 -1
  43. package/dist/_dts/preview-next/src/index.d.ts +1 -0
  44. package/dist/_dts/preview-next/src/onboarding-preview-planner.d.ts +89 -0
  45. package/dist/_dts/preview-next/src/route-contract.d.ts +37 -0
  46. package/dist/_dts/sdk/src/rendering/components/Block.d.ts +7 -76
  47. package/dist/_dts/sdk/src/rendering/components/Block.server.d.ts +9 -0
  48. package/dist/_dts/sdk/src/rendering/components/Block.shared.d.ts +78 -0
  49. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +5 -5
  50. package/dist/_dts/sdk/src/rendering/server.d.ts +2 -2
  51. package/dist/_dts/sdk/src/version.d.ts +1 -1
  52. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  53. package/dist/_dts/theme-core/src/index.d.ts +17 -16
  54. package/dist/_dts/theme-core/src/responsiveDisplay.d.ts +23 -0
  55. package/dist/_dts/theme-core/src/responsiveMode.d.ts +21 -0
  56. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  57. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorErrors.d.ts +1 -0
  58. package/dist/_dts/ui/src/command-multi-select.d.ts +2 -2
  59. package/dist/cli/index.mjs +120 -40
  60. package/dist/client/bookings.mjs +27 -0
  61. package/dist/client/client.mjs +889 -497
  62. package/dist/client/hooks.mjs +61 -21
  63. package/dist/client/rendering/client.mjs +319 -128
  64. package/dist/client/rendering/islands.mjs +122 -44
  65. package/dist/client/rendering.mjs +959 -486
  66. package/dist/preview-next/before-render.mjs +5525 -0
  67. package/dist/preview-next/client/runtime.mjs +104162 -102561
  68. package/dist/preview-next/constants.mjs +0 -2
  69. package/dist/preview-next/index.mjs +0 -2
  70. package/dist/preview-next/middleware.mjs +5535 -1
  71. package/dist/server/components.mjs +7880 -7522
  72. package/dist/server/config-validation.mjs +61 -21
  73. package/dist/server/config.mjs +61 -21
  74. package/dist/server/data.mjs +61 -21
  75. package/dist/server/index.mjs +2 -2
  76. package/dist/server/next.mjs +783 -429
  77. package/dist/server/page-converter.mjs +60 -20
  78. package/dist/server/prebuild.mjs +1 -1
  79. package/dist/server/rendering/server.mjs +2461 -837
  80. package/dist/server/rendering.mjs +9276 -8840
  81. package/dist/server/routing.mjs +102 -39
  82. package/dist/server/server.mjs +62 -22
  83. package/dist/server/theme-bridge.mjs +639 -358
  84. package/dist/styles/index.css +343 -299
  85. package/package.json +1 -1
  86. package/dist/_dts/preview-next/src/client/blocks/runOptimisticCustomizeAction.d.ts +0 -21
package/README.md CHANGED
@@ -826,7 +826,7 @@ import type {
826
826
 
827
827
  The `Layout` component renders the site header, footer, and wraps your page content. Use this when you want consistent site chrome across all pages.
828
828
 
829
- `Layout` is a pure Server Component. The default `@riverbankcms/sdk/rendering` `Page` surface hydrates CMS islands automatically, and `createCatchAllPage()` keeps doing the same for the canonical Next.js catch-all flow. If you intentionally use the strict `@riverbankcms/sdk/rendering/server` surface, or otherwise bypass the default `Page` seam, mount `BlocksIslandsHydrator` explicitly when you need interactive CMS islands:
829
+ `Layout` is a pure Server Component. The default `@riverbankcms/sdk/rendering` `Page` and `Block` surfaces hydrate CMS islands automatically, and `createCatchAllPage()` keeps doing the same for the canonical Next.js catch-all flow. If you intentionally use the strict `@riverbankcms/sdk/rendering/server` surface, mount `BlocksIslandsHydrator` explicitly when you need interactive CMS islands:
830
830
 
831
831
  ```tsx
832
832
  import { Layout } from '@riverbankcms/sdk/rendering/server';
@@ -980,12 +980,12 @@ export default async function MyPage() {
980
980
 
981
981
  ## Block Component
982
982
 
983
- The `Block` component renders individual CMS blocks. Use this when you want to mix CMS content with custom JSX, or render blocks outside of a full page context.
983
+ The `Block` component renders individual CMS blocks. Use this when you want to mix CMS content with custom JSX, or render blocks outside of a full page context. The default `@riverbankcms/sdk/rendering` `Block` surface hydrates interactive CMS islands automatically. If you import `Block` from `@riverbankcms/sdk/rendering/server`, you are choosing the strict bootstrap-free surface and must mount `BlocksIslandsHydrator` yourself for interactive blocks.
984
984
 
985
985
  ### Basic Block Rendering
986
986
 
987
987
  ```tsx
988
- import { Block } from '@riverbankcms/sdk';
988
+ import { Block } from '@riverbankcms/sdk/rendering';
989
989
 
990
990
  export default async function CustomPage() {
991
991
  const siteData = await client.getSite({ slug: 'my-site' });
@@ -1028,6 +1028,23 @@ Blocks can automatically load their data (e.g., blog posts, products) if they ha
1028
1028
  />
1029
1029
  ```
1030
1030
 
1031
+ Interactive blocks such as forms, bookings, events, and commerce also need the CMS API base URL so the hydrated island can submit requests:
1032
+
1033
+ ```tsx
1034
+ import { getRiverbankEnv } from '@riverbankcms/sdk/env';
1035
+
1036
+ const { baseUrl } = getRiverbankEnv();
1037
+
1038
+ <Block
1039
+ blockKind="block.checkout"
1040
+ blockId="checkout-block"
1041
+ content={{ heading: 'Checkout' }}
1042
+ theme={siteData.theme}
1043
+ siteId={siteData.site.id}
1044
+ apiBaseUrl={baseUrl}
1045
+ />
1046
+ ```
1047
+
1031
1048
  ### Advanced Block Options
1032
1049
 
1033
1050
  ```tsx
@@ -315,9 +315,7 @@ export type BookingManagementAPIEndpoints = {
315
315
  siteId: string;
316
316
  resourceId: string;
317
317
  }, void>;
318
- googleCalendarCallback: APIEndpoint<never, {
319
- siteId: string;
320
- }, void>;
318
+ googleCalendarCallback: APIEndpoint<never, never, void>;
321
319
  getAvailableSlots: APIEndpoint<GetAvailableSlotsQuery, {
322
320
  siteId: string;
323
321
  } & GetAvailableSlotsQuery, GetAvailableSlotsResponse>;
@@ -663,6 +663,7 @@ export type BookingActivityListItem = {
663
663
  type: BookingActivityType;
664
664
  category: BookingActivityCategory;
665
665
  description: string;
666
+ participantId: string | null;
666
667
  customer: SiteCustomerRecord | null;
667
668
  relatedCustomer: SiteCustomerRecord | null;
668
669
  amountCents: number | null;
@@ -912,7 +912,7 @@ export declare const API_ENDPOINTS: {
912
912
  readonly responseKind: "void";
913
913
  };
914
914
  readonly googleCalendarCallback: {
915
- readonly path: "/sites/{siteId}/bookings/calendar/google/callback";
915
+ readonly path: "/bookings/calendar/google/callback";
916
916
  readonly method: "GET";
917
917
  readonly auth: "user";
918
918
  readonly responseKind: "void";
@@ -1,4 +1,29 @@
1
1
  export type BillingInterval = 'monthly' | 'annual';
2
+ declare const storageBytesBrand: unique symbol;
3
+ export type StorageBytes = number & {
4
+ readonly [storageBytesBrand]: 'StorageBytes';
5
+ };
6
+ export type StorageByteParseError = 'invalid-storage-bytes';
7
+ export type StorageByteParseResult = Readonly<{
8
+ ok: true;
9
+ value: StorageBytes;
10
+ }> | Readonly<{
11
+ ok: false;
12
+ error: StorageByteParseError;
13
+ }>;
14
+ export type StorageQuota = Readonly<{
15
+ tag: 'limited';
16
+ maxBytes: StorageBytes;
17
+ }> | Readonly<{
18
+ tag: 'unlimited';
19
+ }>;
20
+ export declare function asStorageBytes(value: number): StorageByteParseResult;
21
+ export declare function unsafeStorageBytes(value: number): StorageBytes;
22
+ export declare function storageMegabytes(value: number): StorageBytes;
23
+ export declare function storageGigabytes(value: number): StorageBytes;
24
+ export declare function limitedStorageQuota(maxBytes: StorageBytes): StorageQuota;
25
+ export declare function formatStorageBytes(bytes: StorageBytes): string;
26
+ export declare function formatStorageQuota(quota: StorageQuota): string;
2
27
  export declare const BILLING_PLAN_IDS: readonly ["free", "core", "solo", "studio"];
3
28
  export type BillingPlanId = (typeof BILLING_PLAN_IDS)[number];
4
29
  export declare const PAID_BILLING_PLAN_IDS: readonly ["core", "solo", "studio"];
@@ -31,6 +56,7 @@ export interface PlanEntitlements {
31
56
  monthlyPricePence: number | null;
32
57
  availableIntervals: readonly BillingInterval[];
33
58
  monthlyBookingLimit: number | null;
59
+ durableStorageQuota: StorageQuota;
34
60
  stripeBookingCommission: StripeBookingCommission;
35
61
  customDomain: boolean;
36
62
  customContentTypes: boolean;
@@ -77,3 +103,4 @@ export interface DisplayPricing {
77
103
  discountPercent?: number;
78
104
  };
79
105
  }
106
+ export {};
@@ -50,6 +50,7 @@ export type EventCalendarContent = {
50
50
  filterVenueId?: VenueId | null;
51
51
  buttonVariant?: ButtonVariant | null;
52
52
  buttonText?: string | null;
53
+ showCapacity?: boolean | null;
53
54
  emptyMessage?: string | null;
54
55
  _sectionStyles?: SectionStylesContent;
55
56
  };
@@ -1,6 +1,38 @@
1
- import type React from 'react';
1
+ import React from 'react';
2
2
  import type { ComponentRegistry } from '../resolver';
3
- import { type RuntimeBackedBlockKind } from './runtime-backed-blocks';
3
+ import { BookingFormNodeClient } from '../nodes/booking-form.client';
4
+ import { EventDetailsIslandClient } from '../nodes/event-details.client';
5
+ import { LocationMapIslandClient } from '../nodes/location-map.client';
6
+ import { CarouselNodeClient } from '../nodes/carousel.client';
7
+ import { AccordionNode, AccordionItemNode } from '../nodes/accordion';
8
+ import HeaderSectionNode from '../nodes/header-section.client';
9
+ import { EventCombinedIslandClient } from '../nodes/events';
10
+ import { MediaNode } from '../nodes/media.client';
11
+ import { runtimeBackedBlockServerEntries, type RuntimeBackedBlockMode, type RuntimeBackedBlockKind, type RuntimeBackedClientBlockEntry, type RuntimeBackedClientComponentProps } from './runtime-backed-blocks';
12
+ type SourcePropsClientEntry<TProps extends object = object> = Readonly<{
13
+ kind: 'source-props';
14
+ component: React.ComponentType<TProps>;
15
+ }>;
16
+ type ExplicitAdapterClientEntry<TProps extends object = object> = Readonly<{
17
+ kind: 'explicit-adapter';
18
+ component: React.ComponentType<TProps>;
19
+ produces: 'client-props' | 'island-props';
20
+ }>;
21
+ export type ClientComponentRegistryEntryByKind = Readonly<{
22
+ media: SourcePropsClientEntry<React.ComponentProps<typeof MediaNode>>;
23
+ carousel: SourcePropsClientEntry<React.ComponentProps<typeof CarouselNodeClient>>;
24
+ accordion: SourcePropsClientEntry<React.ComponentProps<typeof AccordionNode>>;
25
+ accordionItem: SourcePropsClientEntry<React.ComponentProps<typeof AccordionItemNode>>;
26
+ headerSection: SourcePropsClientEntry<React.ComponentProps<typeof HeaderSectionNode>>;
27
+ 'booking-form': ExplicitAdapterClientEntry<React.ComponentProps<typeof BookingFormNodeClient>>;
28
+ 'event-details': ExplicitAdapterClientEntry<React.ComponentProps<typeof EventDetailsIslandClient>>;
29
+ 'location-map': ExplicitAdapterClientEntry<React.ComponentProps<typeof LocationMapIslandClient>>;
30
+ 'event-combined': ExplicitAdapterClientEntry<React.ComponentProps<typeof EventCombinedIslandClient>>;
31
+ }>;
32
+ export type ClientComponentRegistryEntry = ClientComponentRegistryEntryByKind[keyof ClientComponentRegistryEntryByKind];
33
+ export declare function defineSourcePropsClientEntry<TProps extends object>(component: React.ComponentType<TProps>): SourcePropsClientEntry<TProps>;
34
+ export declare function defineExplicitAdapterClientEntry<TProps extends object>(component: React.ComponentType<TProps>, contract: Pick<ExplicitAdapterClientEntry<TProps>, 'produces'>): ExplicitAdapterClientEntry<TProps>;
35
+ export declare function defineRuntimeBackedBlockClientEntry<TKind extends RuntimeBackedBlockKind>(kind: TKind, client: React.ComponentType<RuntimeBackedClientComponentProps<typeof runtimeBackedBlockServerEntries[TKind]['definition']['runtime'], RuntimeBackedBlockMode<TKind>>>): RuntimeBackedClientBlockEntry<typeof runtimeBackedBlockServerEntries[TKind]['definition']['runtime'], RuntimeBackedBlockMode<TKind>>;
4
36
  export declare const runtimeBackedBlockClientEntries: {
5
37
  readonly form: Readonly<{
6
38
  definition: import("../..").SystemBlockDefinition<unknown, Readonly<{
@@ -168,6 +200,7 @@ export declare const runtimeBackedBlockClientEntries: {
168
200
  }>;
169
201
  }>;
170
202
  renderKind: "progressive";
203
+ mode: "form";
171
204
  client: React.ElementType;
172
205
  }>;
173
206
  readonly 'event-listing': Readonly<{
@@ -612,6 +645,7 @@ export declare const runtimeBackedBlockClientEntries: {
612
645
  }>;
613
646
  }>;
614
647
  renderKind: "progressive";
648
+ mode: "event-listing";
615
649
  client: React.ElementType;
616
650
  }>;
617
651
  readonly 'event-calendar': Readonly<{
@@ -1080,6 +1114,7 @@ export declare const runtimeBackedBlockClientEntries: {
1080
1114
  }>;
1081
1115
  }>;
1082
1116
  renderKind: "progressive";
1117
+ mode: "event-calendar";
1083
1118
  client: React.ElementType;
1084
1119
  }>;
1085
1120
  readonly 'newsletter-form': Readonly<{
@@ -1284,6 +1319,7 @@ export declare const runtimeBackedBlockClientEntries: {
1284
1319
  }>;
1285
1320
  }>;
1286
1321
  renderKind: "progressive";
1322
+ mode: "newsletter-form";
1287
1323
  client: React.ElementType;
1288
1324
  }>;
1289
1325
  readonly 'product-list': Readonly<{
@@ -1548,6 +1584,7 @@ export declare const runtimeBackedBlockClientEntries: {
1548
1584
  }>;
1549
1585
  }>;
1550
1586
  renderKind: "progressive";
1587
+ mode: "product-list";
1551
1588
  client: React.ElementType;
1552
1589
  }>;
1553
1590
  readonly 'product-detail': Readonly<{
@@ -1644,6 +1681,7 @@ export declare const runtimeBackedBlockClientEntries: {
1644
1681
  }>;
1645
1682
  }>;
1646
1683
  renderKind: "progressive";
1684
+ mode: "product-detail";
1647
1685
  client: React.ElementType;
1648
1686
  }>;
1649
1687
  readonly cart: Readonly<{
@@ -1824,6 +1862,7 @@ export declare const runtimeBackedBlockClientEntries: {
1824
1862
  }>;
1825
1863
  }>;
1826
1864
  renderKind: "client-owned";
1865
+ mode: "cart";
1827
1866
  client: React.ElementType;
1828
1867
  }>;
1829
1868
  readonly checkout: Readonly<{
@@ -1938,6 +1977,7 @@ export declare const runtimeBackedBlockClientEntries: {
1938
1977
  }>;
1939
1978
  }>;
1940
1979
  renderKind: "client-owned";
1980
+ mode: "checkout";
1941
1981
  client: React.ElementType;
1942
1982
  }>;
1943
1983
  readonly 'course-registration': Readonly<{
@@ -2154,6 +2194,7 @@ export declare const runtimeBackedBlockClientEntries: {
2154
2194
  }>;
2155
2195
  }>;
2156
2196
  renderKind: "client-owned";
2197
+ mode: "course-registration";
2157
2198
  client: React.ElementType;
2158
2199
  }>;
2159
2200
  readonly gifting: Readonly<{
@@ -2286,6 +2327,7 @@ export declare const runtimeBackedBlockClientEntries: {
2286
2327
  }>;
2287
2328
  }>;
2288
2329
  renderKind: "client-owned";
2330
+ mode: "gifting";
2289
2331
  client: React.ElementType;
2290
2332
  }>;
2291
2333
  readonly 'event-registration': Readonly<{
@@ -2502,6 +2544,7 @@ export declare const runtimeBackedBlockClientEntries: {
2502
2544
  }>;
2503
2545
  }>;
2504
2546
  renderKind: "client-owned";
2547
+ mode: "event-registration";
2505
2548
  client: React.ElementType;
2506
2549
  }>;
2507
2550
  readonly shop: Readonly<{
@@ -2742,8 +2785,136 @@ export declare const runtimeBackedBlockClientEntries: {
2742
2785
  }>;
2743
2786
  }>;
2744
2787
  renderKind: "progressive";
2788
+ mode: "passes-memberships";
2745
2789
  client: React.ElementType;
2746
2790
  }>;
2747
2791
  };
2748
2792
  export declare const runtimeBackedBlockClientRegistry: Readonly<Record<RuntimeBackedBlockKind, React.ElementType>>;
2793
+ export declare const clientComponentRegistryEntries: {
2794
+ readonly media: Readonly<{
2795
+ kind: "source-props";
2796
+ component: React.ComponentType<import("../nodes/media").MediaNodeProps>;
2797
+ }>;
2798
+ readonly carousel: Readonly<{
2799
+ kind: "source-props";
2800
+ component: React.ComponentType<import("../nodes/carousel.client").CarouselNodeClientProps>;
2801
+ }>;
2802
+ readonly accordion: Readonly<{
2803
+ kind: "source-props";
2804
+ component: React.ComponentType<import("../nodes/accordion").AccordionNodeProps>;
2805
+ }>;
2806
+ readonly accordionItem: Readonly<{
2807
+ kind: "source-props";
2808
+ component: React.ComponentType<import("../nodes/accordion").AccordionItemNodeProps>;
2809
+ }>;
2810
+ readonly headerSection: Readonly<{
2811
+ kind: "source-props";
2812
+ component: React.ComponentType<{
2813
+ [key: string]: unknown;
2814
+ className?: string;
2815
+ blockId?: string;
2816
+ blockKind?: string;
2817
+ blockContent?: unknown;
2818
+ fragmentRegistry?: unknown;
2819
+ pathBase?: string;
2820
+ } & {
2821
+ children?: React.ReactNode | undefined;
2822
+ }>;
2823
+ }>;
2824
+ readonly 'booking-form': Readonly<{
2825
+ kind: "explicit-adapter";
2826
+ component: React.ComponentType<import("../nodes/booking-form.client").BookingFormNodeClientProps>;
2827
+ produces: "client-props" | "island-props";
2828
+ }>;
2829
+ readonly 'event-details': Readonly<{
2830
+ kind: "explicit-adapter";
2831
+ component: React.ComponentType<Readonly<{
2832
+ occurrenceContext?: import("../../../contracts").EventDetailsOccurrenceContext | null;
2833
+ contentEntry?: import("../../../contracts").EventDetailsContentEntry | null;
2834
+ events?: readonly import("../..").PublicEvent[] | null;
2835
+ showVenue?: boolean;
2836
+ showMap?: boolean;
2837
+ showOtherDates?: boolean;
2838
+ otherDatesLimit?: string;
2839
+ showCost?: boolean;
2840
+ showAcceptedPasses?: boolean;
2841
+ showAcceptedMemberships?: boolean;
2842
+ sitePasses?: Readonly<{
2843
+ passes: readonly import("../..").PublicPassProduct[];
2844
+ }> | null;
2845
+ siteMemberships?: Readonly<{
2846
+ memberships: readonly import("../..").PublicMembershipProduct[];
2847
+ }> | null;
2848
+ className?: string | null;
2849
+ nowIso?: string;
2850
+ }>>;
2851
+ produces: "client-props" | "island-props";
2852
+ }>;
2853
+ readonly 'location-map': Readonly<{
2854
+ kind: "explicit-adapter";
2855
+ component: React.ComponentType<Readonly<{
2856
+ location?: import("../nodes/location-map.shared").NormalizedLocationMapValue | null;
2857
+ zoom?: number | null;
2858
+ heightPx?: number | null;
2859
+ showAddressText?: boolean;
2860
+ showDirections?: boolean;
2861
+ directionsLabel?: string | null;
2862
+ className?: string | null;
2863
+ }>>;
2864
+ produces: "client-props" | "island-props";
2865
+ }>;
2866
+ readonly 'event-combined': Readonly<{
2867
+ kind: "explicit-adapter";
2868
+ component: React.ComponentType<Readonly<Readonly<{
2869
+ siteId: string;
2870
+ apiBaseUrl?: string;
2871
+ stage?: "preview" | "published";
2872
+ }> & {
2873
+ renderKind: "progressive";
2874
+ render: Readonly<{
2875
+ mode: "event-combined";
2876
+ } & Readonly<{
2877
+ display: Readonly<{
2878
+ kind: "event-combined";
2879
+ className: string | null;
2880
+ events: readonly import("../..").PublicEvent[];
2881
+ listLayout: import("../..").EventLayout;
2882
+ listColumns: import("../..").ColumnOption;
2883
+ eventsPerPage: string;
2884
+ loadMoreText: string;
2885
+ startOfWeek: import("../..").WeekStart;
2886
+ calendarTabViews: import("../..").CalendarTabViews;
2887
+ showFilters: boolean;
2888
+ showCategoryFilter: import("../..").FilterAutoShow;
2889
+ showVenueFilter: boolean;
2890
+ showStaffFilter: boolean;
2891
+ eventKind: import("../..").EventBlockKind;
2892
+ eventSurface: import("../..").EventSurfaceScope;
2893
+ filterEventPresets: string | null;
2894
+ scheduleScope: import("../..").EventScheduleScope;
2895
+ filterCategoryIds: string | null;
2896
+ filterStaffMemberId: string | null;
2897
+ filterVenueId: string | null;
2898
+ showVenue: boolean;
2899
+ showMap: boolean;
2900
+ showCapacity: boolean;
2901
+ buttonVariant: import("../..").ButtonVariant;
2902
+ buttonText: string;
2903
+ emptyMessage: string;
2904
+ }>;
2905
+ hydration: Readonly<{
2906
+ siteId: string;
2907
+ stage?: "preview" | "published";
2908
+ prefetchedEvents: boolean;
2909
+ eventKind: import("../..").EventBlockKind;
2910
+ eventSurface: import("../..").EventSurfaceScope;
2911
+ filterEventPresets: string | null;
2912
+ scheduleScope: import("../..").EventScheduleScope;
2913
+ }>;
2914
+ }>>;
2915
+ }>>;
2916
+ produces: "client-props" | "island-props";
2917
+ }>;
2918
+ };
2749
2919
  export declare const clientComponentRegistry: ComponentRegistry;
2920
+ export {};
@@ -1,5 +1,5 @@
1
1
  import type React from 'react';
2
- import type { InteractiveBlockRuntime } from '../../../contracts/runtime';
2
+ import type { InteractiveBlockRuntime, RuntimeKind, RuntimeRender, RuntimeSource } from '../../../contracts/runtime';
3
3
  import type { SystemBlockDefinition } from '../../registry';
4
4
  type AnyInteractiveRuntime = InteractiveBlockRuntime<any, any, any>;
5
5
  type RuntimeBackedBlockDefinition<TRuntime extends AnyInteractiveRuntime = AnyInteractiveRuntime> = SystemBlockDefinition<unknown, TRuntime> & Readonly<{
@@ -8,9 +8,16 @@ type RuntimeBackedBlockDefinition<TRuntime extends AnyInteractiveRuntime = AnyIn
8
8
  }>;
9
9
  runtime: TRuntime;
10
10
  }>;
11
- export type RuntimeBackedClientBlockEntry<TRuntime extends AnyInteractiveRuntime> = Readonly<{
11
+ export type RuntimeBackedClientComponentProps<TRuntime extends AnyInteractiveRuntime, TMode extends string> = Readonly<RuntimeSource<TRuntime> & {
12
+ renderKind: RuntimeKind<TRuntime>;
13
+ render: Readonly<{
14
+ mode: TMode;
15
+ } & RuntimeRender<TRuntime>>;
16
+ }>;
17
+ export type RuntimeBackedClientBlockEntry<TRuntime extends AnyInteractiveRuntime, TMode extends string = string> = Readonly<{
12
18
  definition: RuntimeBackedBlockDefinition<TRuntime>;
13
19
  renderKind: TRuntime['kind'];
20
+ mode: TMode;
14
21
  client: React.ElementType;
15
22
  }>;
16
23
  export declare const runtimeBackedBlockServerEntries: {
@@ -1387,6 +1394,21 @@ export declare const runtimeBackedBlockServerEntries: {
1387
1394
  }>;
1388
1395
  };
1389
1396
  export type RuntimeBackedBlockKind = keyof typeof runtimeBackedBlockServerEntries;
1397
+ export declare const runtimeBackedBlockModes: {
1398
+ readonly form: "form";
1399
+ readonly 'event-listing': "event-listing";
1400
+ readonly 'event-calendar': "event-calendar";
1401
+ readonly 'newsletter-form': "newsletter-form";
1402
+ readonly 'product-list': "product-list";
1403
+ readonly 'product-detail': "product-detail";
1404
+ readonly cart: "cart";
1405
+ readonly checkout: "checkout";
1406
+ readonly 'course-registration': "course-registration";
1407
+ readonly gifting: "gifting";
1408
+ readonly 'event-registration': "event-registration";
1409
+ readonly shop: "passes-memberships";
1410
+ };
1411
+ export type RuntimeBackedBlockMode<TKind extends RuntimeBackedBlockKind> = typeof runtimeBackedBlockModes[TKind];
1390
1412
  export declare const runtimeBackedBlockKinds: readonly ("form" | "event-registration" | "course-registration" | "event-listing" | "event-calendar" | "shop" | "product-list" | "product-detail" | "cart" | "checkout" | "gifting" | "newsletter-form")[];
1391
1413
  export declare const runtimeBackedBlockServerRegistry: Readonly<{
1392
1414
  readonly form: React.ElementType<any, keyof React.JSX.IntrinsicElements>;
@@ -12,6 +12,7 @@
12
12
  * correctly relative to the page scroll container.
13
13
  */
14
14
  export declare const POSITIONING_CLASSES: readonly ["rb-sticky", "rb-fixed", "rb-absolute", "rb-relative", "rb-top-0", "rb-left-0", "rb-right-0", "rb-bottom-0", "rb-z-40", "rb-z-50"];
15
+ export { desktopOnlyDisplay, mobileOnlyDisplay, type ResponsiveDisplay, } from '@riverbankcms/theme-core/responsiveDisplay';
15
16
  /**
16
17
  * Split className into positioning classes (for wrapper) and content classes (for section).
17
18
  *
@@ -17,3 +17,4 @@ export declare const BookingFormClient: React.FC<BookingFormClientProps>;
17
17
  * harder to miswire across interactive surfaces.
18
18
  */
19
19
  export declare const BookingFormNodeClient: React.FC<BookingFormNodeClientProps>;
20
+ export declare function buildBookingFormNodeClientProps(props: BookingFormNodeClientProps): BookingFormClientProps;
@@ -2,6 +2,8 @@ import React from 'react';
2
2
  import type { PublicEvent } from '../../../../blocks/events/shared/types';
3
3
  type AgendaEventCardProps = {
4
4
  event: PublicEvent;
5
+ /** Whether to render the capacity indicator. */
6
+ showCapacity: boolean;
5
7
  /** When provided, renders as button and calls onClick instead of navigating */
6
8
  onClick?: (event: PublicEvent) => void;
7
9
  };
@@ -3,6 +3,7 @@ import type { PublicEvent } from '../../../../blocks/events/shared/types';
3
3
  type DayEventsModalProps = {
4
4
  date: Date;
5
5
  events: PublicEvent[];
6
+ showCapacity: boolean;
6
7
  onClose: () => void;
7
8
  onSelectEvent: (event: PublicEvent) => void;
8
9
  };
@@ -12,5 +13,5 @@ type DayEventsModalProps = {
12
13
  * Uses AgendaEventCard with onClick prop to display events.
13
14
  * Clicking an event triggers onSelectEvent (typically opens EventDetailModal).
14
15
  */
15
- export declare function DayEventsModal({ date, events, onClose, onSelectEvent, }: DayEventsModalProps): React.ReactElement;
16
+ export declare function DayEventsModal({ date, events, showCapacity, onClose, onSelectEvent, }: DayEventsModalProps): React.ReactElement;
16
17
  export default DayEventsModal;
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import type { PublicEvent, ButtonVariant, CardVariant } from '../../../../blocks/events/shared/types';
3
3
  type EventDetailModalProps = {
4
4
  event: PublicEvent;
5
+ showCapacity: boolean;
5
6
  onClose: () => void;
6
7
  cardVariant?: CardVariant;
7
8
  buttonVariant?: ButtonVariant;
@@ -14,5 +15,5 @@ type EventDetailModalProps = {
14
15
  * Reuses EventCard component directly for DRY implementation.
15
16
  * EventCard already includes the CTA button to navigate to the full event page.
16
17
  */
17
- export declare function EventDetailModal({ event, onClose, cardVariant, buttonVariant, buttonText, showMap, }: EventDetailModalProps): React.ReactElement;
18
+ export declare function EventDetailModal({ event, showCapacity, onClose, cardVariant, buttonVariant, buttonText, showMap, }: EventDetailModalProps): React.ReactElement;
18
19
  export default EventDetailModal;
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import type { ButtonVariant, CardVariant } from '../../../../blocks/events/shared/types';
3
3
  type EventModalsProps = {
4
+ showCapacity: boolean;
4
5
  cardVariant?: CardVariant;
5
6
  buttonVariant?: ButtonVariant;
6
7
  buttonText?: string;
@@ -13,5 +14,5 @@ type EventModalsProps = {
13
14
  * - EventDetailModal for single event view
14
15
  * - DayEventsModal for day events list (clicking an event switches to event modal)
15
16
  */
16
- export declare function EventModals({ cardVariant, buttonVariant, buttonText, }: EventModalsProps): React.ReactElement | null;
17
+ export declare function EventModals({ showCapacity, cardVariant, buttonVariant, buttonText, }: EventModalsProps): React.ReactElement | null;
17
18
  export default EventModals;
@@ -4,6 +4,7 @@ type WeekAgendaViewProps = {
4
4
  viewDate: Date;
5
5
  events: PublicEvent[];
6
6
  startOfWeek: WeekStart;
7
+ showCapacity: boolean;
7
8
  emptyMessage?: string;
8
9
  };
9
10
  /**
@@ -4,6 +4,7 @@ type WeekTimetableViewProps = {
4
4
  viewDate: Date;
5
5
  events: PublicEvent[];
6
6
  startOfWeek: WeekStart;
7
+ showCapacity: boolean;
7
8
  emptyMessage?: string;
8
9
  };
9
10
  export declare const WeekTimetableView: React.FC<WeekTimetableViewProps>;
@@ -0,0 +1,16 @@
1
+ import type { PublicEvent } from '../../../../blocks/events/shared/types';
2
+ export type EventAvailability = {
3
+ /** Remaining spots. `null` when the event has no capacity cap. */
4
+ available: number | null;
5
+ /** True when the event has a cap and no spots remain. */
6
+ isFull: boolean;
7
+ };
8
+ /**
9
+ * Compute remaining spots for an event from `availableSpots` with a fallback
10
+ * to `capacity - registeredCount`. Returns `{ available: null, isFull: false }`
11
+ * for uncapped events so call sites can render no capacity indicator at all.
12
+ *
13
+ * The single source of truth for capacity math across event cards, agenda
14
+ * rows, and timetable cells — keep wording variations in the call sites.
15
+ */
16
+ export declare function getEventAvailability(event: PublicEvent): EventAvailability;
@@ -10,6 +10,8 @@ export type TimetableEventCell = {
10
10
  categoryColor: string;
11
11
  timeLabel: string;
12
12
  teacherLine: string | null;
13
+ capacityLabel: string | null;
14
+ isFull: boolean;
13
15
  };
14
16
  export type TimetableDay = {
15
17
  date: Date;
@@ -13,8 +13,8 @@ export type { EntryEditorDriver } from './controller/driver';
13
13
  export { EditableBlockProvider, useBlockData } from './components/EditableBlockProvider';
14
14
  export { ContentFieldsForm, type ContentFieldsFormProps } from './components/ContentFieldsForm';
15
15
  export { useUISelector } from './ui/useUISelector';
16
- export { useEditorUiStore, useEditorUiStoreInstance, createEditorUiStore } from './ui/editorUiStore';
17
- export type { EditorUiStoreInstance, EditorUiState, ViewportMode, ViewportWidth, ViewportState, ZoomLevel, } from './ui/editorUiStore';
16
+ export { useEditorUiStore, useEditorUiStoreInstance, useOptionalEditorUiStoreInstance, createEditorUiStore } from './ui/editorUiStore';
17
+ export type { ActivePreviewField, EditorUiStoreInstance, EditorUiState, PreviewSidebarTab, ViewportMode, ViewportWidth, ViewportState, ZoomLevel, } from './ui/editorUiStore';
18
18
  export { PreviewTextEditor } from './primitives/PreviewTextEditor';
19
19
  export { PreviewRichTextEditor } from './primitives/PreviewRichTextEditor';
20
20
  export { useStoreBinding, parseEditorPath } from './primitives/shared';
@@ -0,0 +1,9 @@
1
+ import type { ActivePreviewField } from '../../ui/editorUiStore';
2
+ /**
3
+ * Returns true when the given editor path targets the same block-field that
4
+ * the sidebar has currently focused (the "linked focus" affordance).
5
+ *
6
+ * Encapsulates the `blocks.{blockId}.{fieldPath}` path convention so editor
7
+ * primitives and tests share a single source of truth.
8
+ */
9
+ export declare function isLinkedSidebarField(editorPath: string, activeField: ActivePreviewField): boolean;
@@ -1,2 +1,3 @@
1
1
  export { parseEditorPath, useStoreBinding } from './storeBinding';
2
+ export { isLinkedSidebarField } from './activePreviewField';
2
3
  export type { PathInfo } from './types';
@@ -14,6 +14,11 @@ export type { ViewportState } from "./stores/viewportStore";
14
14
  export type { EditorCommand, EditorBlockItem, EditorDraftSnapshot, EditorHistorySnapshot, EditorEffect, } from "./editorHistory";
15
15
  export type MetadataSnapshot = EditorValueSnapshot<EditorMetadataValues | null>;
16
16
  export type ContentSnapshot = EditorValueSnapshot<EditorContentValues | null>;
17
+ export type PreviewSidebarTab = "editor" | "assistant";
18
+ export type ActivePreviewField = Readonly<{
19
+ blockId: EditorBlockId;
20
+ fieldPath: string;
21
+ }> | null;
17
22
  /**
18
23
  * Form-facing metadata facade. Consumers pass plain records for ergonomics;
19
24
  * the reducer core normalizes and brands values at this boundary.
@@ -98,9 +103,13 @@ type RestoreListener = (transition: {
98
103
  }) => void;
99
104
  export type EditorUiState = {
100
105
  drawerOpen: boolean;
106
+ previewSidebarTab: PreviewSidebarTab;
107
+ activePreviewField: ActivePreviewField;
101
108
  focusRequest: FocusRequest;
102
109
  activeBlockId: EditorBlockId | null;
103
110
  setDrawerOpen: (open: boolean) => void;
111
+ setPreviewSidebarTab: (tab: PreviewSidebarTab) => void;
112
+ setActivePreviewField: (field: ActivePreviewField) => void;
104
113
  requestFocus: (payload: Omit<NonNullable<FocusRequest>, "requestId">) => void;
105
114
  clearFocus: () => void;
106
115
  setActiveBlockId: (id: EditorBlockId | null) => void;
@@ -139,3 +148,4 @@ export type EditorUiStoreInstance = ReturnType<typeof createEditorUiStore>;
139
148
  export declare const EditorUiStoreProvider: import("react").Provider<import("zustand").StoreApi<EditorUiState> | null>;
140
149
  export declare function useEditorUiStore<T>(selector: (state: EditorUiState) => T): T;
141
150
  export declare function useEditorUiStoreInstance(): EditorUiStoreInstance;
151
+ export declare function useOptionalEditorUiStoreInstance(): EditorUiStoreInstance | null;
@@ -5,6 +5,7 @@ import { type Theme } from '@riverbankcms/blocks';
5
5
  import type { PageDesignEditorReadModel } from '@riverbankcms/theme-core/site-styles';
6
6
  import { type EditorStructuralCommand } from '@riverbankcms/core';
7
7
  import { type SdkConfigForBlockPicker } from './block-editor/sdkBlockMerger';
8
+ import { type ReorderControlMode } from './block-editor/reorderControlMode';
8
9
  import type { ArrayKeysManager, BlockEditorHandle, BlockItem, BlockFocusRequest, UiSlice, DraftsSlice } from './block-editor/types';
9
10
  import type { BlockDraftSaveability, FieldWidgetComponent } from '@riverbankcms/block-form/client';
10
11
  type UiState = {
@@ -13,6 +14,7 @@ type UiState = {
13
14
  requestFocus: UiSlice['requestFocus'];
14
15
  clearFocus: () => void;
15
16
  setActiveBlockId: UiSlice['setActiveBlockId'];
17
+ setActivePreviewField: UiSlice['setActivePreviewField'];
16
18
  arrayKeys: ArrayKeysManager;
17
19
  blockValidation: {
18
20
  markPathEdited: (blockId: Parameters<DraftsSlice['setAtPath']>[0], path: string) => void;
@@ -49,6 +51,7 @@ export type BlockEditorProps = {
49
51
  pageDesignEditorModel?: PageDesignEditorReadModel | null;
50
52
  enabledContentTypes?: string[];
51
53
  sdkConfig?: SdkConfigForBlockPicker | null;
54
+ reorderControlMode?: ReorderControlMode;
52
55
  };
53
56
  export declare const BlockEditor: import("react").ForwardRefExoticComponent<BlockEditorProps & import("react").RefAttributes<BlockEditorHandle>>;
54
57
  export {};