camox 0.51.0 → 0.52.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 (91) hide show
  1. package/dist/core/createApp.d.ts +1 -0
  2. package/dist/core/createApp.js +1 -0
  3. package/dist/core/editing/contentEdits.js +78 -0
  4. package/dist/core/editing/createEditableBlock.js +277 -311
  5. package/dist/core/lib/contentType.js +2 -2
  6. package/dist/core/recordItem.js +3 -3
  7. package/dist/features/canvas/CamoxCanvas.js +15 -15
  8. package/dist/features/canvas/CanvasLoadingScreen.js +15 -11
  9. package/dist/features/canvas/CanvasPageFrame.js +81 -87
  10. package/dist/features/canvas/CanvasPreviewPageSlot.js +1 -1
  11. package/dist/features/canvas/DerivedPagePathInput.js +12 -12
  12. package/dist/features/canvas/canvasOverlayGeometry.js +1 -1
  13. package/dist/features/canvas/canvasStore.js +2 -2
  14. package/dist/features/canvas/sidebar/CuratedPageInspector.js +1 -1
  15. package/dist/features/canvas/sidebar/LayoutPageBlocks.js +23 -31
  16. package/dist/features/canvas/useCanvasCamera.js +1 -1
  17. package/dist/features/canvas/useDiscoveredPreviewPaths.js +16 -9
  18. package/dist/features/page/CuratedPageContent.js +1 -1
  19. package/dist/features/preview/CamoxPreview.d.ts +8 -4
  20. package/dist/features/preview/CamoxPreview.js +257 -442
  21. package/dist/features/preview/EditablePageContent.js +244 -2
  22. package/dist/features/preview/EditablePageExperience.js +2 -4
  23. package/dist/features/preview/components/AddBlockSheet.js +55 -15
  24. package/dist/features/preview/components/BlockActionsPopover.js +12 -16
  25. package/dist/features/preview/components/BlockPeek.js +66 -0
  26. package/dist/features/preview/components/BlockThumbnail.js +134 -119
  27. package/dist/features/preview/components/CanvasPreview.js +1 -1
  28. package/dist/features/preview/components/CreatePageModal.js +150 -156
  29. package/dist/features/preview/components/Frame.js +27 -4
  30. package/dist/features/preview/components/MobilePreviewDrawer.js +1 -1
  31. package/dist/features/preview/components/PageInfo.js +161 -126
  32. package/dist/features/preview/components/PagePicker.js +2 -2
  33. package/dist/features/preview/components/PageTree.js +174 -190
  34. package/dist/features/preview/components/PreviewPanel.js +3 -3
  35. package/dist/features/preview/components/ReferenceFieldEditor.js +4 -4
  36. package/dist/features/preview/components/ReferenceListFieldEditor.js +4 -4
  37. package/dist/features/preview/components/RemovedBlockPlaceholder.js +37 -70
  38. package/dist/features/preview/components/RepeatableItemsList.js +1 -1
  39. package/dist/features/preview/components/SelectionEditor.js +248 -256
  40. package/dist/features/preview/components/StudioEditingFallback.js +22 -26
  41. package/dist/features/preview/components/useFieldWriter.js +19 -19
  42. package/dist/features/preview/components/useRecordView.js +105 -147
  43. package/dist/features/preview/components/useRepeatableItemActions.js +0 -2
  44. package/dist/features/preview/pageRecord.js +30 -24
  45. package/dist/features/preview/previewStore.js +2 -0
  46. package/dist/features/preview/studioNotice.js +20 -0
  47. package/dist/features/provider/AuthenticatedCamoxProvider.js +46 -30
  48. package/dist/features/renderer/RendererApp.js +542 -0
  49. package/dist/features/renderer/RendererFrames.js +450 -0
  50. package/dist/features/renderer/definitionAnswers.js +26 -0
  51. package/dist/features/renderer/protocol.js +35 -0
  52. package/dist/features/renderer/rendererHost.js +249 -0
  53. package/dist/features/renderer/studioConnection.js +186 -0
  54. package/dist/features/routes/pageRuntime.js +7 -2
  55. package/dist/features/runtime/RuntimeChrome.js +2 -5
  56. package/dist/features/runtime/assetPrefix.js +14 -0
  57. package/dist/features/runtime/breadcrumbs.js +1 -1
  58. package/dist/features/runtime/editingFallback.js +4 -8
  59. package/dist/features/runtime/livePages.js +1 -1
  60. package/dist/features/runtime/pageApp.js +57 -83
  61. package/dist/features/runtime/pageClient.js +1 -1
  62. package/dist/features/runtime/pageNavigation.js +3 -2
  63. package/dist/features/runtime/publicCache.js +15 -3
  64. package/dist/features/runtime/publishingDraft.js +23 -0
  65. package/dist/features/runtime/rendererClient.d.ts +8 -0
  66. package/dist/features/runtime/rendererClient.js +77 -0
  67. package/dist/features/runtime/runtime.d.ts +9 -0
  68. package/dist/features/runtime/runtime.js +36 -17
  69. package/dist/features/runtime/runtimeRoutes.d.ts +2 -0
  70. package/dist/features/runtime/runtimeRoutes.js +2 -0
  71. package/dist/features/runtime/worker.d.ts +10 -1
  72. package/dist/features/runtime/worker.js +20 -7
  73. package/dist/features/studio/FollowAgentProvider.js +10 -10
  74. package/dist/features/studio/components/ProjectMenu.js +1 -1
  75. package/dist/features/studio/components/ReviewDraftSheet.js +242 -138
  76. package/dist/features/studio/components/ThreadMessages.js +100 -65
  77. package/dist/features/studio/components/UserButton.js +1 -1
  78. package/dist/features/vite/definitionsSync.js +1 -1
  79. package/dist/features/vite/hostedChecks.js +127 -0
  80. package/dist/features/vite/runtimeDev.js +26 -0
  81. package/dist/features/vite/vite.js +33 -5
  82. package/dist/hooks/use-page-destinations.js +10 -10
  83. package/dist/lib/revisions.js +20 -0
  84. package/dist/lib/studio-definitions.js +160 -0
  85. package/dist/lib/studio-reads.js +65 -21
  86. package/dist/lib/use-project-room.js +16 -10
  87. package/dist/package.js +1 -1
  88. package/dist/studio.css +1 -1
  89. package/package.json +8 -4
  90. package/skills/camox/SKILL.md +4 -0
  91. package/skills/camox/references/artifacts.md +1 -1
