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
@@ -5,7 +5,6 @@ import { useProjectUuid } from "../../lib/auth.js";
5
5
  import { useLocation, useNavigate } from "../../features/navigation/navigation.js";
6
6
  import { useOptionalCamoxApp } from "../../features/provider/components/CamoxAppContext.js";
7
7
  import { LinkedRecordsProvider, isItemMarker, queryResultIds, resolveAssetValue, useNormalizedData } from "../../lib/normalized-data.js";
8
- import { reads, useStudioCache } from "../../lib/studio-reads.js";
9
8
  import { useLinkPages } from "../../lib/link-pages.js";
10
9
  import { ArtifactsRunContext, useArtifactHost, useInitialArtifactData } from "../hooks/useArtifactHost.js";
11
10
  import { IconSvg } from "../lib/icons.js";
@@ -13,17 +12,15 @@ import { renderImagePlaceholder } from "../lib/imagePlaceholder.js";
13
12
  import { buildImageSrcSet, getDefaultImageSizes, getDefaultImageWidth, transformImageUrl } from "../lib/imageTransform.js";
14
13
  import { markdownToReactNodes } from "../lib/lexicalReact.js";
15
14
  import { resolveReference, resolveReferenceList } from "../lib/reference.js";
16
- import { blockMutations, collectionMutations, repeatableItemMutations } from "../../lib/queries.js";
17
15
  import { referencePickerFocus } from "../../features/preview/referencePickerFocus.js";
18
- import { invalidateCollectionRecordViews } from "../../lib/collection-cache.js";
19
16
  import { selectionBlockId } from "../../features/preview/previewStore.js";
20
- import { useFrame } from "../../features/preview/components/Frame.js";
21
17
  import { useIsEditable } from "../hooks/useIsEditable.js";
22
18
  import { CanvasWorkspaceContext } from "../../features/canvas/canvasZoom.js";
23
19
  import { PreviewEditingOwnerContext, usePreviewSelection, usePreviewTargetSelection } from "../../features/preview/previewSelection.js";
20
+ import { useApplyContentEdit } from "./contentEdits.js";
21
+ import { useFrame } from "../../features/preview/components/Frame.js";
24
22
  import { overlayFieldId, recordPlacementId } from "../../features/preview/overlayMessages.js";
25
23
  import { useLatestRecord } from "./useLatestRecord.js";
26
- import { referenceWritesFor } from "./referenceWrites.js";
27
24
  import { registerRepeatableItem } from "../../features/preview/repeatableItemTargets.js";
28
25
  import { revealScrollDelta } from "../../features/preview/selectionReveal.js";
29
26
  import { InlineLexicalEditor } from "../components/lexical/InlineLexicalEditor.js";
@@ -36,9 +33,10 @@ import { isQueryBacked } from "@camox/api-contract";
36
33
  import { Type } from "@sinclair/typebox";
37
34
  import { generateKeyBetween } from "fractional-indexing";
38
35
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
39
- import { useMutation, useQueryClient } from "@tanstack/react-query";
40
36
 
41
37
  //#region src/core/editing/createEditableBlock.tsx
38
+ /** Inline field writes report no failure: the field keeps what was typed. */
39
+ const ignore = () => {};
42
40
  /** The pages links lead to in the locale viewed, for the studio's editors, who read the project. */
