docs: movie-corner implementation plan
This commit is contained in:
199
docs/superpowers/plans/2026-05-04-movie-corner.md
Normal file
199
docs/superpowers/plans/2026-05-04-movie-corner.md
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
# Movie Corner Implementation Plan
|
||||||
|
|
||||||
|
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||||
|
|
||||||
|
**Goal:** Add a `/movie-corner` page with a cinematic hero section and a full-height iframe embedding the external movie reviews site.
|
||||||
|
|
||||||
|
**Architecture:** Two-task implementation — navbar link first, then the page itself. The page is a single static component: a fixed-height hero section followed by an iframe that grows to fill all remaining viewport height via flexbox.
|
||||||
|
|
||||||
|
**Tech Stack:** Next.js 15 (App Router), Tailwind CSS v4, TypeScript
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## File Map
|
||||||
|
|
||||||
|
| File | Action | Responsibility |
|
||||||
|
|---|---|---|
|
||||||
|
| `components/navbar.tsx` | Modify | Add "Movie Corner" nav link |
|
||||||
|
| `app/movie-corner/page.tsx` | Create | Full page: metadata + hero + iframe |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Task 1: Add "Movie Corner" to the navbar
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `components/navbar.tsx`
|
||||||
|
|
||||||
|
The `navLinks` array currently has: Home, K-Suite, Projects, Blog, About. Insert Movie Corner between Projects and Blog.
|
||||||
|
|
||||||
|
- [ ] **Step 1: Edit `components/navbar.tsx`**
|
||||||
|
|
||||||
|
Find this block:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const navLinks = [
|
||||||
|
{ href: "/", label: "Home" },
|
||||||
|
{ href: "/k-suite", label: "K-Suite" },
|
||||||
|
{ href: "/projects", label: "Projects" },
|
||||||
|
{
|
||||||
|
href: "https://blog.gabrielkaszewski.dev/",
|
||||||
|
label: "Blog",
|
||||||
|
external: true,
|
||||||
|
},
|
||||||
|
{ href: "/about", label: "About" },
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace with:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const navLinks = [
|
||||||
|
{ href: "/", label: "Home" },
|
||||||
|
{ href: "/k-suite", label: "K-Suite" },
|
||||||
|
{ href: "/projects", label: "Projects" },
|
||||||
|
{ href: "/movie-corner", label: "Movie Corner" },
|
||||||
|
{
|
||||||
|
href: "https://blog.gabrielkaszewski.dev/",
|
||||||
|
label: "Blog",
|
||||||
|
external: true,
|
||||||
|
},
|
||||||
|
{ href: "/about", label: "About" },
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 2: Type-check**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx tsc --noEmit
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected: no errors.
|
||||||
|
|
||||||
|
- [ ] **Step 3: Commit**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add components/navbar.tsx
|
||||||
|
git commit -m "feat: add Movie Corner to navbar"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Task 2: Create the Movie Corner page
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Create: `app/movie-corner/page.tsx`
|
||||||
|
|
||||||
|
The page is a `min-h-screen flex flex-col` container with `pt-20 gravity-body` (matching all other pages). The hero takes its natural height; the iframe section has `flex-1` so it fills the rest.
|
||||||
|
|
||||||
|
- [ ] **Step 1: Create `app/movie-corner/page.tsx`**
|
||||||
|
|
||||||
|
```tsx
|
||||||
|
import { Metadata } from "next";
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "Movie Corner | Gabriel Kaszewski",
|
||||||
|
description:
|
||||||
|
"My personal cinema journal — what I watch and how I feel about it.",
|
||||||
|
};
|
||||||
|
|
||||||
|
const MOVIE_REVIEWS_URL =
|
||||||
|
"https://movies.gabrielkaszewski.dev/users/5d253151-0f6a-4246-9bc5-cb0b5869731b";
|
||||||
|
|
||||||
|
const genres = ["Sci-Fi", "Drama", "Family"];
|
||||||
|
|
||||||
|
export default function MovieCornerPage() {
|
||||||
|
return (
|
||||||
|
<div className="min-h-screen flex flex-col pt-20 gravity-body">
|
||||||
|
<section className="py-12 px-4 text-center relative">
|
||||||
|
<div className="absolute inset-0 flex justify-center pointer-events-none">
|
||||||
|
<div className="w-64 h-32 bg-yellow-400/10 blur-3xl rounded-full mt-4" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="relative">
|
||||||
|
<div className="text-5xl mb-4">🎬</div>
|
||||||
|
|
||||||
|
<h1 className="text-4xl md:text-6xl font-bold tracking-widest text-yellow-400 uppercase mb-3">
|
||||||
|
Movie Corner
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p className="text-white/60 text-base md:text-lg mb-8">
|
||||||
|
What I watch, what I think. A personal cinema journal.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<blockquote className="border-l-2 border-yellow-400/50 bg-white/5 backdrop-blur-sm rounded-r-lg px-6 py-4 max-w-xl mx-auto text-left mb-8">
|
||||||
|
<p className="text-white/80 text-sm italic leading-relaxed mb-2">
|
||||||
|
“I'd only give one piece of advice to anyone marrying.
|
||||||
|
We're all quite similar in the end. We all get old and tell
|
||||||
|
the same tales too many times. But try and marry someone
|
||||||
|
kind.”
|
||||||
|
</p>
|
||||||
|
<cite className="text-yellow-400/70 text-xs not-italic">
|
||||||
|
— About Time, 2013
|
||||||
|
</cite>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<div className="flex justify-center gap-3 flex-wrap">
|
||||||
|
{genres.map((genre, i) => (
|
||||||
|
<span
|
||||||
|
key={genre}
|
||||||
|
className={`px-4 py-1.5 rounded-full text-sm border ${
|
||||||
|
i === 0
|
||||||
|
? "bg-yellow-400/10 border-yellow-400/40 text-yellow-400"
|
||||||
|
: "bg-white/5 border-white/15 text-white/70"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{genre}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section className="flex-1 flex flex-col border-t border-white/10 min-h-0">
|
||||||
|
<iframe
|
||||||
|
src={MOVIE_REVIEWS_URL}
|
||||||
|
title="Gabriel's Movie Reviews"
|
||||||
|
className="flex-1 w-full min-h-0"
|
||||||
|
/>
|
||||||
|
<div className="py-3 text-center">
|
||||||
|
<a
|
||||||
|
href={MOVIE_REVIEWS_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="text-yellow-400/70 text-xs hover:text-yellow-400 transition-colors"
|
||||||
|
>
|
||||||
|
Open reviews directly →
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 2: Type-check**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx tsc --noEmit
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected: no errors.
|
||||||
|
|
||||||
|
- [ ] **Step 3: Verify dev server renders the page**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bun run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Open `http://localhost:3000/movie-corner`. Verify:
|
||||||
|
- Navbar shows "Movie Corner" highlighted in yellow
|
||||||
|
- Hero: 🎬 icon, "MOVIE CORNER" title in yellow, tagline, quote card with left yellow border, three genre chips (Sci-Fi yellow, Drama + Family glass)
|
||||||
|
- Iframe fills remaining screen height with the movie reviews site
|
||||||
|
- "Open reviews directly →" link visible at the bottom
|
||||||
|
|
||||||
|
- [ ] **Step 4: Commit**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add app/movie-corner/page.tsx
|
||||||
|
git commit -m "feat: add movie-corner page with cinematic hero and embedded reviews"
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user