camox 0.0.0 → 0.1.2-alpha.2

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 (255) hide show
  1. package/LICENSE.md +110 -0
  2. package/dist/components/AuthGate.d.ts +7 -0
  3. package/dist/components/AuthGate.d.ts.map +1 -0
  4. package/dist/core/components/AddBlockControlBar.d.ts +9 -0
  5. package/dist/core/components/AddBlockControlBar.d.ts.map +1 -0
  6. package/dist/core/components/AddBlockControlBar.js +65 -0
  7. package/dist/core/components/lexical/InlineContentEditable.d.ts +7 -0
  8. package/dist/core/components/lexical/InlineContentEditable.d.ts.map +1 -0
  9. package/dist/core/components/lexical/InlineContentEditable.js +40 -0
  10. package/dist/core/components/lexical/InlineLexicalEditor.d.ts +12 -0
  11. package/dist/core/components/lexical/InlineLexicalEditor.d.ts.map +1 -0
  12. package/dist/core/components/lexical/InlineLexicalEditor.js +133 -0
  13. package/dist/core/components/lexical/InlineParagraphNode.d.ts +10 -0
  14. package/dist/core/components/lexical/InlineParagraphNode.d.ts.map +1 -0
  15. package/dist/core/components/lexical/InlineParagraphNode.js +34 -0
  16. package/dist/core/components/lexical/SelectionBroadcaster.d.ts +6 -0
  17. package/dist/core/components/lexical/SelectionBroadcaster.d.ts.map +1 -0
  18. package/dist/core/components/lexical/SelectionBroadcaster.js +62 -0
  19. package/dist/core/components/lexical/SidebarLexicalEditor.d.ts +9 -0
  20. package/dist/core/components/lexical/SidebarLexicalEditor.d.ts.map +1 -0
  21. package/dist/core/components/lexical/editorConfig.d.ts +4 -0
  22. package/dist/core/components/lexical/editorConfig.d.ts.map +1 -0
  23. package/dist/core/components/lexical/editorConfig.js +24 -0
  24. package/dist/core/createApp.d.ts +373 -0
  25. package/dist/core/createApp.d.ts.map +1 -0
  26. package/dist/core/createApp.js +40 -0
  27. package/dist/core/createBlock.d.ts +947 -0
  28. package/dist/core/createBlock.d.ts.map +1 -0
  29. package/dist/core/createBlock.js +873 -0
  30. package/dist/core/createLayout.d.ts +78 -0
  31. package/dist/core/createLayout.d.ts.map +1 -0
  32. package/dist/core/createLayout.js +73 -0
  33. package/dist/core/hooks/useFieldSelection.d.ts +11 -0
  34. package/dist/core/hooks/useFieldSelection.d.ts.map +1 -0
  35. package/dist/core/hooks/useFieldSelection.js +25 -0
  36. package/dist/core/hooks/useIsEditable.d.ts +2 -0
  37. package/dist/core/hooks/useIsEditable.d.ts.map +1 -0
  38. package/dist/core/hooks/useIsEditable.js +12 -0
  39. package/dist/core/hooks/useOverlayMessage.d.ts +10 -0
  40. package/dist/core/hooks/useOverlayMessage.d.ts.map +1 -0
  41. package/dist/core/hooks/useOverlayMessage.js +37 -0
  42. package/dist/core/lib/contentType.d.ts +165 -0
  43. package/dist/core/lib/contentType.d.ts.map +1 -0
  44. package/dist/core/lib/contentType.js +148 -0
  45. package/dist/core/lib/fieldTypes.d.ts +85 -0
  46. package/dist/core/lib/fieldTypes.d.ts.map +1 -0
  47. package/dist/core/lib/lexicalReact.d.ts +3 -0
  48. package/dist/core/lib/lexicalReact.d.ts.map +1 -0
  49. package/dist/core/lib/lexicalReact.js +24 -0
  50. package/dist/core/lib/lexicalState.d.ts +10 -0
  51. package/dist/core/lib/lexicalState.d.ts.map +1 -0
  52. package/dist/core/lib/lexicalState.js +38 -0
  53. package/dist/core/lib/modifierFormats.d.ts +9 -0
  54. package/dist/core/lib/modifierFormats.d.ts.map +1 -0
  55. package/dist/core/lib/modifierFormats.js +8 -0
  56. package/dist/core/lib/modifiers.d.ts +12 -0
  57. package/dist/core/lib/modifiers.d.ts.map +1 -0
  58. package/dist/core/lib/modifiers.js +27 -0
  59. package/dist/features/content/CamoxContent.d.ts +2 -0
  60. package/dist/features/content/CamoxContent.d.ts.map +1 -0
  61. package/dist/features/content/CamoxContent.js +100 -0
  62. package/dist/features/content/components/AssetCard.d.ts +10 -0
  63. package/dist/features/content/components/AssetCard.d.ts.map +1 -0
  64. package/dist/features/content/components/AssetCard.js +41 -0
  65. package/dist/features/content/components/AssetCardSkeleton.d.ts +2 -0
  66. package/dist/features/content/components/AssetCardSkeleton.d.ts.map +1 -0
  67. package/dist/features/content/components/AssetCardSkeleton.js +11 -0
  68. package/dist/features/content/components/ContentSidebar.d.ts +2 -0
  69. package/dist/features/content/components/ContentSidebar.d.ts.map +1 -0
  70. package/dist/features/content/components/ContentSidebar.js +15 -0
  71. package/dist/features/content/components/UploadDropZone.d.ts +9 -0
  72. package/dist/features/content/components/UploadDropZone.d.ts.map +1 -0
  73. package/dist/features/content/components/UploadDropZone.js +51 -0
  74. package/dist/features/content/components/UploadProgressDrawer.d.ts +11 -0
  75. package/dist/features/content/components/UploadProgressDrawer.d.ts.map +1 -0
  76. package/dist/features/content/components/UploadProgressDrawer.js +72 -0
  77. package/dist/features/preview/CamoxPreview.d.ts +124 -0
  78. package/dist/features/preview/CamoxPreview.d.ts.map +1 -0
  79. package/dist/features/preview/CamoxPreview.js +253 -0
  80. package/dist/features/preview/components/AddBlockSheet.d.ts +3 -0
  81. package/dist/features/preview/components/AddBlockSheet.d.ts.map +1 -0
  82. package/dist/features/preview/components/AddBlockSheet.js +121 -0
  83. package/dist/features/preview/components/AgentChatSheet.d.ts +3 -0
  84. package/dist/features/preview/components/AgentChatSheet.d.ts.map +1 -0
  85. package/dist/features/preview/components/AgentChatSheet.js +24 -0
  86. package/dist/features/preview/components/AssetFieldEditor.d.ts +18 -0
  87. package/dist/features/preview/components/AssetFieldEditor.d.ts.map +1 -0
  88. package/dist/features/preview/components/AssetFieldEditor.js +139 -0
  89. package/dist/features/preview/components/AssetLightbox.d.ts +9 -0
  90. package/dist/features/preview/components/AssetLightbox.d.ts.map +1 -0
  91. package/dist/features/preview/components/AssetLightbox.js +421 -0
  92. package/dist/features/preview/components/AssetPickerGrid.d.ts +11 -0
  93. package/dist/features/preview/components/AssetPickerGrid.d.ts.map +1 -0
  94. package/dist/features/preview/components/AssetPickerGrid.js +92 -0
  95. package/dist/features/preview/components/BlockActionsPopover.d.ts +15 -0
  96. package/dist/features/preview/components/BlockActionsPopover.d.ts.map +1 -0
  97. package/dist/features/preview/components/BlockActionsPopover.js +506 -0
  98. package/dist/features/preview/components/CreatePageSheet.d.ts +3 -0
  99. package/dist/features/preview/components/CreatePageSheet.d.ts.map +1 -0
  100. package/dist/features/preview/components/CreatePageSheet.js +159 -0
  101. package/dist/features/preview/components/DebouncedFieldEditor.d.ts +10 -0
  102. package/dist/features/preview/components/DebouncedFieldEditor.d.ts.map +1 -0
  103. package/dist/features/preview/components/DebouncedFieldEditor.js +51 -0
  104. package/dist/features/preview/components/EditPageSheet.d.ts +3 -0
  105. package/dist/features/preview/components/EditPageSheet.d.ts.map +1 -0
  106. package/dist/features/preview/components/EditPageSheet.js +352 -0
  107. package/dist/features/preview/components/ItemFieldsEditor.d.ts +29 -0
  108. package/dist/features/preview/components/ItemFieldsEditor.d.ts.map +1 -0
  109. package/dist/features/preview/components/ItemFieldsEditor.js +308 -0
  110. package/dist/features/preview/components/LinkFieldEditor.d.ts +8 -0
  111. package/dist/features/preview/components/LinkFieldEditor.d.ts.map +1 -0
  112. package/dist/features/preview/components/LinkFieldEditor.js +190 -0
  113. package/dist/features/preview/components/MultipleAssetFieldEditor.d.ts +10 -0
  114. package/dist/features/preview/components/MultipleAssetFieldEditor.d.ts.map +1 -0
  115. package/dist/features/preview/components/MultipleAssetFieldEditor.js +232 -0
  116. package/dist/features/preview/components/OverlayTracker.d.ts +6 -0
  117. package/dist/features/preview/components/OverlayTracker.d.ts.map +1 -0
  118. package/dist/features/preview/components/OverlayTracker.js +41 -0
  119. package/dist/features/preview/components/Overlays.d.ts +6 -0
  120. package/dist/features/preview/components/Overlays.d.ts.map +1 -0
  121. package/dist/features/preview/components/Overlays.js +58 -0
  122. package/dist/features/preview/components/PageContentSheet.d.ts +3 -0
  123. package/dist/features/preview/components/PageContentSheet.d.ts.map +1 -0
  124. package/dist/features/preview/components/PageContentSheet.js +492 -0
  125. package/dist/features/preview/components/PageLocationFieldset.d.ts +14 -0
  126. package/dist/features/preview/components/PageLocationFieldset.d.ts.map +1 -0
  127. package/dist/features/preview/components/PageLocationFieldset.js +77 -0
  128. package/dist/features/preview/components/PagePicker.d.ts +3 -0
  129. package/dist/features/preview/components/PagePicker.d.ts.map +1 -0
  130. package/dist/features/preview/components/PagePicker.js +185 -0
  131. package/dist/features/preview/components/PageTree.d.ts +3 -0
  132. package/dist/features/preview/components/PageTree.d.ts.map +1 -0
  133. package/dist/features/preview/components/PageTree.js +410 -0
  134. package/dist/features/preview/components/PeekedBlock.d.ts +6 -0
  135. package/dist/features/preview/components/PeekedBlock.d.ts.map +1 -0
  136. package/dist/features/preview/components/PeekedBlock.js +95 -0
  137. package/dist/features/preview/components/PreviewPanel.d.ts +12 -0
  138. package/dist/features/preview/components/PreviewPanel.d.ts.map +1 -0
  139. package/dist/features/preview/components/PreviewPanel.js +192 -0
  140. package/dist/features/preview/components/PreviewSideSheet.d.ts +13 -0
  141. package/dist/features/preview/components/PreviewSideSheet.d.ts.map +1 -0
  142. package/dist/features/preview/components/PreviewSideSheet.js +28 -0
  143. package/dist/features/preview/components/PreviewToolbar.d.ts +2 -0
  144. package/dist/features/preview/components/PreviewToolbar.d.ts.map +1 -0
  145. package/dist/features/preview/components/PreviewToolbar.js +79 -0
  146. package/dist/features/preview/components/RepeatableItemsList.d.ts +14 -0
  147. package/dist/features/preview/components/RepeatableItemsList.d.ts.map +1 -0
  148. package/dist/features/preview/components/RepeatableItemsList.js +366 -0
  149. package/dist/features/preview/components/ShikiMarkdown.d.ts +4 -0
  150. package/dist/features/preview/components/ShikiMarkdown.d.ts.map +1 -0
  151. package/dist/features/preview/components/ShikiMarkdown.js +37 -0
  152. package/dist/features/preview/components/TextFormatToolbar.d.ts +2 -0
  153. package/dist/features/preview/components/TextFormatToolbar.d.ts.map +1 -0
  154. package/dist/features/preview/components/TextFormatToolbar.js +73 -0
  155. package/dist/features/preview/components/UnlinkAssetButton.d.ts +9 -0
  156. package/dist/features/preview/components/UnlinkAssetButton.d.ts.map +1 -0
  157. package/dist/features/preview/components/UnlinkAssetButton.js +55 -0
  158. package/dist/features/preview/overlayConstants.d.ts +19 -0
  159. package/dist/features/preview/overlayConstants.d.ts.map +1 -0
  160. package/dist/features/preview/overlayConstants.js +21 -0
  161. package/dist/features/preview/overlayMessages.d.ts +62 -0
  162. package/dist/features/preview/overlayMessages.d.ts.map +1 -0
  163. package/dist/features/preview/overlayMessages.js +9 -0
  164. package/dist/features/preview/previewConstants.d.ts +2 -0
  165. package/dist/features/preview/previewConstants.d.ts.map +1 -0
  166. package/dist/features/preview/previewStore.d.ts +116 -0
  167. package/dist/features/preview/previewStore.d.ts.map +1 -0
  168. package/dist/features/preview/previewStore.js +321 -0
  169. package/dist/features/provider/CamoxProvider.d.ts +11 -0
  170. package/dist/features/provider/CamoxProvider.d.ts.map +1 -0
  171. package/dist/features/provider/CamoxProvider.js +73 -0
  172. package/dist/features/provider/actionsStore.d.ts +39 -0
  173. package/dist/features/provider/actionsStore.d.ts.map +1 -0
  174. package/dist/features/provider/actionsStore.js +35 -0
  175. package/dist/features/provider/components/CamoxAppContext.d.ts +371 -0
  176. package/dist/features/provider/components/CamoxAppContext.d.ts.map +1 -0
  177. package/dist/features/provider/components/CamoxAppContext.js +17 -0
  178. package/dist/features/provider/components/CommandPalette.d.ts +3 -0
  179. package/dist/features/provider/components/CommandPalette.d.ts.map +1 -0
  180. package/dist/features/provider/components/CommandPalette.js +127 -0
  181. package/dist/features/provider/useAdminShortcuts.d.ts +5 -0
  182. package/dist/features/provider/useAdminShortcuts.d.ts.map +1 -0
  183. package/dist/features/provider/useAdminShortcuts.js +83 -0
  184. package/dist/features/routes/ogRoute.d.ts +7 -0
  185. package/dist/features/routes/ogRoute.d.ts.map +1 -0
  186. package/dist/features/routes/ogRoute.js +19 -0
  187. package/dist/features/routes/pageRoute.d.ts +135 -0
  188. package/dist/features/routes/pageRoute.d.ts.map +1 -0
  189. package/dist/features/routes/pageRoute.js +112 -0
  190. package/dist/features/studio/CamoxStudio.d.ts +7 -0
  191. package/dist/features/studio/CamoxStudio.d.ts.map +1 -0
  192. package/dist/features/studio/CamoxStudio.js +24 -0
  193. package/dist/features/studio/components/Navbar.d.ts +4 -0
  194. package/dist/features/studio/components/Navbar.d.ts.map +1 -0
  195. package/dist/features/studio/components/Navbar.js +95 -0
  196. package/dist/features/studio/components/ProjectMenu.d.ts +2 -0
  197. package/dist/features/studio/components/ProjectMenu.d.ts.map +1 -0
  198. package/dist/features/studio/components/ProjectMenu.js +132 -0
  199. package/dist/features/studio/components/UserButton.d.ts +2 -0
  200. package/dist/features/studio/components/UserButton.d.ts.map +1 -0
  201. package/dist/features/studio/components/UserButton.js +96 -0
  202. package/dist/features/studio/studioStore.d.ts +17 -0
  203. package/dist/features/studio/studioStore.d.ts.map +1 -0
  204. package/dist/features/studio/studioStore.js +44 -0
  205. package/dist/features/studio/useTheme.d.ts +9 -0
  206. package/dist/features/studio/useTheme.d.ts.map +1 -0
  207. package/dist/features/studio/useTheme.js +98 -0
  208. package/dist/features/vite/appGeneration.d.ts +4 -0
  209. package/dist/features/vite/appGeneration.d.ts.map +1 -0
  210. package/dist/features/vite/appGeneration.js +67 -0
  211. package/dist/features/vite/blockBoilerplate.d.ts +3 -0
  212. package/dist/features/vite/blockBoilerplate.d.ts.map +1 -0
  213. package/dist/features/vite/blockBoilerplate.js +59 -0
  214. package/dist/features/vite/convexSync.d.ts +6 -0
  215. package/dist/features/vite/convexSync.d.ts.map +1 -0
  216. package/dist/features/vite/convexSync.js +98 -0
  217. package/dist/features/vite/definitionsSync.d.ts +11 -0
  218. package/dist/features/vite/definitionsSync.d.ts.map +1 -0
  219. package/dist/features/vite/definitionsSync.js +157 -0
  220. package/dist/features/vite/routeGeneration.d.ts +4 -0
  221. package/dist/features/vite/routeGeneration.d.ts.map +1 -0
  222. package/dist/features/vite/routeGeneration.js +194 -0
  223. package/dist/features/vite/skillGeneration.d.ts +4 -0
  224. package/dist/features/vite/skillGeneration.d.ts.map +1 -0
  225. package/dist/features/vite/skillGeneration.js +69 -0
  226. package/dist/features/vite/utils.d.ts +2 -0
  227. package/dist/features/vite/utils.d.ts.map +1 -0
  228. package/dist/features/vite/utils.js +10 -0
  229. package/dist/features/vite/vite.d.ts +18 -0
  230. package/dist/features/vite/vite.d.ts.map +1 -0
  231. package/dist/features/vite/vite.js +77 -0
  232. package/dist/hooks/use-file-upload.d.ts +22 -0
  233. package/dist/hooks/use-file-upload.d.ts.map +1 -0
  234. package/dist/hooks/use-marquee-selection.d.ts +17 -0
  235. package/dist/hooks/use-marquee-selection.d.ts.map +1 -0
  236. package/dist/lib/analytics-client.d.ts +3 -0
  237. package/dist/lib/analytics-client.d.ts.map +1 -0
  238. package/dist/lib/analytics.d.ts +3 -0
  239. package/dist/lib/analytics.d.ts.map +1 -0
  240. package/dist/lib/analytics.js +24 -0
  241. package/dist/lib/auth.d.ts +3683 -0
  242. package/dist/lib/auth.d.ts.map +1 -0
  243. package/dist/lib/convex-site.d.ts +3 -0
  244. package/dist/lib/convex-site.d.ts.map +1 -0
  245. package/dist/lib/utils.d.ts +40 -0
  246. package/dist/lib/utils.d.ts.map +1 -0
  247. package/dist/studio.css +2 -0
  248. package/package.json +123 -10
  249. package/server/api.d.ts +1 -0
  250. package/server/api.js +1 -0
  251. package/server/dataModel.d.ts +1 -0
  252. package/server/dataModel.js +1 -0
  253. package/skills/camox-block/SKILL.md +357 -0
  254. package/skills/camox-layout/SKILL.md +181 -0
  255. package/index.js +0 -3
