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.
- package/LICENSE.md +110 -0
- package/dist/components/AuthGate.d.ts +7 -0
- package/dist/components/AuthGate.d.ts.map +1 -0
- package/dist/core/components/AddBlockControlBar.d.ts +9 -0
- package/dist/core/components/AddBlockControlBar.d.ts.map +1 -0
- package/dist/core/components/AddBlockControlBar.js +65 -0
- package/dist/core/components/lexical/InlineContentEditable.d.ts +7 -0
- package/dist/core/components/lexical/InlineContentEditable.d.ts.map +1 -0
- package/dist/core/components/lexical/InlineContentEditable.js +40 -0
- package/dist/core/components/lexical/InlineLexicalEditor.d.ts +12 -0
- package/dist/core/components/lexical/InlineLexicalEditor.d.ts.map +1 -0
- package/dist/core/components/lexical/InlineLexicalEditor.js +133 -0
- package/dist/core/components/lexical/InlineParagraphNode.d.ts +10 -0
- package/dist/core/components/lexical/InlineParagraphNode.d.ts.map +1 -0
- package/dist/core/components/lexical/InlineParagraphNode.js +34 -0
- package/dist/core/components/lexical/SelectionBroadcaster.d.ts +6 -0
- package/dist/core/components/lexical/SelectionBroadcaster.d.ts.map +1 -0
- package/dist/core/components/lexical/SelectionBroadcaster.js +62 -0
- package/dist/core/components/lexical/SidebarLexicalEditor.d.ts +9 -0
- package/dist/core/components/lexical/SidebarLexicalEditor.d.ts.map +1 -0
- package/dist/core/components/lexical/editorConfig.d.ts +4 -0
- package/dist/core/components/lexical/editorConfig.d.ts.map +1 -0
- package/dist/core/components/lexical/editorConfig.js +24 -0
- package/dist/core/createApp.d.ts +373 -0
- package/dist/core/createApp.d.ts.map +1 -0
- package/dist/core/createApp.js +40 -0
- package/dist/core/createBlock.d.ts +947 -0
- package/dist/core/createBlock.d.ts.map +1 -0
- package/dist/core/createBlock.js +873 -0
- package/dist/core/createLayout.d.ts +78 -0
- package/dist/core/createLayout.d.ts.map +1 -0
- package/dist/core/createLayout.js +73 -0
- package/dist/core/hooks/useFieldSelection.d.ts +11 -0
- package/dist/core/hooks/useFieldSelection.d.ts.map +1 -0
- package/dist/core/hooks/useFieldSelection.js +25 -0
- package/dist/core/hooks/useIsEditable.d.ts +2 -0
- package/dist/core/hooks/useIsEditable.d.ts.map +1 -0
- package/dist/core/hooks/useIsEditable.js +12 -0
- package/dist/core/hooks/useOverlayMessage.d.ts +10 -0
- package/dist/core/hooks/useOverlayMessage.d.ts.map +1 -0
- package/dist/core/hooks/useOverlayMessage.js +37 -0
- package/dist/core/lib/contentType.d.ts +165 -0
- package/dist/core/lib/contentType.d.ts.map +1 -0
- package/dist/core/lib/contentType.js +148 -0
- package/dist/core/lib/fieldTypes.d.ts +85 -0
- package/dist/core/lib/fieldTypes.d.ts.map +1 -0
- package/dist/core/lib/lexicalReact.d.ts +3 -0
- package/dist/core/lib/lexicalReact.d.ts.map +1 -0
- package/dist/core/lib/lexicalReact.js +24 -0
- package/dist/core/lib/lexicalState.d.ts +10 -0
- package/dist/core/lib/lexicalState.d.ts.map +1 -0
- package/dist/core/lib/lexicalState.js +38 -0
- package/dist/core/lib/modifierFormats.d.ts +9 -0
- package/dist/core/lib/modifierFormats.d.ts.map +1 -0
- package/dist/core/lib/modifierFormats.js +8 -0
- package/dist/core/lib/modifiers.d.ts +12 -0
- package/dist/core/lib/modifiers.d.ts.map +1 -0
- package/dist/core/lib/modifiers.js +27 -0
- package/dist/features/content/CamoxContent.d.ts +2 -0
- package/dist/features/content/CamoxContent.d.ts.map +1 -0
- package/dist/features/content/CamoxContent.js +100 -0
- package/dist/features/content/components/AssetCard.d.ts +10 -0
- package/dist/features/content/components/AssetCard.d.ts.map +1 -0
- package/dist/features/content/components/AssetCard.js +41 -0
- package/dist/features/content/components/AssetCardSkeleton.d.ts +2 -0
- package/dist/features/content/components/AssetCardSkeleton.d.ts.map +1 -0
- package/dist/features/content/components/AssetCardSkeleton.js +11 -0
- package/dist/features/content/components/ContentSidebar.d.ts +2 -0
- package/dist/features/content/components/ContentSidebar.d.ts.map +1 -0
- package/dist/features/content/components/ContentSidebar.js +15 -0
- package/dist/features/content/components/UploadDropZone.d.ts +9 -0
- package/dist/features/content/components/UploadDropZone.d.ts.map +1 -0
- package/dist/features/content/components/UploadDropZone.js +51 -0
- package/dist/features/content/components/UploadProgressDrawer.d.ts +11 -0
- package/dist/features/content/components/UploadProgressDrawer.d.ts.map +1 -0
- package/dist/features/content/components/UploadProgressDrawer.js +72 -0
- package/dist/features/preview/CamoxPreview.d.ts +124 -0
- package/dist/features/preview/CamoxPreview.d.ts.map +1 -0
- package/dist/features/preview/CamoxPreview.js +253 -0
- package/dist/features/preview/components/AddBlockSheet.d.ts +3 -0
- package/dist/features/preview/components/AddBlockSheet.d.ts.map +1 -0
- package/dist/features/preview/components/AddBlockSheet.js +121 -0
- package/dist/features/preview/components/AgentChatSheet.d.ts +3 -0
- package/dist/features/preview/components/AgentChatSheet.d.ts.map +1 -0
- package/dist/features/preview/components/AgentChatSheet.js +24 -0
- package/dist/features/preview/components/AssetFieldEditor.d.ts +18 -0
- package/dist/features/preview/components/AssetFieldEditor.d.ts.map +1 -0
- package/dist/features/preview/components/AssetFieldEditor.js +139 -0
- package/dist/features/preview/components/AssetLightbox.d.ts +9 -0
- package/dist/features/preview/components/AssetLightbox.d.ts.map +1 -0
- package/dist/features/preview/components/AssetLightbox.js +421 -0
- package/dist/features/preview/components/AssetPickerGrid.d.ts +11 -0
- package/dist/features/preview/components/AssetPickerGrid.d.ts.map +1 -0
- package/dist/features/preview/components/AssetPickerGrid.js +92 -0
- package/dist/features/preview/components/BlockActionsPopover.d.ts +15 -0
- package/dist/features/preview/components/BlockActionsPopover.d.ts.map +1 -0
- package/dist/features/preview/components/BlockActionsPopover.js +506 -0
- package/dist/features/preview/components/CreatePageSheet.d.ts +3 -0
- package/dist/features/preview/components/CreatePageSheet.d.ts.map +1 -0
- package/dist/features/preview/components/CreatePageSheet.js +159 -0
- package/dist/features/preview/components/DebouncedFieldEditor.d.ts +10 -0
- package/dist/features/preview/components/DebouncedFieldEditor.d.ts.map +1 -0
- package/dist/features/preview/components/DebouncedFieldEditor.js +51 -0
- package/dist/features/preview/components/EditPageSheet.d.ts +3 -0
- package/dist/features/preview/components/EditPageSheet.d.ts.map +1 -0
- package/dist/features/preview/components/EditPageSheet.js +352 -0
- package/dist/features/preview/components/ItemFieldsEditor.d.ts +29 -0
- package/dist/features/preview/components/ItemFieldsEditor.d.ts.map +1 -0
- package/dist/features/preview/components/ItemFieldsEditor.js +308 -0
- package/dist/features/preview/components/LinkFieldEditor.d.ts +8 -0
- package/dist/features/preview/components/LinkFieldEditor.d.ts.map +1 -0
- package/dist/features/preview/components/LinkFieldEditor.js +190 -0
- package/dist/features/preview/components/MultipleAssetFieldEditor.d.ts +10 -0
- package/dist/features/preview/components/MultipleAssetFieldEditor.d.ts.map +1 -0
- package/dist/features/preview/components/MultipleAssetFieldEditor.js +232 -0
- package/dist/features/preview/components/OverlayTracker.d.ts +6 -0
- package/dist/features/preview/components/OverlayTracker.d.ts.map +1 -0
- package/dist/features/preview/components/OverlayTracker.js +41 -0
- package/dist/features/preview/components/Overlays.d.ts +6 -0
- package/dist/features/preview/components/Overlays.d.ts.map +1 -0
- package/dist/features/preview/components/Overlays.js +58 -0
- package/dist/features/preview/components/PageContentSheet.d.ts +3 -0
- package/dist/features/preview/components/PageContentSheet.d.ts.map +1 -0
- package/dist/features/preview/components/PageContentSheet.js +492 -0
- package/dist/features/preview/components/PageLocationFieldset.d.ts +14 -0
- package/dist/features/preview/components/PageLocationFieldset.d.ts.map +1 -0
- package/dist/features/preview/components/PageLocationFieldset.js +77 -0
- package/dist/features/preview/components/PagePicker.d.ts +3 -0
- package/dist/features/preview/components/PagePicker.d.ts.map +1 -0
- package/dist/features/preview/components/PagePicker.js +185 -0
- package/dist/features/preview/components/PageTree.d.ts +3 -0
- package/dist/features/preview/components/PageTree.d.ts.map +1 -0
- package/dist/features/preview/components/PageTree.js +410 -0
- package/dist/features/preview/components/PeekedBlock.d.ts +6 -0
- package/dist/features/preview/components/PeekedBlock.d.ts.map +1 -0
- package/dist/features/preview/components/PeekedBlock.js +95 -0
- package/dist/features/preview/components/PreviewPanel.d.ts +12 -0
- package/dist/features/preview/components/PreviewPanel.d.ts.map +1 -0
- package/dist/features/preview/components/PreviewPanel.js +192 -0
- package/dist/features/preview/components/PreviewSideSheet.d.ts +13 -0
- package/dist/features/preview/components/PreviewSideSheet.d.ts.map +1 -0
- package/dist/features/preview/components/PreviewSideSheet.js +28 -0
- package/dist/features/preview/components/PreviewToolbar.d.ts +2 -0
- package/dist/features/preview/components/PreviewToolbar.d.ts.map +1 -0
- package/dist/features/preview/components/PreviewToolbar.js +79 -0
- package/dist/features/preview/components/RepeatableItemsList.d.ts +14 -0
- package/dist/features/preview/components/RepeatableItemsList.d.ts.map +1 -0
- package/dist/features/preview/components/RepeatableItemsList.js +366 -0
- package/dist/features/preview/components/ShikiMarkdown.d.ts +4 -0
- package/dist/features/preview/components/ShikiMarkdown.d.ts.map +1 -0
- package/dist/features/preview/components/ShikiMarkdown.js +37 -0
- package/dist/features/preview/components/TextFormatToolbar.d.ts +2 -0
- package/dist/features/preview/components/TextFormatToolbar.d.ts.map +1 -0
- package/dist/features/preview/components/TextFormatToolbar.js +73 -0
- package/dist/features/preview/components/UnlinkAssetButton.d.ts +9 -0
- package/dist/features/preview/components/UnlinkAssetButton.d.ts.map +1 -0
- package/dist/features/preview/components/UnlinkAssetButton.js +55 -0
- package/dist/features/preview/overlayConstants.d.ts +19 -0
- package/dist/features/preview/overlayConstants.d.ts.map +1 -0
- package/dist/features/preview/overlayConstants.js +21 -0
- package/dist/features/preview/overlayMessages.d.ts +62 -0
- package/dist/features/preview/overlayMessages.d.ts.map +1 -0
- package/dist/features/preview/overlayMessages.js +9 -0
- package/dist/features/preview/previewConstants.d.ts +2 -0
- package/dist/features/preview/previewConstants.d.ts.map +1 -0
- package/dist/features/preview/previewStore.d.ts +116 -0
- package/dist/features/preview/previewStore.d.ts.map +1 -0
- package/dist/features/preview/previewStore.js +321 -0
- package/dist/features/provider/CamoxProvider.d.ts +11 -0
- package/dist/features/provider/CamoxProvider.d.ts.map +1 -0
- package/dist/features/provider/CamoxProvider.js +73 -0
- package/dist/features/provider/actionsStore.d.ts +39 -0
- package/dist/features/provider/actionsStore.d.ts.map +1 -0
- package/dist/features/provider/actionsStore.js +35 -0
- package/dist/features/provider/components/CamoxAppContext.d.ts +371 -0
- package/dist/features/provider/components/CamoxAppContext.d.ts.map +1 -0
- package/dist/features/provider/components/CamoxAppContext.js +17 -0
- package/dist/features/provider/components/CommandPalette.d.ts +3 -0
- package/dist/features/provider/components/CommandPalette.d.ts.map +1 -0
- package/dist/features/provider/components/CommandPalette.js +127 -0
- package/dist/features/provider/useAdminShortcuts.d.ts +5 -0
- package/dist/features/provider/useAdminShortcuts.d.ts.map +1 -0
- package/dist/features/provider/useAdminShortcuts.js +83 -0
- package/dist/features/routes/ogRoute.d.ts +7 -0
- package/dist/features/routes/ogRoute.d.ts.map +1 -0
- package/dist/features/routes/ogRoute.js +19 -0
- package/dist/features/routes/pageRoute.d.ts +135 -0
- package/dist/features/routes/pageRoute.d.ts.map +1 -0
- package/dist/features/routes/pageRoute.js +112 -0
- package/dist/features/studio/CamoxStudio.d.ts +7 -0
- package/dist/features/studio/CamoxStudio.d.ts.map +1 -0
- package/dist/features/studio/CamoxStudio.js +24 -0
- package/dist/features/studio/components/Navbar.d.ts +4 -0
- package/dist/features/studio/components/Navbar.d.ts.map +1 -0
- package/dist/features/studio/components/Navbar.js +95 -0
- package/dist/features/studio/components/ProjectMenu.d.ts +2 -0
- package/dist/features/studio/components/ProjectMenu.d.ts.map +1 -0
- package/dist/features/studio/components/ProjectMenu.js +132 -0
- package/dist/features/studio/components/UserButton.d.ts +2 -0
- package/dist/features/studio/components/UserButton.d.ts.map +1 -0
- package/dist/features/studio/components/UserButton.js +96 -0
- package/dist/features/studio/studioStore.d.ts +17 -0
- package/dist/features/studio/studioStore.d.ts.map +1 -0
- package/dist/features/studio/studioStore.js +44 -0
- package/dist/features/studio/useTheme.d.ts +9 -0
- package/dist/features/studio/useTheme.d.ts.map +1 -0
- package/dist/features/studio/useTheme.js +98 -0
- package/dist/features/vite/appGeneration.d.ts +4 -0
- package/dist/features/vite/appGeneration.d.ts.map +1 -0
- package/dist/features/vite/appGeneration.js +67 -0
- package/dist/features/vite/blockBoilerplate.d.ts +3 -0
- package/dist/features/vite/blockBoilerplate.d.ts.map +1 -0
- package/dist/features/vite/blockBoilerplate.js +59 -0
- package/dist/features/vite/convexSync.d.ts +6 -0
- package/dist/features/vite/convexSync.d.ts.map +1 -0
- package/dist/features/vite/convexSync.js +98 -0
- package/dist/features/vite/definitionsSync.d.ts +11 -0
- package/dist/features/vite/definitionsSync.d.ts.map +1 -0
- package/dist/features/vite/definitionsSync.js +157 -0
- package/dist/features/vite/routeGeneration.d.ts +4 -0
- package/dist/features/vite/routeGeneration.d.ts.map +1 -0
- package/dist/features/vite/routeGeneration.js +194 -0
- package/dist/features/vite/skillGeneration.d.ts +4 -0
- package/dist/features/vite/skillGeneration.d.ts.map +1 -0
- package/dist/features/vite/skillGeneration.js +69 -0
- package/dist/features/vite/utils.d.ts +2 -0
- package/dist/features/vite/utils.d.ts.map +1 -0
- package/dist/features/vite/utils.js +10 -0
- package/dist/features/vite/vite.d.ts +18 -0
- package/dist/features/vite/vite.d.ts.map +1 -0
- package/dist/features/vite/vite.js +77 -0
- package/dist/hooks/use-file-upload.d.ts +22 -0
- package/dist/hooks/use-file-upload.d.ts.map +1 -0
- package/dist/hooks/use-marquee-selection.d.ts +17 -0
- package/dist/hooks/use-marquee-selection.d.ts.map +1 -0
- package/dist/lib/analytics-client.d.ts +3 -0
- package/dist/lib/analytics-client.d.ts.map +1 -0
- package/dist/lib/analytics.d.ts +3 -0
- package/dist/lib/analytics.d.ts.map +1 -0
- package/dist/lib/analytics.js +24 -0
- package/dist/lib/auth.d.ts +3683 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/convex-site.d.ts +3 -0
- package/dist/lib/convex-site.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +40 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/studio.css +2 -0
- package/package.json +123 -10
- package/server/api.d.ts +1 -0
- package/server/api.js +1 -0
- package/server/dataModel.d.ts +1 -0
- package/server/dataModel.js +1 -0
- package/skills/camox-block/SKILL.md +357 -0
- package/skills/camox-layout/SKILL.md +181 -0
- 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 @@
|
|
|
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,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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 };
|