diff --git a/servers/fastapi/api/v1/ppt/endpoints/presentation.py b/servers/fastapi/api/v1/ppt/endpoints/presentation.py index 2bcf9a8..f5f7184 100644 --- a/servers/fastapi/api/v1/ppt/endpoints/presentation.py +++ b/servers/fastapi/api/v1/ppt/endpoints/presentation.py @@ -1,5 +1,6 @@ import asyncio import colorsys +from copy import deepcopy from datetime import datetime import hashlib import json @@ -141,10 +142,10 @@ def _build_theme_payload_from_palette(color_palette, description: str) -> dict: def _fallback_ai_colors_from_topic(topic: str) -> dict: - """Create a deterministic, topic-seeded base palette without domain-specific hardcoding.""" + """Create a topic-aware fallback palette with slight variation across runs.""" seed = hashlib.sha256((topic or "presentation").strip().lower().encode("utf-8")).digest() - hue = (seed[0] / 255.0) - dark_mode = (seed[1] % 2) == 0 + hue = ((seed[0] / 255.0) + random.SystemRandom().uniform(-0.06, 0.06)) % 1.0 + dark_mode = (seed[1] % 2) == 0 if random.SystemRandom().random() > 0.25 else not ((seed[1] % 2) == 0) primary = _to_hex_from_rgb(colorsys.hls_to_rgb(hue, 0.46, 0.62)) accent_1 = _to_hex_from_rgb(colorsys.hls_to_rgb((hue + 0.08) % 1.0, 0.56, 0.52)) @@ -169,6 +170,53 @@ def _fallback_ai_colors_from_topic(topic: str) -> dict: } +async def _build_auto_theme_layout_model(topic: str) -> PresentationLayoutModel: + """Build a mixed layout model for auto-theme mode instead of forcing a single prebuilt group.""" + candidate_groups = [ + "neo-general", + "neo-modern", + "neo-standard", + "neo-swift", + "neo-brutalist", + "neo-brutalist-fancy", + "soft-bloom", + "velvet-haze", + *DEFAULT_TEMPLATES, + ] + + layouts_pool = [] + for group in candidate_groups: + try: + group_layout = await get_layout_by_name(group) + for slide in group_layout.slides: + slide_copy = deepcopy(slide) + slide_copy.id = f"auto-{group}:{slide.id}" + if slide_copy.description: + slide_copy.description = f"{slide_copy.description} (source: {group})" + else: + slide_copy.description = f"Auto-mixed layout (source: {group})" + layouts_pool.append(slide_copy) + except Exception: + # Ignore missing groups and continue building from available ones. + continue + + if not layouts_pool: + raise HTTPException(status_code=500, detail="No layouts available for auto-theme generation") + + random.SystemRandom().shuffle(layouts_pool) + + # Keep a rich but controlled pool to reduce repetition while avoiding over-complexity. + target_size = min(max(12, len(layouts_pool) // 3), 24) + mixed_slides = layouts_pool[:target_size] + + topic_hash = hashlib.sha256((topic or "presentation").encode("utf-8")).hexdigest()[:8] + return PresentationLayoutModel( + name=f"auto-theme-{topic_hash}-{uuid.uuid4().hex[:6]}", + ordered=False, + slides=mixed_slides, + ) + + @PRESENTATION_ROUTER.get("/all", response_model=List[PresentationWithSlides]) async def get_all_presentations(sql_session: AsyncSession = Depends(get_async_session)): presentations_with_slides = [] @@ -250,7 +298,10 @@ async def create_presentation( if auto_theme and not theme: # Generate dynamic theme from topic try: - ai_colors = await generate_theme_from_topic(content) + ai_colors = await generate_theme_from_topic( + content, + variation_seed=uuid.uuid4().hex[:8], + ) color_palette = generate_color_palette( ai_colors.get("primary"), ai_colors.get("background"), @@ -305,7 +356,8 @@ async def create_presentation( async def prepare_presentation( presentation_id: Annotated[uuid.UUID, Body()], outlines: Annotated[List[SlideOutlineModel], Body()], - layout: Annotated[PresentationLayoutModel, Body()], + layout: Annotated[Optional[PresentationLayoutModel], Body()] = None, + auto_theme: Annotated[bool, Body()] = False, title: Annotated[Optional[str], Body()] = None, sql_session: AsyncSession = Depends(get_async_session), ): @@ -318,6 +370,12 @@ async def prepare_presentation( presentation_outline_model = PresentationOutlineModel(slides=outlines) + if auto_theme: + layout = await _build_auto_theme_layout_model(presentation.content) + + if not layout: + raise HTTPException(status_code=400, detail="Layout is required") + total_slide_layouts = len(layout.slides) total_outlines = len(outlines) @@ -609,10 +667,8 @@ async def check_if_api_request_is_valid( detail="Number of slides must be greater than 0", ) - if request.auto_theme: - request.template = "neo-general" - # Checking if template is valid - elif request.template not in DEFAULT_TEMPLATES: + # Checking if template is valid (auto-theme builds a dynamic mixed layout) + if not request.auto_theme and request.template not in DEFAULT_TEMPLATES: request.template = request.template.lower() if not request.template.startswith("custom-"): raise HTTPException( @@ -641,6 +697,40 @@ async def generate_presentation_handler( ): try: using_slides_markdown = False + generated_theme = None + + if request.auto_theme: + try: + ai_colors = await generate_theme_from_topic( + request.content, + variation_seed=uuid.uuid4().hex[:8], + ) + color_palette = generate_color_palette( + ai_colors.get("primary"), + ai_colors.get("background"), + ai_colors.get("accent_1"), + ai_colors.get("accent_2"), + ai_colors.get("text_1"), + ai_colors.get("text_2"), + ) + generated_theme = _build_theme_payload_from_palette( + color_palette, + "Theme generated automatically from presentation topic", + ) + except Exception: + ai_colors = _fallback_ai_colors_from_topic(request.content) + color_palette = generate_color_palette( + ai_colors.get("primary"), + ai_colors.get("background"), + ai_colors.get("accent_1"), + ai_colors.get("accent_2"), + ai_colors.get("text_1"), + ai_colors.get("text_2"), + ) + generated_theme = _build_theme_payload_from_palette( + color_palette, + "Fallback AI theme generated from topic", + ) if request.slides_markdown: using_slides_markdown = True @@ -732,7 +822,11 @@ async def generate_presentation_handler( print(f"Generated {total_outlines} outlines for the presentation") # Parse Layouts - layout_model = await get_layout_by_name(request.template) + layout_model = ( + await _build_auto_theme_layout_model(request.content) + if request.auto_theme + else await get_layout_by_name(request.template) + ) total_slide_layouts = len(layout_model.slides) # Generate Structure @@ -804,6 +898,7 @@ async def generate_presentation_handler( outlines=presentation_outlines.model_dump(), layout=layout_model.model_dump(), structure=presentation_structure.model_dump(), + theme=generated_theme, tone=request.tone.value, verbosity=request.verbosity.value, instructions=request.instructions, diff --git a/servers/fastapi/api/v1/ppt/endpoints/theme_generate.py b/servers/fastapi/api/v1/ppt/endpoints/theme_generate.py index 846932f..f6bd25c 100644 --- a/servers/fastapi/api/v1/ppt/endpoints/theme_generate.py +++ b/servers/fastapi/api/v1/ppt/endpoints/theme_generate.py @@ -1,4 +1,5 @@ from typing import Optional +import uuid from fastapi import APIRouter, HTTPException from pydantic import BaseModel @@ -34,7 +35,11 @@ async def generate_theme_from_topic_endpoint( ) -> ThemeData: """Generate a theme color palette using AI based on the presentation topic.""" try: - ai_colors = await generate_theme_from_topic(request.topic, request.mood) + ai_colors = await generate_theme_from_topic( + request.topic, + request.mood, + variation_seed=uuid.uuid4().hex[:8], + ) except Exception: raise HTTPException( status_code=500, diff --git a/servers/fastapi/constants/presentation.py b/servers/fastapi/constants/presentation.py index 22d6b01..c0d2416 100644 --- a/servers/fastapi/constants/presentation.py +++ b/servers/fastapi/constants/presentation.py @@ -1 +1 @@ -DEFAULT_TEMPLATES = ["general", "modern", "standard", "swift"] +DEFAULT_TEMPLATES = ["general", "modern", "standard", "swift", "professional-pitch", "educational-science", "educational-social-science", "tech-ai-red"] diff --git a/servers/fastapi/utils/llm_calls/generate_theme_from_topic.py b/servers/fastapi/utils/llm_calls/generate_theme_from_topic.py index eb33be4..9c95b6a 100644 --- a/servers/fastapi/utils/llm_calls/generate_theme_from_topic.py +++ b/servers/fastapi/utils/llm_calls/generate_theme_from_topic.py @@ -41,11 +41,19 @@ def _get_theme_generation_messages( topic: str, mood: Optional[str] = None, + variation_seed: Optional[str] = None, ): mood_instruction = "" if mood: mood_instruction = f"\nThe user wants a '{mood}' mood/style for the theme." + variation_instruction = "" + if variation_seed: + variation_instruction = ( + "\nDesign a fresh variant for this request and avoid reusing your most common default palette patterns." + f"\nVariation token: {variation_seed}" + ) + return [ LLMSystemMessage( content=f"""You are a professional presentation designer and color theory expert. @@ -71,10 +79,12 @@ def _get_theme_generation_messages( - text_2 should contrast well against the primary color. 4. **Professionalism**: Avoid overly saturated or clashing colors. Aim for a polished, premium look. +4.1 **Restrained palette first**: Keep the visual system focused and calm by default (one dominant, one support, one accent). Avoid rainbow-like palettes unless explicitly requested. 5. **Background choice**: Default to light backgrounds (#F8FAFC to #FFFFFF range) unless the topic strongly suggests a dark theme (e.g., night photography, space, cybersecurity, gaming). 6. **Topic match priority**: Prioritize topic relevance over generic trendy palettes. If topic implies ocean/space/night, use blue-dark families first. {mood_instruction} +{variation_instruction} Return exactly 6 hex color values.""", ), @@ -87,6 +97,7 @@ def _get_theme_generation_messages( async def generate_theme_from_topic( topic: str, mood: Optional[str] = None, + variation_seed: Optional[str] = None, ) -> dict: """ Uses the LLM to generate a color palette based on the presentation topic. @@ -98,7 +109,7 @@ async def generate_theme_from_topic( try: response = await client.generate_structured( model=model, - messages=_get_theme_generation_messages(topic, mood), + messages=_get_theme_generation_messages(topic, mood, variation_seed), response_format=THEME_GENERATION_SCHEMA, strict=True, ) diff --git a/servers/nextjs/app/(presentation-generator)/outline/hooks/usePresentationGeneration.ts b/servers/nextjs/app/(presentation-generator)/outline/hooks/usePresentationGeneration.ts index 16b3497..94aef50 100644 --- a/servers/nextjs/app/(presentation-generator)/outline/hooks/usePresentationGeneration.ts +++ b/servers/nextjs/app/(presentation-generator)/outline/hooks/usePresentationGeneration.ts @@ -85,16 +85,18 @@ export const usePresentationGeneration = ( }); try { - const templateToUse = selectedTemplate ?? (isAutoTheme ? "general" : null); + const templateToUse = selectedTemplate ?? null; if (!templateToUse) { - setActiveTab(TABS.LAYOUTS); - return; + if (!isAutoTheme) { + setActiveTab(TABS.LAYOUTS); + return; + } } let layout; // Check if it's a custom template (string) - if (typeof templateToUse === 'string') { + if (templateToUse && typeof templateToUse === 'string') { const builtInTemplate = templates.find(t => t.id === templateToUse); if (builtInTemplate) { layout = { @@ -147,7 +149,7 @@ export const usePresentationGeneration = ( })) }; } - } else { + } else if (templateToUse) { // Built-in template layout = { name: templateToUse.id, @@ -167,6 +169,7 @@ export const usePresentationGeneration = ( presentation_id: presentationId, outlines: outlines, layout: layout, + auto_theme: isAutoTheme, }); if (response) { diff --git a/servers/nextjs/app/presentation-templates/educational-science/EduScienceComparisonLayout.tsx b/servers/nextjs/app/presentation-templates/educational-science/EduScienceComparisonLayout.tsx new file mode 100644 index 0000000..e0f1a55 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-science/EduScienceComparisonLayout.tsx @@ -0,0 +1,37 @@ +import React from "react"; +import * as z from "zod"; + +export const layoutId = "educational-science-comparison"; +export const layoutName = "Comparison Study"; +export const layoutDescription = "Text-priority comparison layout for contrasting two scientific ideas, models, or outcomes."; + +export const Schema = z.object({ + title: z.string().min(5).max(70).default("Mitosis vs Meiosis"), + leftTitle: z.string().min(3).max(30).default("Mitosis"), + rightTitle: z.string().min(3).max(30).default("Meiosis"), + leftPoints: z.array(z.string().min(6).max(90)).max(5).default(["One cell division", "Produces 2 identical cells", "Used for growth and repair"]), + rightPoints: z.array(z.string().min(6).max(90)).max(5).default(["Two cell divisions", "Produces 4 non-identical cells", "Used for gamete formation"]), + summary: z.string().min(20).max(180).default("Both processes are essential, but they serve different biological purposes in organisms."), +}); + +type SchemaType = z.infer; + +export default function EduScienceComparisonLayout({ data }: { data: Partial }) { + return ( +
+