@@ -0,0 +1,95 @@
1
+ import { previewStore } from "../previewStore.js";
2
+ import { useSelector } from "@xstate/store/react";
3
+ import * as React from "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region src/features/preview/components/PeekedBlock.tsx
6
+ var PeekedBlock = ({ onExitComplete }) => {
7
+ const peekedBlock = useSelector(previewStore, (state) => state.context.peekedBlock);
8
+ const skipExitAnimation = useSelector(previewStore, (state) => state.context.skipPeekedBlockExitAnimation);
9
+ const peekedBlockRef = React.useRef(null);
10
+ const [displayedBlock, setDisplayedBlock] = React.useState(null);
11
+ const [isExpanded, setIsExpanded] = React.useState(false);
12
+ React.useEffect(() => {
13
+ if (peekedBlock) {
14
+ setDisplayedBlock(peekedBlock);
15
+ return;
16
+ }
17
+ if (skipExitAnimation) {
18
+ setIsExpanded(false);
19
+ setDisplayedBlock(null);
20
+ onExitComplete?.();
21
+ previewStore.send({ type: "clearSkipPeekedBlockExitAnimation" });
22
+ return;
23
+ }
24
+ setIsExpanded(false);
25
+ }, [
26
+ peekedBlock,
27
+ skipExitAnimation,
28
+ onExitComplete
29
+ ]);
30
+ React.useEffect(() => {
31
+ if (!displayedBlock) return;
32
+ const id = requestAnimationFrame(() => setIsExpanded(true));
33
+ return () => cancelAnimationFrame(id);
34
+ }, [displayedBlock]);
35
+ React.useEffect(() => {
36
+ if (displayedBlock && peekedBlockRef.current) peekedBlockRef.current.scrollIntoView({
37
+ behavior: "instant",
38
+ block: "start"
39
+ });
40
+ }, [displayedBlock]);
41
+ const handleTransitionEnd = React.useCallback((e) => {
42
+ if (e.propertyName !== "grid-template-rows" || e.target !== e.currentTarget) return;
43
+ if (isExpanded) {
44
+ peekedBlockRef.current?.scrollIntoView({
45
+ behavior: "instant",
46
+ block: "start"
47
+ });
48
+ return;
49
+ }
50
+ setDisplayedBlock(null);
51
+ onExitComplete?.();
52
+ }, [isExpanded, onExitComplete]);
53
+ const normalizedContent = React.useMemo(() => {
54
+ if (!displayedBlock) return null;
55
+ const result = { ...displayedBlock.getInitialContent() };
56
+ for (const key in result) {
57
+ const value = result[key];
58
+ if (Array.isArray(value) && value.length > 0) {
59
+ const firstItem = value[0];
60
+ if (firstItem && typeof firstItem === "object" && !firstItem.content && !firstItem._id) result[key] = value.map((item) => ({
61
+ content: item,
62
+ _id: void 0
63
+ }));
64
+ }
65
+ }
66
+ return result;
67
+ }, [displayedBlock]);
68
+ if (!displayedBlock || !normalizedContent) return null;
69
+ return /* @__PURE__ */ jsx("div", {
70
+ ref: peekedBlockRef,
71
+ style: {
72
+ scrollMargin: "5rem",
73
+ display: "grid",
74
+ gridTemplateRows: isExpanded ? "1fr" : "0fr",
75
+ transition: "grid-template-rows 300ms ease-out",
76
+ background: "var(--background)"
77
+ },
78
+ onTransitionEnd: handleTransitionEnd,
79
+ children: /* @__PURE__ */ jsx("div", {
80
+ style: { overflow: "hidden" },
81
+ children: /* @__PURE__ */ jsx(displayedBlock.Component, {
82
+ blockData: {
83
+ _id: "__preview__",
84
+ type: displayedBlock.id,
85
+ content: normalizedContent,
86
+ settings: displayedBlock.getInitialSettings(),
87
+ position: ""
88
+ },
89
+ mode: "peek"
90
+ })
91
+ })
92
+ });
93
+ };
94
+ //#endregion
95
+ export { PeekedBlock };
@@ -0,0 +1,12 @@
1
+ import * as React from "react";
2
+ export declare const PreviewFrame: ({ children, style, className, onIframeReady, }: {
3
+ children: React.ReactNode;
4
+ style?: React.CSSProperties;
5
+ className?: string;
6
+ onIframeReady?: (iframe: HTMLIFrameElement) => void;
7
+ }) => import("react/jsx-runtime").JSX.Element;
8
+ declare const PreviewPanel: ({ children }: {
9
+ children: React.ReactNode;
10
+ }) => import("react/jsx-runtime").JSX.Element;
11
+ export { PreviewPanel };
12
+ //# sourceMappingURL=PreviewPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewPanel.d.ts","sourceRoot":"","sources":["../../../../src/features/preview/components/PreviewPanel.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAmB/B,eAAO,MAAM,YAAY,GAAI,gDAK1B;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACrD,4CAQA,CAAC;AAmFF,QAAA,MAAM,YAAY,GAAI,cAAc;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,4CAwHhE,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,192 @@
1
+ import { previewStore } from "../previewStore.js";
2
+ import { actionsStore } from "../../provider/actionsStore.js";
3
+ import { useIsPreviewSheetOpen } from "./PreviewSideSheet.js";
4
+ import { useBlockActionsShortcuts } from "./BlockActionsPopover.js";
5
+ import { Overlays } from "./Overlays.js";
6
+ import { OverlayTracker } from "./OverlayTracker.js";
7
+ import { PreviewToolbar } from "./PreviewToolbar.js";
8
+ import { TextFormatToolbar } from "./TextFormatToolbar.js";
9
+ import { Frame, useFrame } from "@camox/ui/frame";
10
+ import { useSelector } from "@xstate/store/react";
11
+ import * as React from "react";
12
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
13
+ import { PanelContent } from "@camox/ui/panel";
14
+ import { checkIfInputFocused } from "@/lib/utils";
15
+ //#region src/features/preview/components/PreviewPanel.tsx
16
+ var PreviewFrame = ({ children, style, className, onIframeReady }) => {
17
+ return /* @__PURE__ */ jsxs(Frame, {
18
+ className,
19
+ style,
20
+ onIframeReady,
21
+ children: [
22
+ children,
23
+ /* @__PURE__ */ jsx(KeyDownForwarder, {}),
24
+ /* @__PURE__ */ jsx(OverlayTracker, {})
25
+ ]
26
+ });
27
+ };
28
+ var KeyDownForwarder = () => {
29
+ const { window: iframeWindow } = useFrame();
30
+ const actions = useSelector(actionsStore, (state) => state.context.actions);
31
+ React.useEffect(() => {
32
+ if (!iframeWindow || !iframeWindow.parent || iframeWindow.parent === iframeWindow) return;
33
+ const handleKeyDown = (e) => {
34
+ if (e.key.toLowerCase() === "l" && !e.repeat && !checkIfInputFocused(iframeWindow.document)) {
35
+ e.preventDefault();
36
+ iframeWindow.parent.postMessage({ type: "holdLockContent" }, "*");
37
+ return;
38
+ }
39
+ const matchingAction = actions.find((action) => {
40
+ if (!action.shortcut) return false;
41
+ if (!action.checkIfAvailable()) return false;
42
+ if (checkIfInputFocused(iframeWindow.document)) {
43
+ if (!action.shortcut.withMeta && !action.shortcut.withAlt) return false;
44
+ if (action.shortcut.key === "Backspace") return false;
45
+ }
46
+ const { key, withMeta, withAlt, withShift } = action.shortcut;
47
+ return (withAlt && key.length === 1 && /[a-z]/i.test(key) ? e.code === `Key${key.toUpperCase()}` : key.toLowerCase() === e.key.toLowerCase()) && !!withMeta === (e.metaKey || e.ctrlKey) && !!withAlt === e.altKey && !!withShift === e.shiftKey;
48
+ });
49
+ if (matchingAction) {
50
+ e.preventDefault();
51
+ iframeWindow.parent.postMessage({
52
+ type: "executeAction",
53
+ actionId: matchingAction.id
54
+ }, "*");
55
+ }
56
+ };
57
+ const handleKeyUp = (e) => {
58
+ if (e.key.toLowerCase() === "l") iframeWindow.parent.postMessage({ type: "releaseLockContent" }, "*");
59
+ };
60
+ iframeWindow.addEventListener("keydown", handleKeyDown);
61
+ iframeWindow.addEventListener("keyup", handleKeyUp);
62
+ return () => {
63
+ iframeWindow.removeEventListener("keydown", handleKeyDown);
64
+ iframeWindow.removeEventListener("keyup", handleKeyUp);
65
+ };
66
+ }, [iframeWindow, actions]);
67
+ return null;
68
+ };
69
+ var PreviewPanel = ({ children }) => {
70
+ useBlockActionsShortcuts();
71
+ const iframeElement = useSelector(previewStore, (state) => state.context.iframeElement);
72
+ const handleIframeReady = React.useCallback((element) => {
73
+ previewStore.send({
74
+ type: "setIframeElement",
75
+ element
76
+ });
77
+ }, []);
78
+ const isMobileMode = useSelector(previewStore, (state) => state.context.isMobileMode);
79
+ const isAgentChatSheetOpen = useSelector(previewStore, (state) => state.context.isAgentChatSheetOpen);
80
+ const isAnySideSheetOpen = useIsPreviewSheetOpen();
81
+ const wrapperRef = React.useRef(null);
82
+ const [panelWidth, setPanelWidth] = React.useState(0);
83
+ const [panelLeft, setPanelLeft] = React.useState(0);
84
+ React.useEffect(() => {
85
+ const el = wrapperRef.current?.parentElement;
86
+ if (!el) return;
87
+ const update = () => {
88
+ const rect = el.getBoundingClientRect();
89
+ setPanelWidth(rect.width);
90
+ setPanelLeft(rect.left);
91
+ };
92
+ update();
93
+ const observer = new ResizeObserver(update);
94
+ observer.observe(el);
95
+ return () => observer.disconnect();
96
+ }, []);
97
+ const sheetOverlap = Math.max(0, 400 - panelLeft);
98
+ const sheetOpenScale = panelWidth > 0 ? (panelWidth - sheetOverlap) / panelWidth : 1;
99
+ React.useEffect(() => {
100
+ const actions = [
101
+ {
102
+ id: "toggle-editing-panel",
103
+ label: "Toggle editing panel",
104
+ groupLabel: "Preview",
105
+ checkIfAvailable: () => true,
106
+ execute: () => previewStore.send({ type: "toggleSidebar" }),
107
+ shortcut: {
108
+ key: "b",
109
+ withAlt: true
110
+ },
111
+ icon: "PanelRight"
112
+ },
113
+ {
114
+ id: "toggle-lock-content",
115
+ label: "Toggle lock content",
116
+ groupLabel: "Preview",
117
+ checkIfAvailable: () => true,
118
+ execute: () => previewStore.send({ type: "toggleLockContent" }),
119
+ icon: "Lock"
120
+ },
121
+ {
122
+ id: "toggle-mobile-mode",
123
+ label: "Toggle mobile mode",
124
+ groupLabel: "Preview",
125
+ checkIfAvailable: () => true,
126
+ execute: () => previewStore.send({ type: "toggleMobileMode" }),
127
+ shortcut: { key: "m" },
128
+ icon: "TabletSmartphone"
129
+ },
130
+ {
131
+ id: "open-agent-chat",
132
+ label: "Ask for changes",
133
+ groupLabel: "Preview",
134
+ checkIfAvailable: () => !isAgentChatSheetOpen,
135
+ execute: () => previewStore.send({ type: "openAgentChatSheet" }),
136
+ shortcut: {
137
+ key: "i",
138
+ withAlt: true
139
+ },
140
+ icon: "MessageSquare"
141
+ }
142
+ ];
143
+ actionsStore.send({
144
+ type: "registerManyActions",
145
+ actions
146
+ });
147
+ return () => {
148
+ actionsStore.send({
149
+ type: "unregisterManyActions",
150
+ ids: actions.map((a) => a.id)
151
+ });
152
+ };
153
+ }, [isAgentChatSheetOpen]);
154
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(PanelContent, {
155
+ className: "relative overflow-hidden",
156
+ children: /* @__PURE__ */ jsx("div", {
157
+ ref: wrapperRef,
158
+ className: "absolute inset-0 transition-[transform,height] duration-500 ease-in-out will-change-transform",
159
+ style: {
160
+ height: isAnySideSheetOpen ? `${100 / sheetOpenScale}%` : "100%",
161
+ transformOrigin: "top right",
162
+ transform: isAnySideSheetOpen ? `scale(${sheetOpenScale})` : "scale(1)"
163
+ },
164
+ children: isMobileMode ? /* @__PURE__ */ jsxs("div", {
165
+ className: "checkered flex h-full justify-center",
166
+ children: [
167
+ /* @__PURE__ */ jsxs("div", {
168
+ className: "relative mt-8 h-[700px] w-[393px] overflow-hidden",
169
+ children: [/* @__PURE__ */ jsx(PreviewFrame, {
170
+ className: "overflow-auto",
171
+ onIframeReady: handleIframeReady,
172
+ children
173
+ }), /* @__PURE__ */ jsx(Overlays, { iframeElement })]
174
+ }),
175
+ /* @__PURE__ */ jsx(TextFormatToolbar, {}),
176
+ /* @__PURE__ */ jsx(PreviewToolbar, {})
177
+ ]
178
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [
179
+ /* @__PURE__ */ jsx(PreviewFrame, {
180
+ className: "checkered h-full w-full",
181
+ onIframeReady: handleIframeReady,
182
+ children
183
+ }),
184
+ /* @__PURE__ */ jsx(Overlays, { iframeElement }),
185
+ /* @__PURE__ */ jsx(TextFormatToolbar, {}),
186
+ /* @__PURE__ */ jsx(PreviewToolbar, {})
187
+ ] })
188
+ })
189
+ }) });
190
+ };
191
+ //#endregion
192
+ export { PreviewFrame, PreviewPanel };
@@ -0,0 +1,13 @@
1
+ import * as Sheet from "@camox/ui/sheet";
2
+ import * as React from "react";
3
+ interface PreviewSideSheetProps {
4
+ open: boolean;
5
+ onOpenChange: (open: boolean) => void;
6
+ onOpenAutoFocus?: (e: Event) => void;
7
+ children: React.ReactNode;
8
+ className?: string;
9
+ }
10
+ declare const PreviewSideSheet: ({ open, onOpenChange, onOpenAutoFocus, children, className, }: PreviewSideSheetProps) => import("react/jsx-runtime").JSX.Element;
11
+ export declare function useIsPreviewSheetOpen(): boolean;
12
+ export { PreviewSideSheet, Sheet as SheetParts };
13
+ //# sourceMappingURL=PreviewSideSheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewSideSheet.d.ts","sourceRoot":"","sources":["../../../../src/features/preview/components/PreviewSideSheet.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,iBAAiB,CAAC;AAEzC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,UAAU,qBAAqB;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,gBAAgB,GAAI,+DAMvB,qBAAqB,4CAcvB,CAAC;AAEF,wBAAgB,qBAAqB,YAYpC;AAED,OAAO,EAAE,gBAAgB,EAAE,KAAK,IAAI,UAAU,EAAE,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { previewStore } from "../previewStore.js";
2
+ import { useSelector } from "@xstate/store/react";
3
+ import "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ import * as Sheet from "@camox/ui/sheet";
6
+ //#region src/features/preview/components/PreviewSideSheet.tsx
7
+ var PreviewSideSheet = ({ open, onOpenChange, onOpenAutoFocus, children, className }) => {
8
+ return /* @__PURE__ */ jsx(Sheet.Sheet, {
9
+ open,
10
+ onOpenChange,
11
+ children: /* @__PURE__ */ jsx(Sheet.SheetContent, {
12
+ className,
13
+ side: "left",
14
+ overlayClassName: "bg-black/0",
15
+ style: { minWidth: 400 },
16
+ onOpenAutoFocus,
17
+ children
18
+ })
19
+ });
20
+ };
21
+ function useIsPreviewSheetOpen() {
22
+ const isPageContentSheetOpen = useSelector(previewStore, (state) => state.context.isPageContentSheetOpen);
23
+ const isPeekingBlock = useSelector(previewStore, (state) => state.context.peekedBlock != null);
24
+ const isAgentChatSheetOpen = useSelector(previewStore, (state) => state.context.isAgentChatSheetOpen);
25
+ return isPageContentSheetOpen || isPeekingBlock || isAgentChatSheetOpen;
26
+ }
27
+ //#endregion
28
+ export { PreviewSideSheet, Sheet, useIsPreviewSheetOpen };
@@ -0,0 +1,2 @@
1
+ export declare const PreviewToolbar: () => import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=PreviewToolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewToolbar.d.ts","sourceRoot":"","sources":["../../../../src/features/preview/components/PreviewToolbar.tsx"],"names":[],"mappings":"AAcA,eAAO,MAAM,cAAc,+CAoG1B,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { previewStore } from "../previewStore.js";
2
+ import { actionsStore } from "../../provider/actionsStore.js";
3
+ import { Kbd } from "@camox/ui/kbd";
4
+ import { useSelector } from "@xstate/store/react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { cn, getActionShortcut } from "@/lib/utils";
7
+ import { Button } from "@camox/ui/button";
8
+ import { Lock, MonitorPlay, PanelRight, TabletSmartphone } from "lucide-react";
9
+ import * as Tooltip$1 from "@camox/ui/tooltip";
10
+ import { ButtonGroup } from "@camox/ui/button-group";
11
+ import { FloatingToolbar } from "@camox/ui/floating-toolbar";
12
+ import { Toggle } from "@camox/ui/toggle";
13
+ //#region src/features/preview/components/PreviewToolbar.tsx
14
+ var PreviewToolbar = () => {
15
+ const isEditingLocked = useSelector(previewStore, (state) => state.context.isContentLocked);
16
+ const isEditingPanelOpen = useSelector(previewStore, (state) => state.context.isSidebarOpen);
17
+ const isPresentationMode = useSelector(previewStore, (state) => state.context.isPresentationMode);
18
+ const isPageContentSheetOpen = useSelector(previewStore, (state) => state.context.isPageContentSheetOpen);
19
+ const isAddBlockSheetOpen = useSelector(previewStore, (state) => state.context.isAddBlockSheetOpen);
20
+ const isAgentChatSheetOpen = useSelector(previewStore, (state) => state.context.isAgentChatSheetOpen);
21
+ const isAnySideSheetOpen = isPageContentSheetOpen || isAddBlockSheetOpen || isAgentChatSheetOpen;
22
+ const actions = useSelector(actionsStore, (state) => state.context.actions);
23
+ const isMobileMode = useSelector(previewStore, (state) => state.context.isMobileMode);
24
+ return /* @__PURE__ */ jsxs(FloatingToolbar, {
25
+ className: cn("bottom-2 gap-4 justify-between", isAnySideSheetOpen && "opacity-0 pointer-events-none translate-y-full"),
26
+ children: [/* @__PURE__ */ jsxs(ButtonGroup, { children: [
27
+ /* @__PURE__ */ jsxs(Tooltip$1.Tooltip, { children: [/* @__PURE__ */ jsx(Tooltip$1.TooltipTrigger, {
28
+ asChild: true,
29
+ children: /* @__PURE__ */ jsx(Toggle, {
30
+ "data-state": isEditingPanelOpen ? "off" : "on",
31
+ pressed: !isEditingPanelOpen,
32
+ variant: "outline",
33
+ onClick: () => previewStore.send({ type: "toggleSidebar" }),
34
+ children: /* @__PURE__ */ jsx(PanelRight, {})
35
+ })
36
+ }), /* @__PURE__ */ jsxs(Tooltip$1.TooltipContent, { children: ["Toggle sidebar ", getActionShortcut(actions, "toggle-editing-panel")] })] }),
37
+ /* @__PURE__ */ jsxs(Tooltip$1.Tooltip, { children: [/* @__PURE__ */ jsx(Tooltip$1.TooltipTrigger, {
38
+ asChild: true,
39
+ children: /* @__PURE__ */ jsx(Toggle, {
40
+ "data-state": isEditingLocked ? "on" : "off",
41
+ pressed: isEditingLocked,
42
+ onPressedChange: () => previewStore.send({ type: "toggleLockContent" }),
43
+ variant: "outline",
44
+ children: /* @__PURE__ */ jsx(Lock, {})
45
+ })
46
+ }), /* @__PURE__ */ jsxs(Tooltip$1.TooltipContent, { children: ["Toggle edit mode ", /* @__PURE__ */ jsx(Kbd, { children: "L" })] })] }),
47
+ /* @__PURE__ */ jsxs(Tooltip$1.Tooltip, { children: [/* @__PURE__ */ jsx(Tooltip$1.TooltipTrigger, {
48
+ asChild: true,
49
+ children: /* @__PURE__ */ jsx(Toggle, {
50
+ "data-state": isMobileMode ? "on" : "off",
51
+ pressed: isMobileMode,
52
+ onPressedChange: () => previewStore.send({ type: "toggleMobileMode" }),
53
+ variant: "outline",
54
+ children: /* @__PURE__ */ jsx(TabletSmartphone, {})
55
+ })
56
+ }), /* @__PURE__ */ jsxs(Tooltip$1.TooltipContent, { children: ["Toggle mobile layout ", getActionShortcut(actions, "toggle-mobile-mode")] })] }),
57
+ /* @__PURE__ */ jsxs(Tooltip$1.Tooltip, { children: [/* @__PURE__ */ jsx(Tooltip$1.TooltipTrigger, {
58
+ asChild: true,
59
+ children: /* @__PURE__ */ jsxs(Toggle, {
60
+ "data-state": isPresentationMode ? "on" : "off",
61
+ pressed: isPresentationMode,
62
+ variant: "outline",
63
+ onClick: () => previewStore.send({ type: "enterPresentationMode" }),
64
+ children: [/* @__PURE__ */ jsx(MonitorPlay, {}), "Preview"]
65
+ })
66
+ }), /* @__PURE__ */ jsxs(Tooltip$1.TooltipContent, { children: ["Hide all admin interface ", getActionShortcut(actions, "enter-presentation-mode")] })] })
67
+ ] }), /* @__PURE__ */ jsxs(Button, {
68
+ variant: "outline",
69
+ className: "bg-transparent dark:bg-transparent",
70
+ onClick: () => previewStore.send({ type: "openAgentChatSheet" }),
71
+ children: [/* @__PURE__ */ jsx("span", {
72
+ className: "text-muted-foreground",
73
+ children: "Ask for changes..."
74
+ }), getActionShortcut(actions, "open-agent-chat")]
75
+ })]
76
+ });
77
+ };
78
+ //#endregion
79
+ export { PreviewToolbar };
@@ -0,0 +1,14 @@
1
+ import { Doc, Id } from 'camox/server/dataModel';
2
+ interface RepeatableItemsListProps {
3
+ items: Doc<"repeatableItems">[] | Record<string, unknown>[];
4
+ blockId: Id<"blocks">;
5
+ fieldName: string;
6
+ minItems?: number;
7
+ maxItems?: number;
8
+ schema: unknown;
9
+ /** When set, items are inline objects managed through the parent item's content */
10
+ parentItemId?: Id<"repeatableItems">;
11
+ }
12
+ declare const RepeatableItemsList: ({ items, blockId, fieldName, minItems, maxItems, schema, parentItemId, }: RepeatableItemsListProps) => import("react/jsx-runtime").JSX.Element;
13
+ export { RepeatableItemsList };
14
+ //# sourceMappingURL=RepeatableItemsList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RepeatableItemsList.d.ts","sourceRoot":"","sources":["../../../../src/features/preview/components/RepeatableItemsList.tsx"],"names":[],"mappings":"AAsBA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AA2RjD,UAAU,wBAAwB;IAChC,KAAK,EAAE,GAAG,CAAC,iBAAiB,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC5D,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,mFAAmF;IACnF,YAAY,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC;CACtC;AAED,QAAA,MAAM,mBAAmB,GAAI,0EAQ1B,wBAAwB,4CA4Q1B,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,CAAC"}