diff --git a/electron/servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/PresentationCard.tsx b/electron/servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/PresentationCard.tsx
index 24e1d9d1..3da715e3 100644
--- a/electron/servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/PresentationCard.tsx
+++ b/electron/servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/PresentationCard.tsx
@@ -1,5 +1,5 @@
'use client'
-import React from "react";
+import React, { useEffect } from "react";
import { Card } from "@/components/ui/card";
import { DashboardApi } from "@/app/(presentation-generator)/services/api/dashboard";
@@ -12,7 +12,7 @@ import {
import { useRouter } from "next/navigation";
import { toast } from "sonner";
-import { useFontLoader } from "@/app/(presentation-generator)/hooks/useFontLoader";
+import { useFontLoader } from "@/app/(presentation-generator)/hooks/useFontLoad";
import SlideScale from "@/app/(presentation-generator)/components/PresentationRender";
import MarkdownRenderer from "@/components/MarkDownRender";
@@ -28,11 +28,52 @@ export const PresentationCard = ({
onDeleted?: (presentationId: string) => void;
}) => {
const router = useRouter();
- useFontLoader(presentation.fonts || []);
+
const handlePreview = (e: React.MouseEvent) => {
e.preventDefault();
router.push(`/presentation?id=${id}&type=standard`);
};
+ useEffect(() => {
+ applyTheme(presentation.theme)
+ }, [])
+ const applyTheme = async (theme: any) => {
+ const element = document.getElementById(`dashboard-presentation-card-${id}`)
+ if (!element) return;
+
+ if (!theme || !theme.data || !theme.data.colors['graph_0']) { return; }
+ const cssVariables = {
+ '--primary-color': theme.data.colors['primary'],
+ '--background-color': theme.data.colors['background'],
+ '--card-color': theme.data.colors['card'],
+ '--stroke': theme.data.colors['stroke'],
+ '--primary-text': theme.data.colors['primary_text'],
+ '--background-text': theme.data.colors['background_text'],
+ '--graph-0': theme.data.colors['graph_0'],
+ '--graph-1': theme.data.colors['graph_1'],
+ '--graph-2': theme.data.colors['graph_2'],
+ '--graph-3': theme.data.colors['graph_3'],
+ '--graph-4': theme.data.colors['graph_4'],
+ '--graph-5': theme.data.colors['graph_5'],
+ '--graph-6': theme.data.colors['graph_6'],
+ '--graph-7': theme.data.colors['graph_7'],
+ '--graph-8': theme.data.colors['graph_8'],
+ '--graph-9': theme.data.colors['graph_9'],
+ }
+ Object.entries(cssVariables).forEach(([key, value]) => {
+ element.style.setProperty(key, value)
+ })
+ //
+ if (theme.data.fonts.textFont.url && theme.data.fonts.textFont.name) {
+ useFontLoader({ [theme.data.fonts.textFont.name]: theme.data.fonts.textFont.url })
+ }
+
+ // Apply fonts to preview container
+ element.style.setProperty('font-family', `"${theme.data.fonts.textFont.name}"`)
+ element.style.setProperty('--heading-font-family', `"${theme.data.fonts.textFont.name}"`)
+ element.style.setProperty('--body-font-family', `"${theme.data.fonts.textFont.name}"`)
+
+
+ }
const handleDelete = async (e: React.MouseEvent) => {
e.preventDefault();
@@ -59,7 +100,9 @@ export const PresentationCard = ({
onClick={handlePreview}
className="bg-[#F8FBFB] font-syne shadow-none sm:shadow-none presentation-card rounded-[12px] p-0 group hover:shadow-md transition-all duration-500 slide-theme cursor-pointer overflow-hidden flex flex-col"
>
-
+
{/*
{presentation.type}
diff --git a/electron/servers/nextjs/app/(presentation-generator)/components/EditableLayoutWrapper.tsx b/electron/servers/nextjs/app/(presentation-generator)/components/EditableLayoutWrapper.tsx
index 5065d91f..d4db580f 100644
--- a/electron/servers/nextjs/app/(presentation-generator)/components/EditableLayoutWrapper.tsx
+++ b/electron/servers/nextjs/app/(presentation-generator)/components/EditableLayoutWrapper.tsx
@@ -12,7 +12,7 @@ interface EditableLayoutWrapperProps {
slideData: any;
isEditMode?: boolean;
properties?: any;
-
+
}
interface EditableElement {
@@ -29,7 +29,7 @@ const EditableLayoutWrapper: React.FC = ({
slideIndex,
slideData,
properties,
-
+
}) => {
const dispatch = useDispatch();
const containerRef = useRef(null);
@@ -245,7 +245,7 @@ const EditableLayoutWrapper: React.FC = ({
}
}
});
-
+
// Process SVG icons
svgElements.forEach((svg, index) => {
const svgEl = svg as SVGElement;
diff --git a/electron/servers/nextjs/app/(presentation-generator)/components/ImageEditor.tsx b/electron/servers/nextjs/app/(presentation-generator)/components/ImageEditor.tsx
index ae452f27..65eae752 100644
--- a/electron/servers/nextjs/app/(presentation-generator)/components/ImageEditor.tsx
+++ b/electron/servers/nextjs/app/(presentation-generator)/components/ImageEditor.tsx
@@ -67,7 +67,7 @@ const ImageEditor = ({
(properties &&
properties[imageIdx] &&
properties[imageIdx].initialObjectFit) ||
- "cover"
+ "cover"
);
// Refs
@@ -104,7 +104,7 @@ const ImageEditor = ({
console.error("error in getting previous generated images", error);
setError(
error.message ||
- "Failed to get previous generated images. Please try again."
+ "Failed to get previous generated images. Please try again."
);
}
};
@@ -233,7 +233,7 @@ const ImageEditor = ({
trackEvent(MixpanelEvent.ImageEditor_UploadImage_API_Call);
const result = await ImagesApi.uploadImage(file);
setUploadedImageUrl(result.file_url || result.path);
- } catch (err:any) {
+ } catch (err: any) {
setUploadError("Failed to upload image. Please try again.");
toast.error(err.message || "Failed to upload image. Please try again.");
console.log("Upload error:", err.message);
@@ -247,7 +247,7 @@ const ImageEditor = ({
setUploadedImagesLoading(true);
const result = await ImagesApi.getUploadedImages();
setUploadedImages(result);
- } catch (err:any) {
+ } catch (err: any) {
toast.error(err.message || "Failed to get uploaded images. Please try again.");
console.log("Get uploaded images error:", err.message);
} finally {
@@ -265,7 +265,7 @@ const ImageEditor = ({
const result = await ImagesApi.deleteImage(image_id);
setUploadedImages(uploadedImages.filter((image) => image.id !== image_id));
toast.success(result.message || "Image deleted successfully");
- } catch (err:any) {
+ } catch (err: any) {
toast.error(err.message || "Failed to delete image. Please try again.");
}
};
@@ -480,12 +480,12 @@ const ImageEditor = ({
}
className="cursor-pointer group aspect-[4/3] rounded-lg overflow-hidden relative border border-gray-200"
>
- {
+ {
e.stopPropagation();
handleDeleteImage(image.id)
- }}/>
+ }} />
@@ -496,7 +496,7 @@ const ImageEditor = ({
-
+
))
)}
@@ -578,7 +578,7 @@ const ImageEditor = ({
variant="outline"
className={cn(
objectFit === "cover" &&
- "bg-blue-50 border-blue-500"
+ "bg-blue-50 border-blue-500"
)}
onClick={() => handleFitChange("cover")}
>
@@ -588,7 +588,7 @@ const ImageEditor = ({
variant="outline"
className={cn(
objectFit === "contain" &&
- "bg-blue-50 border-blue-500"
+ "bg-blue-50 border-blue-500"
)}
onClick={() => handleFitChange("contain")}
>
@@ -607,7 +607,7 @@ const ImageEditor = ({