{data.title}

+
+
+

{data.leftTitle}

+
    {(data.leftPoints ?? []).map((p, i) =>
  • • {p}
  • )}
+
+
+

{data.rightTitle}

+
    {(data.rightPoints ?? []).map((p, i) =>
  • • {p}
  • )}
+
+
+

{data.summary}

+
+ ); +} diff --git a/servers/nextjs/app/presentation-templates/educational-science/EduScienceConceptLayout.tsx b/servers/nextjs/app/presentation-templates/educational-science/EduScienceConceptLayout.tsx new file mode 100644 index 0000000..5cb3611 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-science/EduScienceConceptLayout.tsx @@ -0,0 +1,39 @@ +import React from "react"; +import * as z from "zod"; + +export const layoutId = "educational-science-concepts"; +export const layoutName = "Core Concepts"; +export const layoutDescription = "Text-heavy concept slide with structured explanation blocks and minimal decorative shapes."; + +export const Schema = z.object({ + title: z.string().min(5).max(70).default("Core Concepts of Photosynthesis"), + explanation: z.string().min(60).max(420).default("Photosynthesis is the process by which green plants convert light energy into chemical energy. Chlorophyll absorbs sunlight and helps create glucose from carbon dioxide and water."), + points: z.array(z.object({ heading: z.string().min(4).max(40), detail: z.string().min(20).max(140) })).max(6).default([ + { heading: "Input", detail: "Plants use sunlight, carbon dioxide, and water as input materials." }, + { heading: "Output", detail: "Glucose and oxygen are produced as outputs." }, + { heading: "Location", detail: "The process mainly takes place in chloroplasts." }, + ]), +}); + +type SchemaType = z.infer; + +export default function EduScienceConceptLayout({ data }: { data: Partial }) { + return ( +
+
+
+

{data.title}

+

{data.explanation}

+
+ {(data.points ?? []).map((p, i) => ( +
+

{p.heading}

+

{p.detail}

+
+ ))} +
+
+
+ ); +} diff --git a/servers/nextjs/app/presentation-templates/educational-science/EduScienceDataInsightsLayout.tsx b/servers/nextjs/app/presentation-templates/educational-science/EduScienceDataInsightsLayout.tsx new file mode 100644 index 0000000..736a6ab --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-science/EduScienceDataInsightsLayout.tsx @@ -0,0 +1,42 @@ +import React from "react"; +import * as z from "zod"; + +export const layoutId = "educational-science-data-insights"; +export const layoutName = "Data Insights"; +export const layoutDescription = "Education-focused data slide with concise chart-like bars and detailed explanatory notes."; + +export const Schema = z.object({ + title: z.string().min(5).max(70).default("Data Insights: Heat Transfer Rates"), + insight: z.string().min(30).max(220).default("Materials with higher thermal conductivity transfer heat faster under identical conditions."), + metrics: z.array(z.object({ label: z.string().min(3).max(25), value: z.string().min(1).max(10), note: z.string().min(10).max(90) })).max(5).default([ + { label: "Copper", value: "401", note: "Highest conductivity among tested materials." }, + { label: "Aluminum", value: "237", note: "Strong conduction with lower cost." }, + { label: "Steel", value: "50", note: "Moderate conductivity and structural strength." }, + ]), +}); + +type SchemaType = z.infer; + +export default function EduScienceDataInsightsLayout({ data }: { data: Partial }) { + const metrics = data.metrics ?? []; + const max = Math.max(...metrics.map((m) => Number(m.value) || 1), 1); + return ( +
+

{data.title}

+

{data.insight}

+
+ {metrics.map((m, i) => { + const width = `${Math.max(18, Math.round(((Number(m.value) || 1) / max) * 100))}%`; + return ( +
+

{m.label}

+
+

{m.note}

+
+ ); + })} +
+
+ ); +} diff --git a/servers/nextjs/app/presentation-templates/educational-science/EduScienceExperimentLayout.tsx b/servers/nextjs/app/presentation-templates/educational-science/EduScienceExperimentLayout.tsx new file mode 100644 index 0000000..dcc3b8f --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-science/EduScienceExperimentLayout.tsx @@ -0,0 +1,32 @@ +import React from "react"; +import * as z from "zod"; + +export const layoutId = "educational-science-experiment"; +export const layoutName = "Experiment Breakdown"; +export const layoutDescription = "Structured experiment slide highlighting hypothesis, method, observations, and conclusion in a clean format."; + +export const Schema = z.object({ + title: z.string().min(5).max(70).default("Experiment: Effects of Light on Plant Growth"), + hypothesis: z.string().min(20).max(180).default("Plants receiving more sunlight will show faster growth over the same period."), + method: z.string().min(40).max(260).default("Two groups of plants were placed in different light conditions and measured daily for two weeks."), + observations: z.string().min(40).max(260).default("The high-light group had consistently greater stem height and leaf size compared to the low-light group."), + conclusion: z.string().min(30).max(220).default("The data supports the hypothesis that light exposure significantly influences plant growth rate."), +}); + +type SchemaType = z.infer; + +export default function EduScienceExperimentLayout({ data }: { data: Partial }) { + return ( +
+
+

{data.title}

+
+

Hypothesis

{data.hypothesis}

+

Method

{data.method}

+

Observations

{data.observations}

+

Conclusion

{data.conclusion}

+
+
+ ); +} diff --git a/servers/nextjs/app/presentation-templates/educational-science/EduScienceFAQLayout.tsx b/servers/nextjs/app/presentation-templates/educational-science/EduScienceFAQLayout.tsx new file mode 100644 index 0000000..95dd4c8 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-science/EduScienceFAQLayout.tsx @@ -0,0 +1,33 @@ +import React from "react"; +import * as z from "zod"; + +export const layoutId = "educational-science-faq"; +export const layoutName = "Science Q&A"; +export const layoutDescription = "Question-and-answer slide for classroom-style explanations with text-first clarity."; + +export const Schema = z.object({ + title: z.string().min(5).max(70).default("Common Questions"), + faqs: z.array(z.object({ question: z.string().min(8).max(90), answer: z.string().min(20).max(180) })).max(5).default([ + { question: "Why does ice float on water?", answer: "Ice is less dense than liquid water because hydrogen bonds create an open crystalline structure." }, + { question: "What is acceleration?", answer: "Acceleration is the rate at which velocity changes over time, including speeding up, slowing down, or changing direction." }, + ]), +}); + +type SchemaType = z.infer; + +export default function EduScienceFAQLayout({ data }: { data: Partial }) { + return ( +
+

{data.title}

+
+ {(data.faqs ?? []).map((f, i) => ( +
+

Q{i + 1}. {f.question}

+

{f.answer}

+
+ ))} +
+
+ ); +} diff --git a/servers/nextjs/app/presentation-templates/educational-science/EduScienceGlossaryLayout.tsx b/servers/nextjs/app/presentation-templates/educational-science/EduScienceGlossaryLayout.tsx new file mode 100644 index 0000000..d089787 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-science/EduScienceGlossaryLayout.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import * as z from "zod"; + +export const layoutId = "educational-science-glossary"; +export const layoutName = "Glossary"; +export const layoutDescription = "Simple glossary layout for key science terms with concise definitions."; + +export const Schema = z.object({ + title: z.string().min(5).max(70).default("Key Terms"), + terms: z.array(z.object({ term: z.string().min(3).max(30), meaning: z.string().min(12).max(120) })).max(8).default([ + { term: "Atom", meaning: "The basic unit of matter composed of protons, neutrons, and electrons." }, + { term: "Molecule", meaning: "A group of atoms chemically bonded together." }, + { term: "Ecosystem", meaning: "A community of organisms interacting with their physical environment." }, + ]), +}); + +type SchemaType = z.infer; + +export default function EduScienceGlossaryLayout({ data }: { data: Partial }) { + return ( +
+

{data.title}

+
+ {(data.terms ?? []).map((t, i) => ( +
+

{t.term}

+

{t.meaning}

+
+ ))} +
+
+ ); +} diff --git a/servers/nextjs/app/presentation-templates/educational-science/EduScienceImageExplainerLayout.tsx b/servers/nextjs/app/presentation-templates/educational-science/EduScienceImageExplainerLayout.tsx new file mode 100644 index 0000000..bb458fa --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-science/EduScienceImageExplainerLayout.tsx @@ -0,0 +1,45 @@ +import React from "react"; +import * as z from "zod"; +import { ImageSchema } from "../defaultSchemes"; + +export const layoutId = "educational-science-image-explainer"; +export const layoutName = "Image Explainer"; +export const layoutDescription = "Clean explainer slide with one educational image and strong text explanation."; + +export const Schema = z.object({ + title: z.string().min(5).max(70).default("Human Heart: Structure and Function"), + explanation: z.string().min(40).max(320).default("The heart has four chambers and functions as a pump to circulate oxygen-rich and oxygen-poor blood through separate pathways."), + annotations: z.array(z.string().min(6).max(90)).max(4).default([ + "Atria receive blood", + "Ventricles pump blood", + "Valves prevent backflow", + ]), + image: ImageSchema.default({ + __image_url__: "https://images.unsplash.com/photo-1579154204601-01588f351e67?auto=format&fit=crop&w=900&q=80", + __image_prompt__: "diagram style science anatomy heart" + }), +}); + +type SchemaType = z.infer; + +export default function EduScienceImageExplainerLayout({ data }: { data: Partial }) { + return ( +
+

{data.title}

+
+
+ {data.image?.__image_url__ ? {data.image.__image_prompt__} : null} +
+
+

{data.explanation}

+
+ {(data.annotations ?? []).map((a, i) => ( +
{a}
+ ))} +
+
+
+
+ ); +} diff --git a/servers/nextjs/app/presentation-templates/educational-science/EduScienceIntroLayout.tsx b/servers/nextjs/app/presentation-templates/educational-science/EduScienceIntroLayout.tsx new file mode 100644 index 0000000..b64159f --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-science/EduScienceIntroLayout.tsx @@ -0,0 +1,48 @@ +import React from "react"; +import * as z from "zod"; + +export const layoutId = "educational-science-intro"; +export const layoutName = "Science Intro"; +export const layoutDescription = "Clean introductory science slide with text-first structure and subtle academic shapes."; + +export const Schema = z.object({ + title: z.string().min(5).max(70).default("Understanding Cell Division"), + subtitle: z.string().min(8).max(120).default("A simple guide to how new cells are formed"), + context: z.string().min(40).max(360).default("Cell division is essential for growth, repair, and reproduction. In this lesson, we will understand the key stages and why each stage matters in biological systems."), + objectives: z.array(z.string().min(6).max(80)).max(4).default([ + "Define mitosis and cytokinesis", + "Identify key stages in sequence", + "Explain why cell division is important", + ]), +}); + +type SchemaType = z.infer; + +export default function EduScienceIntroLayout({ data }: { data: Partial }) { + const objectives = data.objectives ?? []; + return ( +
+
+
+ +
+
+

Educational Science

+

{data.title}

+

{data.subtitle}

+
+ +

{data.context}

+ +
+ {objectives.map((item, idx) => ( +
+ {item} +
+ ))} +
+
+
+ ); +} diff --git a/servers/nextjs/app/presentation-templates/educational-science/EduScienceSummaryLayout.tsx b/servers/nextjs/app/presentation-templates/educational-science/EduScienceSummaryLayout.tsx new file mode 100644 index 0000000..db64630 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-science/EduScienceSummaryLayout.tsx @@ -0,0 +1,36 @@ +import React from "react"; +import * as z from "zod"; + +export const layoutId = "educational-science-summary"; +export const layoutName = "Lesson Summary"; +export const layoutDescription = "Clean summary slide for main takeaways and next learning steps with minimal visuals."; + +export const Schema = z.object({ + title: z.string().min(5).max(70).default("Lesson Summary"), + recap: z.string().min(30).max(220).default("Today we covered the main principles, observed key examples, and connected them to real-world applications."), + takeaways: z.array(z.string().min(8).max(100)).max(5).default([ + "Scientific models simplify complex systems", + "Evidence strengthens explanations", + "Variables must be controlled in experiments", + ]), + nextSteps: z.string().min(20).max(180).default("Next, apply these concepts in a practical activity and compare your observations with expected outcomes."), +}); + +type SchemaType = z.infer; + +export default function EduScienceSummaryLayout({ data }: { data: Partial }) { + return ( +
+
+

{data.title}

+

{data.recap}

+
+ {(data.takeaways ?? []).map((t, i) => ( +
{t}
+ ))} +
+

Next Step: {data.nextSteps}

+
+ ); +} diff --git a/servers/nextjs/app/presentation-templates/educational-science/EduScienceTimelineLayout.tsx b/servers/nextjs/app/presentation-templates/educational-science/EduScienceTimelineLayout.tsx new file mode 100644 index 0000000..b60e783 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-science/EduScienceTimelineLayout.tsx @@ -0,0 +1,41 @@ +import React from "react"; +import * as z from "zod"; + +export const layoutId = "educational-science-timeline"; +export const layoutName = "Scientific Process Timeline"; +export const layoutDescription = "Simple timeline to explain scientific process steps with emphasis on written explanation."; + +export const Schema = z.object({ + title: z.string().min(5).max(70).default("Scientific Method"), + intro: z.string().min(30).max(220).default("The scientific method is a repeatable process used to investigate questions and test ideas."), + stages: z.array(z.object({ step: z.string().min(3).max(30), detail: z.string().min(20).max(120) })).max(6).default([ + { step: "Observation", detail: "Notice a phenomenon and define a measurable question." }, + { step: "Hypothesis", detail: "Propose a testable explanation for the observation." }, + { step: "Experiment", detail: "Design and run tests while controlling variables." }, + { step: "Conclusion", detail: "Analyze data and accept, reject, or revise the hypothesis." }, + ]), +}); + +type SchemaType = z.infer; + +export default function EduScienceTimelineLayout({ data }: { data: Partial }) { + const stages = data.stages ?? []; + return ( +
+

{data.title}

+

{data.intro}

+
+ {stages.map((s, i) => ( +
+
{i + 1}
+
+

{s.step}

+

{s.detail}

+
+
+ ))} +
+
+ ); +} diff --git a/servers/nextjs/app/presentation-templates/educational-science/settings.json b/servers/nextjs/app/presentation-templates/educational-science/settings.json new file mode 100644 index 0000000..a2e7010 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-science/settings.json @@ -0,0 +1,5 @@ +{ + "description": "Educational Science: clean, beautiful, text-first layouts with subtle geometric shapes for teaching and learning decks.", + "ordered": false, + "default": false +} diff --git a/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceCaseStudyLayout.tsx b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceCaseStudyLayout.tsx new file mode 100644 index 0000000..2b49a05 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceCaseStudyLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../educational-science/EduScienceExperimentLayout"; + +export const Schema = BaseSchema; +export const layoutId = "educational-social-science-case-study"; +export const layoutName = "Case Study"; +export const layoutDescription = "Structured case-study format with context, method, observations, and conclusion."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceComparisonLayout.tsx b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceComparisonLayout.tsx new file mode 100644 index 0000000..750e807 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceComparisonLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../educational-science/EduScienceComparisonLayout"; + +export const Schema = BaseSchema; +export const layoutId = "educational-social-science-comparison"; +export const layoutName = "Comparative Analysis"; +export const layoutDescription = "Two-column comparison layout for ideologies, systems, or policy models."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceConceptLayout.tsx b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceConceptLayout.tsx new file mode 100644 index 0000000..b630f0c --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceConceptLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../educational-science/EduScienceConceptLayout"; + +export const Schema = BaseSchema; +export const layoutId = "educational-social-science-concepts"; +export const layoutName = "Core Concepts"; +export const layoutDescription = "Simple concept-explainer layout for social science theories and frameworks."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceDataInsightsLayout.tsx b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceDataInsightsLayout.tsx new file mode 100644 index 0000000..2597a5a --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceDataInsightsLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../educational-science/EduScienceDataInsightsLayout"; + +export const Schema = BaseSchema; +export const layoutId = "educational-social-science-data-insights"; +export const layoutName = "Societal Data Insights"; +export const layoutDescription = "Clean data-focused slide for population, behavior, and policy insights with explanatory text."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceFAQLayout.tsx b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceFAQLayout.tsx new file mode 100644 index 0000000..ebd8ce5 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceFAQLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../educational-science/EduScienceFAQLayout"; + +export const Schema = BaseSchema; +export const layoutId = "educational-social-science-faq"; +export const layoutName = "Classroom Q&A"; +export const layoutDescription = "Simple Q&A slide for common social science questions and clear evidence-based answers."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceGlossaryLayout.tsx b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceGlossaryLayout.tsx new file mode 100644 index 0000000..c6b07c4 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceGlossaryLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../educational-science/EduScienceGlossaryLayout"; + +export const Schema = BaseSchema; +export const layoutId = "educational-social-science-glossary"; +export const layoutName = "Key Terms Glossary"; +export const layoutDescription = "Glossary-style layout for social science terminology and concise definitions."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceImageExplainerLayout.tsx b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceImageExplainerLayout.tsx new file mode 100644 index 0000000..e8b6b92 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceImageExplainerLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../educational-science/EduScienceImageExplainerLayout"; + +export const Schema = BaseSchema; +export const layoutId = "educational-social-science-image-explainer"; +export const layoutName = "Image Explainer"; +export const layoutDescription = "Visual + text explainer for maps, demographics, field photos, and social context diagrams."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceIntroLayout.tsx b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceIntroLayout.tsx new file mode 100644 index 0000000..ba2dff9 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceIntroLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../educational-science/EduScienceIntroLayout"; + +export const Schema = BaseSchema; +export const layoutId = "educational-social-science-intro"; +export const layoutName = "Social Science Intro"; +export const layoutDescription = "Clean text-first introductory slide for social science lessons and course modules."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceSummaryLayout.tsx b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceSummaryLayout.tsx new file mode 100644 index 0000000..852fb03 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceSummaryLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../educational-science/EduScienceSummaryLayout"; + +export const Schema = BaseSchema; +export const layoutId = "educational-social-science-summary"; +export const layoutName = "Lesson Summary"; +export const layoutDescription = "Clean summary slide with major takeaways and next discussion points."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceTimelineLayout.tsx b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceTimelineLayout.tsx new file mode 100644 index 0000000..3ecf1fd --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-social-science/SocialScienceTimelineLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../educational-science/EduScienceTimelineLayout"; + +export const Schema = BaseSchema; +export const layoutId = "educational-social-science-timeline"; +export const layoutName = "Historical Timeline"; +export const layoutDescription = "Text-rich timeline to explain historical progression, policy change, or social movements."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/educational-social-science/settings.json b/servers/nextjs/app/presentation-templates/educational-social-science/settings.json new file mode 100644 index 0000000..f241667 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/educational-social-science/settings.json @@ -0,0 +1,5 @@ +{ + "description": "Educational Social Science: clean, text-first layouts for history, civics, sociology, economics, and policy learning.", + "ordered": false, + "default": false +} diff --git a/servers/nextjs/app/presentation-templates/index.tsx b/servers/nextjs/app/presentation-templates/index.tsx index c1d124c..5fdd360 100644 --- a/servers/nextjs/app/presentation-templates/index.tsx +++ b/servers/nextjs/app/presentation-templates/index.tsx @@ -75,6 +75,56 @@ import VelvetHazeTimelineLayout, { Schema as VelvetHazeTimelineSchema, layoutId import VelvetHazeComparisonLayout, { Schema as VelvetHazeComparisonSchema, layoutId as VelvetHazeComparisonId, layoutName as VelvetHazeComparisonName, layoutDescription as VelvetHazeComparisonDesc } from "./velvet-haze/VelvetHazeComparisonLayout"; import VelvetHazeImageGalleryLayout, { Schema as VelvetHazeImageGallerySchema, layoutId as VelvetHazeImageGalleryId, layoutName as VelvetHazeImageGalleryName, layoutDescription as VelvetHazeImageGalleryDesc } from "./velvet-haze/VelvetHazeImageGalleryLayout"; +// Professional Pitch templates +import PitchIntroLayout, { Schema as PitchIntroSchema, layoutId as PitchIntroId, layoutName as PitchIntroName, layoutDescription as PitchIntroDesc } from "./professional-pitch/PitchIntroLayout"; +import PitchAgendaLayout, { Schema as PitchAgendaSchema, layoutId as PitchAgendaId, layoutName as PitchAgendaName, layoutDescription as PitchAgendaDesc } from "./professional-pitch/PitchAgendaLayout"; +import PitchProblemSolutionLayout, { Schema as PitchProblemSolutionSchema, layoutId as PitchProblemSolutionId, layoutName as PitchProblemSolutionName, layoutDescription as PitchProblemSolutionDesc } from "./professional-pitch/PitchProblemSolutionLayout"; +import PitchMarketOpportunityLayout, { Schema as PitchMarketOpportunitySchema, layoutId as PitchMarketOpportunityId, layoutName as PitchMarketOpportunityName, layoutDescription as PitchMarketOpportunityDesc } from "./professional-pitch/PitchMarketOpportunityLayout"; +import PitchBusinessModelLayout, { Schema as PitchBusinessModelSchema, layoutId as PitchBusinessModelId, layoutName as PitchBusinessModelName, layoutDescription as PitchBusinessModelDesc } from "./professional-pitch/PitchBusinessModelLayout"; +import PitchTractionMetricsLayout, { Schema as PitchTractionMetricsSchema, layoutId as PitchTractionMetricsId, layoutName as PitchTractionMetricsName, layoutDescription as PitchTractionMetricsDesc } from "./professional-pitch/PitchTractionMetricsLayout"; +import PitchFinancialOverviewLayout, { Schema as PitchFinancialOverviewSchema, layoutId as PitchFinancialOverviewId, layoutName as PitchFinancialOverviewName, layoutDescription as PitchFinancialOverviewDesc } from "./professional-pitch/PitchFinancialOverviewLayout"; +import PitchGoToMarketLayout, { Schema as PitchGoToMarketSchema, layoutId as PitchGoToMarketId, layoutName as PitchGoToMarketName, layoutDescription as PitchGoToMarketDesc } from "./professional-pitch/PitchGoToMarketLayout"; +import PitchCompetitiveLandscapeLayout, { Schema as PitchCompetitiveLandscapeSchema, layoutId as PitchCompetitiveLandscapeId, layoutName as PitchCompetitiveLandscapeName, layoutDescription as PitchCompetitiveLandscapeDesc } from "./professional-pitch/PitchCompetitiveLandscapeLayout"; +import PitchTeamLayout, { Schema as PitchTeamSchema, layoutId as PitchTeamId, layoutName as PitchTeamName, layoutDescription as PitchTeamDesc } from "./professional-pitch/PitchTeamLayout"; +import PitchProductSnapshotLayout, { Schema as PitchProductSnapshotSchema, layoutId as PitchProductSnapshotId, layoutName as PitchProductSnapshotName, layoutDescription as PitchProductSnapshotDesc } from "./professional-pitch/PitchProductSnapshotLayout"; +import PitchClosingLayout, { Schema as PitchClosingSchema, layoutId as PitchClosingId, layoutName as PitchClosingName, layoutDescription as PitchClosingDesc } from "./professional-pitch/PitchClosingLayout"; + +// Educational Social Science templates +import SocialScienceIntroLayout, { Schema as SocialScienceIntroSchema, layoutId as SocialScienceIntroId, layoutName as SocialScienceIntroName, layoutDescription as SocialScienceIntroDesc } from "./educational-social-science/SocialScienceIntroLayout"; +import SocialScienceConceptLayout, { Schema as SocialScienceConceptSchema, layoutId as SocialScienceConceptId, layoutName as SocialScienceConceptName, layoutDescription as SocialScienceConceptDesc } from "./educational-social-science/SocialScienceConceptLayout"; +import SocialScienceTimelineLayout, { Schema as SocialScienceTimelineSchema, layoutId as SocialScienceTimelineId, layoutName as SocialScienceTimelineName, layoutDescription as SocialScienceTimelineDesc } from "./educational-social-science/SocialScienceTimelineLayout"; +import SocialScienceCaseStudyLayout, { Schema as SocialScienceCaseStudySchema, layoutId as SocialScienceCaseStudyId, layoutName as SocialScienceCaseStudyName, layoutDescription as SocialScienceCaseStudyDesc } from "./educational-social-science/SocialScienceCaseStudyLayout"; +import SocialScienceDataInsightsLayout, { Schema as SocialScienceDataInsightsSchema, layoutId as SocialScienceDataInsightsId, layoutName as SocialScienceDataInsightsName, layoutDescription as SocialScienceDataInsightsDesc } from "./educational-social-science/SocialScienceDataInsightsLayout"; +import SocialScienceComparisonLayout, { Schema as SocialScienceComparisonSchema, layoutId as SocialScienceComparisonId, layoutName as SocialScienceComparisonName, layoutDescription as SocialScienceComparisonDesc } from "./educational-social-science/SocialScienceComparisonLayout"; +import SocialScienceImageExplainerLayout, { Schema as SocialScienceImageExplainerSchema, layoutId as SocialScienceImageExplainerId, layoutName as SocialScienceImageExplainerName, layoutDescription as SocialScienceImageExplainerDesc } from "./educational-social-science/SocialScienceImageExplainerLayout"; +import SocialScienceFAQLayout, { Schema as SocialScienceFAQSchema, layoutId as SocialScienceFAQId, layoutName as SocialScienceFAQName, layoutDescription as SocialScienceFAQDesc } from "./educational-social-science/SocialScienceFAQLayout"; +import SocialScienceGlossaryLayout, { Schema as SocialScienceGlossarySchema, layoutId as SocialScienceGlossaryId, layoutName as SocialScienceGlossaryName, layoutDescription as SocialScienceGlossaryDesc } from "./educational-social-science/SocialScienceGlossaryLayout"; +import SocialScienceSummaryLayout, { Schema as SocialScienceSummarySchema, layoutId as SocialScienceSummaryId, layoutName as SocialScienceSummaryName, layoutDescription as SocialScienceSummaryDesc } from "./educational-social-science/SocialScienceSummaryLayout"; + +// Tech AI Red templates +import TechAIIntroLayout, { Schema as TechAIIntroSchema, layoutId as TechAIIntroId, layoutName as TechAIIntroName, layoutDescription as TechAIIntroDesc } from "./tech-ai-red/TechAIIntroLayout"; +import TechAIPipelineLayout, { Schema as TechAIPipelineSchema, layoutId as TechAIPipelineId, layoutName as TechAIPipelineName, layoutDescription as TechAIPipelineDesc } from "./tech-ai-red/TechAIPipelineLayout"; +import TechAIArchitectureLayout, { Schema as TechAIArchitectureSchema, layoutId as TechAIArchitectureId, layoutName as TechAIArchitectureName, layoutDescription as TechAIArchitectureDesc } from "./tech-ai-red/TechAIArchitectureLayout"; +import TechAIMetricsLayout, { Schema as TechAIMetricsSchema, layoutId as TechAIMetricsId, layoutName as TechAIMetricsName, layoutDescription as TechAIMetricsDesc } from "./tech-ai-red/TechAIMetricsLayout"; +import TechAIModelComparisonLayout, { Schema as TechAIModelComparisonSchema, layoutId as TechAIModelComparisonId, layoutName as TechAIModelComparisonName, layoutDescription as TechAIModelComparisonDesc } from "./tech-ai-red/TechAIModelComparisonLayout"; +import TechAIUseCasesLayout, { Schema as TechAIUseCasesSchema, layoutId as TechAIUseCasesId, layoutName as TechAIUseCasesName, layoutDescription as TechAIUseCasesDesc } from "./tech-ai-red/TechAIUseCasesLayout"; +import TechAIRiskGovernanceLayout, { Schema as TechAIRiskGovernanceSchema, layoutId as TechAIRiskGovernanceId, layoutName as TechAIRiskGovernanceName, layoutDescription as TechAIRiskGovernanceDesc } from "./tech-ai-red/TechAIRiskGovernanceLayout"; +import TechAIRoadmapLayout, { Schema as TechAIRoadmapSchema, layoutId as TechAIRoadmapId, layoutName as TechAIRoadmapName, layoutDescription as TechAIRoadmapDesc } from "./tech-ai-red/TechAIRoadmapLayout"; +import TechAITeamLayout, { Schema as TechAITeamSchema, layoutId as TechAITeamId, layoutName as TechAITeamName, layoutDescription as TechAITeamDesc } from "./tech-ai-red/TechAITeamLayout"; +import TechAIClosingLayout, { Schema as TechAIClosingSchema, layoutId as TechAIClosingId, layoutName as TechAIClosingName, layoutDescription as TechAIClosingDesc } from "./tech-ai-red/TechAIClosingLayout"; + +// Educational Science templates +import EduScienceIntroLayout, { Schema as EduScienceIntroSchema, layoutId as EduScienceIntroId, layoutName as EduScienceIntroName, layoutDescription as EduScienceIntroDesc } from "./educational-science/EduScienceIntroLayout"; +import EduScienceConceptLayout, { Schema as EduScienceConceptSchema, layoutId as EduScienceConceptId, layoutName as EduScienceConceptName, layoutDescription as EduScienceConceptDesc } from "./educational-science/EduScienceConceptLayout"; +import EduScienceTimelineLayout, { Schema as EduScienceTimelineSchema, layoutId as EduScienceTimelineId, layoutName as EduScienceTimelineName, layoutDescription as EduScienceTimelineDesc } from "./educational-science/EduScienceTimelineLayout"; +import EduScienceExperimentLayout, { Schema as EduScienceExperimentSchema, layoutId as EduScienceExperimentId, layoutName as EduScienceExperimentName, layoutDescription as EduScienceExperimentDesc } from "./educational-science/EduScienceExperimentLayout"; +import EduScienceDataInsightsLayout, { Schema as EduScienceDataInsightsSchema, layoutId as EduScienceDataInsightsId, layoutName as EduScienceDataInsightsName, layoutDescription as EduScienceDataInsightsDesc } from "./educational-science/EduScienceDataInsightsLayout"; +import EduScienceComparisonLayout, { Schema as EduScienceComparisonSchema, layoutId as EduScienceComparisonId, layoutName as EduScienceComparisonName, layoutDescription as EduScienceComparisonDesc } from "./educational-science/EduScienceComparisonLayout"; +import EduScienceImageExplainerLayout, { Schema as EduScienceImageExplainerSchema, layoutId as EduScienceImageExplainerId, layoutName as EduScienceImageExplainerName, layoutDescription as EduScienceImageExplainerDesc } from "./educational-science/EduScienceImageExplainerLayout"; +import EduScienceFAQLayout, { Schema as EduScienceFAQSchema, layoutId as EduScienceFAQId, layoutName as EduScienceFAQName, layoutDescription as EduScienceFAQDesc } from "./educational-science/EduScienceFAQLayout"; +import EduScienceGlossaryLayout, { Schema as EduScienceGlossarySchema, layoutId as EduScienceGlossaryId, layoutName as EduScienceGlossaryName, layoutDescription as EduScienceGlossaryDesc } from "./educational-science/EduScienceGlossaryLayout"; +import EduScienceSummaryLayout, { Schema as EduScienceSummarySchema, layoutId as EduScienceSummaryId, layoutName as EduScienceSummaryName, layoutDescription as EduScienceSummaryDesc } from "./educational-science/EduScienceSummaryLayout"; + // Modern templates @@ -198,6 +248,10 @@ import softBloomSettings from "./soft-bloom/settings.json"; import velvetHazeSettings from "./velvet-haze/settings.json"; import neoModernSettings from "./neo-modern/settings.json"; import neoSwiftSettings from "./neo-swift/settings.json"; +import professionalPitchSettings from "./professional-pitch/settings.json"; +import educationalScienceSettings from "./educational-science/settings.json"; +import educationalSocialScienceSettings from "./educational-social-science/settings.json"; +import techAIRedSettings from "./tech-ai-red/settings.json"; // Helper to create template entry @@ -393,6 +447,60 @@ export const swiftTemplates: TemplateWithData[] = [ createTemplateEntry(Timeline, TimelineSchema, TimelineId, TimelineName, TimelineDesc, "swift", "Timeline"), ]; +export const professionalPitchTemplates: TemplateWithData[] = [ + createTemplateEntry(PitchIntroLayout, PitchIntroSchema, PitchIntroId, PitchIntroName, PitchIntroDesc, "professional-pitch", "PitchIntroLayout"), + createTemplateEntry(PitchAgendaLayout, PitchAgendaSchema, PitchAgendaId, PitchAgendaName, PitchAgendaDesc, "professional-pitch", "PitchAgendaLayout"), + createTemplateEntry(PitchProblemSolutionLayout, PitchProblemSolutionSchema, PitchProblemSolutionId, PitchProblemSolutionName, PitchProblemSolutionDesc, "professional-pitch", "PitchProblemSolutionLayout"), + createTemplateEntry(PitchMarketOpportunityLayout, PitchMarketOpportunitySchema, PitchMarketOpportunityId, PitchMarketOpportunityName, PitchMarketOpportunityDesc, "professional-pitch", "PitchMarketOpportunityLayout"), + createTemplateEntry(PitchBusinessModelLayout, PitchBusinessModelSchema, PitchBusinessModelId, PitchBusinessModelName, PitchBusinessModelDesc, "professional-pitch", "PitchBusinessModelLayout"), + createTemplateEntry(PitchTractionMetricsLayout, PitchTractionMetricsSchema, PitchTractionMetricsId, PitchTractionMetricsName, PitchTractionMetricsDesc, "professional-pitch", "PitchTractionMetricsLayout"), + createTemplateEntry(PitchFinancialOverviewLayout, PitchFinancialOverviewSchema, PitchFinancialOverviewId, PitchFinancialOverviewName, PitchFinancialOverviewDesc, "professional-pitch", "PitchFinancialOverviewLayout"), + createTemplateEntry(PitchGoToMarketLayout, PitchGoToMarketSchema, PitchGoToMarketId, PitchGoToMarketName, PitchGoToMarketDesc, "professional-pitch", "PitchGoToMarketLayout"), + createTemplateEntry(PitchCompetitiveLandscapeLayout, PitchCompetitiveLandscapeSchema, PitchCompetitiveLandscapeId, PitchCompetitiveLandscapeName, PitchCompetitiveLandscapeDesc, "professional-pitch", "PitchCompetitiveLandscapeLayout"), + createTemplateEntry(PitchTeamLayout, PitchTeamSchema, PitchTeamId, PitchTeamName, PitchTeamDesc, "professional-pitch", "PitchTeamLayout"), + createTemplateEntry(PitchProductSnapshotLayout, PitchProductSnapshotSchema, PitchProductSnapshotId, PitchProductSnapshotName, PitchProductSnapshotDesc, "professional-pitch", "PitchProductSnapshotLayout"), + createTemplateEntry(PitchClosingLayout, PitchClosingSchema, PitchClosingId, PitchClosingName, PitchClosingDesc, "professional-pitch", "PitchClosingLayout"), +]; + +export const educationalScienceTemplates: TemplateWithData[] = [ + createTemplateEntry(EduScienceIntroLayout, EduScienceIntroSchema, EduScienceIntroId, EduScienceIntroName, EduScienceIntroDesc, "educational-science", "EduScienceIntroLayout"), + createTemplateEntry(EduScienceConceptLayout, EduScienceConceptSchema, EduScienceConceptId, EduScienceConceptName, EduScienceConceptDesc, "educational-science", "EduScienceConceptLayout"), + createTemplateEntry(EduScienceTimelineLayout, EduScienceTimelineSchema, EduScienceTimelineId, EduScienceTimelineName, EduScienceTimelineDesc, "educational-science", "EduScienceTimelineLayout"), + createTemplateEntry(EduScienceExperimentLayout, EduScienceExperimentSchema, EduScienceExperimentId, EduScienceExperimentName, EduScienceExperimentDesc, "educational-science", "EduScienceExperimentLayout"), + createTemplateEntry(EduScienceDataInsightsLayout, EduScienceDataInsightsSchema, EduScienceDataInsightsId, EduScienceDataInsightsName, EduScienceDataInsightsDesc, "educational-science", "EduScienceDataInsightsLayout"), + createTemplateEntry(EduScienceComparisonLayout, EduScienceComparisonSchema, EduScienceComparisonId, EduScienceComparisonName, EduScienceComparisonDesc, "educational-science", "EduScienceComparisonLayout"), + createTemplateEntry(EduScienceImageExplainerLayout, EduScienceImageExplainerSchema, EduScienceImageExplainerId, EduScienceImageExplainerName, EduScienceImageExplainerDesc, "educational-science", "EduScienceImageExplainerLayout"), + createTemplateEntry(EduScienceFAQLayout, EduScienceFAQSchema, EduScienceFAQId, EduScienceFAQName, EduScienceFAQDesc, "educational-science", "EduScienceFAQLayout"), + createTemplateEntry(EduScienceGlossaryLayout, EduScienceGlossarySchema, EduScienceGlossaryId, EduScienceGlossaryName, EduScienceGlossaryDesc, "educational-science", "EduScienceGlossaryLayout"), + createTemplateEntry(EduScienceSummaryLayout, EduScienceSummarySchema, EduScienceSummaryId, EduScienceSummaryName, EduScienceSummaryDesc, "educational-science", "EduScienceSummaryLayout"), +]; + +export const educationalSocialScienceTemplates: TemplateWithData[] = [ + createTemplateEntry(SocialScienceIntroLayout, SocialScienceIntroSchema, SocialScienceIntroId, SocialScienceIntroName, SocialScienceIntroDesc, "educational-social-science", "SocialScienceIntroLayout"), + createTemplateEntry(SocialScienceConceptLayout, SocialScienceConceptSchema, SocialScienceConceptId, SocialScienceConceptName, SocialScienceConceptDesc, "educational-social-science", "SocialScienceConceptLayout"), + createTemplateEntry(SocialScienceTimelineLayout, SocialScienceTimelineSchema, SocialScienceTimelineId, SocialScienceTimelineName, SocialScienceTimelineDesc, "educational-social-science", "SocialScienceTimelineLayout"), + createTemplateEntry(SocialScienceCaseStudyLayout, SocialScienceCaseStudySchema, SocialScienceCaseStudyId, SocialScienceCaseStudyName, SocialScienceCaseStudyDesc, "educational-social-science", "SocialScienceCaseStudyLayout"), + createTemplateEntry(SocialScienceDataInsightsLayout, SocialScienceDataInsightsSchema, SocialScienceDataInsightsId, SocialScienceDataInsightsName, SocialScienceDataInsightsDesc, "educational-social-science", "SocialScienceDataInsightsLayout"), + createTemplateEntry(SocialScienceComparisonLayout, SocialScienceComparisonSchema, SocialScienceComparisonId, SocialScienceComparisonName, SocialScienceComparisonDesc, "educational-social-science", "SocialScienceComparisonLayout"), + createTemplateEntry(SocialScienceImageExplainerLayout, SocialScienceImageExplainerSchema, SocialScienceImageExplainerId, SocialScienceImageExplainerName, SocialScienceImageExplainerDesc, "educational-social-science", "SocialScienceImageExplainerLayout"), + createTemplateEntry(SocialScienceFAQLayout, SocialScienceFAQSchema, SocialScienceFAQId, SocialScienceFAQName, SocialScienceFAQDesc, "educational-social-science", "SocialScienceFAQLayout"), + createTemplateEntry(SocialScienceGlossaryLayout, SocialScienceGlossarySchema, SocialScienceGlossaryId, SocialScienceGlossaryName, SocialScienceGlossaryDesc, "educational-social-science", "SocialScienceGlossaryLayout"), + createTemplateEntry(SocialScienceSummaryLayout, SocialScienceSummarySchema, SocialScienceSummaryId, SocialScienceSummaryName, SocialScienceSummaryDesc, "educational-social-science", "SocialScienceSummaryLayout"), +]; + +export const techAIRedTemplates: TemplateWithData[] = [ + createTemplateEntry(TechAIIntroLayout, TechAIIntroSchema, TechAIIntroId, TechAIIntroName, TechAIIntroDesc, "tech-ai-red", "TechAIIntroLayout"), + createTemplateEntry(TechAIPipelineLayout, TechAIPipelineSchema, TechAIPipelineId, TechAIPipelineName, TechAIPipelineDesc, "tech-ai-red", "TechAIPipelineLayout"), + createTemplateEntry(TechAIArchitectureLayout, TechAIArchitectureSchema, TechAIArchitectureId, TechAIArchitectureName, TechAIArchitectureDesc, "tech-ai-red", "TechAIArchitectureLayout"), + createTemplateEntry(TechAIMetricsLayout, TechAIMetricsSchema, TechAIMetricsId, TechAIMetricsName, TechAIMetricsDesc, "tech-ai-red", "TechAIMetricsLayout"), + createTemplateEntry(TechAIModelComparisonLayout, TechAIModelComparisonSchema, TechAIModelComparisonId, TechAIModelComparisonName, TechAIModelComparisonDesc, "tech-ai-red", "TechAIModelComparisonLayout"), + createTemplateEntry(TechAIUseCasesLayout, TechAIUseCasesSchema, TechAIUseCasesId, TechAIUseCasesName, TechAIUseCasesDesc, "tech-ai-red", "TechAIUseCasesLayout"), + createTemplateEntry(TechAIRiskGovernanceLayout, TechAIRiskGovernanceSchema, TechAIRiskGovernanceId, TechAIRiskGovernanceName, TechAIRiskGovernanceDesc, "tech-ai-red", "TechAIRiskGovernanceLayout"), + createTemplateEntry(TechAIRoadmapLayout, TechAIRoadmapSchema, TechAIRoadmapId, TechAIRoadmapName, TechAIRoadmapDesc, "tech-ai-red", "TechAIRoadmapLayout"), + createTemplateEntry(TechAITeamLayout, TechAITeamSchema, TechAITeamId, TechAITeamName, TechAITeamDesc, "tech-ai-red", "TechAITeamLayout"), + createTemplateEntry(TechAIClosingLayout, TechAIClosingSchema, TechAIClosingId, TechAIClosingName, TechAIClosingDesc, "tech-ai-red", "TechAIClosingLayout"), +]; + // TODO: Step 4: Combine all templates into a single array For UseCases (like the ones below) // All templates combined export const allLayouts: TemplateWithData[] = [ @@ -408,6 +516,10 @@ export const allLayouts: TemplateWithData[] = [ ...swiftTemplates, ...softBloomTemplates, ...velvetHazeTemplates, + ...professionalPitchTemplates, + ...educationalScienceTemplates, + ...educationalSocialScienceTemplates, + ...techAIRedTemplates, ]; @@ -500,6 +612,34 @@ export const templates: TemplateLayoutsWithSettings[] = [ settings: swiftSettings as TemplateGroupSettings, layouts: swiftTemplates, }, + { + id: "professional-pitch", + name: "Professional Pitch", + description: professionalPitchSettings.description, + settings: professionalPitchSettings as TemplateGroupSettings, + layouts: professionalPitchTemplates, + }, + { + id: "educational-science", + name: "Educational Science", + description: educationalScienceSettings.description, + settings: educationalScienceSettings as TemplateGroupSettings, + layouts: educationalScienceTemplates, + }, + { + id: "educational-social-science", + name: "Educational Social Science", + description: educationalSocialScienceSettings.description, + settings: educationalSocialScienceSettings as TemplateGroupSettings, + layouts: educationalSocialScienceTemplates, + }, + { + id: "tech-ai-red", + name: "Tech AI Red", + description: techAIRedSettings.description, + settings: techAIRedSettings as TemplateGroupSettings, + layouts: techAIRedTemplates, + }, ]; diff --git a/servers/nextjs/app/presentation-templates/professional-pitch/PitchAgendaLayout.tsx b/servers/nextjs/app/presentation-templates/professional-pitch/PitchAgendaLayout.tsx new file mode 100644 index 0000000..33cf18d --- /dev/null +++ b/servers/nextjs/app/presentation-templates/professional-pitch/PitchAgendaLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleDescriptionBulletList"; + +export const Schema = BaseSchema; +export const layoutId = "professional-pitch-agenda"; +export const layoutName = "Pitch Agenda"; +export const layoutDescription = "Clean agenda layout to list key sections in a structured, investor-friendly sequence."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/professional-pitch/PitchBusinessModelLayout.tsx b/servers/nextjs/app/presentation-templates/professional-pitch/PitchBusinessModelLayout.tsx new file mode 100644 index 0000000..de224b0 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/professional-pitch/PitchBusinessModelLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleDescriptionTable"; + +export const Schema = BaseSchema; +export const layoutId = "professional-pitch-business-model"; +export const layoutName = "Business Model"; +export const layoutDescription = "Minimal business model layout for pricing, channels, and revenue mechanics in a clear table."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/professional-pitch/PitchClosingLayout.tsx b/servers/nextjs/app/presentation-templates/professional-pitch/PitchClosingLayout.tsx new file mode 100644 index 0000000..5f96899 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/professional-pitch/PitchClosingLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleDescriptionIconList"; + +export const Schema = BaseSchema; +export const layoutId = "professional-pitch-closing"; +export const layoutName = "Closing / Ask"; +export const layoutDescription = "Clean closing slide for recap, value proposition, and a clear investment or next-step ask."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/professional-pitch/PitchCompetitiveLandscapeLayout.tsx b/servers/nextjs/app/presentation-templates/professional-pitch/PitchCompetitiveLandscapeLayout.tsx new file mode 100644 index 0000000..90859dc --- /dev/null +++ b/servers/nextjs/app/presentation-templates/professional-pitch/PitchCompetitiveLandscapeLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleDualChartsComparison"; + +export const Schema = BaseSchema; +export const layoutId = "professional-pitch-competitive-landscape"; +export const layoutName = "Competitive Landscape"; +export const layoutDescription = "Professional comparison layout with dual charts for competitor and positioning insights."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/professional-pitch/PitchFinancialOverviewLayout.tsx b/servers/nextjs/app/presentation-templates/professional-pitch/PitchFinancialOverviewLayout.tsx new file mode 100644 index 0000000..c78b7d0 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/professional-pitch/PitchFinancialOverviewLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleMetricsChart"; + +export const Schema = BaseSchema; +export const layoutId = "professional-pitch-financial-overview"; +export const layoutName = "Financial Overview"; +export const layoutDescription = "Clean financial summary slide combining core metrics with one supporting chart."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/professional-pitch/PitchGoToMarketLayout.tsx b/servers/nextjs/app/presentation-templates/professional-pitch/PitchGoToMarketLayout.tsx new file mode 100644 index 0000000..181dcc7 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/professional-pitch/PitchGoToMarketLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleDescriptionTimeline"; + +export const Schema = BaseSchema; +export const layoutId = "professional-pitch-go-to-market"; +export const layoutName = "Go-to-Market Plan"; +export const layoutDescription = "Timeline-driven GTM slide to communicate launch phases and execution milestones."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/professional-pitch/PitchIntroLayout.tsx b/servers/nextjs/app/presentation-templates/professional-pitch/PitchIntroLayout.tsx new file mode 100644 index 0000000..af361cd --- /dev/null +++ b/servers/nextjs/app/presentation-templates/professional-pitch/PitchIntroLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleDescriptionImageRight"; + +export const Schema = BaseSchema; +export const layoutId = "professional-pitch-intro"; +export const layoutName = "Pitch Intro"; +export const layoutDescription = "Minimal opening slide for a professional pitch deck with strong title, short context, and visual support."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/professional-pitch/PitchMarketOpportunityLayout.tsx b/servers/nextjs/app/presentation-templates/professional-pitch/PitchMarketOpportunityLayout.tsx new file mode 100644 index 0000000..7849b96 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/professional-pitch/PitchMarketOpportunityLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleBadgeChart"; + +export const Schema = BaseSchema; +export const layoutId = "professional-pitch-market-opportunity"; +export const layoutName = "Market Opportunity"; +export const layoutDescription = "Professional market slide combining concise narrative with chart-led opportunity framing."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/professional-pitch/PitchProblemSolutionLayout.tsx b/servers/nextjs/app/presentation-templates/professional-pitch/PitchProblemSolutionLayout.tsx new file mode 100644 index 0000000..b58a010 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/professional-pitch/PitchProblemSolutionLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleDualComparisonCards"; + +export const Schema = BaseSchema; +export const layoutId = "professional-pitch-problem-solution"; +export const layoutName = "Problem vs Solution"; +export const layoutDescription = "Balanced two-column comparison slide to explain the problem and your focused solution."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/professional-pitch/PitchProductSnapshotLayout.tsx b/servers/nextjs/app/presentation-templates/professional-pitch/PitchProductSnapshotLayout.tsx new file mode 100644 index 0000000..61dc9af --- /dev/null +++ b/servers/nextjs/app/presentation-templates/professional-pitch/PitchProductSnapshotLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleMetricsImage"; + +export const Schema = BaseSchema; +export const layoutId = "professional-pitch-product-snapshot"; +export const layoutName = "Product Snapshot"; +export const layoutDescription = "Focused product slide with visual context and supporting proof metrics."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/professional-pitch/PitchTeamLayout.tsx b/servers/nextjs/app/presentation-templates/professional-pitch/PitchTeamLayout.tsx new file mode 100644 index 0000000..9ff0f5a --- /dev/null +++ b/servers/nextjs/app/presentation-templates/professional-pitch/PitchTeamLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleDescriptionContactCards"; + +export const Schema = BaseSchema; +export const layoutId = "professional-pitch-team"; +export const layoutName = "Team"; +export const layoutDescription = "Minimal team profile slide highlighting leadership roles and ownership areas."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/professional-pitch/PitchTractionMetricsLayout.tsx b/servers/nextjs/app/presentation-templates/professional-pitch/PitchTractionMetricsLayout.tsx new file mode 100644 index 0000000..3f80e9d --- /dev/null +++ b/servers/nextjs/app/presentation-templates/professional-pitch/PitchTractionMetricsLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleKpiGrid"; + +export const Schema = BaseSchema; +export const layoutId = "professional-pitch-traction-metrics"; +export const layoutName = "Traction Metrics"; +export const layoutDescription = "KPI-first traction slide for growth, retention, and performance proof points."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/professional-pitch/settings.json b/servers/nextjs/app/presentation-templates/professional-pitch/settings.json new file mode 100644 index 0000000..8192472 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/professional-pitch/settings.json @@ -0,0 +1,5 @@ +{ + "description": "Professional Pitch Desk: a clean, minimalist presentation system for business, startup, and investor storytelling.", + "ordered": false, + "default": false +} diff --git a/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIArchitectureLayout.tsx b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIArchitectureLayout.tsx new file mode 100644 index 0000000..44df00a --- /dev/null +++ b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIArchitectureLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleDescriptionTable"; + +export const Schema = BaseSchema; +export const layoutId = "tech-ai-red-architecture"; +export const layoutName = "System Architecture"; +export const layoutDescription = "Structured architecture overview for AI stack components, data flow, and integrations."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIClosingLayout.tsx b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIClosingLayout.tsx new file mode 100644 index 0000000..bb89c1c --- /dev/null +++ b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIClosingLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../professional-pitch/PitchClosingLayout"; + +export const Schema = BaseSchema; +export const layoutId = "tech-ai-red-closing"; +export const layoutName = "Closing / CTA"; +export const layoutDescription = "Final call-to-action slide for demos, adoption plans, and next technical milestones."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIIntroLayout.tsx b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIIntroLayout.tsx new file mode 100644 index 0000000..e787bf9 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIIntroLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleDescriptionImageRight"; + +export const Schema = BaseSchema; +export const layoutId = "tech-ai-red-intro"; +export const layoutName = "AI Intro"; +export const layoutDescription = "Tech opener with bold AI context, designed for red-black or red-white brand styling."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIMetricsLayout.tsx b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIMetricsLayout.tsx new file mode 100644 index 0000000..4a9be5b --- /dev/null +++ b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIMetricsLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleKpiGrid"; + +export const Schema = BaseSchema; +export const layoutId = "tech-ai-red-metrics"; +export const layoutName = "AI Metrics"; +export const layoutDescription = "Performance KPI grid for latency, accuracy, adoption, and reliability benchmarks."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIModelComparisonLayout.tsx b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIModelComparisonLayout.tsx new file mode 100644 index 0000000..8c2d286 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIModelComparisonLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleDualComparisonCards"; + +export const Schema = BaseSchema; +export const layoutId = "tech-ai-red-model-comparison"; +export const layoutName = "Model Comparison"; +export const layoutDescription = "Side-by-side comparison slide for models, approaches, or vendor options."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIPipelineLayout.tsx b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIPipelineLayout.tsx new file mode 100644 index 0000000..67d40e6 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIPipelineLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleDescriptionTimeline"; + +export const Schema = BaseSchema; +export const layoutId = "tech-ai-red-pipeline"; +export const layoutName = "AI Pipeline"; +export const layoutDescription = "Clear pipeline/timeline layout for model lifecycle, deployment steps, and ML workflows."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIRiskGovernanceLayout.tsx b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIRiskGovernanceLayout.tsx new file mode 100644 index 0000000..e8acf33 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIRiskGovernanceLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleDescriptionIconList"; + +export const Schema = BaseSchema; +export const layoutId = "tech-ai-red-risk-governance"; +export const layoutName = "Risk & Governance"; +export const layoutDescription = "Governance slide for responsible AI, privacy, compliance, and mitigation actions."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIRoadmapLayout.tsx b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIRoadmapLayout.tsx new file mode 100644 index 0000000..f9e62c1 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIRoadmapLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-swift/TitleTaglineDescriptionNumberedSteps"; + +export const Schema = BaseSchema; +export const layoutId = "tech-ai-red-roadmap"; +export const layoutName = "AI Roadmap"; +export const layoutDescription = "Numbered roadmap layout for phased implementation and release planning."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/tech-ai-red/TechAITeamLayout.tsx b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAITeamLayout.tsx new file mode 100644 index 0000000..e8e02d9 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAITeamLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-swift/TitleSubtitleTeamMemberCards"; + +export const Schema = BaseSchema; +export const layoutId = "tech-ai-red-team"; +export const layoutName = "AI Team"; +export const layoutDescription = "Team slide for AI leadership, engineering, and research roles with concise bios."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIUseCasesLayout.tsx b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIUseCasesLayout.tsx new file mode 100644 index 0000000..218d980 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/tech-ai-red/TechAIUseCasesLayout.tsx @@ -0,0 +1,8 @@ +import BaseLayout, { Schema as BaseSchema } from "../neo-standard/TitleDescriptionBulletList"; + +export const Schema = BaseSchema; +export const layoutId = "tech-ai-red-use-cases"; +export const layoutName = "AI Use Cases"; +export const layoutDescription = "Text-first use case layout for product scenarios, automation opportunities, and impact notes."; + +export default BaseLayout; diff --git a/servers/nextjs/app/presentation-templates/tech-ai-red/settings.json b/servers/nextjs/app/presentation-templates/tech-ai-red/settings.json new file mode 100644 index 0000000..f755788 --- /dev/null +++ b/servers/nextjs/app/presentation-templates/tech-ai-red/settings.json @@ -0,0 +1,5 @@ +{ + "description": "Tech AI Red: modern technical layouts designed for red-black or red-white visual themes.", + "ordered": false, + "default": false +}