camox 0.62.0 → 0.65.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 (42) hide show
  1. package/dist/core/createApp.d.ts +28 -28
  2. package/dist/core/createLayout.d.ts +1 -1
  3. package/dist/core/derivedRoutes.js +3 -30
  4. package/dist/core/editing/createEditableBlock.d.ts +604 -604
  5. package/dist/features/canvas/canvasCamera.js +11 -2
  6. package/dist/features/canvas/useCanvasCamera.js +14 -10
  7. package/dist/features/page/CuratedPageContent.js +2 -1
  8. package/dist/features/page/UnplacedBlockContent.js +52 -0
  9. package/dist/features/preview/components/PreviewPanel.js +40 -12
  10. package/dist/features/preview/components/SidebarStack.js +78 -9
  11. package/dist/features/preview/strayCaretGuard.js +34 -0
  12. package/dist/features/provider/CoreCamoxProvider.js +5 -3
  13. package/dist/features/routes/pageRuntime.d.ts +2 -0
  14. package/dist/features/routes/pageRuntime.js +8 -5
  15. package/dist/features/runtime/pageApp.js +111 -74
  16. package/dist/features/runtime/pageClient.js +22 -2
  17. package/dist/features/runtime/runtime.d.ts +10 -0
  18. package/dist/features/runtime/runtime.js +314 -4
  19. package/dist/features/runtime/runtimeRoutes.d.ts +5 -0
  20. package/dist/features/runtime/runtimeRoutes.js +5 -0
  21. package/dist/features/studio/components/ChatWidget.js +88 -62
  22. package/dist/features/studio/components/ConnectAgent.js +313 -0
  23. package/dist/features/studio/components/Patrol.js +455 -205
  24. package/dist/features/studio/components/ReviewDraftSheet.js +431 -334
  25. package/dist/features/studio/components/Squareling.js +74 -41
  26. package/dist/features/studio/components/ThreadComposer.js +130 -107
  27. package/dist/features/studio/components/ThreadMessages.js +136 -30
  28. package/dist/features/studio/components/clientLogoPaths.js +10 -0
  29. package/dist/features/studio/findingSentence.js +37 -0
  30. package/dist/features/studio/reportSentence.js +15 -0
  31. package/dist/features/studio/studioStore.js +23 -1
  32. package/dist/features/studio/workingSentence.js +8 -0
  33. package/dist/lib/api-client.d.ts +1 -0
  34. package/dist/lib/auth.js +34 -32
  35. package/dist/lib/locale-path.js +1 -7
  36. package/dist/lib/queries.js +9 -1
  37. package/dist/lib/server-auth-cookie.js +17 -4
  38. package/dist/lib/studio-reads.d.ts +1 -1
  39. package/dist/lib/studio-reads.js +5 -1
  40. package/dist/package.js +1 -1
  41. package/dist/studio.css +1 -1
  42. package/package.json +16 -5
@@ -2,7 +2,7 @@ import { IconProps } from "./lib/icons.js";
2
2
  import { CamoxDocument } from "./defineDocument.js";
3
3
  import { ArtifactRenderProps } from "./lib/artifact.js";
4
4
  import { InlineTextStyles } from "./lib/textStyles.js";
5
- import { ReferenceContent, ReferenceScope } from "./lib/reference.js";
5
+ import { ReferenceContent, ReferenceKeys, ReferenceListKeys, ReferenceScope } from "./lib/reference.js";
6
6
  import { Layout } from "./createLayout.js";
7
7
  import { Collection } from "./createCollection.js";
8
8
  import { IconValue } from "./lib/iconTypes.js";
@@ -142,7 +142,7 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
142
142
  Repeater: <K extends never>(props: {
143
143
  name: K;
144
144
  children: (item: {
145
- Field: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends IconValue | ArtifactSource ? never : ({}[K] extends (infer U)[] ? U : never)[F_1] extends string ? F_1 : never]: ({}[K] extends (infer U)[] ? U : never)[F_1]; }>(props: InlineTextStyles & {
145
+ Field: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends ArtifactSource | IconValue ? never : ({}[K] extends (infer U)[] ? U : never)[F_1] extends string ? F_1 : never]: ({}[K] extends (infer U)[] ? U : never)[F_1]; }>(props: InlineTextStyles & {
146
146
  name: F;
147
147
  children: (props: {
148
148
  children: React.ReactNode;
@@ -240,7 +240,7 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
240
240
  [attribute: `data-camox-${string}`]: string | boolean | undefined;
241
241
  }, data: FileValue) => React.ReactNode;
242
242
  }) => React.ReactNode;
243
- ImageList: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends (infer U_1)[] ? ImageValue extends U_1 ? U_1 extends U_1 & {
243
+ ImageList: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends (infer U)[] ? ImageValue extends U ? U extends U & {
244
244
  url: string;
245
245
  alt: string;
246
246
  filename: string;
@@ -258,7 +258,7 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
258
258
  sizes?: string;
259
259
  }, data: ImageValue) => React.ReactNode;
260
260
  }) => React.ReactNode;
