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 @@
1
+ {"version":3,"file":"fieldTypes.d.ts","sourceRoot":"","sources":["../../../src/core/lib/fieldTypes.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAKL,KAAK,WAAW,EAMjB,MAAM,cAAc,CAAC;AAMtB,KAAK,cAAc,GAAG;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,QAAA,MAAM,oBAAoB;;;;;+BAKC,WAAW;0BAChB,OAAO;oDAKmB,qBAAqB;;;;;;qCASpC,eAAe,aACI,WAAW;2BAIxC,OAAO,8BAA8B,cAAc;yCAErC,qBAAqB;;;;;;+BAS/B,WAAW;0BAChB,OAAO,KAAc,MAAM;oDACD,qBAAqB;;;;;;+BAS1C,WAAW;0BAChB,OAAO;oDACmB,qBAAqB;;;;;;+BAS1C,WAAW;0BAChB,OAAO,4CAA4C,cAAc;oDAOvC,qBAAqB;;;;;;+BAS1C,WAAW;0BAChB,OAAO;oDACmB,qBAAqB;;;;;;+BAU1C,WAAW;0BAChB,OAAO,8BAA8B,cAAc;oDAKzB,qBAAqB;;;;;;+BAU1C,WAAW;0BAChB,OAAO,8BAA8B,cAAc;oDAKzB,qBAAqB;;CAgBpE,CAAC;AAEF,KAAK,oBAAoB,GAAG,OAAO,oBAAoB,CAAC;AACxD,KAAK,SAAS,GAAG,MAAM,oBAAoB,CAAC;AAE5C,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ export declare function lexicalStateToReactNodes(serialized: string): React.ReactNode;
3
+ //# sourceMappingURL=lexicalReact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexicalReact.d.ts","sourceRoot":"","sources":["../../../src/core/lib/lexicalReact.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAO5E"}
@@ -0,0 +1,24 @@
1
+ import { applyModifierRendering } from "./modifiers.js";
2
+ import * as React from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/core/lib/lexicalReact.tsx
5
+ function lexicalStateToReactNodes(serialized) {
6
+ try {
7
+ return renderNode(JSON.parse(serialized).root);
8
+ } catch {
9
+ return serialized;
10
+ }
11
+ }
12
+ function renderNode(node) {
13
+ if (node.type === "text") return applyModifierRendering(node.text ?? "", node.format ?? 0);
14
+ if (node.type === "linebreak") return /* @__PURE__ */ jsx("br", {});
15
+ if (!node.children) return null;
16
+ const children = node.children.map((child, i) => /* @__PURE__ */ jsx(React.Fragment, { children: renderNode(child) }, i));
17
+ if (node.type === "root") {
18
+ if (node.children.length === 1) return renderNode(node.children[0]);
19
+ return children;
20
+ }
21
+ return children;
22
+ }
23
+ //#endregion
24
+ export { lexicalStateToReactNodes };
@@ -0,0 +1,10 @@
1
+ export declare function isLexicalState(value: unknown): boolean;
2
+ export declare function plainTextToLexicalState(text: string): string;
3
+ export declare function lexicalStateToPlainText(serialized: string): string;
4
+ export declare function lexicalStateToMarkdown(serialized: string): string;
5
+ /**
6
+ * Parse simple markdown (bold/italic) into Lexical JSON.
7
+ * Works without Lexical runtime — pure string parsing.
8
+ */
9
+ export declare function markdownToLexicalState(markdown: string): string;
10
+ //# sourceMappingURL=lexicalState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexicalState.d.ts","sourceRoot":"","sources":["../../../src/core/lib/lexicalState.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQtD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgC5D;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAOlE;AAmBD,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAOjE;AA0BD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuB/D"}
@@ -0,0 +1,38 @@
1
+ //#region src/core/lib/lexicalState.ts
2
+ function isLexicalState(value) {
3
+ if (typeof value !== "string") return false;
4
+ try {
5
+ return JSON.parse(value)?.root?.type === "root";
6
+ } catch {
7
+ return false;
8
+ }
9
+ }
10
+ function plainTextToLexicalState(text) {
11
+ return JSON.stringify({ root: {
12
+ children: [{
13
+ children: [{
14
+ detail: 0,
15
+ format: 0,
16
+ mode: "normal",
17
+ style: "",
18
+ text,
19
+ type: "text",
20
+ version: 1
21
+ }],
22
+ direction: "ltr",
23
+ format: "",
24
+ indent: 0,
25
+ type: "paragraph",
26
+ version: 1,
27
+ textFormat: 0,
28
+ textStyle: ""
29
+ }],
30
+ direction: "ltr",
31
+ format: "",
32
+ indent: 0,
33
+ type: "root",
34
+ version: 1
35
+ } });
36
+ }
37
+ //#endregion
38
+ export { isLexicalState, plainTextToLexicalState };
@@ -0,0 +1,9 @@
1
+ /** Format bitmask flags matching Lexical's internal constants */
2
+ export declare const FORMAT_FLAGS: {
3
+ readonly bold: 1;
4
+ readonly italic: 2;
5
+ };
6
+ /** Markdown wrappers keyed by format name */
7
+ export declare const MARKDOWN_WRAPPERS: Record<string, (text: string) => string>;
8
+ export declare function lexicalTextToMarkdown(text: string, format: number): string;
9
+ //# sourceMappingURL=modifierFormats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modifierFormats.d.ts","sourceRoot":"","sources":["../../../src/core/lib/modifierFormats.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAEX,6CAA6C;AAC7C,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAGtE,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAS1E"}
@@ -0,0 +1,8 @@
1
+ //#region src/core/lib/modifierFormats.ts
2
+ /** Format bitmask flags matching Lexical's internal constants */
3
+ var FORMAT_FLAGS = {
4
+ bold: 1,
5
+ italic: 2
6
+ };
7
+ //#endregion
8
+ export { FORMAT_FLAGS };
@@ -0,0 +1,12 @@
1
+ import * as React from "react";
2
+ export { lexicalTextToMarkdown } from './modifierFormats';
3
+ export interface TextModifier {
4
+ formatFlag: number;
5
+ label: string;
6
+ icon: string;
7
+ render: (children: React.ReactNode) => React.ReactNode;
8
+ toMarkdown: (text: string) => string;
9
+ }
10
+ export declare const TEXT_MODIFIERS: Record<string, TextModifier>;
11
+ export declare function applyModifierRendering(text: string, format: number): React.ReactNode;
12
+ //# sourceMappingURL=modifiers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modifiers.d.ts","sourceRoot":"","sources":["../../../src/core/lib/modifiers.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC;IACvD,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACtC;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAevD,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAQpF"}
@@ -0,0 +1,27 @@
1
+ import { FORMAT_FLAGS } from "./modifierFormats.js";
2
+ import "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/core/lib/modifiers.tsx
5
+ var TEXT_MODIFIERS = {
6
+ bold: {
7
+ formatFlag: FORMAT_FLAGS.bold,
8
+ label: "Bold",
9
+ icon: "B",
10
+ render: (children) => /* @__PURE__ */ jsx("strong", { children }),
11
+ toMarkdown: (text) => `**${text}**`
12
+ },
13
+ italic: {
14
+ formatFlag: FORMAT_FLAGS.italic,
15
+ label: "Italic",
16
+ icon: "I",
17
+ render: (children) => /* @__PURE__ */ jsx("em", { children }),
18
+ toMarkdown: (text) => `*${text}*`
19
+ }
20
+ };
21
+ function applyModifierRendering(text, format) {
22
+ let node = text;
23
+ for (const modifier of Object.values(TEXT_MODIFIERS)) if (format & modifier.formatFlag) node = modifier.render(node);
24
+ return node;
25
+ }
26
+ //#endregion
27
+ export { TEXT_MODIFIERS, applyModifierRendering };
@@ -0,0 +1,2 @@
1
+ export declare const CamoxContent: () => import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=CamoxContent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CamoxContent.d.ts","sourceRoot":"","sources":["../../../src/features/content/CamoxContent.tsx"],"names":[],"mappings":"AAgBA,eAAO,MAAM,YAAY,+CA2FxB,CAAC"}
@@ -0,0 +1,100 @@
1
+ import { AssetCard } from "./components/AssetCard.js";
2
+ import { AssetCardSkeleton } from "./components/AssetCardSkeleton.js";
3
+ import { ContentSidebar } from "./components/ContentSidebar.js";
4
+ import { UploadDropZone } from "./components/UploadDropZone.js";
5
+ import { UploadProgressDrawer } from "./components/UploadProgressDrawer.js";
6
+ import { api } from "camox/server/api";
7
+ import { useQuery } from "convex/react";
8
+ import { useCallback, useRef, useState } from "react";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ import { PanelContent } from "@camox/ui/panel";
11
+ import { useFileUpload } from "@/hooks/use-file-upload";
12
+ import { AssetLightbox } from "@/features/preview/components/AssetLightbox";
13
+ import { useMarqueeSelection } from "@/hooks/use-marquee-selection";
14
+ //#region src/features/content/CamoxContent.tsx
15
+ var CamoxContent = () => {
16
+ const files = useQuery(api.files.listFiles);
17
+ const [selectedIds, setSelectedIds] = useState(/* @__PURE__ */ new Set());
18
+ const [lightboxFileId, setLightboxFileId] = useState(null);
19
+ const { uploads, uploadFiles, clearAll } = useFileUpload();
20
+ const containerRef = useRef(null);
21
+ const { selectionRect, didDragRef, handlers } = useMarqueeSelection(containerRef, useCallback((ids) => setSelectedIds(ids), []));
22
+ return /* @__PURE__ */ jsxs("div", {
23
+ className: "flex flex-1 flex-row",
24
+ children: [
25
+ /* @__PURE__ */ jsx(ContentSidebar, {}),
26
+ /* @__PURE__ */ jsx("div", {
27
+ className: "flex min-w-0 flex-1 flex-col",
28
+ children: /* @__PURE__ */ jsx(UploadDropZone, {
29
+ onDrop: uploadFiles,
30
+ className: "flex flex-1 flex-col",
31
+ children: /* @__PURE__ */ jsxs(PanelContent, {
32
+ ref: containerRef,
33
+ className: "relative p-4 select-none",
34
+ onClick: () => {
35
+ if (didDragRef.current) {
36
+ didDragRef.current = false;
37
+ return;
38
+ }
39
+ setSelectedIds(/* @__PURE__ */ new Set());
40
+ },
41
+ onPointerDown: handlers.onPointerDown,
42
+ onPointerMove: handlers.onPointerMove,
43
+ onPointerUp: handlers.onPointerUp,
44
+ children: [
45
+ files === void 0 && /* @__PURE__ */ jsx("div", {
46
+ className: "grid grid-cols-[repeat(auto-fill,minmax(220px,1fr))] gap-4",
47
+ children: Array.from({ length: 12 }, (_, i) => /* @__PURE__ */ jsx(AssetCardSkeleton, {}, i))
48
+ }),
49
+ files?.length === 0 && /* @__PURE__ */ jsx("div", {
50
+ className: "flex h-full flex-1 items-center justify-center",
51
+ children: /* @__PURE__ */ jsx("p", {
52
+ className: "text-muted-foreground",
53
+ children: "No assets yet"
54
+ })
55
+ }),
56
+ files && files.length > 0 && /* @__PURE__ */ jsx("div", {
57
+ className: "grid grid-cols-[repeat(auto-fill,minmax(220px,1fr))] gap-4",
58
+ children: files.map((file) => /* @__PURE__ */ jsx(AssetCard, {
59
+ file,
60
+ selected: selectedIds.has(file._id),
61
+ onSelect: () => {
62
+ setSelectedIds((prev) => {
63
+ const next = new Set(prev);
64
+ if (next.has(file._id)) next.delete(file._id);
65
+ else next.add(file._id);
66
+ return next;
67
+ });
68
+ },
69
+ onOpen: () => setLightboxFileId(file._id)
70
+ }, file._id))
71
+ }),
72
+ selectionRect && /* @__PURE__ */ jsx("div", {
73
+ className: "border-primary bg-primary/10 pointer-events-none absolute z-50 border",
74
+ style: {
75
+ left: selectionRect.left,
76
+ top: selectionRect.top,
77
+ width: selectionRect.width,
78
+ height: selectionRect.height
79
+ }
80
+ })
81
+ ]
82
+ })
83
+ })
84
+ }),
85
+ /* @__PURE__ */ jsx(UploadProgressDrawer, {
86
+ uploads,
87
+ onClose: clearAll
88
+ }),
89
+ lightboxFileId && /* @__PURE__ */ jsx(AssetLightbox, {
90
+ open: true,
91
+ onOpenChange: (open) => {
92
+ if (!open) setLightboxFileId(null);
93
+ },
94
+ fileId: lightboxFileId
95
+ })
96
+ ]
97
+ });
98
+ };
99
+ //#endregion
100
+ export { CamoxContent };
@@ -0,0 +1,10 @@
1
+ import { Doc } from 'camox/server/dataModel';
2
+ interface AssetCardProps {
3
+ file: Doc<"files">;
4
+ selected: boolean;
5
+ onSelect: () => void;
6
+ onOpen: () => void;
7
+ }
8
+ export declare const AssetCard: ({ file, selected, onSelect, onOpen }: AssetCardProps) => import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=AssetCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetCard.d.ts","sourceRoot":"","sources":["../../../../src/features/content/components/AssetCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAKlD,UAAU,cAAc;IACtB,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,GAAI,sCAAsC,cAAc,4CAuC7E,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { cn } from "@/lib/utils";
3
+ import { FileIcon } from "lucide-react";
4
+ //#region src/features/content/components/AssetCard.tsx
5
+ var AssetCard = ({ file, selected, onSelect, onOpen }) => {
6
+ const isImage = file.mimeType?.startsWith("image/");
7
+ const extension = file.filename?.split(".").pop()?.toUpperCase() ?? "";
8
+ return /* @__PURE__ */ jsxs("button", {
9
+ type: "button",
10
+ "data-asset-id": file._id,
11
+ className: cn("group flex flex-col gap-1.5 rounded-lg p-2 text-left border-2 border-transparent", selected ? "bg-primary/20 border-2 border-primary" : "hover:bg-accent/75"),
12
+ onClick: (e) => {
13
+ e.stopPropagation();
14
+ onSelect();
15
+ },
16
+ onDoubleClick: (e) => {
17
+ e.stopPropagation();
18
+ onOpen();
19
+ },
20
+ children: [/* @__PURE__ */ jsx("div", {
21
+ className: "bg-muted flex aspect-4/3 w-full items-center justify-center overflow-hidden rounded-md",
22
+ children: isImage ? /* @__PURE__ */ jsx("img", {
23
+ src: file.url,
24
+ alt: file.alt || file.filename,
25
+ draggable: false,
26
+ className: "pointer-events-none h-full w-full object-cover"
27
+ }) : /* @__PURE__ */ jsxs("div", {
28
+ className: "text-muted-foreground flex flex-col items-center gap-1",
29
+ children: [/* @__PURE__ */ jsx(FileIcon, { className: "h-8 w-8" }), extension && /* @__PURE__ */ jsx("span", {
30
+ className: "text-sm font-medium",
31
+ children: extension
32
+ })]
33
+ })
34
+ }), /* @__PURE__ */ jsx("p", {
35
+ className: "line-clamp-2 px-0.5 text-xs break-all",
36
+ children: file.filename
37
+ })]
38
+ });
39
+ };
40
+ //#endregion
41
+ export { AssetCard };
@@ -0,0 +1,2 @@
1
+ export declare const AssetCardSkeleton: () => import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=AssetCardSkeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetCardSkeleton.d.ts","sourceRoot":"","sources":["../../../../src/features/content/components/AssetCardSkeleton.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,+CAO7B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Skeleton } from "@camox/ui/skeleton";
3
+ //#region src/features/content/components/AssetCardSkeleton.tsx
4
+ var AssetCardSkeleton = () => {
5
+ return /* @__PURE__ */ jsxs("div", {
6
+ className: "flex flex-col gap-1.5 rounded-lg p-2",
7
+ children: [/* @__PURE__ */ jsx(Skeleton, { className: "aspect-4/3 w-full rounded-md" }), /* @__PURE__ */ jsx(Skeleton, { className: "mx-0.5 h-3.5 w-3/4" })]
8
+ });
9
+ };
10
+ //#endregion
11
+ export { AssetCardSkeleton };
@@ -0,0 +1,2 @@
1
+ export declare const ContentSidebar: () => import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ContentSidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentSidebar.d.ts","sourceRoot":"","sources":["../../../../src/features/content/components/ContentSidebar.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,+CAY1B,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { ImageIcon } from "lucide-react";
3
+ //#region src/features/content/components/ContentSidebar.tsx
4
+ var ContentSidebar = () => {
5
+ return /* @__PURE__ */ jsx("div", {
6
+ className: "flex w-[220px] flex-col border-r-2 p-2",
7
+ children: /* @__PURE__ */ jsxs("button", {
8
+ type: "button",
9
+ className: "bg-accent text-accent-foreground flex items-center gap-2 rounded-md px-2 py-1.5 text-sm font-medium",
10
+ children: [/* @__PURE__ */ jsx(ImageIcon, { className: "h-4 w-4" }), "Assets"]
11
+ })
12
+ });
13
+ };
14
+ //#endregion
15
+ export { ContentSidebar };
@@ -0,0 +1,9 @@
1
+ interface UploadDropZoneProps {
2
+ onDrop: (files: FileList) => void;
3
+ children: React.ReactNode;
4
+ className?: string;
5
+ label?: string;
6
+ }
7
+ export declare function UploadDropZone({ onDrop, children, className, label, }: UploadDropZoneProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=UploadDropZone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadDropZone.d.ts","sourceRoot":"","sources":["../../../../src/features/content/components/UploadDropZone.tsx"],"names":[],"mappings":"AAKA,UAAU,mBAAmB;IAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,QAAQ,EACR,SAAS,EACT,KAA8B,GAC/B,EAAE,mBAAmB,2CA4DrB"}
@@ -0,0 +1,51 @@
1
+ import { useCallback, useRef, useState } from "react";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { cn } from "@/lib/utils";
4
+ import { Upload } from "lucide-react";
5
+ //#region src/features/content/components/UploadDropZone.tsx
6
+ function UploadDropZone({ onDrop, children, className, label = "Drop files to upload" }) {
7
+ const [isDragging, setIsDragging] = useState(false);
8
+ const dragCounter = useRef(0);
9
+ const handleDragEnter = useCallback((e) => {
10
+ e.preventDefault();
11
+ e.stopPropagation();
12
+ dragCounter.current++;
13
+ if (dragCounter.current === 1) setIsDragging(true);
14
+ }, []);
15
+ const handleDragLeave = useCallback((e) => {
16
+ e.preventDefault();
17
+ e.stopPropagation();
18
+ dragCounter.current--;
19
+ if (dragCounter.current === 0) setIsDragging(false);
20
+ }, []);
21
+ const handleDragOver = useCallback((e) => {
22
+ e.preventDefault();
23
+ e.stopPropagation();
24
+ }, []);
25
+ const handleDrop = useCallback((e) => {
26
+ e.preventDefault();
27
+ e.stopPropagation();
28
+ dragCounter.current = 0;
29
+ setIsDragging(false);
30
+ if (e.dataTransfer.files.length > 0) onDrop(e.dataTransfer.files);
31
+ }, [onDrop]);
32
+ return /* @__PURE__ */ jsxs("div", {
33
+ className: cn("relative min-h-full", className),
34
+ onDragEnter: handleDragEnter,
35
+ onDragLeave: handleDragLeave,
36
+ onDragOver: handleDragOver,
37
+ onDrop: handleDrop,
38
+ children: [children, isDragging && /* @__PURE__ */ jsx("div", {
39
+ className: "bg-background absolute inset-0 z-40 flex flex-col items-center justify-center gap-2 p-4",
40
+ children: /* @__PURE__ */ jsxs("div", {
41
+ className: "border-primary flex h-full w-full flex-col items-center justify-center gap-2 rounded-lg border-3 border-dashed",
42
+ children: [/* @__PURE__ */ jsx(Upload, { className: "text-primary-foreground h-8 w-8" }), /* @__PURE__ */ jsx("p", {
43
+ className: "text-primary-foreground text-sm font-medium",
44
+ children: label
45
+ })]
46
+ })
47
+ })]
48
+ });
49
+ }
50
+ //#endregion
51
+ export { UploadDropZone };
@@ -0,0 +1,11 @@
1
+ import { UploadItem } from '../../../hooks/use-file-upload';
2
+ interface UploadProgressDrawerProps {
3
+ uploads: UploadItem[];
4
+ onClose: () => void;
5
+ }
6
+ export declare function UploadProgressDrawer({ uploads, onClose }: UploadProgressDrawerProps): import("react/jsx-runtime").JSX.Element | null;
7
+ export declare function UploadItemRow({ item }: {
8
+ item: UploadItem;
9
+ }): import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=UploadProgressDrawer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadProgressDrawer.d.ts","sourceRoot":"","sources":["../../../../src/features/content/components/UploadProgressDrawer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,UAAU,yBAAyB;IACjC,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,yBAAyB,kDAmCnF;AAED,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,2CA0B3D"}
@@ -0,0 +1,72 @@
1
+ import { useState } from "react";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { AlertCircle, Check, ChevronDown, ChevronUp, File, Loader2, X } from "lucide-react";
4
+ //#region src/features/content/components/UploadProgressDrawer.tsx
5
+ function UploadProgressDrawer({ uploads, onClose }) {
6
+ const [collapsed, setCollapsed] = useState(false);
7
+ if (uploads.length === 0) return null;
8
+ const completedCount = uploads.filter((u) => u.status === "complete").length;
9
+ return /* @__PURE__ */ jsxs("div", {
10
+ className: "border-border bg-background fixed right-4 bottom-4 z-50 w-80 rounded-lg border shadow-lg",
11
+ children: [/* @__PURE__ */ jsxs("div", {
12
+ className: "border-border flex items-center justify-between border-b px-3 py-2",
13
+ children: [/* @__PURE__ */ jsx("span", {
14
+ className: "text-sm font-medium",
15
+ children: completedCount === uploads.length ? `${completedCount} upload${completedCount !== 1 ? "s" : ""} complete` : `Uploading ${uploads.length} file${uploads.length !== 1 ? "s" : ""}`
16
+ }), /* @__PURE__ */ jsxs("div", {
17
+ className: "flex items-center gap-1",
18
+ children: [/* @__PURE__ */ jsx("button", {
19
+ onClick: () => setCollapsed((c) => !c),
20
+ className: "hover:bg-muted rounded p-1",
21
+ children: collapsed ? /* @__PURE__ */ jsx(ChevronUp, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(ChevronDown, { className: "h-4 w-4" })
22
+ }), /* @__PURE__ */ jsx("button", {
23
+ onClick: onClose,
24
+ className: "hover:bg-muted rounded p-1",
25
+ children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
26
+ })]
27
+ })]
28
+ }), !collapsed && /* @__PURE__ */ jsx("div", {
29
+ className: "max-h-60 overflow-y-auto",
30
+ children: uploads.map((item) => /* @__PURE__ */ jsx(UploadItemRow, { item }, item.id))
31
+ })]
32
+ });
33
+ }
34
+ function UploadItemRow({ item }) {
35
+ return /* @__PURE__ */ jsxs("div", {
36
+ className: "flex items-center gap-2 px-3 py-2",
37
+ children: [
38
+ /* @__PURE__ */ jsx(File, { className: "text-muted-foreground h-4 w-4 shrink-0" }),
39
+ /* @__PURE__ */ jsxs("div", {
40
+ className: "min-w-0 flex-1",
41
+ children: [
42
+ /* @__PURE__ */ jsx("p", {
43
+ className: "truncate text-sm",
44
+ children: item.filename
45
+ }),
46
+ (item.status === "uploading" || item.status === "committing") && /* @__PURE__ */ jsx("div", {
47
+ className: "bg-muted mt-1 h-1.5 overflow-hidden rounded-full",
48
+ children: /* @__PURE__ */ jsx("div", {
49
+ className: "bg-primary h-full transition-all duration-200",
50
+ style: { width: `${item.progress}%` }
51
+ })
52
+ }),
53
+ item.status === "error" && /* @__PURE__ */ jsx("p", {
54
+ className: "text-destructive mt-0.5 text-xs",
55
+ children: item.error
56
+ })
57
+ ]
58
+ }),
59
+ /* @__PURE__ */ jsxs("div", {
60
+ className: "shrink-0",
61
+ children: [
62
+ item.status === "uploading" && /* @__PURE__ */ jsx(Loader2, { className: "text-muted-foreground h-4 w-4 animate-spin" }),
63
+ item.status === "committing" && /* @__PURE__ */ jsx(Loader2, { className: "text-primary h-4 w-4 animate-spin" }),
64
+ item.status === "complete" && /* @__PURE__ */ jsx(Check, { className: "h-4 w-4 text-green-500" }),
65
+ item.status === "error" && /* @__PURE__ */ jsx(AlertCircle, { className: "text-destructive h-4 w-4" })
66
+ ]
67
+ })
68
+ ]
69
+ });
70
+ }
71
+ //#endregion
72
+ export { UploadProgressDrawer };