43
41
  function useEditorLinkPages() {
44
42
  const $ = c(1);
@@ -209,7 +207,7 @@ function createEditableBlock(options) {
209
207
  const RepeaterHoverContext = React.createContext(null);
210
208
  const getOverlayFieldId = (blockId, fieldName, scope = {}) => scope.reference ? overlayFieldId(blockId, fieldName, { placement: scope.reference.placement }) : overlayFieldId(blockId, fieldName, { itemId: scope.itemId });
211
209
  const Field = (t0) => {
212
- const $ = c(40);
210
+ const $ = c(37);
213
211
  const { name, textStyle, linkStyle, children } = t0;
214
212
  const selectTarget = usePreviewSelection();
215
213
  const blockContext = React.use(Context);
@@ -243,48 +241,39 @@ function createEditableBlock(options) {
243
241
  setPrevSidebarHover(isHoveredFromSidebar);
244
242
  setIsHovered(isHoveredFromSidebar);
245
243
  }
244
+ const applyEdit = useApplyContentEdit();
246
245
  let t2;
247
- if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
248
- t2 = blockMutations.updateContent();
249
- $[1] = t2;
250
- } else t2 = $[1];
251
- const updateBlockContent = useMutation(t2);
252
- let t3;
253
- if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
254
- t3 = repeatableItemMutations.updateContent();
255
- $[2] = t3;
256
- } else t3 = $[2];
257
- const updateRepeatableContent = useMutation(t3);
258
- let t4;
259
- if ($[3] !== blockId || $[4] !== name || $[5] !== reference || $[6] !== repeaterContext || $[7] !== updateBlockContent || $[8] !== updateRepeatableContent) {
260
- t4 = (newValue) => {
246
+ if ($[1] !== applyEdit || $[2] !== blockId || $[3] !== name || $[4] !== reference || $[5] !== repeaterContext) {
247
+ t2 = (newValue) => {
261
248
  if (reference) {
262
249
  reference.update(String(name), newValue);
263
250
  return;
264
251
  }
252
+ const content_0 = { [name]: newValue };
265
253
  if (repeaterContext) {
266
254
  const { itemId } = repeaterContext;
267
- if (itemId != null) updateRepeatableContent.mutate({
268
- id: itemId,
269
- content: { [name]: newValue }
270
- });
271
- } else updateBlockContent.mutate({
272
- id: blockId,
273
- content: { [name]: newValue }
274
- });
255
+ if (itemId != null) applyEdit({
256
+ type: "itemContent",
257
+ itemId,
258
+ content: content_0
259
+ }).catch(ignore);
260
+ } else applyEdit({
261
+ type: "blockContent",
262
+ blockId,
263
+ content: content_0
264
+ }).catch(ignore);
275
265
  };
276
- $[3] = blockId;
277
- $[4] = name;
278
- $[5] = reference;
279
- $[6] = repeaterContext;
280
- $[7] = updateBlockContent;
281
- $[8] = updateRepeatableContent;
282
- $[9] = t4;
283
- } else t4 = $[9];
284
- const handleChange = t4;
285
- let t5;
286
- if ($[10] !== blockId || $[11] !== name || $[12] !== reference || $[13] !== repeaterContext || $[14] !== selectTarget) {
287
- t5 = () => {
266
+ $[1] = applyEdit;
267
+ $[2] = blockId;
268
+ $[3] = name;
269
+ $[4] = reference;
270
+ $[5] = repeaterContext;
271
+ $[6] = t2;
272
+ } else t2 = $[6];
273
+ const handleChange = t2;
274
+ let t3;
275
+ if ($[7] !== blockId || $[8] !== name || $[9] !== reference || $[10] !== repeaterContext || $[11] !== selectTarget) {
276
+ t3 = () => {
288
277
  if (reference) {
289
278
  reference.selectRecordField(String(name), "String");
290
279
  return;
@@ -302,95 +291,95 @@ function createEditableBlock(options) {
302
291
  fieldType: "String"
303
292
  });
304
293
  };
305
- $[10] = blockId;
306
- $[11] = name;
307
- $[12] = reference;
308
- $[13] = repeaterContext;
309
- $[14] = selectTarget;
294
+ $[7] = blockId;
295
+ $[8] = name;
296
+ $[9] = reference;
297
+ $[10] = repeaterContext;
298
+ $[11] = selectTarget;
299
+ $[12] = t3;
300
+ } else t3 = $[12];
301
+ const selectField = t3;
302
+ let t4;
303
+ if ($[13] !== selectField) {
304
+ t4 = () => {
305
+ setIsEditorFocused(true);
306
+ selectField();
307
+ };
308
+ $[13] = selectField;
309
+ $[14] = t4;
310
+ } else t4 = $[14];
311
+ const handleFocus = t4;
312
+ let t5;
313
+ if ($[15] === Symbol.for("react.memo_cache_sentinel")) {
314
+ t5 = () => {
315
+ setIsEditorFocused(false);
316
+ };
310
317
  $[15] = t5;
311
318
  } else t5 = $[15];
312
- const selectField = t5;
319
+ const handleBlur = t5;
313
320
  let t6;
314
- if ($[16] !== selectField) {
321
+ if ($[16] !== isContentEditable) {
315
322
  t6 = () => {
316
- setIsEditorFocused(true);
317
- selectField();
323
+ if (isContentEditable) setIsHovered(true);
318
324
  };
319
- $[16] = selectField;
325
+ $[16] = isContentEditable;
320
326
  $[17] = t6;
321
327
  } else t6 = $[17];
322
- const handleFocus = t6;
328
+ const handleMouseEnter = t6;
323
329
  let t7;
324
- if ($[18] === Symbol.for("react.memo_cache_sentinel")) {
330
+ if ($[18] !== isContentEditable) {
325
331
  t7 = () => {
326
- setIsEditorFocused(false);
327
- };
328
- $[18] = t7;
329
- } else t7 = $[18];
330
- const handleBlur = t7;
331
- let t8;
332
- if ($[19] !== isContentEditable) {
333
- t8 = () => {
334
- if (isContentEditable) setIsHovered(true);
335
- };
336
- $[19] = isContentEditable;
337
- $[20] = t8;
338
- } else t8 = $[20];
339
- const handleMouseEnter = t8;
340
- let t9;
341
- if ($[21] !== isContentEditable) {
342
- t9 = () => {
343
332
  if (isContentEditable) setIsHovered(false);
344
333
  };
345
- $[21] = isContentEditable;
346
- $[22] = t9;
347
- } else t9 = $[22];
348
- const handleMouseLeave = t9;
334
+ $[18] = isContentEditable;
335
+ $[19] = t7;
336
+ } else t7 = $[19];
337
+ const handleMouseLeave = t7;
349
338
  const fieldData = { text: fieldValue };
350
339
  const fieldSchema = repeaterContext ? repeaterContext.itemSchema?.[name] : (blockContext.sourceSchema ?? typeboxSchema.properties)[name];
351
- let t10;
352
- if ($[23] !== currentPathname || $[24] !== fieldValue || $[25] !== linkStyle || $[26] !== pages || $[27] !== textStyle) {
353
- t10 = () => markdownToReactNodes(fieldValue, {
340
+ let t8;
341
+ if ($[20] !== currentPathname || $[21] !== fieldValue || $[22] !== linkStyle || $[23] !== pages || $[24] !== textStyle) {
342
+ t8 = () => markdownToReactNodes(fieldValue, {
354
343
  pages,
355
344
  fallbackHref: currentPathname,
356
345
  textStyle,
357
346
  linkStyle
358
347
  });
359
- $[23] = currentPathname;
360
- $[24] = fieldValue;
361
- $[25] = linkStyle;
362
- $[26] = pages;
363
- $[27] = textStyle;
364
- $[28] = t10;
365
- } else t10 = $[28];
366
- const text = t10;
348
+ $[20] = currentPathname;
349
+ $[21] = fieldValue;
350
+ $[22] = linkStyle;
351
+ $[23] = pages;
352
+ $[24] = textStyle;
353
+ $[25] = t8;
354
+ } else t8 = $[25];
355
+ const text = t8;
367
356
  if (!isContentEditable) return /* @__PURE__ */ jsx(Fragment, { children: children({ children: text() }, fieldData) });
368
- const t11 = fieldSchema?.maxLength;
369
- let t12;
370
- if ($[29] !== currentPathname || $[30] !== fieldValue || $[31] !== handleChange || $[32] !== handleFocus || $[33] !== linkStyle || $[34] !== pages || $[35] !== t11 || $[36] !== textStyle) {
371
- t12 = /* @__PURE__ */ jsx(InlineLexicalEditor, {
357
+ const t9 = fieldSchema?.maxLength;
358
+ let t10;
359
+ if ($[26] !== currentPathname || $[27] !== fieldValue || $[28] !== handleChange || $[29] !== handleFocus || $[30] !== linkStyle || $[31] !== pages || $[32] !== t9 || $[33] !== textStyle) {
360
+ t10 = /* @__PURE__ */ jsx(InlineLexicalEditor, {
372
361
  textStyle,
373
362
  linkStyle,
374
363
  pages,
375
364
  fallbackHref: currentPathname,
376
365
  initialState: fieldValue,
377
366
  externalState: fieldValue,
378
- maxLength: t11,
367
+ maxLength: t9,
379
368
  onChange: handleChange,
380
369
  onFocus: handleFocus,
381
370
  onBlur: handleBlur
382
371
  });
383
- $[29] = currentPathname;
384
- $[30] = fieldValue;
385
- $[31] = handleChange;
386
- $[32] = handleFocus;
387
- $[33] = linkStyle;
388
- $[34] = pages;
389
- $[35] = t11;
390
- $[36] = textStyle;
391
- $[37] = t12;
392
- } else t12 = $[37];
393
- const t13 = children({
372
+ $[26] = currentPathname;
373
+ $[27] = fieldValue;
374
+ $[28] = handleChange;
375
+ $[29] = handleFocus;
376
+ $[30] = linkStyle;
377
+ $[31] = pages;
378
+ $[32] = t9;
379
+ $[33] = textStyle;
380
+ $[34] = t10;
381
+ } else t10 = $[34];
382
+ const t11 = children({
394
383
  ref: elementRef,
395
384
  "data-camox-field-id": fieldId,
396
385
  ...overlayState,
@@ -398,15 +387,15 @@ function createEditableBlock(options) {
398
387
  onMouseEnter: handleMouseEnter,
399
388
  onMouseLeave: handleMouseLeave,
400
389
  onClickCapture: selectField,
401
- children: t12
390
+ children: t10
402
391
  }, fieldData);
403
- let t14;
404
- if ($[38] !== t13) {
405
- t14 = /* @__PURE__ */ jsx(Fragment, { children: t13 });
406
- $[38] = t13;
407
- $[39] = t14;
408
- } else t14 = $[39];
409
- return t14;
392
+ let t12;
393
+ if ($[35] !== t11) {
394
+ t12 = /* @__PURE__ */ jsx(Fragment, { children: t11 });
395
+ $[35] = t11;
396
+ $[36] = t12;
397
+ } else t12 = $[36];
398
+ return t12;
410
399
  };
411
400
  const Icon = (t0) => {
412
401
  const $ = c(33);
@@ -906,7 +895,7 @@ function createEditableBlock(options) {
906
895
  return t19;
907
896
  };
908
897
  const Link = (t0) => {
909
- const $ = c(21);
898
+ const $ = c(18);
910
899
  const { name, children } = t0;
911
900
  const selectTarget = usePreviewSelection();
912
901
  const blockContext = React.use(Context);
@@ -918,25 +907,14 @@ function createEditableBlock(options) {
918
907
  const repeaterContext = React.use(RepeatableItemContext);
919
908
  const rawFieldValue = repeaterContext ? repeaterContext.itemContent[name] : content[name];
920
909
  const fieldValue = normalizeLinkValue(rawFieldValue);
910
+ const applyEdit = useApplyContentEdit();
911
+ const pages = useEditorLinkPages();
921
912
  let t1;
922
913
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
923
- t1 = blockMutations.updateContent();
914
+ t1 = { select: _temp3 };
924
915
  $[0] = t1;
925
916
  } else t1 = $[0];
926
- const updateBlockContent = useMutation(t1);
927
- let t2;
928
- if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
929
- t2 = repeatableItemMutations.updateContent();
930
- $[1] = t2;
931
- } else t2 = $[1];
932
- const updateRepeatableContent = useMutation(t2);
933
- const pages = useEditorLinkPages();
934
- let t3;
935
- if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
936
- t3 = { select: _temp3 };
937
- $[2] = t3;
938
- } else t3 = $[2];
939
- const currentPathname = useLocation(t3);
917
+ const currentPathname = useLocation(t1);
940
918
  const resolvedHref = resolveLinkHref(fieldValue, pages, currentPathname);
941
919
  const fieldId = getOverlayFieldId(blockId, String(name), { itemId: repeaterContext?.itemId });
942
920
  const [isEditing, setIsEditing] = React.useState(false);
@@ -962,26 +940,28 @@ function createEditableBlock(options) {
962
940
  setPrevSidebarHover(isHoveredFromSidebar);
963
941
  setIsHovered(isHoveredFromSidebar);
964
942
  }
965
- let t4;
966
- if ($[3] !== blockId || $[4] !== name || $[5] !== repeaterContext || $[6] !== updateBlockContent || $[7] !== updateRepeatableContent) {
967
- t4 = (newLinkValue) => {
968
- if (repeaterContext?.itemId != null) updateRepeatableContent.mutate({
969
- id: repeaterContext.itemId,
970
- content: { [name]: newLinkValue }
971
- });
972
- else updateBlockContent.mutate({
973
- id: blockId,
974
- content: { [name]: newLinkValue }
975
- });
943
+ let t2;
944
+ if ($[1] !== applyEdit || $[2] !== blockId || $[3] !== name || $[4] !== repeaterContext?.itemId) {
945
+ t2 = (newLinkValue) => {
946
+ const content_0 = { [name]: newLinkValue };
947
+ const itemId = repeaterContext?.itemId;
948
+ applyEdit(itemId != null ? {
949
+ type: "itemContent",
950
+ itemId,
951
+ content: content_0
952
+ } : {
953
+ type: "blockContent",
954
+ blockId,
955
+ content: content_0
956
+ }).catch(ignore);
976
957
  };
977
- $[3] = blockId;
978
- $[4] = name;
979
- $[5] = repeaterContext;
980
- $[6] = updateBlockContent;
981
- $[7] = updateRepeatableContent;
982
- $[8] = t4;
983
- } else t4 = $[8];
984
- const saveLinkValue = t4;
958
+ $[1] = applyEdit;
959
+ $[2] = blockId;
960
+ $[3] = name;
961
+ $[4] = repeaterContext?.itemId;
962
+ $[5] = t2;
963
+ } else t2 = $[5];
964
+ const saveLinkValue = t2;
985
965
  const handleInput = (e) => {
986
966
  const newText = e.target.textContent || "";
987
967
  saveLinkValue({
@@ -989,9 +969,9 @@ function createEditableBlock(options) {
989
969
  text: newText
990
970
  });
991
971
  };
992
- let t5;
993
- if ($[9] !== blockId || $[10] !== name || $[11] !== repeaterContext || $[12] !== selectTarget) {
994
- t5 = () => {
972
+ let t3;
973
+ if ($[6] !== blockId || $[7] !== name || $[8] !== repeaterContext || $[9] !== selectTarget) {
974
+ t3 = () => {
995
975
  selectTarget(repeaterContext?.itemId != null ? {
996
976
  type: "item-field",
997
977
  blockId,
@@ -1005,33 +985,33 @@ function createEditableBlock(options) {
1005
985
  fieldType: "Link"
1006
986
  });
1007
987
  };
1008
- $[9] = blockId;
1009
- $[10] = name;
1010
- $[11] = repeaterContext;
1011
- $[12] = selectTarget;
1012
- $[13] = t5;
1013
- } else t5 = $[13];
1014
- const selectField = t5;
1015
- let t6;
1016
- if ($[14] !== selectField) {
1017
- t6 = () => {
988
+ $[6] = blockId;
989
+ $[7] = name;
990
+ $[8] = repeaterContext;
991
+ $[9] = selectTarget;
992
+ $[10] = t3;
993
+ } else t3 = $[10];
994
+ const selectField = t3;
995
+ let t4;
996
+ if ($[11] !== selectField) {
997
+ t4 = () => {
1018
998
  setIsEditing(true);
1019
999
  setIsEditorFocused(true);
1020
1000
  selectField();
1021
1001
  };
1022
- $[14] = selectField;
1023
- $[15] = t6;
1024
- } else t6 = $[15];
1025
- const handleFocus = t6;
1026
- let t7;
1027
- if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
1028
- t7 = () => {
1002
+ $[11] = selectField;
1003
+ $[12] = t4;
1004
+ } else t4 = $[12];
1005
+ const handleFocus = t4;
1006
+ let t5;
1007
+ if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
1008
+ t5 = () => {
1029
1009
  setIsEditing(false);
1030
1010
  setIsEditorFocused(false);
1031
1011
  };
1032
- $[16] = t7;
1033
- } else t7 = $[16];
1034
- const handleBlur = t7;
1012
+ $[13] = t5;
1013
+ } else t5 = $[13];
1014
+ const handleBlur = t5;
1035
1015
  const linkData = {
1036
1016
  text: displayText,
1037
1017
  href: resolvedHref,
@@ -1043,18 +1023,18 @@ function createEditableBlock(options) {
1043
1023
  rel: fieldValue.newTab ? "noreferrer" : void 0,
1044
1024
  children: fieldValue.text
1045
1025
  }, linkData) });
1046
- let t8;
1047
- let t9;
1048
- if ($[17] === Symbol.for("react.memo_cache_sentinel")) {
1049
- t8 = () => setIsHovered(true);
1050
- t9 = () => setIsHovered(false);
1051
- $[17] = t8;
1052
- $[18] = t9;
1026
+ let t6;
1027
+ let t7;
1028
+ if ($[14] === Symbol.for("react.memo_cache_sentinel")) {
1029
+ t6 = () => setIsHovered(true);
1030
+ t7 = () => setIsHovered(false);
1031
+ $[14] = t6;
1032
+ $[15] = t7;
1053
1033
  } else {
1054
- t8 = $[17];
1055
- t9 = $[18];
1034
+ t6 = $[14];
1035
+ t7 = $[15];
1056
1036
  }
1057
- const t10 = children({
1037
+ const t8 = children({
1058
1038
  ref: elementRef,
1059
1039
  to: resolvedHref,
1060
1040
  target: fieldValue.newTab ? "_blank" : void 0,
@@ -1069,19 +1049,19 @@ function createEditableBlock(options) {
1069
1049
  onInput: handleInput,
1070
1050
  onFocus: handleFocus,
1071
1051
  onBlur: handleBlur,
1072
- onMouseEnter: t8,
1073
- onMouseLeave: t9,
1052
+ onMouseEnter: t6,
1053
+ onMouseLeave: t7,
1074
1054
  onKeyDown: _temp5,
1075
1055
  spellCheck: false,
1076
1056
  suppressContentEditableWarning: true
1077
1057
  }, linkData);
1078
- let t11;
1079
- if ($[19] !== t10) {
1080
- t11 = /* @__PURE__ */ jsx(Fragment, { children: t10 });
1081
- $[19] = t10;
1082
- $[20] = t11;
1083
- } else t11 = $[20];
1084
- return t11;
1058
+ let t9;
1059
+ if ($[16] !== t8) {
1060
+ t9 = /* @__PURE__ */ jsx(Fragment, { children: t8 });
1061
+ $[16] = t8;
1062
+ $[17] = t9;
1063
+ } else t9 = $[17];
1064
+ return t9;
1085
1065
  };
1086
1066
  const assetOverlayMode = (reference) => {
1087
1067
  if (reference) return "reference";
@@ -1991,48 +1971,41 @@ function createEditableBlock(options) {
1991
1971
  };
1992
1972
  };
1993
1973
  const usePlacedRecord = (block, owner, fieldName, record) => {
1994
- const $ = c(40);
1995
- const studioCache = useStudioCache();
1974
+ const $ = c(37);
1996
1975
  const selectTarget = usePreviewSelection();
1997
1976
  const projectUuid = useProjectUuid();
1998
- const queryClient = useQueryClient();
1999
- let t0;
2000
- if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
2001
- t0 = collectionMutations.edit();
2002
- $[0] = t0;
2003
- } else t0 = $[0];
2004
- const mutation = useMutation(t0);
1977
+ const applyEdit = useApplyContentEdit();
2005
1978
  const [error, setError] = React.useState(null);
2006
1979
  const [pointerHovered, setPointerHovered] = React.useState(false);
2007
1980
  const editable = useIsEditable(block.mode);
2008
- let t1;
2009
- if ($[1] !== block || $[2] !== fieldName || $[3] !== owner || $[4] !== record) {
2010
- t1 = record ? placementOf(block, owner, fieldName, record.id) : null;
2011
- $[1] = block;
2012
- $[2] = fieldName;
2013
- $[3] = owner;
2014
- $[4] = record;
2015
- $[5] = t1;
2016
- } else t1 = $[5];
2017
- const placement = t1;
1981
+ let t0;
1982
+ if ($[0] !== block || $[1] !== fieldName || $[2] !== owner || $[3] !== record) {
1983
+ t0 = record ? placementOf(block, owner, fieldName, record.id) : null;
1984
+ $[0] = block;
1985
+ $[1] = fieldName;
1986
+ $[2] = owner;
1987
+ $[3] = record;
1988
+ $[4] = t0;
1989
+ } else t0 = $[4];
1990
+ const placement = t0;
2018
1991
  const selected = useRecordSelection(placement);
2019
1992
  const { window: iframeWindow } = useFrame();
1993
+ let t1;
1994
+ if ($[5] !== placement) {
1995
+ t1 = placement ? recordPlacementId(placement) : void 0;
1996
+ $[5] = placement;
1997
+ $[6] = t1;
1998
+ } else t1 = $[6];
2020
1999
  let t2;
2021
- if ($[6] !== placement) {
2022
- t2 = placement ? recordPlacementId(placement) : void 0;
2023
- $[6] = placement;
2024
- $[7] = t2;
2025
- } else t2 = $[7];
2026
- let t3;
2027
- if ($[8] !== t2) {
2028
- t3 = { fieldId: t2 };
2000
+ if ($[7] !== t1) {
2001
+ t2 = { fieldId: t1 };
2002
+ $[7] = t1;
2029
2003
  $[8] = t2;
2030
- $[9] = t3;
2031
- } else t3 = $[9];
2032
- const sidebarHovered = useOverlayMessage(iframeWindow, editable, "CAMOX_HOVER_FIELD", "CAMOX_HOVER_FIELD_END", t3);
2033
- let t4;
2034
- if ($[10] !== editable || $[11] !== placement || $[12] !== selectTarget) {
2035
- t4 = (event) => {
2004
+ } else t2 = $[8];
2005
+ const sidebarHovered = useOverlayMessage(iframeWindow, editable, "CAMOX_HOVER_FIELD", "CAMOX_HOVER_FIELD_END", t2);
2006
+ let t3;
2007
+ if ($[9] !== editable || $[10] !== placement || $[11] !== selectTarget) {
2008
+ t3 = (event) => {
2036
2009
  if (!editable || !placement) return;
2037
2010
  if (event.target.closest("[data-camox-field-id]") !== event.currentTarget) return;
2038
2011
  selectTarget({
@@ -2040,15 +2013,15 @@ function createEditableBlock(options) {
2040
2013
  ...placement
2041
2014
  });
2042
2015
  };
2043
- $[10] = editable;
2044
- $[11] = placement;
2045
- $[12] = selectTarget;
2046
- $[13] = t4;
2047
- } else t4 = $[13];
2048
- const selectRecord = t4;
2049
- let t5;
2050
- if ($[14] !== editable || $[15] !== placement || $[16] !== selectTarget) {
2051
- t5 = (recordFieldName, recordFieldType) => {
2016
+ $[9] = editable;
2017
+ $[10] = placement;
2018
+ $[11] = selectTarget;
2019
+ $[12] = t3;
2020
+ } else t3 = $[12];
2021
+ const selectRecord = t3;
2022
+ let t4;
2023
+ if ($[13] !== editable || $[14] !== placement || $[15] !== selectTarget) {
2024
+ t4 = (recordFieldName, recordFieldType) => {
2052
2025
  if (!editable || !placement) return;
2053
2026
  selectTarget({
2054
2027
  type: "record-field",
@@ -2057,95 +2030,87 @@ function createEditableBlock(options) {
2057
2030
  recordFieldType
2058
2031
  });
2059
2032
  };
2060
- $[14] = editable;
2061
- $[15] = placement;
2062
- $[16] = selectTarget;
2063
- $[17] = t5;
2064
- } else t5 = $[17];
2065
- const selectRecordField = t5;
2066
- let t6;
2067
- if ($[18] !== editable || $[19] !== mutation || $[20] !== projectUuid || $[21] !== queryClient || $[22] !== record || $[23] !== studioCache) {
2068
- t6 = (field, value) => {
2033
+ $[13] = editable;
2034
+ $[14] = placement;
2035
+ $[15] = selectTarget;
2036
+ $[16] = t4;
2037
+ } else t4 = $[16];
2038
+ const selectRecordField = t4;
2039
+ let t5;
2040
+ if ($[17] !== applyEdit || $[18] !== editable || $[19] !== projectUuid || $[20] !== record) {
2041
+ t5 = (field, value) => {
2069
2042
  if (!record || !editable) return;
2070
2043
  setError(null);
2071
- referenceWritesFor(queryClient).save(record, field, value, async (input) => {
2072
- const saved = await mutation.mutateAsync({
2073
- ...input,
2074
- projectUuid
2075
- });
2076
- studioCache.set(reads.record({
2077
- projectUuid,
2078
- collectionId: record.collectionId,
2079
- id: record.id
2080
- }), saved);
2081
- invalidateCollectionRecordViews(studioCache, projectUuid, record.collectionId);
2082
- return saved;
2044
+ applyEdit({
2045
+ type: "recordField",
2046
+ projectUuid,
2047
+ record,
2048
+ field,
2049
+ value
2083
2050
  }).catch((cause) => {
2084
2051
  setError(cause instanceof Error ? cause.message : "Could not save item");
2085
2052
  });
2086
2053
  };
2054
+ $[17] = applyEdit;
2087
2055
  $[18] = editable;
2088
- $[19] = mutation;
2089
- $[20] = projectUuid;
2090
- $[21] = queryClient;
2091
- $[22] = record;
2092
- $[23] = studioCache;
2093
- $[24] = t6;
2094
- } else t6 = $[24];
2095
- const update = t6;
2096
- const t7 = pointerHovered || sidebarHovered;
2097
- let t8;
2098
- if ($[25] !== placement || $[26] !== selectRecordField || $[27] !== update) {
2099
- t8 = placement ? {
2056
+ $[19] = projectUuid;
2057
+ $[20] = record;
2058
+ $[21] = t5;
2059
+ } else t5 = $[21];
2060
+ const update = t5;
2061
+ const t6 = pointerHovered || sidebarHovered;
2062
+ let t7;
2063
+ if ($[22] !== placement || $[23] !== selectRecordField || $[24] !== update) {
2064
+ t7 = placement ? {
2100
2065
  placement,
2101
2066
  selectRecordField,
2102
2067
  update
2103
2068
  } : null;
2104
- $[25] = placement;
2105
- $[26] = selectRecordField;
2106
- $[27] = update;
2107
- $[28] = t8;
2108
- } else t8 = $[28];
2109
- let t10;
2069
+ $[22] = placement;
2070
+ $[23] = selectRecordField;
2071
+ $[24] = update;
2072
+ $[25] = t7;
2073
+ } else t7 = $[25];
2074
+ let t8;
2110
2075
  let t9;
2111
- if ($[29] === Symbol.for("react.memo_cache_sentinel")) {
2112
- t9 = () => setPointerHovered(true);
2113
- t10 = () => setPointerHovered(false);
2114
- $[29] = t10;
2115
- $[30] = t9;
2076
+ if ($[26] === Symbol.for("react.memo_cache_sentinel")) {
2077
+ t8 = () => setPointerHovered(true);
2078
+ t9 = () => setPointerHovered(false);
2079
+ $[26] = t8;
2080
+ $[27] = t9;
2116
2081
  } else {
2117
- t10 = $[29];
2118
- t9 = $[30];
2082
+ t8 = $[26];
2083
+ t9 = $[27];
2119
2084
  }
2120
- let t11;
2121
- if ($[31] !== selectRecord) {
2122
- t11 = {
2085
+ let t10;
2086
+ if ($[28] !== selectRecord) {
2087
+ t10 = {
2123
2088
  onClickCapture: selectRecord,
2124
- onMouseEnter: t9,
2125
- onMouseLeave: t10
2089
+ onMouseEnter: t8,
2090
+ onMouseLeave: t9
2126
2091
  };
2127
- $[31] = selectRecord;
2128
- $[32] = t11;
2129
- } else t11 = $[32];
2130
- let t12;
2131
- if ($[33] !== editable || $[34] !== error || $[35] !== selected || $[36] !== t11 || $[37] !== t7 || $[38] !== t8) {
2132
- t12 = {
2092
+ $[28] = selectRecord;
2093
+ $[29] = t10;
2094
+ } else t10 = $[29];
2095
+ let t11;
2096
+ if ($[30] !== editable || $[31] !== error || $[32] !== selected || $[33] !== t10 || $[34] !== t6 || $[35] !== t7) {
2097
+ t11 = {
2133
2098
  editable,
2134
2099
  error,
2135
2100
  selected,
2136
- hovered: t7,
2137
- reference: t8,
2138
- wrapperProps: t11
2101
+ hovered: t6,
2102
+ reference: t7,
2103
+ wrapperProps: t10
2139
2104
  };
2140
- $[33] = editable;
2141
- $[34] = error;
2142
- $[35] = selected;
2105
+ $[30] = editable;
2106
+ $[31] = error;
2107
+ $[32] = selected;
2108
+ $[33] = t10;
2109
+ $[34] = t6;
2110
+ $[35] = t7;
2143
2111
  $[36] = t11;
2144
- $[37] = t7;
2145
- $[38] = t8;
2146
- $[39] = t12;
2147
- } else t12 = $[39];
2148
- return t12;
2112
+ } else t11 = $[36];
2113
+ return t11;
2149
2114
  };
2150
2115
  const RecordScope = (t0) => {
2151
2116
  const $ = c(16);
@@ -2569,23 +2534,24 @@ function createEditableBlock(options) {
2569
2534
  const $ = c(9);
2570
2535
  const { collectionId, collection, properties, record, children, fallback } = t0;
2571
2536
  const editingOwner = React.use(PreviewEditingOwnerContext);
2572
- let t1;
2573
- if ($[0] !== collection || $[1] !== collectionId || $[2] !== record) {
2574
- t1 = {
2537
+ const t1 = collection?._internal;
2538
+ let t2;
2539
+ if ($[0] !== collectionId || $[1] !== record || $[2] !== t1) {
2540
+ t2 = {
2575
2541
  collectionId,
2576
- collection,
2542
+ collection: t1,
2577
2543
  loaded: record
2578
2544
  };
2579
- $[0] = collection;
2580
- $[1] = collectionId;
2581
- $[2] = record;
2582
- $[3] = t1;
2583
- } else t1 = $[3];
2584
- const latest = useLatestRecord(t1);
2545
+ $[0] = collectionId;
2546
+ $[1] = record;
2547
+ $[2] = t1;
2548
+ $[3] = t2;
2549
+ } else t2 = $[3];
2550
+ const latest = useLatestRecord(t2);
2585
2551
  if (editingOwner?.kind !== "layout" || !latest) return fallback;
2586
- let t2;
2552
+ let t3;
2587
2553
  if ($[4] !== children || $[5] !== editingOwner.layoutId || $[6] !== latest || $[7] !== properties) {
2588
- t2 = /* @__PURE__ */ jsx(LayoutRecord, {
2554
+ t3 = /* @__PURE__ */ jsx(LayoutRecord, {
2589
2555
  layoutId: editingOwner.layoutId,
2590
2556
  properties,
2591
2557
  record: latest,
@@ -2595,9 +2561,9 @@ function createEditableBlock(options) {
2595
2561
  $[5] = editingOwner.layoutId;
2596
2562
  $[6] = latest;
2597
2563
  $[7] = properties;
2598
- $[8] = t2;
2599
- } else t2 = $[8];
2600
- return t2;
2564
+ $[8] = t3;
2565
+ } else t3 = $[8];
2566
+ return t3;
2601
2567
  };
2602
2568
  const ReferenceList = (t0) => {
2603
2569
  const $ = c(44);