camox 0.32.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/core/createBlock.d.ts +1 -1
  2. package/dist/core/createBlock.js +88 -108
  3. package/dist/core/hooks/useIsEditable.js +6 -10
  4. package/dist/core/lib/fieldTypes.js +10 -219
  5. package/dist/features/agent-chat/components/AgentChatSidebar.js +172 -0
  6. package/dist/features/agent-chat/components/AgentChatThread.js +9 -9
  7. package/dist/features/preview/CamoxPreview.js +137 -729
  8. package/dist/features/preview/components/{AddBlockSheet.js → AddBlockSidebar.js} +121 -131
  9. package/dist/features/preview/components/AssetFieldEditor.js +107 -82
  10. package/dist/features/preview/components/AssetLightbox.js +4 -4
  11. package/dist/features/preview/components/AssetPickerModal.js +277 -0
  12. package/dist/features/preview/components/BlockActionsPopover.js +18 -24
  13. package/dist/features/preview/components/CreatePageModal.js +6 -6
  14. package/dist/features/preview/components/FieldToolbar.js +64 -127
  15. package/dist/features/preview/components/ItemFieldsEditor.js +98 -125
  16. package/dist/features/preview/components/LeftSidebar.js +64 -0
  17. package/dist/features/preview/components/LinkFieldEditor.js +1 -1
  18. package/dist/features/preview/components/MultipleAssetFieldEditor.js +94 -56
  19. package/dist/features/preview/components/OverlayTracker.js +15 -15
  20. package/dist/features/preview/components/Overlays.js +12 -12
  21. package/dist/features/preview/components/PageEditorSidebar.js +563 -0
  22. package/dist/features/preview/components/PageInfoSidebar.js +1453 -0
  23. package/dist/features/preview/components/PageNavigatorSidebar.js +590 -0
  24. package/dist/features/preview/components/PagePicker.js +3 -3
  25. package/dist/features/preview/components/PageStatusBadge.js +1 -1
  26. package/dist/features/preview/components/PageTree.js +204 -564
  27. package/dist/features/preview/components/PreviewPanel.js +123 -158
  28. package/dist/features/preview/components/PreviewToolbar.js +260 -256
  29. package/dist/features/preview/components/PublishDialog.js +2 -2
  30. package/dist/features/preview/components/RepeatableItemsList.js +2 -2
  31. package/dist/features/preview/components/RightSidebar.js +109 -0
  32. package/dist/features/preview/components/UnlinkAssetButton.js +2 -2
  33. package/dist/features/preview/components/useRepeatableItemActions.js +3 -138
  34. package/dist/features/preview/components/useUpdateBlockPosition.js +1 -1
  35. package/dist/features/preview/previewQueryFns.js +23 -0
  36. package/dist/features/preview/previewStore.js +46 -63
  37. package/dist/features/provider/CamoxProvider.js +255 -70
  38. package/dist/features/provider/useAdminShortcuts.js +5 -48
  39. package/dist/features/routes/pageRoute.js +1 -1
  40. package/dist/features/studio/CamoxStudio.js +6 -5
  41. package/dist/features/studio/components/EnvironmentMenu.js +2 -2
  42. package/dist/features/studio/components/Navbar.js +53 -71
  43. package/dist/features/studio/components/ProjectMenu.js +1 -1
  44. package/dist/features/studio/components/UserButton.js +1 -1
  45. package/dist/features/studio/routes.js +7 -0
  46. package/dist/features/studio/useTheme.js +67 -33
  47. package/dist/features/vite/routeGeneration.js +68 -66
  48. package/dist/hooks/use-file-upload.js +1 -1
  49. package/dist/lib/auth.js +23 -22
  50. package/dist/lib/utils.js +1 -1
  51. package/dist/studio-overlays.css +1 -1
  52. package/dist/studio.css +1 -1
  53. package/package.json +4 -4
  54. package/dist/features/agent-chat/components/AgentChatSheet.js +0 -207
  55. package/dist/features/preview/components/AssetPickerGrid.js +0 -236
  56. package/dist/features/preview/components/PageContentSheet.js +0 -608
  57. package/dist/features/preview/components/PageMetadataModal.js +0 -908
  58. package/dist/features/preview/components/PreviewSideSheet.js +0 -76
