import type { Metadata } from "next"; import { notFound } from "next/navigation"; import { getPatternTutorial } from "@/lib/api"; import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; import { CodeBlock } from "@/components/ui/code-block"; import { Markdown } from "@/components/ui/markdown"; import { Callout } from "@/components/ui/callout"; import { Badge } from "@/components/ui/badge"; import { CommonMistakesList, LearningProgression, PatternVariations, RecognitionSignals, RelatedPatterns, } from "@/components/patterns"; import { PatternVisualization } from "@/components/visualization"; import { TwoPointersVisualization, PrefixSumVisualization, LinkedListVisualization, MonotonicStackVisualization, TreeTraversalVisualization, BFSVisualization, DFSVisualization, CoinChangeVisualization, BacktrackingVisualization, HeapVisualization } from "@/components/visualizations-new"; import { twoSumAlgorithm } from "@/content/algorithms/two-sum"; import { slidingWindowAlgorithm } from "@/content/algorithms/sliding-window"; import { binarySearchAlgorithm } from "@/content/algorithms/binary-search"; import { prefixSumAlgorithm } from "@/content/algorithms/prefix-sum"; import { fastSlowPointersAlgorithm } from "@/content/algorithms/fast-slow-pointers"; import { linkedListReversalAlgorithm } from "@/content/algorithms/linkedlist-reversal"; import { monotonicStackAlgorithm } from "@/content/algorithms/monotonic-stack"; import { treeTraversalAlgorithm } from "@/content/algorithms/tree-traversal"; import { bfsAlgorithm } from "@/content/algorithms/bfs"; import { dfsAlgorithm } from "@/content/algorithms/dfs"; import { coinChangeAlgorithm } from "@/content/algorithms/coin-change"; import { subsetsAlgorithm } from "@/content/algorithms/subsets"; import { kthLargestAlgorithm } from "@/content/algorithms/kth-largest"; interface PageProps { params: Promise<{ slug: string }>; } export async function generateMetadata({ params }: PageProps): Promise { const { slug } = await params; try { const pattern = await getPatternTutorial(slug); const description = pattern.description || `Learn the ${pattern.name} pattern with ${pattern.question_count} practice problems.`; return { title: `${pattern.name} Pattern`, description, openGraph: { title: `${pattern.name} Pattern | CodeTutor`, description, type: "article", }, }; } catch { return { title: "Pattern Not Found", }; } } export default async function PatternDetailPage({ params }: PageProps) { const { slug } = await params; let pattern; try { pattern = await getPatternTutorial(slug); } catch { notFound(); } const difficultyLabels = ["Beginner", "Easy", "Intermediate", "Advanced", "Expert"]; const difficultyLabel = pattern.difficulty_level ? difficultyLabels[pattern.difficulty_level - 1] || "Intermediate" : null; return (
{/* Header */}

{pattern.name}

{difficultyLabel && ( {difficultyLabel} )}

{pattern.question_count} questions using this pattern

{/* Description */} {pattern.description && ( What is {pattern.name}? {pattern.description} )} {/* Metaphor - The relatable analogy */} {pattern.metaphor && ( {pattern.metaphor} )} {/* Core Concept - The "aha!" insight */} {pattern.core_concept && ( Core Concept {pattern.core_concept} )} {/* Interactive Visualization */} {slug === "two-pointers" ? ( ) : slug === "sliding-window" ? ( ) : slug === "binary-search" ? ( ) : slug === "prefix-sum" ? ( ) : slug === "fast-slow-pointers" ? ( ) : slug === "linkedlist-reversal" ? ( ) : slug === "monotonic-stack" ? ( ) : slug === "tree-traversal" ? ( ) : slug === "bfs" ? ( ) : slug === "dfs" ? ( ) : slug === "dynamic-programming" ? ( ) : slug === "backtracking" ? ( ) : slug === "heap" ? ( ) : pattern.visualization_examples && pattern.visualization_examples.length > 0 ? ( Interactive Visualization ) : null} {/* Static Visualization - ASCII diagram walkthrough (fallback) */} {pattern.visualization && ( Visual Walkthrough {pattern.visualization} )} {/* Code Template */} {pattern.code_template && ( Code Template

Use this skeleton as a starting point for problems using this pattern:

)} {/* Recognition Signals */} {pattern.recognition_signals && pattern.recognition_signals.length > 0 && ( )} {/* When to Use */} {pattern.when_to_use && ( When to Use {pattern.when_to_use} )} {/* Common Mistakes */} {pattern.common_mistakes && pattern.common_mistakes.length > 0 && ( )} {/* Pattern Variations */} {pattern.variations && pattern.variations.length > 0 && ( )} {/* Learning Progression */} {pattern.learning_progression && ( )} {/* Related Patterns */}
{pattern.prerequisite_patterns && pattern.prerequisite_patterns.length > 0 && ( )} {pattern.related_patterns && pattern.related_patterns.length > 0 && ( )}
); }