@@ -1,6 +1,5 @@
1
- import { NormalizedDataProvider } from "../../../lib/normalized-data.js";
2
- import { BlockErrorBoundary } from "./BlockErrorBoundary.js";
3
1
  import { cn } from "../../../lib/utils.js";
2
+ import { useRendererHost } from "../../renderer/RendererFrames.js";
4
3
  import { useEditingFrame } from "../editingFrame.js";
5
4
  import { EMPTY_PREVIEW_DOCUMENT, isSiteStyle } from "./previewStyles.js";
6
5
  import { FrameContext } from "./Frame.js";
@@ -13,24 +12,17 @@ import { createPortal } from "react-dom";
13
12
  const VIEWPORT_WIDTH = 1200;
14
13
  const VIEWPORT_HEIGHT = 800;
15
14
  const ThumbnailFrame = (t0) => {
16
- const $ = c(29);
17
- const { block, width } = t0;
15
+ const $ = c(26);
16
+ const { blockType, title, width } = t0;
18
17
  const sourceDocument = useEditingFrame().document;
19
18
  const [frame, setFrame] = React.useState(null);
20
19
  const [root, setRoot] = React.useState(null);
21
20
  const [content, setContent] = React.useState(null);
22
21
  const [contentHeight, setContentHeight] = React.useState(VIEWPORT_HEIGHT);
23
- let t1;
24
- if ($[0] !== block._internal) {
25
- t1 = block._internal.getPeekBundle();
26
- $[0] = block._internal;
27
- $[1] = t1;
28
- } else t1 = $[1];
29
- const bundle = t1;
30
22
  const initialization = React.useRef(0);
31
- let t2;
32
- if ($[2] !== frame?.contentDocument || $[3] !== sourceDocument) {
33
- t2 = () => {
23
+ let t1;
24
+ if ($[0] !== frame?.contentDocument || $[1] !== sourceDocument) {
25
+ t1 = () => {
34
26
  const doc = frame?.contentDocument;
35
27
  const mount = doc?.querySelector("[data-camox-preview-root]");
36
28
  if (!doc || !mount) return;
@@ -66,30 +58,30 @@ const ThumbnailFrame = (t0) => {
66
58
  if (initialization.current === generation) setRoot(mount);
67
59
  });
68
60
  };
69
- $[2] = frame?.contentDocument;
70
- $[3] = sourceDocument;
71
- $[4] = t2;
72
- } else t2 = $[4];
73
- const initialize = t2;
61
+ $[0] = frame?.contentDocument;
62
+ $[1] = sourceDocument;
63
+ $[2] = t1;
64
+ } else t1 = $[2];
65
+ const initialize = t1;
66
+ let t2;
74
67
  let t3;
75
- let t4;
76
- if ($[5] !== initialize) {
77
- t3 = () => {
68
+ if ($[3] !== initialize) {
69
+ t2 = () => {
78
70
  initialize();
79
71
  };
80
- t4 = [initialize];
81
- $[5] = initialize;
82
- $[6] = t3;
83
- $[7] = t4;
72
+ t3 = [initialize];
73
+ $[3] = initialize;
74
+ $[4] = t2;
75
+ $[5] = t3;
84
76
  } else {
85
- t3 = $[6];
86
- t4 = $[7];
77
+ t2 = $[4];
78
+ t3 = $[5];
87
79
  }
88
- React.useEffect(t3, t4);
80
+ React.useEffect(t2, t3);
81
+ let t4;
89
82
  let t5;
90
- let t6;
91
- if ($[8] !== content) {
92
- t5 = () => {
83
+ if ($[6] !== content) {
84
+ t4 = () => {
93
85
  if (!content) return;
94
86
  const observer = new ResizeObserver(() => {
95
87
  setContentHeight(content.getBoundingClientRect().height);
@@ -97,53 +89,53 @@ const ThumbnailFrame = (t0) => {
97
89
  observer.observe(content);
98
90
  return () => observer.disconnect();
99
91
  };
100
- t6 = [content];
101
- $[8] = content;
102
- $[9] = t5;
103
- $[10] = t6;
92
+ t5 = [content];
93
+ $[6] = content;
94
+ $[7] = t4;
95
+ $[8] = t5;
104
96
  } else {
105
- t5 = $[9];
106
- t6 = $[10];
97
+ t4 = $[7];
98
+ t5 = $[8];
107
99
  }
108
- React.useEffect(t5, t6);
109
- const t7 = contentHeight * width / VIEWPORT_WIDTH;
110
- let t8;
111
- if ($[11] !== t7) {
112
- t8 = { height: t7 };
113
- $[11] = t7;
114
- $[12] = t8;
115
- } else t8 = $[12];
116
- const t9 = `${block._internal.title} preview`;
117
- const t10 = `scale(${width / VIEWPORT_WIDTH})`;
118
- let t11;
119
- if ($[13] !== t10) {
120
- t11 = {
100
+ React.useEffect(t4, t5);
101
+ const t6 = contentHeight * width / VIEWPORT_WIDTH;
102
+ let t7;
103
+ if ($[9] !== t6) {
104
+ t7 = { height: t6 };
105
+ $[9] = t6;
106
+ $[10] = t7;
107
+ } else t7 = $[10];
108
+ const t8 = `${title} preview`;
109
+ const t9 = `scale(${width / VIEWPORT_WIDTH})`;
110
+ let t10;
111
+ if ($[11] !== t9) {
112
+ t10 = {
121
113
  width: VIEWPORT_WIDTH,
122
114
  height: VIEWPORT_HEIGHT,
123
- transform: t10
115
+ transform: t9
124
116
  };
125
- $[13] = t10;
126
- $[14] = t11;
127
- } else t11 = $[14];
128
- let t12;
129
- if ($[15] !== initialize || $[16] !== t11 || $[17] !== t9) {
130
- t12 = /* @__PURE__ */ jsx("iframe", {
117
+ $[11] = t9;
118
+ $[12] = t10;
119
+ } else t10 = $[12];
120
+ let t11;
121
+ if ($[13] !== initialize || $[14] !== t10 || $[15] !== t8) {
122
+ t11 = /* @__PURE__ */ jsx("iframe", {
131
123
  ref: setFrame,
132
- title: t9,
124
+ title: t8,
133
125
  srcDoc: EMPTY_PREVIEW_DOCUMENT,
134
126
  onLoad: initialize,
135
127
  tabIndex: -1,
136
128
  className: "pointer-events-none absolute top-0 left-0 origin-top-left border-0",
137
- style: t11
129
+ style: t10
138
130
  });
139
- $[15] = initialize;
131
+ $[13] = initialize;
132
+ $[14] = t10;
133
+ $[15] = t8;
140
134
  $[16] = t11;
141
- $[17] = t9;
142
- $[18] = t12;
143
- } else t12 = $[18];
144
- let t13;
145
- if ($[19] !== block._internal.Component || $[20] !== block._internal.id || $[21] !== bundle || $[22] !== frame || $[23] !== root) {
146
- t13 = root && createPortal(/* @__PURE__ */ jsx(FrameContext.Provider, {
135
+ } else t11 = $[16];
136
+ let t12;
137
+ if ($[17] !== blockType || $[18] !== content || $[19] !== frame || $[20] !== root) {
138
+ t12 = root && createPortal(/* @__PURE__ */ jsx(FrameContext.Provider, {
147
139
  value: {
148
140
  window: frame?.contentWindow ?? null,
149
141
  iframeElement: frame
@@ -151,56 +143,76 @@ const ThumbnailFrame = (t0) => {
151
143
  children: /* @__PURE__ */ jsx("div", {
152
144
  ref: setContent,
153
145
  style: { display: "flow-root" },
154
- children: /* @__PURE__ */ jsx(BlockErrorBoundary, {
155
- blockId: "thumbnail",
156
- blockType: block._internal.id,
157
- children: /* @__PURE__ */ jsx(React.Suspense, {
158
- fallback: null,
159
- children: /* @__PURE__ */ jsx(NormalizedDataProvider, {
160
- files: bundle.files,
161
- repeatableItems: bundle.repeatableItems,
162
- children: /* @__PURE__ */ jsx(block._internal.Component, {
163
- blockData: {
164
- _id: "thumbnail",
165
- type: block._internal.id,
166
- content: bundle.block.content,
167
- settings: bundle.block.settings,
168
- position: ""
169
- },
170
- mode: "peek"
171
- })
172
- })
173
- })
146
+ children: content && /* @__PURE__ */ jsx(ThumbnailContent, {
147
+ blockType,
148
+ slot: content
174
149
  })
175
150
  })
176
151
  }), root);
177
- $[19] = block._internal.Component;
178
- $[20] = block._internal.id;
179
- $[21] = bundle;
180
- $[22] = frame;
181
- $[23] = root;
182
- $[24] = t13;
183
- } else t13 = $[24];
184
- let t14;
185
- if ($[25] !== t12 || $[26] !== t13 || $[27] !== t8) {
186
- t14 = /* @__PURE__ */ jsxs("div", {
152
+ $[17] = blockType;
153
+ $[18] = content;
154
+ $[19] = frame;
155
+ $[20] = root;
156
+ $[21] = t12;
157
+ } else t12 = $[21];
158
+ let t13;
159
+ if ($[22] !== t11 || $[23] !== t12 || $[24] !== t7) {
160
+ t13 = /* @__PURE__ */ jsxs("div", {
187
161
  className: "relative max-h-full w-full shrink-0 overflow-hidden",
188
- style: t8,
189
- children: [t12, t13]
162
+ style: t7,
163
+ children: [t11, t12]
190
164
  });
191
- $[25] = t12;
192
- $[26] = t13;
193
- $[27] = t8;
194
- $[28] = t14;
195
- } else t14 = $[28];
196
- return t14;
165
+ $[22] = t11;
166
+ $[23] = t12;
167
+ $[24] = t7;
168
+ $[25] = t13;
169
+ } else t13 = $[25];
170
+ return t13;
197
171
  };
172
+ /**
173
+ * What the thumbnail shows: the block rendered into `slot` by the renderer frame, which runs the
174
+ * draft's code.
175
+ */
176
+ const ThumbnailContent = (t0) => {
177
+ const $ = c(6);
178
+ const { blockType, slot } = t0;
179
+ const host = useRendererHost();
180
+ const thumbnailId = React.useId();
181
+ let t1;
182
+ let t2;
183
+ if ($[0] !== blockType || $[1] !== host || $[2] !== slot || $[3] !== thumbnailId) {
184
+ t1 = () => {
185
+ if (!host) return;
186
+ host.showThumbnail(thumbnailId, slot, blockType);
187
+ return () => host.hideThumbnail(thumbnailId);
188
+ };
189
+ t2 = [
190
+ host,
191
+ thumbnailId,
192
+ slot,
193
+ blockType
194
+ ];
195
+ $[0] = blockType;
196
+ $[1] = host;
197
+ $[2] = slot;
198
+ $[3] = thumbnailId;
199
+ $[4] = t1;
200
+ $[5] = t2;
201
+ } else {
202
+ t1 = $[4];
203
+ t2 = $[5];
204
+ }
205
+ React.useLayoutEffect(t1, t2);
206
+ return null;
207
+ };
208
+ /** A block's thumbnail, rendered by the renderer frame with the draft's code. */
198
209
  const BlockThumbnail = (t0) => {
199
- const $ = c(11);
200
- const { block, className } = t0;
210
+ const $ = c(13);
211
+ const { blockType, title, className } = t0;
201
212
  const ref = React.useRef(null);
202
213
  const [isVisible, setIsVisible] = React.useState(false);
203
214
  const [width, setWidth] = React.useState(0);
215
+ const renderable = !!useRendererHost();
204
216
  let t1;
205
217
  let t2;
206
218
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
@@ -237,28 +249,31 @@ const BlockThumbnail = (t0) => {
237
249
  $[3] = t3;
238
250
  } else t3 = $[3];
239
251
  let t4;
240
- if ($[4] !== block || $[5] !== isVisible || $[6] !== width) {
241
- t4 = isVisible && width > 0 && /* @__PURE__ */ jsx(ThumbnailFrame, {
242
- block,
252
+ if ($[4] !== blockType || $[5] !== isVisible || $[6] !== renderable || $[7] !== title || $[8] !== width) {
253
+ t4 = renderable && isVisible && width > 0 && /* @__PURE__ */ jsx(ThumbnailFrame, {
254
+ blockType,
255
+ title,
243
256
  width
244
257
  });
245
- $[4] = block;
258
+ $[4] = blockType;
246
259
  $[5] = isVisible;
247
- $[6] = width;
248
- $[7] = t4;
249
- } else t4 = $[7];
260
+ $[6] = renderable;
261
+ $[7] = title;
262
+ $[8] = width;
263
+ $[9] = t4;
264
+ } else t4 = $[9];
250
265
  let t5;
251
- if ($[8] !== t3 || $[9] !== t4) {
266
+ if ($[10] !== t3 || $[11] !== t4) {
252
267
  t5 = /* @__PURE__ */ jsx("div", {
253
268
  ref,
254
269
  className: t3,
255
270
  "aria-hidden": "true",
256
271
  children: t4
257
272
  });
258
- $[8] = t3;
259
- $[9] = t4;
260
- $[10] = t5;
261
- } else t5 = $[10];
273
+ $[10] = t3;
274
+ $[11] = t4;
275
+ $[12] = t5;
276
+ } else t5 = $[12];
262
277
  return t5;
263
278
  };
264
279
 
@@ -1,6 +1,6 @@
1
+ import { CanvasLoadingScreen } from "../../canvas/CanvasLoadingScreen.js";
1
2
  import { ViewportContinuity, ViewportContinuityContext } from "../viewportContinuity.js";
2
3
  import { PreviewActivationContext } from "./PreviewActivation.js";
3
- import { CanvasLoadingScreen } from "../../canvas/CanvasLoadingScreen.js";
4
4
  import { PreviewPageFrame, PreviewPageFrameContext } from "../previewPageFrame.js";
5
5
  import { PreviewPreparationContext } from "../previewPreparation.js";
6
6
  import { c } from "react/compiler-runtime";