@@ -5,7 +5,7 @@ import { transformImageUrl } from "../../../core/lib/imageTransform.js";
5
5
  import { UploadDropZone } from "../../content/components/UploadDropZone.js";
6
6
  import { useFileUpload } from "../../../hooks/use-file-upload.js";
7
7
  import { AssetLightbox } from "./AssetLightbox.js";
8
- import { AssetPickerGrid } from "./AssetPickerGrid.js";
8
+ import { AssetPickerModal } from "./AssetPickerModal.js";
9
9
  import { UnlinkAssetButton } from "./UnlinkAssetButton.js";
10
10
  import { AssetActionButtons } from "./AssetFieldEditor.js";
11
11
  import { c } from "react/compiler-runtime";
@@ -22,9 +22,9 @@ import { CSS } from "@dnd-kit/utilities";
22
22
  //#region src/features/preview/components/MultipleAssetFieldEditor.tsx
23
23
  const SortableAssetItem = (t0) => {
24
24
  const $ = c(45);
25
- if ($[0] !== "3cf038d410d44a905bb67a7755e19d8146b75274d1d91e2ad5f7a0d2580bec80") {
25
+ if ($[0] !== "0caea1891823f5fc9c0479c2355a3624a6f7a738eac9bd06dae08f7338ed3b58") {
26
26
  for (let $i = 0; $i < 45; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
27
- $[0] = "3cf038d410d44a905bb67a7755e19d8146b75274d1d91e2ad5f7a0d2580bec80";
27
+ $[0] = "0caea1891823f5fc9c0479c2355a3624a6f7a738eac9bd06dae08f7338ed3b58";
28
28
  }
29
29
  const { asset, assetType, onRemove, onAssetOpen } = t0;
30
30
  const t1 = String(asset._fileId);
@@ -180,10 +180,10 @@ const SortableAssetItem = (t0) => {
180
180
  return t17;
181
181
  };
182
182
  const MultipleAssetFieldEditor = (t0) => {
183
- const $ = c(12);
184
- if ($[0] !== "3cf038d410d44a905bb67a7755e19d8146b75274d1d91e2ad5f7a0d2580bec80") {
185
- for (let $i = 0; $i < 12; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
186
- $[0] = "3cf038d410d44a905bb67a7755e19d8146b75274d1d91e2ad5f7a0d2580bec80";
183
+ const $ = c(28);
184
+ if ($[0] !== "0caea1891823f5fc9c0479c2355a3624a6f7a738eac9bd06dae08f7338ed3b58") {
185
+ for (let $i = 0; $i < 28; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
186
+ $[0] = "0caea1891823f5fc9c0479c2355a3624a6f7a738eac9bd06dae08f7338ed3b58";
187
187
  }
188
188
  const { fieldName, assetType, currentData, onFieldChange } = t0;
189
189
  const isImage = assetType === "Image";
@@ -234,67 +234,105 @@ const MultipleAssetFieldEditor = (t0) => {
234
234
  setPickerOpen(false);
235
235
  };
236
236
  const T0 = UploadDropZone;
237
- const t3 = pickerOpen ? /* @__PURE__ */ jsx(AssetPickerGrid, {
238
- assetType,
239
- mode: "multiple",
240
- onSelectSingle: _temp5,
241
- onSelectMultiple: handleSelectMultiple,
242
- onClose: () => setPickerOpen(false)
243
- }) : /* @__PURE__ */ jsxs("div", {
244
- className: "space-y-4 px-4 py-4",
245
- children: [items.length > 0 && /* @__PURE__ */ jsx(DndContext, {
246
- sensors,
247
- collisionDetection: closestCenter,
248
- onDragEnd: handleDragEnd,
249
- modifiers: [restrictToVerticalAxis],
250
- children: /* @__PURE__ */ jsx(SortableContext, {
251
- items: items.map(_temp6),
252
- strategy: verticalListSortingStrategy,
253
- children: /* @__PURE__ */ jsx("ul", {
254
- className: "flex flex-col gap-1",
255
- children: items.map((asset) => /* @__PURE__ */ jsx(SortableAssetItem, {
256
- asset,
257
- assetType,
258
- onRemove: handleRemove,
259
- onAssetOpen: setLightboxAsset
260
- }, asset._fileId))
261
- })
237
+ const t3 = "space-y-4 px-2 py-4";
238
+ const t4 = items.length > 0 && /* @__PURE__ */ jsx(DndContext, {
239
+ sensors,
240
+ collisionDetection: closestCenter,
241
+ onDragEnd: handleDragEnd,
242
+ modifiers: [restrictToVerticalAxis],
243
+ children: /* @__PURE__ */ jsx(SortableContext, {
244
+ items: items.map(_temp5),
245
+ strategy: verticalListSortingStrategy,
246
+ children: /* @__PURE__ */ jsx("ul", {
247
+ className: "flex flex-col gap-1",
248
+ children: items.map((asset) => /* @__PURE__ */ jsx(SortableAssetItem, {
249
+ asset,
250
+ assetType,
251
+ onRemove: handleRemove,
252
+ onAssetOpen: setLightboxAsset
253
+ }, asset._fileId))
262
254
  })
263
- }), /* @__PURE__ */ jsx(AssetActionButtons, {
255
+ })
256
+ });
257
+ let t5;
258
+ if ($[4] !== setPickerOpen) {
259
+ t5 = () => setPickerOpen(true);
260
+ $[4] = setPickerOpen;
261
+ $[5] = t5;
262
+ } else t5 = $[5];
263
+ let t6;
264
+ if ($[6] !== isImage || $[7] !== t5 || $[8] !== uploadFiles || $[9] !== uploads) {
265
+ t6 = /* @__PURE__ */ jsx(AssetActionButtons, {
264
266
  isImage,
265
267
  multiple: true,
266
268
  fileInputRef,
267
- onPickerOpen: () => setPickerOpen(true),
269
+ onPickerOpen: t5,
268
270
  onFilesSelected: uploadFiles,
269
271
  uploads
270
- })]
271
- });
272
- let t4;
273
- if ($[4] !== lightboxAsset || $[5] !== setLightboxAsset) {
274
- t4 = lightboxAsset && /* @__PURE__ */ jsx(AssetLightbox, {
272
+ });
273
+ $[6] = isImage;
274
+ $[7] = t5;
275
+ $[8] = uploadFiles;
276
+ $[9] = uploads;
277
+ $[10] = t6;
278
+ } else t6 = $[10];
279
+ let t7;
280
+ if ($[11] !== t4 || $[12] !== t6) {
281
+ t7 = /* @__PURE__ */ jsxs("div", {
282
+ className: t3,
283
+ children: [t4, t6]
284
+ });
285
+ $[11] = t4;
286
+ $[12] = t6;
287
+ $[13] = t7;
288
+ } else t7 = $[13];
289
+ let t8;
290
+ if ($[14] !== assetType || $[15] !== handleSelectMultiple || $[16] !== pickerOpen || $[17] !== setPickerOpen) {
291
+ t8 = /* @__PURE__ */ jsx(AssetPickerModal, {
292
+ open: pickerOpen,
293
+ onOpenChange: setPickerOpen,
294
+ assetType,
295
+ mode: "multiple",
296
+ onSelectSingle: _temp6,
297
+ onSelectMultiple: handleSelectMultiple
298
+ });
299
+ $[14] = assetType;
300
+ $[15] = handleSelectMultiple;
301
+ $[16] = pickerOpen;
302
+ $[17] = setPickerOpen;
303
+ $[18] = t8;
304
+ } else t8 = $[18];
305
+ let t9;
306
+ if ($[19] !== lightboxAsset || $[20] !== setLightboxAsset) {
307
+ t9 = lightboxAsset && /* @__PURE__ */ jsx(AssetLightbox, {
275
308
  open: !!lightboxAsset,
276
309
  onOpenChange: (open) => {
277
310
  if (!open) setLightboxAsset(null);
278
311
  },
279
312
  fileId: lightboxAsset._fileId
280
313
  });
281
- $[4] = lightboxAsset;
282
- $[5] = setLightboxAsset;
283
- $[6] = t4;
284
- } else t4 = $[6];
285
- let t5;
286
- if ($[7] !== T0 || $[8] !== t3 || $[9] !== t4 || $[10] !== uploadFiles) {
287
- t5 = /* @__PURE__ */ jsxs(T0, {
314
+ $[19] = lightboxAsset;
315
+ $[20] = setLightboxAsset;
316
+ $[21] = t9;
317
+ } else t9 = $[21];
318
+ let t10;
319
+ if ($[22] !== T0 || $[23] !== t7 || $[24] !== t8 || $[25] !== t9 || $[26] !== uploadFiles) {
320
+ t10 = /* @__PURE__ */ jsxs(T0, {
288
321
  onDrop: uploadFiles,
289
- children: [t3, t4]
322
+ children: [
323
+ t7,
324
+ t8,
325
+ t9
326
+ ]
290
327
  });
291
- $[7] = T0;
292
- $[8] = t3;
293
- $[9] = t4;
294
- $[10] = uploadFiles;
295
- $[11] = t5;
296
- } else t5 = $[11];
297
- return t5;
328
+ $[22] = T0;
329
+ $[23] = t7;
330
+ $[24] = t8;
331
+ $[25] = t9;
332
+ $[26] = uploadFiles;
333
+ $[27] = t10;
334
+ } else t10 = $[27];
335
+ return t10;
298
336
  };
299
337
  function _temp(a) {
300
338
  return !!a && !!a.url;
@@ -308,10 +346,10 @@ function _temp3(assets) {
308
346
  function _temp4(f) {
309
347
  return { _fileId: f.id };
310
348
  }
311
- function _temp5() {}
312
- function _temp6(a_4) {
349
+ function _temp5(a_4) {
313
350
  return String(a_4._fileId);
314
351
  }
352
+ function _temp6() {}
315
353
 
316
354
  //#endregion
317
355
  export { MultipleAssetFieldEditor };
@@ -1,6 +1,6 @@
1
- import { previewStore } from "../previewStore.js";
2
1
  import { useFrame } from "./Frame.js";
3
2
  import { isOverlayMessage } from "../overlayMessages.js";
3
+ import { previewStore } from "../previewStore.js";
4
4
  import { c } from "react/compiler-runtime";
5
5
  import { useSelector } from "@xstate/store-react";
6
6
  import * as React from "react";
@@ -12,25 +12,25 @@ import * as React from "react";
12
12
  */
13
13
  const OverlayTracker = () => {
14
14
  const $ = c(9);
15
- if ($[0] !== "e30e2d44ddd11434fba7914649cce579c7f2cb5f9cba2ea52958570ba7530abf") {
15
+ if ($[0] !== "e0ea417a1efc597e2017b6de423987462b3c414f4a8241a5bd4f2de04d2dd29e") {
16
16
  for (let $i = 0; $i < 9; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
17
- $[0] = "e30e2d44ddd11434fba7914649cce579c7f2cb5f9cba2ea52958570ba7530abf";
17
+ $[0] = "e0ea417a1efc597e2017b6de423987462b3c414f4a8241a5bd4f2de04d2dd29e";
18
18
  }
19
19
  const { window: iframeWindow } = useFrame();
20
- const isPageContentSheetOpen = useSelector(previewStore, _temp);
21
- const isAddBlockSheetOpen = useSelector(previewStore, _temp2);
20
+ const isPageEditorSidebarOpen = useSelector(previewStore, _temp);
21
+ const isAddBlockSidebarOpen = useSelector(previewStore, _temp2);
22
22
  let t0;
23
23
  let t1;
24
- if ($[1] !== iframeWindow || $[2] !== isAddBlockSheetOpen) {
24
+ if ($[1] !== iframeWindow || $[2] !== isAddBlockSidebarOpen) {
25
25
  t0 = () => {
26
- if (!iframeWindow || !isAddBlockSheetOpen) return;
26
+ if (!iframeWindow || !isAddBlockSidebarOpen) return;
27
27
  const handleClick = _temp3;
28
28
  iframeWindow.document.addEventListener("click", handleClick);
29
29
  return () => iframeWindow.document.removeEventListener("click", handleClick);
30
30
  };
31
- t1 = [iframeWindow, isAddBlockSheetOpen];
31
+ t1 = [iframeWindow, isAddBlockSidebarOpen];
32
32
  $[1] = iframeWindow;
33
- $[2] = isAddBlockSheetOpen;
33
+ $[2] = isAddBlockSidebarOpen;
34
34
  $[3] = t0;
35
35
  $[4] = t1;
36
36
  } else {
@@ -40,14 +40,14 @@ const OverlayTracker = () => {
40
40
  React.useEffect(t0, t1);
41
41
  let t2;
42
42
  let t3;
43
- if ($[5] !== iframeWindow || $[6] !== isPageContentSheetOpen) {
43
+ if ($[5] !== iframeWindow || $[6] !== isPageEditorSidebarOpen) {
44
44
  t2 = () => {
45
45
  if (!iframeWindow) return;
46
46
  const handleMessage = (event) => {
47
47
  if (!isOverlayMessage(event.data)) return;
48
48
  const { type } = event.data;
49
49
  if (type === "CAMOX_FOCUS_FIELD") {
50
- if (isPageContentSheetOpen) return;
50
+ if (isPageEditorSidebarOpen) return;
51
51
  const { fieldId } = event.data;
52
52
  const element = iframeWindow.document.querySelector(`[data-camox-field-id="${fieldId}"]`);
53
53
  if (element) element.focus();
@@ -56,9 +56,9 @@ const OverlayTracker = () => {
56
56
  iframeWindow.addEventListener("message", handleMessage);
57
57
  return () => iframeWindow.removeEventListener("message", handleMessage);
58
58
  };
59
- t3 = [iframeWindow, isPageContentSheetOpen];
59
+ t3 = [iframeWindow, isPageEditorSidebarOpen];
60
60
  $[5] = iframeWindow;
61
- $[6] = isPageContentSheetOpen;
61
+ $[6] = isPageEditorSidebarOpen;
62
62
  $[7] = t2;
63
63
  $[8] = t3;
64
64
  } else {
@@ -69,10 +69,10 @@ const OverlayTracker = () => {
69
69
  return null;
70
70
  };
71
71
  function _temp(state) {
72
- return state.context.isPageContentSheetOpen;
72
+ return state.context.isPageEditorSidebarOpen;
73
73
  }
74
74
  function _temp2(state_0) {
75
- return state_0.context.isAddBlockSheetOpen;
75
+ return state_0.context.isAddBlockSidebarOpen;
76
76
  }
77
77
  function _temp3() {
78
78
  previewStore.send({ type: "exitPeekedBlock" });
@@ -1,5 +1,5 @@
1
- import { previewStore } from "../previewStore.js";
2
1
  import { isOverlayMessage } from "../overlayMessages.js";
2
+ import { previewStore } from "../previewStore.js";
3
3
  import { usePageBlocks } from "../../../lib/normalized-data.js";
4
4
  import { usePreviewedPage } from "../CamoxPreview.js";
5
5
  import { c } from "react/compiler-runtime";
@@ -9,12 +9,12 @@ import * as React from "react";
9
9
  //#region src/features/preview/components/Overlays.tsx
10
10
  const Overlays = (t0) => {
11
11
  const $ = c(15);
12
- if ($[0] !== "6b8884e7d682d7edd8d7ea97e0dfb6a690c2fd0b3e00f8e55354ffd5d743702c") {
12
+ if ($[0] !== "a159f5febae53b051adcfa6973022c237bd738c0db1dc2c0c91aace28d405412") {
13
13
  for (let $i = 0; $i < 15; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
14
- $[0] = "6b8884e7d682d7edd8d7ea97e0dfb6a690c2fd0b3e00f8e55354ffd5d743702c";
14
+ $[0] = "a159f5febae53b051adcfa6973022c237bd738c0db1dc2c0c91aace28d405412";
15
15
  }
16
16
  const { iframeElement } = t0;
17
- const isPageContentSheetOpen = useSelector(previewStore, _temp);
17
+ const isPageEditorSidebarOpen = useSelector(previewStore, _temp);
18
18
  const selection = useSelector(previewStore, _temp2);
19
19
  const peekedBlock = useSelector(previewStore, _temp3);
20
20
  const page = usePreviewedPage();
@@ -40,7 +40,7 @@ const Overlays = (t0) => {
40
40
  else if (blockIndex === 0) afterPosition = "";
41
41
  }
42
42
  previewStore.send({
43
- type: "openAddBlockSheet",
43
+ type: "openAddBlockSidebar",
44
44
  afterPosition,
45
45
  via: "overlay"
46
46
  });
@@ -60,9 +60,9 @@ const Overlays = (t0) => {
60
60
  } else t2 = $[4];
61
61
  React.useEffect(t1, t2);
62
62
  let t3;
63
- if ($[5] !== iframeElement?.contentWindow || $[6] !== isPageContentSheetOpen || $[7] !== peekedBlock || $[8] !== selection) {
63
+ if ($[5] !== iframeElement?.contentWindow || $[6] !== isPageEditorSidebarOpen || $[7] !== peekedBlock || $[8] !== selection) {
64
64
  t3 = () => {
65
- if (isPageContentSheetOpen) return;
65
+ if (isPageEditorSidebarOpen) return;
66
66
  if (peekedBlock) return;
67
67
  if (!selection) return;
68
68
  if (selection.type !== "block-field" && selection.type !== "item-field") return;
@@ -76,21 +76,21 @@ const Overlays = (t0) => {
76
76
  iframeElement?.contentWindow?.postMessage(message_0, "*");
77
77
  };
78
78
  $[5] = iframeElement?.contentWindow;
79
- $[6] = isPageContentSheetOpen;
79
+ $[6] = isPageEditorSidebarOpen;
80
80
  $[7] = peekedBlock;
81
81
  $[8] = selection;
82
82
  $[9] = t3;
83
83
  } else t3 = $[9];
84
84
  let t4;
85
- if ($[10] !== iframeElement || $[11] !== isPageContentSheetOpen || $[12] !== peekedBlock || $[13] !== selection) {
85
+ if ($[10] !== iframeElement || $[11] !== isPageEditorSidebarOpen || $[12] !== peekedBlock || $[13] !== selection) {
86
86
  t4 = [
87
87
  selection,
88
- isPageContentSheetOpen,
88
+ isPageEditorSidebarOpen,
89
89
  peekedBlock,
90
90
  iframeElement
91
91
  ];
92
92
  $[10] = iframeElement;
93
- $[11] = isPageContentSheetOpen;
93
+ $[11] = isPageEditorSidebarOpen;
94
94
  $[12] = peekedBlock;
95
95
  $[13] = selection;
96
96
  $[14] = t4;
@@ -99,7 +99,7 @@ const Overlays = (t0) => {
99
99
  return null;
100
100
  };
101
101
  function _temp(state) {
102
- return state.context.isPageContentSheetOpen;
102
+ return state.context.isPageEditorSidebarOpen;
103
103
  }
104
104
  function _temp2(state_0) {
105
105
  return state_0.context.selection;