From 655897d08201fe01c276fbacc1ed7cb65a665e12 Mon Sep 17 00:00:00 2001 From: Gautam25Raj Date: Mon, 22 Jun 2026 03:38:08 +0530 Subject: [PATCH 1/3] feat: add TemplateDesignNote component for design taste notes refactor: restructure TemplateDetailCards component for clarity and export feat: create TemplateDetailContainer to manage template details and developer mode refactor: update TemplateDetailHero for improved accessibility and styling feat: implement TemplateFullSystemSpec for detailed technical specifications refactor: enhance TemplatePreviewSection with improved layout and links refactor: update TemplateStyleGuide for better organization and styling feat: add TemplatesNavigation component with theme toggle functionality fix: improve portfolio parsing logic for section settings fix: enhance billing service error handling and metadata structure --- .../app/preview/[documentId]/page.tsx | 2 +- .../app/templates/[id]/preview/page.tsx | 14 +- .../components/PortfolioPublicFooter.tsx | 2 +- .../dashboard/editor/SectionEditor.tsx | 24 ++ .../components/landing/CtaSection.tsx | 4 +- .../components/landing/FaqSection.tsx | 2 +- .../components/landing/FeatureGridSection.tsx | 26 +- .../components/landing/HeroPortfolio.tsx | 18 +- .../components/landing/HeroSection.tsx | 6 +- .../components/landing/SeoSection.tsx | 4 +- .../landing/TemplateLinksSection.tsx | 8 +- .../components/pricing/ComparisonTable.tsx | 8 +- .../components/SharedTemplateFeatures.tsx | 48 ++- .../templates/components/TemplateBenefits.tsx | 9 +- .../templates/components/TemplateBestFit.tsx | 21 +- .../templates/components/TemplateCatalog.tsx | 6 +- .../templates/components/TemplateCta.tsx | 12 +- .../components/TemplateDesignNote.tsx | 47 +++ .../components/TemplateDetailCards.tsx | 42 +- .../components/TemplateDetailContainer.tsx | 141 +++++++ .../components/TemplateDetailHero.tsx | 17 +- .../components/TemplateFullSystemSpec.tsx | 379 ++++++++++++++++++ .../components/TemplatePreviewSection.tsx | 28 +- .../components/TemplateStyleGuide.tsx | 43 +- .../components/TemplatesNavigation.tsx | 28 +- apps/portfolio/lib/portfolio.ts | 3 +- apps/server/src/services/billingService.ts | 16 +- 27 files changed, 808 insertions(+), 150 deletions(-) create mode 100644 apps/portfolio/features/templates/components/TemplateDesignNote.tsx create mode 100644 apps/portfolio/features/templates/components/TemplateDetailContainer.tsx create mode 100644 apps/portfolio/features/templates/components/TemplateFullSystemSpec.tsx diff --git a/apps/portfolio/app/preview/[documentId]/page.tsx b/apps/portfolio/app/preview/[documentId]/page.tsx index 9176a2b5..127bd7a3 100644 --- a/apps/portfolio/app/preview/[documentId]/page.tsx +++ b/apps/portfolio/app/preview/[documentId]/page.tsx @@ -35,7 +35,7 @@ export async function generateMetadata({ // Fail silently } return { - title: "Private Portfolio Preview | VeriWorkly", + title: "Private Portfolio Preview", robots: { index: false, follow: false }, }; } diff --git a/apps/portfolio/app/templates/[id]/preview/page.tsx b/apps/portfolio/app/templates/[id]/preview/page.tsx index c9c9ec2d..8a2b474a 100644 --- a/apps/portfolio/app/templates/[id]/preview/page.tsx +++ b/apps/portfolio/app/templates/[id]/preview/page.tsx @@ -1,6 +1,8 @@ -import { notFound } from "next/navigation"; import type { Metadata } from "next"; +import { notFound } from "next/navigation"; + import { DraftPreview } from "@/components/DraftPreview"; + import { isTemplateId, templates } from "@/templates/catalog/templates"; export async function generateMetadata({ @@ -9,16 +11,16 @@ export async function generateMetadata({ params: Promise<{ id: string }>; }): Promise { const { id } = await params; + const template = templates.find((t) => t.id === id); - if (!template) { + if (!template) return { - title: "Template Preview | VeriWorkly", + title: "Template Preview", robots: { index: true, follow: true }, }; - } - const title = `${template.name} Template Live Preview | VeriWorkly`; + const title = `${template.name} Template Live Preview`; const description = `See a live interactive preview of the ${template.name} template. Switch styles, layouts, and visualize your portfolio.`; const imageUrl = `/og/templates/preview/${template.id}-preview-page-og.png`; @@ -59,6 +61,8 @@ export async function generateMetadata({ export default async function Preview({ params }: { params: Promise<{ id: string }> }) { const { id } = await params; + if (!isTemplateId(id)) notFound(); + return ; } diff --git a/apps/portfolio/components/PortfolioPublicFooter.tsx b/apps/portfolio/components/PortfolioPublicFooter.tsx index 5a7b7d48..e29f31c0 100644 --- a/apps/portfolio/components/PortfolioPublicFooter.tsx +++ b/apps/portfolio/components/PortfolioPublicFooter.tsx @@ -32,7 +32,7 @@ const products = [ const PortfolioPublicFooter = () => { return ( -