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
@@ -1,8 +1,7 @@
1
- import { previewStore } from "../previewStore.js";
2
- import { useIsPreviewSheetOpen } from "./PreviewSideSheet.js";
3
1
  import { actionsStore } from "../../provider/actionsStore.js";
4
- import { checkIfInputFocused } from "../../../lib/utils.js";
2
+ import { checkIfInputFocused, cn } from "../../../lib/utils.js";
5
3
  import { Frame, useFrame } from "./Frame.js";
4
+ import { previewStore } from "../previewStore.js";
6
5
  import { useBlockActionsShortcuts } from "./BlockActionsPopover.js";
7
6
  import { FieldOverlayStyles } from "./FieldOverlayStyles.js";
8
7
  import { FieldToolbar } from "./FieldToolbar.js";
@@ -18,9 +17,9 @@ import { PanelContent } from "@camox/ui/panel";
18
17
  //#region src/features/preview/components/PreviewPanel.tsx
19
18
  const PreviewFrame = (t0) => {
20
19
  const $ = c(9);
21
- if ($[0] !== "a461a48603db73fa17ba8571e013d5de18c35d1f481b8ee66c35e485f2bdef70") {
20
+ if ($[0] !== "730f56a45d2b6c768058a961ac2ddb25f186cbd0a88cb4389cd59d3a0fda899d") {
22
21
  for (let $i = 0; $i < 9; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
23
- $[0] = "a461a48603db73fa17ba8571e013d5de18c35d1f481b8ee66c35e485f2bdef70";
22
+ $[0] = "730f56a45d2b6c768058a961ac2ddb25f186cbd0a88cb4389cd59d3a0fda899d";
24
23
  }
25
24
  const { children, style, className, onIframeReady } = t0;
26
25
  let t1;
@@ -61,9 +60,9 @@ const PreviewFrame = (t0) => {
61
60
  };
62
61
  const KeyDownForwarder = () => {
63
62
  const $ = c(5);
64
- if ($[0] !== "a461a48603db73fa17ba8571e013d5de18c35d1f481b8ee66c35e485f2bdef70") {
63
+ if ($[0] !== "730f56a45d2b6c768058a961ac2ddb25f186cbd0a88cb4389cd59d3a0fda899d") {
65
64
  for (let $i = 0; $i < 5; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
66
- $[0] = "a461a48603db73fa17ba8571e013d5de18c35d1f481b8ee66c35e485f2bdef70";
65
+ $[0] = "730f56a45d2b6c768058a961ac2ddb25f186cbd0a88cb4389cd59d3a0fda899d";
67
66
  }
68
67
  const { window: iframeWindow } = useFrame();
69
68
  const actions = useSelector(actionsStore, _temp);
@@ -73,11 +72,6 @@ const KeyDownForwarder = () => {
73
72
  t0 = () => {
74
73
  if (!iframeWindow || !iframeWindow.parent || iframeWindow.parent === iframeWindow) return;
75
74
  const handleKeyDown = (e) => {
76
- if (e.key.toLowerCase() === "l" && !e.repeat && !checkIfInputFocused(iframeWindow.document)) {
77
- e.preventDefault();
78
- iframeWindow.parent.postMessage({ type: "holdLockContent" }, "*");
79
- return;
80
- }
81
75
  const matchingAction = actions.find((action) => {
82
76
  if (!action.shortcut) return false;
83
77
  if (!action.checkIfAvailable()) return false;
@@ -96,14 +90,9 @@ const KeyDownForwarder = () => {
96
90
  }, "*");
97
91
  }
98
92
  };
99
- const handleKeyUp = (e_0) => {
100
- if (e_0.key.toLowerCase() === "l") iframeWindow.parent.postMessage({ type: "releaseLockContent" }, "*");
101
- };
102
93
  iframeWindow.addEventListener("keydown", handleKeyDown);
103
- iframeWindow.addEventListener("keyup", handleKeyUp);
104
94
  return () => {
105
95
  iframeWindow.removeEventListener("keydown", handleKeyDown);
106
- iframeWindow.removeEventListener("keyup", handleKeyUp);
107
96
  };
108
97
  };
109
98
  t1 = [iframeWindow, actions];
@@ -118,113 +107,68 @@ const KeyDownForwarder = () => {
118
107
  React.useEffect(t0, t1);
119
108
  return null;
120
109
  };
110
+ const viewportClassName = {
111
+ tablet: "h-[1024px] w-[768px] max-h-full max-w-full",
112
+ mobile: "h-175 w-[393px] max-h-full max-w-full"
113
+ };
121
114
  const PreviewPanel = (t0) => {
122
- const $ = c(14);
123
- if ($[0] !== "a461a48603db73fa17ba8571e013d5de18c35d1f481b8ee66c35e485f2bdef70") {
124
- for (let $i = 0; $i < 14; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
125
- $[0] = "a461a48603db73fa17ba8571e013d5de18c35d1f481b8ee66c35e485f2bdef70";
115
+ const $ = c(8);
116
+ if ($[0] !== "730f56a45d2b6c768058a961ac2ddb25f186cbd0a88cb4389cd59d3a0fda899d") {
117
+ for (let $i = 0; $i < 8; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
118
+ $[0] = "730f56a45d2b6c768058a961ac2ddb25f186cbd0a88cb4389cd59d3a0fda899d";
126
119
  }
127
- const { children } = t0;
120
+ const { children, toolbarProps } = t0;
128
121
  useBlockActionsShortcuts();
129
122
  const iframeElement = useSelector(previewStore, _temp2);
130
123
  const handleIframeReady = _temp3;
131
- const isMobileMode = useSelector(previewStore, _temp4);
132
- const isAnySideSheetOpen = useIsPreviewSheetOpen();
133
- const wrapperRef = React.useRef(null);
134
- const [panelWidth, setPanelWidth] = React.useState(0);
135
- const [panelLeft, setPanelLeft] = React.useState(0);
124
+ const viewportMode = useSelector(previewStore, _temp4);
125
+ const isEditMode = useSelector(previewStore, _temp5);
136
126
  let t1;
137
- let t2;
138
127
  if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
139
- t1 = () => {
140
- const el = wrapperRef.current?.parentElement;
141
- if (!el) return;
142
- const update = () => {
143
- const rect = el.getBoundingClientRect();
144
- setPanelWidth(rect.width);
145
- setPanelLeft(rect.left);
146
- };
147
- update();
148
- const observer = new ResizeObserver(update);
149
- observer.observe(el);
150
- return () => observer.disconnect();
151
- };
152
- t2 = [];
128
+ t1 = [];
153
129
  $[1] = t1;
154
- $[2] = t2;
155
- } else {
156
- t1 = $[1];
157
- t2 = $[2];
158
- }
159
- React.useEffect(t1, t2);
160
- const sheetOverlap = Math.max(0, 400 - panelLeft);
161
- const sheetOpenScale = panelWidth > 0 ? (panelWidth - sheetOverlap) / panelWidth : 1;
162
- let t3;
163
- if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
164
- t3 = [];
165
- $[3] = t3;
166
- } else t3 = $[3];
167
- React.useEffect(_temp14, t3);
168
- const t4 = isAnySideSheetOpen ? `${100 / sheetOpenScale}%` : "100%";
169
- const t5 = isAnySideSheetOpen ? `scale(${sheetOpenScale})` : "scale(1)";
170
- let t6;
171
- if ($[4] !== t4 || $[5] !== t5) {
172
- t6 = {
173
- height: t4,
174
- transformOrigin: "top right",
175
- transform: t5
176
- };
177
- $[4] = t4;
178
- $[5] = t5;
179
- $[6] = t6;
180
- } else t6 = $[6];
181
- let t7;
182
- if ($[7] !== children || $[8] !== iframeElement || $[9] !== isMobileMode) {
183
- t7 = isMobileMode ? /* @__PURE__ */ jsxs("div", {
184
- className: "checkered flex h-full justify-center",
185
- children: [
186
- /* @__PURE__ */ jsxs("div", {
187
- className: "relative mt-8 h-175 w-[393px] overflow-hidden",
188
- children: [/* @__PURE__ */ jsx(PreviewFrame, {
189
- className: "overflow-auto",
190
- onIframeReady: handleIframeReady,
191
- children
192
- }), /* @__PURE__ */ jsx(Overlays, { iframeElement })]
193
- }),
194
- /* @__PURE__ */ jsx(FieldToolbar, {}),
195
- /* @__PURE__ */ jsx(PreviewToolbar, {})
196
- ]
197
- }) : /* @__PURE__ */ jsxs(Fragment, { children: [
198
- /* @__PURE__ */ jsx(PreviewFrame, {
199
- className: "checkered h-full w-full",
200
- onIframeReady: handleIframeReady,
201
- children
202
- }),
203
- /* @__PURE__ */ jsx(Overlays, { iframeElement }),
204
- /* @__PURE__ */ jsx(FieldToolbar, {}),
205
- /* @__PURE__ */ jsx(PreviewToolbar, {})
206
- ] });
207
- $[7] = children;
208
- $[8] = iframeElement;
209
- $[9] = isMobileMode;
210
- $[10] = t7;
211
- } else t7 = $[10];
212
- let t8;
213
- if ($[11] !== t6 || $[12] !== t7) {
214
- t8 = /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(PanelContent, {
130
+ } else t1 = $[1];
131
+ React.useEffect(_temp17, t1);
132
+ let t2;
133
+ if ($[2] !== children || $[3] !== iframeElement || $[4] !== isEditMode || $[5] !== toolbarProps || $[6] !== viewportMode) {
134
+ t2 = /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(PanelContent, {
215
135
  className: "relative overflow-hidden bg-black",
216
136
  children: /* @__PURE__ */ jsx("div", {
217
- ref: wrapperRef,
218
- className: "absolute inset-0 transition-[transform,height] duration-500 ease-in-out will-change-transform",
219
- style: t6,
220
- children: t7
137
+ className: "absolute inset-0",
138
+ children: viewportMode === "full" ? /* @__PURE__ */ jsxs(Fragment, { children: [
139
+ /* @__PURE__ */ jsx(PreviewFrame, {
140
+ className: "checkered h-full w-full",
141
+ onIframeReady: handleIframeReady,
142
+ children
143
+ }),
144
+ isEditMode && /* @__PURE__ */ jsx(Overlays, { iframeElement }),
145
+ isEditMode && /* @__PURE__ */ jsx(FieldToolbar, {}),
146
+ /* @__PURE__ */ jsx(PreviewToolbar, { ...toolbarProps })
147
+ ] }) : /* @__PURE__ */ jsxs("div", {
148
+ className: cn("checkered flex h-full justify-center", isEditMode ? "items-start" : "items-center"),
149
+ children: [
150
+ /* @__PURE__ */ jsxs("div", {
151
+ className: cn("relative overflow-hidden", viewportClassName[viewportMode], isEditMode && "mt-8"),
152
+ children: [/* @__PURE__ */ jsx(PreviewFrame, {
153
+ className: "overflow-auto",
154
+ onIframeReady: handleIframeReady,
155
+ children
156
+ }), isEditMode && /* @__PURE__ */ jsx(Overlays, { iframeElement })]
157
+ }),
158
+ isEditMode && /* @__PURE__ */ jsx(FieldToolbar, {}),
159
+ /* @__PURE__ */ jsx(PreviewToolbar, { ...toolbarProps })
160
+ ]
161
+ })
221
162
  })
222
163
  }) });
223
- $[11] = t6;
224
- $[12] = t7;
225
- $[13] = t8;
226
- } else t8 = $[13];
227
- return t8;
164
+ $[2] = children;
165
+ $[3] = iframeElement;
166
+ $[4] = isEditMode;
167
+ $[5] = toolbarProps;
168
+ $[6] = viewportMode;
169
+ $[7] = t2;
170
+ } else t2 = $[7];
171
+ return t2;
228
172
  };
229
173
  function _temp(state) {
230
174
  return state.context.actions;
@@ -239,85 +183,106 @@ function _temp3(element) {
239
183
  });
240
184
  }
241
185
  function _temp4(state_0) {
242
- return state_0.context.isMobileMode;
186
+ return state_0.context.viewportMode;
243
187
  }
244
- function _temp5() {
245
- return true;
188
+ function _temp5(state_1) {
189
+ return state_1.context.isEditMode;
246
190
  }
247
191
  function _temp6() {
248
- return previewStore.send({ type: "toggleSidebar" });
192
+ return true;
249
193
  }
250
194
  function _temp7() {
251
- return true;
195
+ return previewStore.send({ type: "cycleViewportMode" });
252
196
  }
253
197
  function _temp8() {
254
- return previewStore.send({ type: "toggleLockContent" });
198
+ return true;
255
199
  }
256
200
  function _temp9() {
257
- return true;
201
+ return previewStore.send({
202
+ type: "setViewportMode",
203
+ mode: "full"
204
+ });
258
205
  }
259
206
  function _temp0() {
260
- return previewStore.send({ type: "toggleMobileMode" });
207
+ return true;
261
208
  }
262
209
  function _temp1() {
263
- return true;
210
+ return previewStore.send({
211
+ type: "setViewportMode",
212
+ mode: "tablet"
213
+ });
264
214
  }
265
215
  function _temp10() {
266
- const { isAgentChatSheetOpen } = previewStore.getSnapshot().context;
267
- previewStore.send({ type: isAgentChatSheetOpen ? "closeAgentChatSheet" : "openAgentChatSheet" });
216
+ return true;
268
217
  }
269
218
  function _temp11() {
270
- return true;
219
+ return previewStore.send({
220
+ type: "setViewportMode",
221
+ mode: "mobile"
222
+ });
271
223
  }
272
224
  function _temp12() {
225
+ return true;
226
+ }
227
+ function _temp13() {
228
+ const { isAgentChatSidebarOpen } = previewStore.getSnapshot().context;
229
+ previewStore.send({ type: isAgentChatSidebarOpen ? "closeAgentChatSidebar" : "openAgentChatSidebar" });
230
+ }
231
+ function _temp14() {
232
+ return true;
233
+ }
234
+ function _temp15() {
273
235
  previewStore.send({ type: "clearSelection" });
274
236
  }
275
- function _temp13(a) {
237
+ function _temp16(a) {
276
238
  return a.id;
277
239
  }
278
- function _temp14() {
240
+ function _temp17() {
279
241
  const actions = [
280
242
  {
281
- id: "toggle-editing-panel",
282
- label: "Toggle editing panel",
243
+ id: "cycle-viewport-mode",
244
+ label: "Cycle viewport mode",
283
245
  aliases: [
284
- "Sidebar",
285
- "Toggle sidebar",
286
- "Show sidebar",
287
- "Hide sidebar"
246
+ "Responsive preview",
247
+ "Viewport preview",
248
+ "Device preview"
288
249
  ],
289
250
  groupLabel: "Preview",
290
- checkIfAvailable: _temp5,
291
- execute: _temp6,
292
- shortcut: {
293
- key: "b",
294
- withAlt: true
295
- }
251
+ checkIfAvailable: _temp6,
252
+ execute: _temp7,
253
+ shortcut: { key: "m" }
296
254
  },
297
255
  {
298
- id: "toggle-lock-content",
299
- label: "Toggle lock content",
256
+ id: "set-viewport-full",
257
+ label: "Set full viewport",
300
258
  aliases: [
301
- "Lock editing",
302
- "Unlock content",
303
- "Lock page"
259
+ "Full preview",
260
+ "Desktop preview",
261
+ "Full width preview"
304
262
  ],
305
263
  groupLabel: "Preview",
306
- checkIfAvailable: _temp7,
307
- execute: _temp8
264
+ checkIfAvailable: _temp8,
265
+ execute: _temp9
266
+ },
267
+ {
268
+ id: "set-viewport-tablet",
269
+ label: "Set tablet viewport",
270
+ aliases: ["Tablet preview", "Responsive preview"],
271
+ groupLabel: "Preview",
272
+ checkIfAvailable: _temp0,
273
+ execute: _temp1
308
274
  },
309
275
  {
310
- id: "toggle-mobile-mode",
311
- label: "Toggle mobile mode",
276
+ id: "set-viewport-mobile",
277
+ label: "Set mobile viewport",
312
278
  aliases: [
313
279
  "Mobile preview",
314
- "Responsive preview",
315
- "Phone preview"
280
+ "Phone preview",
281
+ "Responsive preview"
316
282
  ],
317
283
  groupLabel: "Preview",
318
- checkIfAvailable: _temp9,
319
- execute: _temp0,
320
- shortcut: { key: "m" }
284
+ checkIfAvailable: _temp10,
285
+ execute: _temp11
321
286
  },
322
287
  {
323
288
  id: "toggle-agent-chat",
@@ -329,8 +294,8 @@ function _temp14() {
329
294
  "Open chat"
330
295
  ],
331
296
  groupLabel: "Preview",
332
- checkIfAvailable: _temp1,
333
- execute: _temp10,
297
+ checkIfAvailable: _temp12,
298
+ execute: _temp13,
334
299
  shortcut: {
335
300
  key: "i",
336
301
  withAlt: true
@@ -341,8 +306,8 @@ function _temp14() {
341
306
  label: "Clear selection",
342
307
  aliases: ["Deselect", "Unselect"],
343
308
  groupLabel: "Preview",
344
- checkIfAvailable: _temp11,
345
- execute: _temp12,
309
+ checkIfAvailable: _temp14,
310
+ execute: _temp15,
346
311
  shortcut: { key: "Escape" }
347
312
  }
348
313
  ];
@@ -353,10 +318,10 @@ function _temp14() {
353
318
  return () => {
354
319
  actionsStore.send({
355
320
  type: "unregisterManyActions",
356
- ids: actions.map(_temp13)
321
+ ids: actions.map(_temp16)
357
322
  });
358
323
  };
359
324
  }
360
325
 
361
326
  //#endregion
362
- export { PreviewFrame, PreviewPanel };
327
+ export { PreviewPanel };