- Please add "GOOGLE_API_KEY" to enable template creation via AI.
+ Please add "GOOGLE_API_KEY" to enable template creation via AI.
Please add your OpenAI API Key to process the layout
diff --git a/servers/nextjs/app/(presentation-generator)/custom-template/components/LoadingSpinner.tsx b/servers/nextjs/app/(presentation-generator)/custom-template/components/LoadingSpinner.tsx
index e379f73f..1e23494b 100644
--- a/servers/nextjs/app/(presentation-generator)/custom-template/components/LoadingSpinner.tsx
+++ b/servers/nextjs/app/(presentation-generator)/custom-template/components/LoadingSpinner.tsx
@@ -1,6 +1,6 @@
import React from "react";
import { Loader2 } from "lucide-react";
-import Header from "@/app/(presentation-generator)/dashboard/components/Header";
+import Header from "@/app/(presentation-generator)/(dashboard)/dashboard/components/Header";
interface LoadingSpinnerProps {
message: string;
diff --git a/servers/nextjs/app/(presentation-generator)/custom-template/page.tsx b/servers/nextjs/app/(presentation-generator)/custom-template/page.tsx
index cd355765..2cc41b71 100644
--- a/servers/nextjs/app/(presentation-generator)/custom-template/page.tsx
+++ b/servers/nextjs/app/(presentation-generator)/custom-template/page.tsx
@@ -2,7 +2,7 @@
import React, { useEffect } from "react";
import FontManager from "./components/FontManager";
-import Header from "../dashboard/components/Header";
+import Header from "../(dashboard)/dashboard/components/Header";
import { useCustomLayout } from "./hooks/useCustomLayout";
import { useFontManagement } from "./hooks/useFontManagement";
diff --git a/servers/nextjs/app/(presentation-generator)/dashboard/components/DashboardPage.tsx b/servers/nextjs/app/(presentation-generator)/dashboard/components/DashboardPage.tsx
deleted file mode 100644
index c7ad86dd..00000000
--- a/servers/nextjs/app/(presentation-generator)/dashboard/components/DashboardPage.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-"use client";
-
-import React, { useState, useEffect } from "react";
-
-import Wrapper from "@/components/Wrapper";
-import { DashboardApi } from "@/app/(presentation-generator)/services/api/dashboard";
-import { PresentationGrid } from "@/app/(presentation-generator)/dashboard/components/PresentationGrid";
-
-
-import Header from "@/app/(presentation-generator)/dashboard/components/Header";
-
-const DashboardPage: React.FC = () => {
- const [presentations, setPresentations] = useState(null);
- const [isLoading, setIsLoading] = useState(true);
- const [error, setError] = useState(null);
-
- useEffect(() => {
- const loadData = async () => {
- await fetchPresentations();
- };
- loadData();
- }, []);
-
- const fetchPresentations = async () => {
- try {
- setIsLoading(true);
- setError(null);
- const data = await DashboardApi.getPresentations();
- data.sort(
- (a: any, b: any) =>
- new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime()
- );
- setPresentations(data);
- } catch (err) {
- setError(null);
- setPresentations([]);
- } finally {
- setIsLoading(false);
- }
- };
-
- const removePresentation = (presentationId: string) => {
- setPresentations((prev: any) =>
- prev ? prev.filter((p: any) => p.id !== presentationId) : []
- );
- };
-
- return (
-
-
-
-
-
-
- Slide Presentation
-
-
-
-
-
-
- );
-};
-
-export default DashboardPage;
diff --git a/servers/nextjs/app/(presentation-generator)/dashboard/components/Header.tsx b/servers/nextjs/app/(presentation-generator)/dashboard/components/Header.tsx
deleted file mode 100644
index 4e8895a1..00000000
--- a/servers/nextjs/app/(presentation-generator)/dashboard/components/Header.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-"use client";
-
-import Wrapper from "@/components/Wrapper";
-import React from "react";
-import Link from "next/link";
-import BackBtn from "@/components/BackBtn";
-import { usePathname } from "next/navigation";
-import HeaderNav from "@/app/(presentation-generator)/components/HeaderNab";
-import { Layout, FilePlus2 } from "lucide-react";
-import { trackEvent, MixpanelEvent } from "@/utils/mixpanel";
-const Header = () => {
- const pathname = usePathname();
- return (
-
-
-
-
- {(pathname !== "/upload" && pathname !== "/dashboard") &&
}
-
trackEvent(MixpanelEvent.Navigation, { from: pathname, to: "/dashboard" })}>
-

-
-
-
- trackEvent(MixpanelEvent.Navigation, { from: pathname, to: "/custom-template" })}
- className="flex items-center gap-2 px-3 py-2 text-white hover:bg-primary/80 rounded-md transition-colors outline-none"
- role="menuitem"
- >
-
- Create Template
-
- trackEvent(MixpanelEvent.Navigation, { from: pathname, to: "/template-preview" })}
- className="flex items-center gap-2 px-3 py-2 text-white hover:bg-primary/80 rounded-md transition-colors outline-none"
- role="menuitem"
- >
-
- Templates
-
-
-
-
-
-
- );
-};
-
-export default Header;
diff --git a/servers/nextjs/app/(presentation-generator)/dashboard/components/PresentationCard.tsx b/servers/nextjs/app/(presentation-generator)/dashboard/components/PresentationCard.tsx
deleted file mode 100644
index 588f61dd..00000000
--- a/servers/nextjs/app/(presentation-generator)/dashboard/components/PresentationCard.tsx
+++ /dev/null
@@ -1,120 +0,0 @@
-import React, { useMemo } from "react";
-
-import { Card } from "@/components/ui/card";
-import { DashboardApi } from "@/app/(presentation-generator)/services/api/dashboard";
-import { DotsVerticalIcon, TrashIcon } from "@radix-ui/react-icons";
-import {
- Popover,
- PopoverTrigger,
- PopoverContent,
-} from "@/components/ui/popover";
-import { useRouter } from "next/navigation";
-import { toast } from "sonner";
-import SlideScale from "../../components/PresentationRender";
-
-export const PresentationCard = ({
- id,
- title,
- created_at,
- slide,
- onDeleted
-}: {
- id: string;
- title: string;
- created_at: string;
- slide: any;
- onDeleted?: (presentationId: string) => void;
-}) => {
- const router = useRouter();
-
-
-
-
- const handlePreview = (e: React.MouseEvent) => {
- e.preventDefault();
- router.push(`/presentation?id=${id}`);
- };
-
- const handleDelete = async (e: React.MouseEvent) => {
- e.preventDefault();
- e.stopPropagation();
-
-
- const response = await DashboardApi.deletePresentation(id);
-
- if (response) {
- toast.success("Presentation deleted", {
- description: "The presentation has been deleted successfully",
- });
- if (onDeleted) {
- onDeleted(id);
- }
- } else {
- toast.error("Error deleting presentation");
- }
- };
- return (
-
-
- {/* Date */}
-
-
- {new Date(created_at).toLocaleDateString()}
-
-
- e.stopPropagation()}>
-
-
-
-
-
-
-
-
-
-
-
-
-
- {/* Icon and Title */}
-
-
-
- );
-};
diff --git a/servers/nextjs/app/(presentation-generator)/dashboard/loading.tsx b/servers/nextjs/app/(presentation-generator)/dashboard/loading.tsx
deleted file mode 100644
index d3350f27..00000000
--- a/servers/nextjs/app/(presentation-generator)/dashboard/loading.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { Skeleton } from '@/components/ui/skeleton'
-import React from 'react'
-import Header from './components/Header'
-import Wrapper from '@/components/Wrapper'
-
-const loading = () => {
- return (
-
-
-
-
-
-
- Slide Presentation
-
-
- {
- Array.from({ length: 8 }).map((_, index) => (
-
- ))
- }
-
-
-
-
- )
-}
-
-export default loading
\ No newline at end of file
diff --git a/servers/nextjs/app/(presentation-generator)/documents-preview/components/DocumentPreviewPage.tsx b/servers/nextjs/app/(presentation-generator)/documents-preview/components/DocumentPreviewPage.tsx
index 06d44619..edf2cad9 100644
--- a/servers/nextjs/app/(presentation-generator)/documents-preview/components/DocumentPreviewPage.tsx
+++ b/servers/nextjs/app/(presentation-generator)/documents-preview/components/DocumentPreviewPage.tsx
@@ -27,7 +27,7 @@ import MarkdownRenderer from "./MarkdownRenderer";
import { getIconFromFile } from "../../utils/others";
import { ChevronRight, PanelRightOpen, X } from "lucide-react";
import ToolTip from "@/components/ToolTip";
-import Header from "@/app/(presentation-generator)/dashboard/components/Header";
+import Header from "@/app/(presentation-generator)/(dashboard)/dashboard/components/Header";
import { trackEvent, MixpanelEvent } from "@/utils/mixpanel";
// Types
@@ -147,7 +147,7 @@ const DocumentsPreviewPage: React.FC = () => {
(fileItem: FileItem) => fileItem.file_path
);
trackEvent(MixpanelEvent.DocumentsPreview_Create_Presentation_API_Call);
- const createResponse = await PresentationGenerationApi.createPresentation(
+ const createResponse = await PresentationGenerationApi.createPresentation(
{
content: config?.prompt ?? "",
n_slides: config?.slides ? parseInt(config.slides) : null,
@@ -240,9 +240,8 @@ const DocumentsPreviewPage: React.FC = () => {
updateSelectedDocument(key)}
- className={`${
- selectedDocument === key ? "border border-blue-500" : ""
- } flex p-2 rounded-sm gap-2 items-center cursor-pointer`}
+ className={`${selectedDocument === key ? "border border-blue-500" : ""
+ } flex p-2 rounded-sm gap-2 items-center cursor-pointer`}
>
![]()
void, selectedTemplate: string | null }) => {
- const { previewLayouts, loading: customLoading } = useCustomTemplatePreview(template.id);
+ const { previewLayouts, loading: customLoading, totalLayouts } = useCustomTemplatePreview(template.id);
const isSelected = selectedTemplate === template.id;
return (
+
{
- onSelectTemplate(template.id);
- }}
+ className={`${isSelected ? 'border-2 border-blue-500' : ''} cursor-pointer flex flex-col justify-between relative hover:shadow-lg transition-all duration-200 group overflow-hidden`}
+ onClick={() => onSelectTemplate(template.id)}
>
+
+
+
+ Layouts- {totalLayouts}
+
-
-
- {template.name}
-
-
-
-
-
{/* Layout previews */}
@@ -61,36 +56,37 @@ export const CustomTemplateCard = memo(({ template, onSelectTemplate, selectedTe
))
- ) : previewLayouts && previewLayouts?.length > 0 ? (
- // Actual layout previews - using memoized component
- previewLayouts?.slice(0, 4).map((layout: CompiledLayout, index: number) => (
-
- ))
- ) : (
- // Empty state placeholders
- [...Array(Math.min(4, template.layoutCount))].map((_, index) => (
-
- No preview
-
- ))
+ ) : previewLayouts.length > 0 && (
+ // Actual layout previews
+ previewLayouts.slice(0, 4).map((layout: CompiledLayout, index: number) => {
+ const LayoutComponent = layout.component;
+ return (
+
+ );
+ })
)}
- {isSelected && (
-
- Selected
-
- )}
+
+
+ {template.name}
+
+
+
+
);
});
diff --git a/servers/nextjs/app/(presentation-generator)/outline/components/GenerateButton.tsx b/servers/nextjs/app/(presentation-generator)/outline/components/GenerateButton.tsx
index 8fb71cec..d6322fa1 100644
--- a/servers/nextjs/app/(presentation-generator)/outline/components/GenerateButton.tsx
+++ b/servers/nextjs/app/(presentation-generator)/outline/components/GenerateButton.tsx
@@ -4,6 +4,10 @@ import { trackEvent, MixpanelEvent } from "@/utils/mixpanel";
import { Button } from "@/components/ui/button";
import { LoadingState, Template } from "../types/index";
import { TemplateLayoutsWithSettings } from "@/app/presentation-templates/utils";
+<<<<<<< feat/revamp_design
+import { ChevronRight } from "lucide-react";
+=======
+>>>>>>> main
interface GenerateButtonProps {
loadingState: LoadingState;
@@ -50,34 +54,14 @@ const GenerateButton: React.FC = ({
}
onSubmit();
}}
- className="bg-[#5146E5] w-full rounded-lg text-base sm:text-lg py-4 sm:py-6 font-instrument_sans font-semibold hover:bg-[#5146E5]/80 text-white disabled:opacity-50 disabled:cursor-not-allowed"
+ className=" w-full flex items-center gap-0.5 rounded-[58px] text-sm py-3 px-5 font-instrument_sans font-semibold text-[#101323] disabled:opacity-50 disabled:cursor-not-allowed"
+ style={{
+ background: "linear-gradient(270deg, #D5CAFC 2.4%, #E3D2EB 27.88%, #F4DCD3 69.23%, #FDE4C2 100%)",
+ }}
>
-
+
{getButtonText()}
+
);
};
diff --git a/servers/nextjs/app/(presentation-generator)/outline/components/OutlineContent.tsx b/servers/nextjs/app/(presentation-generator)/outline/components/OutlineContent.tsx
index 2d3c5d4f..cbc7c40f 100644
--- a/servers/nextjs/app/(presentation-generator)/outline/components/OutlineContent.tsx
+++ b/servers/nextjs/app/(presentation-generator)/outline/components/OutlineContent.tsx
@@ -91,41 +91,30 @@ const OutlineContent: React.FC = ({
)}
{/* Outlines content */}
+
{outlines && outlines.length > 0 && (
-
+
- {isStreaming ? (
-
- outlines.map((item, index) => (
- = 0 && index < highestActiveIndex}
- />
- ))
- ) :
- ({ id: `slide-${index}` })) || []}
+ `slide-${index}`)}
strategy={verticalListSortingStrategy}
>
- {outlines?.map((item, index) => (
+ {outlines.map((item, index) => (
= 0 && index < highestActiveIndex}
/>
))}
- }
+