261
- FileList: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends (infer U_1)[] ? FileValue extends U_1 ? U_1 extends U_1 & {
261
+ FileList: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends (infer U)[] ? FileValue extends U ? U extends U & {
262
262
  url: string;
263
263
  alt: string;
264
264
  filename: string;
@@ -276,15 +276,15 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
276
276
  [attribute: `data-camox-${string}`]: string | boolean | undefined;
277
277
  }, data: FileValue) => React.ReactNode;
278
278
  }) => React.ReactNode;
279
- Reference: <F extends string>(props: {
279
+ Reference: <F extends ReferenceKeys<never>>(props: {
280
280
  name: F;
281
281
  children: (scope: ReferenceScope<ReferenceContent<never[F]>>) => React.ReactNode;
282
282
  }) => React.ReactNode;
283
- ReferenceList: <F extends string>(props: {
283
+ ReferenceList: <F extends ReferenceListKeys<never>>(props: {
284
284
  name: F;
285
285
  children: (scope: ReferenceScope<ReferenceContent<never[F]>>) => React.ReactNode;
286
286
  }) => React.ReactNode;
287
- Repeater: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends (infer U_1)[] ? ImageValue extends U_1 ? never : FileValue extends U_1 ? never : U_1 extends string ? never : F_1 : never]: ({}[K] extends (infer U)[] ? U : never)[F_1]; }>(props: {
287
+ Repeater: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends (infer U)[] ? ImageValue extends U ? never : FileValue extends U ? never : U extends string ? never : F_1 : never]: ({}[K] extends (infer U)[] ? U : never)[F_1]; }>(props: {
288
288
  name: F;
289
289
  children: (item: {
290
290
  Field: (props: InlineTextStyles & {
@@ -403,11 +403,11 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
403
403
  useSetting: <F extends string>(name: F) => never;
404
404
  }, index: number) => React.ReactNode;
405
405
  }) => React.ReactNode;
406
- Reference: <K extends never>(props: {
406
+ Reference: <K extends ReferenceKeys<Record<string, import("@sinclair/typebox").TSchema>>>(props: {
407
407
  name: K;
408
408
  children: (scope: ReferenceScope<never>) => React.ReactNode;
409
409
  }) => React.ReactNode;
410
- ReferenceList: <K extends never>(props: {
410
+ ReferenceList: <K extends ReferenceListKeys<Record<string, import("@sinclair/typebox").TSchema>>>(props: {
411
411
  name: K;
412
412
  children: (scope: ReferenceScope<never>) => React.ReactNode;
413
413
  }) => React.ReactNode;
@@ -416,12 +416,11 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
416
416
  Component: ({ blockData, mode, isFirstBlock, showAddBlockTop, showAddBlockBottom, addBlockAfterPosition }: BlockComponentProps<{
417
417
  [x: string]: unknown;
418
418
  }>) => import("react").JSX.Element;
419
- LayoutItem: ({ collectionId, collection, properties, record, children, fallback }: LayoutItemProps) => string | number | bigint | boolean | Iterable<import("react").ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<import("react").ReactNode> | null | undefined> | import("react").JSX.Element | null | undefined;
419
+ LayoutItem: ({ collectionId, collection, properties, record, children, fallback }: LayoutItemProps) => string | number | bigint | boolean | import("react").JSX.Element | Iterable<import("react").ReactNode> | Promise<string | number | bigint | boolean | Iterable<import("react").ReactNode> | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | import("react").ReactPortal | null | undefined> | null | undefined;
420
420
  id: string;
421
421
  title: string;
422
422
  description: string;
423
423
  contentSchema: {
424
- toStructuredData?: unknown;
425
424
  type: "object";
426
425
  title: string;
427
426
  description: string;
@@ -429,6 +428,7 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
429
428
  required: string[];
430
429
  toMarkdown: string[];
431
430
  toTitle: string;
431
+ toStructuredData?: unknown;
432
432
  };
433
433
  settingsSchema: {
434
434
  type: "object";
@@ -584,7 +584,7 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
584
584
  Repeater: <K extends never>(props: {
585
585
  name: K;
586
586
  children: (item: {
587
- Field: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends IconValue | ArtifactSource ? never : ({}[K] extends (infer U)[] ? U : never)[F_1] extends string ? F_1 : never]: ({}[K] extends (infer U)[] ? U : never)[F_1]; }>(props: InlineTextStyles & {
587
+ Field: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends ArtifactSource | IconValue ? never : ({}[K] extends (infer U)[] ? U : never)[F_1] extends string ? F_1 : never]: ({}[K] extends (infer U)[] ? U : never)[F_1]; }>(props: InlineTextStyles & {
588
588
  name: F;
589
589
  children: (props: {
590
590
  children: React.ReactNode;
@@ -682,7 +682,7 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
682
682
  [attribute: `data-camox-${string}`]: string | boolean | undefined;
683
683
  }, data: FileValue) => React.ReactNode;
684
684
  }) => React.ReactNode;
685
- ImageList: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends (infer U_1)[] ? ImageValue extends U_1 ? U_1 extends U_1 & {
685
+ ImageList: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends (infer U)[] ? ImageValue extends U ? U extends U & {
686
686
  url: string;
687
687
  alt: string;
688
688
  filename: string;
@@ -700,7 +700,7 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
700
700
  sizes?: string;
701
701
  }, data: ImageValue) => React.ReactNode;
702
702
  }) => React.ReactNode;
703
- FileList: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends (infer U_1)[] ? FileValue extends U_1 ? U_1 extends U_1 & {
703
+ FileList: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends (infer U)[] ? FileValue extends U ? U extends U & {
704
704
  url: string;
705
705
  alt: string;
706
706
  filename: string;
@@ -718,15 +718,15 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
718
718
  [attribute: `data-camox-${string}`]: string | boolean | undefined;
719
719
  }, data: FileValue) => React.ReactNode;
720
720
  }) => React.ReactNode;
721
- Reference: <F extends string>(props: {
721
+ Reference: <F extends ReferenceKeys<never>>(props: {
722
722
  name: F;
723
723
  children: (scope: ReferenceScope<ReferenceContent<never[F]>>) => React.ReactNode;
724
724
  }) => React.ReactNode;
725
- ReferenceList: <F extends string>(props: {
725
+ ReferenceList: <F extends ReferenceListKeys<never>>(props: {
726
726
  name: F;
727
727
  children: (scope: ReferenceScope<ReferenceContent<never[F]>>) => React.ReactNode;
728
728
  }) => React.ReactNode;
729
- Repeater: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends (infer U_1)[] ? ImageValue extends U_1 ? never : FileValue extends U_1 ? never : U_1 extends string ? never : F_1 : never]: ({}[K] extends (infer U)[] ? U : never)[F_1]; }>(props: {
729
+ Repeater: <F extends keyof { [F_1 in keyof ({}[K] extends (infer U)[] ? U : never) as ({}[K] extends (infer U)[] ? U : never)[F_1] extends (infer U)[] ? ImageValue extends U ? never : FileValue extends U ? never : U extends string ? never : F_1 : never]: ({}[K] extends (infer U)[] ? U : never)[F_1]; }>(props: {
730
730
  name: F;
731
731
  children: (item: {
732
732
  Field: (props: InlineTextStyles & {
@@ -845,11 +845,11 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
845
845
  useSetting: <F extends string>(name: F) => never;
846
846
  }, index: number) => React.ReactNode;
847
847
  }) => React.ReactNode;
848
- Reference: <K extends never>(props: {
848
+ Reference: <K extends ReferenceKeys<Record<string, import("@sinclair/typebox").TSchema>>>(props: {
849
849
  name: K;
850
850
  children: (scope: ReferenceScope<never>) => React.ReactNode;
851
851
  }) => React.ReactNode;
852
- ReferenceList: <K extends never>(props: {
852
+ ReferenceList: <K extends ReferenceListKeys<Record<string, import("@sinclair/typebox").TSchema>>>(props: {
853
853
  name: K;
854
854
  children: (scope: ReferenceScope<never>) => React.ReactNode;
855
855
  }) => React.ReactNode;
@@ -858,12 +858,11 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
858
858
  Component: ({ blockData, mode, isFirstBlock, showAddBlockTop, showAddBlockBottom, addBlockAfterPosition }: BlockComponentProps<{
859
859
  [x: string]: unknown;
860
860
  }>) => import("react").JSX.Element;
861
- LayoutItem: ({ collectionId, collection, properties, record, children, fallback }: LayoutItemProps) => string | number | bigint | boolean | Iterable<import("react").ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<import("react").ReactNode> | null | undefined> | import("react").JSX.Element | null | undefined;
861
+ LayoutItem: ({ collectionId, collection, properties, record, children, fallback }: LayoutItemProps) => string | number | bigint | boolean | import("react").JSX.Element | Iterable<import("react").ReactNode> | Promise<string | number | bigint | boolean | Iterable<import("react").ReactNode> | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | import("react").ReactPortal | null | undefined> | null | undefined;
862
862
  id: string;
863
863
  title: string;
864
864
  description: string;
865
865
  contentSchema: {
866
- toStructuredData?: unknown;
867
866
  type: "object";
868
867
  title: string;
869
868
  description: string;
@@ -871,6 +870,7 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
871
870
  required: string[];
872
871
  toMarkdown: string[];
873
872
  toTitle: string;
873
+ toStructuredData?: unknown;
874
874
  };
875
875
  settingsSchema: {
876
876
  type: "object";
@@ -931,7 +931,6 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
931
931
  title: string;
932
932
  description: string;
933
933
  contentSchema: {
934
- toStructuredData?: unknown;
935
934
  type: "object";
936
935
  title: string;
937
936
  description: string;
@@ -939,6 +938,7 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
939
938
  required: string[];
940
939
  toMarkdown: string[];
941
940
  toTitle: string;
941
+ toStructuredData?: unknown;
942
942
  };
943
943
  settingsSchema: {
944
944
  type: "object";
@@ -955,10 +955,6 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
955
955
  synced: boolean;
956
956
  }[];
957
957
  layouts: {
958
- recordPages?: {
959
- collectionId: string;
960
- field: string;
961
- } | undefined;
962
958
  layoutId: string;
963
959
  kind: "curated" | "derived" | "singleton";
964
960
  title: string;
@@ -988,15 +984,19 @@ export declare function createApp({ blocks, lazyBlocks, layouts, collections, do
988
984
  }[];
989
985
  slot: "after";
990
986
  })[];
987
+ recordPages?: {
988
+ collectionId: string;
989
+ field: string;
990
+ } | undefined;
991
991
  }[];
992
992
  collections: {
993
- contentSchema: any;
994
- toStructuredData?: Record<string, unknown> | undefined;
995
993
  collectionId: string;
996
994
  title: string;
997
995
  description: string;
998
996
  toTitle: string;
999
997
  toDescription: string | null;
998
+ toStructuredData?: Record<string, unknown> | undefined;
999
+ contentSchema: any;
1000
1000
  }[];
1001
1001
  homepage: {
1002
1002
  layoutId: string;
@@ -244,7 +244,7 @@ declare function createLayoutDefinition(options: AnyLayoutOptions): {
244
244
  Item: {
245
245
  ({ children }: {
246
246
  children: (item: any) => React.ReactNode;
247
- }): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | React.JSX.Element | null | undefined;
247
+ }): string | number | bigint | boolean | React.JSX.Element | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | Iterable<React.ReactNode> | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | React.ReactPortal | null | undefined> | null | undefined;
248
248
  displayName: string;
249
249
  };
250
250
  useData(): unknown;
@@ -1,37 +1,10 @@
1
1
  import { asCollectionItem } from "./recordItem.js";
2
+ import { matchLayoutRoute, routeSegments } from "@camox/api-contract/layout-routes";
2
3
 
3
4
  //#region src/core/derivedRoutes.ts
4
- function routeSegments(id) {
5
- return id.split(".");
6
- }
5
+ /** The singleton or derived layout whose route matches `pathname`, with its params, or null. */
7
6
  function matchDerivedLayout(layouts, pathname) {
8
- const path = pathname.replace(/^\/|\/$/g, "").split("/");
9
- const candidates = layouts.filter((layout) => layout._internal.kind !== "curated").sort((a, b) => routeSegments(a._internal.id).filter((s) => s.startsWith("$")).length - routeSegments(b._internal.id).filter((s) => s.startsWith("$")).length);
10
- for (const layout of candidates) {
11
- const segments = routeSegments(layout._internal.id);
12
- if (segments.length !== path.length) continue;
13
- const params = {};
14
- let matches = true;
15
- for (const [index, segment] of segments.entries()) {
16
- let value;
17
- try {
18
- value = decodeURIComponent(path[index]);
19
- } catch {
20
- matches = false;
21
- break;
22
- }
23
- if (segment.startsWith("$") && value && !value.includes("/")) params[segment.slice(1)] = value;
24
- else if (segment !== value) {
25
- matches = false;
26
- break;
27
- }
28
- }
29
- if (matches) return {
30
- layout,
31
- params
32
- };
33
- }
34
- return null;
7
+ return matchLayoutRoute(layouts, pathname, (layout) => layout._internal);
35
8
  }
36
9
  /** Builds the path of one discovered page, rejecting params the route could not match. */
37
10
  function derivedLayoutPath(layoutId, params) {