From 6930faa247e1a7e7bcdadc6bdd9dea3429723d62 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 29 Mar 2026 16:42:14 +0000 Subject: [PATCH 01/10] Initial plan From 6395a9ca28b077e8cc9b52dfb483023e6c00068c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 29 Mar 2026 16:50:14 +0000 Subject: [PATCH 02/10] feat: add homepage slot framework with variant components, config system, and config page Agent-Logs-Url: https://github.com/thinkdj/ottabase/sessions/727333a7-edea-4b82-9a29-3919a7439a95 Co-authored-by: thinkdj <688055+thinkdj@users.noreply.github.com> --- .../app/homepage-config/page.tsx | 96 +++++++++++ .../app/layout-shell.tsx | 27 ++-- .../app/page.tsx | 149 +++++++++--------- .../app/providers.tsx | 3 +- .../components/Navbar.tsx | 1 + .../components/SlotRenderer.tsx | 82 ++++++++++ .../components/index.ts | 1 + .../components/variants/cta/CTABanner.tsx | 34 ++++ .../components/variants/cta/CTADefault.tsx | 30 ++++ .../components/variants/cta/CTAMinimal.tsx | 32 ++++ .../components/variants/cta/index.ts | 4 + .../components/variants/cta/types.ts | 16 ++ .../variants/features/FeaturesCards.tsx | 25 +++ .../variants/features/FeaturesGrid.tsx | 20 +++ .../variants/features/FeaturesList.tsx | 23 +++ .../components/variants/features/index.ts | 4 + .../components/variants/features/types.ts | 11 ++ .../variants/footer/FooterColumns.tsx | 83 ++++++++++ .../variants/footer/FooterDefault.tsx | 46 ++++++ .../variants/footer/FooterMinimal.tsx | 16 ++ .../components/variants/footer/index.ts | 4 + .../components/variants/footer/types.ts | 12 ++ .../components/variants/hero/HeroCentered.tsx | 39 +++++ .../components/variants/hero/HeroMinimal.tsx | 37 +++++ .../components/variants/hero/HeroSplit.tsx | 51 ++++++ .../components/variants/hero/index.ts | 4 + .../components/variants/hero/types.ts | 17 ++ .../variants/navbar/NavbarCentered.tsx | 127 +++++++++++++++ .../variants/navbar/NavbarDefault.tsx | 119 ++++++++++++++ .../variants/navbar/NavbarMinimal.tsx | 21 +++ .../components/variants/navbar/index.ts | 4 + .../components/variants/navbar/types.ts | 12 ++ .../lib/homepage-config-context.tsx | 58 +++++++ .../lib/homepage-config.ts | 120 ++++++++++++++ 34 files changed, 1242 insertions(+), 86 deletions(-) create mode 100644 apps/ottabase-template-app-nextjs-homepage/app/homepage-config/page.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/SlotRenderer.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/cta/CTABanner.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/cta/CTADefault.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/cta/CTAMinimal.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/cta/index.ts create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/cta/types.ts create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/features/FeaturesCards.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/features/FeaturesGrid.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/features/FeaturesList.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/features/index.ts create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/features/types.ts create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/footer/FooterColumns.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/footer/FooterDefault.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/footer/FooterMinimal.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/footer/index.ts create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/footer/types.ts create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/hero/HeroCentered.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/hero/HeroMinimal.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/hero/HeroSplit.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/hero/index.ts create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/hero/types.ts create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/navbar/NavbarCentered.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/navbar/NavbarDefault.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/navbar/NavbarMinimal.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/navbar/index.ts create mode 100644 apps/ottabase-template-app-nextjs-homepage/components/variants/navbar/types.ts create mode 100644 apps/ottabase-template-app-nextjs-homepage/lib/homepage-config-context.tsx create mode 100644 apps/ottabase-template-app-nextjs-homepage/lib/homepage-config.ts diff --git a/apps/ottabase-template-app-nextjs-homepage/app/homepage-config/page.tsx b/apps/ottabase-template-app-nextjs-homepage/app/homepage-config/page.tsx new file mode 100644 index 000000000..196a0e0cb --- /dev/null +++ b/apps/ottabase-template-app-nextjs-homepage/app/homepage-config/page.tsx @@ -0,0 +1,96 @@ +'use client'; + +import { RotateCcw } from 'lucide-react'; +import { useHomepageConfig } from '../../lib/homepage-config-context'; +import { SLOT_NAMES, SLOT_REGISTRY } from '../../lib/homepage-config'; +import type { SlotName } from '../../lib/homepage-config'; + +export default function HomepageConfigPage() { + const { config, setVariant, resetConfig } = useHomepageConfig(); + + return ( +
+ {/* Header */} +
+
+

Homepage Config

+

+ Switch component variants for each section. Changes are saved automatically and applied + instantly. +

+
+ +
+ + {/* Slot sections */} + {SLOT_NAMES.map((slotName) => ( + setVariant(slotName, variantId)} + /> + ))} +
+ ); +} + +// ── SlotConfigSection ─────────────────────────────────────────────────────── + +function SlotConfigSection({ + slotName, + activeVariant, + onSelect, +}: { + slotName: SlotName; + activeVariant: string; + onSelect: (variantId: string) => void; +}) { + const slot = SLOT_REGISTRY[slotName]; + + return ( +
+
+

{slot.label}

+

+ Choose which {slot.label} variant to render. +

+
+ +
+ {slot.variants.map((variant) => { + const isActive = activeVariant === variant.id; + return ( + + ); + })} +
+
+ ); +} diff --git a/apps/ottabase-template-app-nextjs-homepage/app/layout-shell.tsx b/apps/ottabase-template-app-nextjs-homepage/app/layout-shell.tsx index 5fbb9a54c..69e7325a2 100644 --- a/apps/ottabase-template-app-nextjs-homepage/app/layout-shell.tsx +++ b/apps/ottabase-template-app-nextjs-homepage/app/layout-shell.tsx @@ -1,22 +1,31 @@ 'use client'; -import { Footer } from '../components/Footer'; -import { Navbar } from '../components/Navbar'; +import { SlotRenderer } from '../components/SlotRenderer'; const GITHUB_URL = 'https://github.com/thinkdj/ottabase'; -const FOOTER_LINKS = [ - { href: '/about', label: 'About' }, - { href: '/theme-demo', label: 'Themes' }, - { href: GITHUB_URL, label: 'GitHub', external: true }, -]; +const NAVBAR_DATA = { + title: 'Ottabase', + githubUrl: GITHUB_URL, +}; + +const FOOTER_DATA = { + siteName: 'Ottabase', + tagline: 'Built with Next.js & Cloudflare Workers', + links: [ + { href: '/about', label: 'About' }, + { href: '/theme-demo', label: 'Themes' }, + { href: '/homepage-config', label: 'Config' }, + { href: GITHUB_URL, label: 'GitHub', external: true }, + ], +}; export function LayoutShell({ children }: { children: React.ReactNode }) { return ( <> - +
{children}
-