diff --git a/src/App.tsx b/src/App.tsx index 18daf2e..ece18eb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,6 +4,16 @@ import { TooltipProvider } from "@/components/ui/tooltip"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { BrowserRouter, Routes, Route } from "react-router-dom"; import Index from "./pages/Index"; +import Themes from "./pages/Themes"; +import Puzzles from "./pages/Puzzles"; +import Miscellany from "./pages/Miscellany"; +import SchoolConnect from "./pages/theme-pages/SchoolConnect"; +import DiscreteMath from "./pages/theme-pages/DiscreteMath"; +import SocialChoice from "./pages/theme-pages/SocialChoice"; +import AdvancedAlgorithms from "./pages/theme-pages/AdvancedAlgorithms"; +import DataStructures from "./pages/theme-pages/DataStructures"; +import Games from "./pages/theme-pages/Games"; +import CardsMath from "./pages/theme-pages/CardsMath"; import NotFound from "./pages/NotFound"; const queryClient = new QueryClient(); @@ -16,6 +26,19 @@ const App = () => ( } /> + } /> + } /> + } /> + + {/* Theme-specific routes */} + } /> + } /> + } /> + } /> + } /> + } /> + } /> + {/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */} } /> diff --git a/src/components/ComingSoon.tsx b/src/components/ComingSoon.tsx new file mode 100644 index 0000000..595fe04 --- /dev/null +++ b/src/components/ComingSoon.tsx @@ -0,0 +1,55 @@ +import { Link } from "react-router-dom"; +import { ArrowLeft, Wrench } from "lucide-react"; +import { Button } from "@/components/ui/button"; + +interface ComingSoonProps { + title: string; + description?: string; +} + +const ComingSoon = ({ title, description }: ComingSoonProps) => { + return ( +
+
+
+ +
+ +

+ {title} +

+ +

+ Coming Soon +

+ +

+ {description || + "We're working hard to bring you amazing interactive educational content. This section will be filled with engaging puzzles, tools, and resources to enhance your learning experience." + } +

+ +
+

+ Want to be notified when this section launches? We're building something special that will include: +

+
    +
  • • Interactive learning modules
  • +
  • • Real-time collaboration tools
  • +
  • • Progress tracking and analytics
  • +
  • • Customizable difficulty levels
  • +
+
+ + +
+
+ ); +}; + +export default ComingSoon; \ No newline at end of file diff --git a/src/components/InteractiveCard.tsx b/src/components/InteractiveCard.tsx new file mode 100644 index 0000000..941a166 --- /dev/null +++ b/src/components/InteractiveCard.tsx @@ -0,0 +1,104 @@ +import { Badge } from "@/components/ui/badge"; +import { ArrowRight, Clock, Users } from "lucide-react"; +import { cn } from "@/lib/utils"; + +interface InteractiveCardProps { + title: string; + description: string; + tags: string[]; + difficulty?: "Beginner" | "Intermediate" | "Advanced"; + duration?: string; + participants?: string; + imageUrl?: string; + onClick?: () => void; + className?: string; +} + +const InteractiveCard = ({ + title, + description, + tags, + difficulty, + duration, + participants, + imageUrl, + onClick, + className +}: InteractiveCardProps) => { + const difficultyColors = { + Beginner: "bg-green-100 text-green-800", + Intermediate: "bg-yellow-100 text-yellow-800", + Advanced: "bg-red-100 text-red-800" + }; + + return ( +
+ {imageUrl && ( +
+ {title} +
+ )} + +
+
+

+ {title} +

+ +
+ +

+ {description} +

+ +
+ {duration && ( +
+ + {duration} +
+ )} + {participants && ( +
+ + {participants} +
+ )} +
+ +
+ {difficulty && ( + + {difficulty} + + )} + {tags.slice(0, 3).map((tag) => ( + + {tag} + + ))} + {tags.length > 3 && ( + + +{tags.length - 3} + + )} +
+
+
+ ); +}; + +export default InteractiveCard; \ No newline at end of file diff --git a/src/components/Navigation.tsx b/src/components/Navigation.tsx new file mode 100644 index 0000000..23bf3da --- /dev/null +++ b/src/components/Navigation.tsx @@ -0,0 +1,52 @@ +import { Link, useLocation } from "react-router-dom"; +import { cn } from "@/lib/utils"; + +const Navigation = () => { + const location = useLocation(); + + const navItems = [ + { name: "Themes", path: "/themes" }, + { name: "Puzzles", path: "/puzzles" }, + { name: "Miscellany", path: "/miscellany" } + ]; + + return ( + + ); +}; + +export default Navigation; \ No newline at end of file diff --git a/src/components/ThemeCard.tsx b/src/components/ThemeCard.tsx new file mode 100644 index 0000000..8b78a17 --- /dev/null +++ b/src/components/ThemeCard.tsx @@ -0,0 +1,42 @@ +import { Link } from "react-router-dom"; +import { ArrowRight } from "lucide-react"; +import { cn } from "@/lib/utils"; + +interface ThemeCardProps { + title: string; + description: string; + path: string; + icon?: React.ReactNode; + className?: string; +} + +const ThemeCard = ({ title, description, path, icon, className }: ThemeCardProps) => { + return ( + +
+
+ {icon && ( +
+ {icon} +
+ )} +

+ {title} +

+

+ {description} +

+
+ +
+ + ); +}; + +export default ThemeCard; \ No newline at end of file diff --git a/src/index.css b/src/index.css index 02c3260..afe2aa9 100644 --- a/src/index.css +++ b/src/index.css @@ -8,33 +8,48 @@ All colors MUST be HSL. @layer base { :root { - --background: 0 0% 100%; - --foreground: 222.2 84% 4.9%; + /* Clean, geometric aesthetic inspired by anytype */ + --background: 0 0% 98%; + --foreground: 220 13% 18%; --card: 0 0% 100%; - --card-foreground: 222.2 84% 4.9%; + --card-foreground: 220 13% 18%; --popover: 0 0% 100%; - --popover-foreground: 222.2 84% 4.9%; + --popover-foreground: 220 13% 18%; - --primary: 222.2 47.4% 11.2%; - --primary-foreground: 210 40% 98%; + --primary: 220 13% 18%; + --primary-foreground: 0 0% 98%; - --secondary: 210 40% 96.1%; - --secondary-foreground: 222.2 47.4% 11.2%; + --secondary: 220 13% 91%; + --secondary-foreground: 220 13% 18%; - --muted: 210 40% 96.1%; - --muted-foreground: 215.4 16.3% 46.9%; + --muted: 220 13% 96%; + --muted-foreground: 220 9% 46%; - --accent: 210 40% 96.1%; - --accent-foreground: 222.2 47.4% 11.2%; + --accent: 346 77% 49%; + --accent-foreground: 0 0% 98%; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 40% 98%; + --destructive: 0 84% 60%; + --destructive-foreground: 0 0% 98%; - --border: 214.3 31.8% 91.4%; - --input: 214.3 31.8% 91.4%; - --ring: 222.2 84% 4.9%; + --border: 220 13% 91%; + --input: 220 13% 91%; + --ring: 220 13% 18%; + + /* Custom design tokens for the boxy aesthetic */ + --surface: 0 0% 100%; + --surface-variant: 220 13% 96%; + --outline: 220 13% 87%; + --outline-variant: 220 13% 91%; + + /* Gradients for visual interest */ + --gradient-primary: linear-gradient(135deg, hsl(346 77% 49%) 0%, hsl(346 77% 45%) 100%); + --gradient-secondary: linear-gradient(135deg, hsl(220 13% 96%) 0%, hsl(220 13% 91%) 100%); + + /* Shadows for depth */ + --shadow-card: 0 1px 3px hsl(220 13% 18% / 0.1), 0 1px 2px hsl(220 13% 18% / 0.06); + --shadow-card-hover: 0 4px 6px hsl(220 13% 18% / 0.1), 0 2px 4px hsl(220 13% 18% / 0.06); --radius: 0.5rem; @@ -56,33 +71,42 @@ All colors MUST be HSL. } .dark { - --background: 222.2 84% 4.9%; - --foreground: 210 40% 98%; + --background: 220 13% 9%; + --foreground: 220 13% 98%; - --card: 222.2 84% 4.9%; - --card-foreground: 210 40% 98%; + --card: 220 13% 11%; + --card-foreground: 220 13% 98%; - --popover: 222.2 84% 4.9%; - --popover-foreground: 210 40% 98%; + --popover: 220 13% 11%; + --popover-foreground: 220 13% 98%; - --primary: 210 40% 98%; - --primary-foreground: 222.2 47.4% 11.2%; + --primary: 220 13% 98%; + --primary-foreground: 220 13% 9%; - --secondary: 217.2 32.6% 17.5%; - --secondary-foreground: 210 40% 98%; + --secondary: 220 13% 15%; + --secondary-foreground: 220 13% 98%; - --muted: 217.2 32.6% 17.5%; - --muted-foreground: 215 20.2% 65.1%; + --muted: 220 13% 15%; + --muted-foreground: 220 9% 63%; - --accent: 217.2 32.6% 17.5%; - --accent-foreground: 210 40% 98%; + --accent: 346 77% 49%; + --accent-foreground: 0 0% 98%; - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 40% 98%; + --destructive: 0 84% 60%; + --destructive-foreground: 0 0% 98%; - --border: 217.2 32.6% 17.5%; - --input: 217.2 32.6% 17.5%; - --ring: 212.7 26.8% 83.9%; + --border: 220 13% 15%; + --input: 220 13% 15%; + --ring: 220 13% 91%; + + /* Dark mode custom tokens */ + --surface: 220 13% 11%; + --surface-variant: 220 13% 15%; + --outline: 220 13% 23%; + --outline-variant: 220 13% 19%; + + --shadow-card: 0 1px 3px hsl(220 13% 0% / 0.2), 0 1px 2px hsl(220 13% 0% / 0.12); + --shadow-card-hover: 0 4px 6px hsl(220 13% 0% / 0.2), 0 2px 4px hsl(220 13% 0% / 0.12); --sidebar-background: 240 5.9% 10%; --sidebar-foreground: 240 4.8% 95.9%; --sidebar-primary: 224.3 76.3% 48%; diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index 99637ff..d5d1819 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -1,12 +1,123 @@ -// Update this page (the content is just a fallback if you fail to update the page) +import { Link } from "react-router-dom"; +import { Button } from "@/components/ui/button"; +import { ArrowRight, BookOpen, Puzzle, Sparkles } from "lucide-react"; +import Navigation from "@/components/Navigation"; const Index = () => { return ( -
-
-

Welcome to Your Blank App

-

Start building your amazing project here!

-
+
+ + + {/* Hero Section */} +
+
+
+
+ +
+

+ Interactive Learning + Made Simple +

+

+ Discover a collection of interactive educational tools designed to supplement lectures and enhance understanding across multiple disciplines. From discrete mathematics to social choice theory. +

+
+ +
+ + +
+
+
+ + {/* Feature Cards */} +
+
+

+ What You'll Find Here +

+ +
+
+
+ +
+

Educational Themes

+

+ Comprehensive interactive modules covering computer science, mathematics, and algorithm design fundamentals. +

+
+ +
+
+ +
+

Interactive Puzzles

+

+ Engaging problem-solving activities that reinforce theoretical concepts through hands-on practice. +

+
+ +
+
+ +
+

Creative Tools

+

+ Unique educational experiments and miscellaneous interactive content to spark curiosity and creativity. +

+
+
+
+
+ + {/* CTA Section */} +
+
+

+ Ready to Start Learning? +

+

+ Choose your path and dive into interactive educational content designed to make complex concepts accessible and engaging. +

+ +
+ + + + + +
+
+
); }; diff --git a/src/pages/Miscellany.tsx b/src/pages/Miscellany.tsx new file mode 100644 index 0000000..8ca6a39 --- /dev/null +++ b/src/pages/Miscellany.tsx @@ -0,0 +1,12 @@ +import ComingSoon from "@/components/ComingSoon"; + +const Miscellany = () => { + return ( + + ); +}; + +export default Miscellany; \ No newline at end of file diff --git a/src/pages/Puzzles.tsx b/src/pages/Puzzles.tsx new file mode 100644 index 0000000..3fe49a8 --- /dev/null +++ b/src/pages/Puzzles.tsx @@ -0,0 +1,12 @@ +import ComingSoon from "@/components/ComingSoon"; + +const Puzzles = () => { + return ( + + ); +}; + +export default Puzzles; \ No newline at end of file diff --git a/src/pages/Themes.tsx b/src/pages/Themes.tsx new file mode 100644 index 0000000..ce1f686 --- /dev/null +++ b/src/pages/Themes.tsx @@ -0,0 +1,109 @@ +import { + GraduationCap, + Binary, + Users, + Cpu, + Database, + Gamepad2, + CreditCard, + Calculator +} from "lucide-react"; +import Navigation from "@/components/Navigation"; +import ThemeCard from "@/components/ThemeCard"; + +const Themes = () => { + const themes = [ + { + title: "School Connect", + description: "Interactive tools designed to bridge theoretical concepts with practical applications in educational settings.", + path: "/themes/school-connect", + icon: + }, + { + title: "Discrete Math", + description: "Explore fundamental concepts in discrete mathematics through visual and interactive demonstrations.", + path: "/themes/discrete-math", + icon: + }, + { + title: "Social Choice", + description: "Understand voting systems, fairness criteria, and collective decision-making through interactive simulations.", + path: "/themes/social-choice", + icon: + }, + { + title: "Advanced Algorithms", + description: "Deep dive into complex algorithmic concepts with step-by-step visualizations and performance analysis.", + path: "/themes/advanced-algorithms", + icon: + }, + { + title: "Data Structures", + description: "Master fundamental and advanced data structures through interactive manipulation and visualization.", + path: "/themes/data-structures", + icon: + }, + { + title: "Games", + description: "Learn through play with educational games that reinforce computer science and mathematical concepts.", + path: "/themes/games", + icon: + }, + { + title: "Cards and Math", + description: "Discover mathematical principles and probability theory through card games and interactive demonstrations.", + path: "/themes/cards-math", + icon: + } + ]; + + return ( +
+ + +
+
+
+
+ +
+

+ Educational Themes +

+

+ Explore our collection of interactive educational modules, each focusing on a specific area of study. + These themes provide structured pathways through complex topics with hands-on learning experiences. +

+
+ +
+ {themes.map((theme) => ( + + ))} +
+ +
+
+

+ More Themes Coming Soon +

+

+ We're continuously developing new interactive themes to cover more educational topics. + Each theme will include multiple interactive modules, assessments, and practical exercises + to enhance your learning experience. +

+
+
+
+
+
+ ); +}; + +export default Themes; \ No newline at end of file diff --git a/src/pages/theme-pages/AdvancedAlgorithms.tsx b/src/pages/theme-pages/AdvancedAlgorithms.tsx new file mode 100644 index 0000000..3d10533 --- /dev/null +++ b/src/pages/theme-pages/AdvancedAlgorithms.tsx @@ -0,0 +1,12 @@ +import ComingSoon from "@/components/ComingSoon"; + +const AdvancedAlgorithms = () => { + return ( + + ); +}; + +export default AdvancedAlgorithms; \ No newline at end of file diff --git a/src/pages/theme-pages/CardsMath.tsx b/src/pages/theme-pages/CardsMath.tsx new file mode 100644 index 0000000..fceb74a --- /dev/null +++ b/src/pages/theme-pages/CardsMath.tsx @@ -0,0 +1,12 @@ +import ComingSoon from "@/components/ComingSoon"; + +const CardsMath = () => { + return ( + + ); +}; + +export default CardsMath; \ No newline at end of file diff --git a/src/pages/theme-pages/DataStructures.tsx b/src/pages/theme-pages/DataStructures.tsx new file mode 100644 index 0000000..6b05598 --- /dev/null +++ b/src/pages/theme-pages/DataStructures.tsx @@ -0,0 +1,12 @@ +import ComingSoon from "@/components/ComingSoon"; + +const DataStructures = () => { + return ( + + ); +}; + +export default DataStructures; \ No newline at end of file diff --git a/src/pages/theme-pages/DiscreteMath.tsx b/src/pages/theme-pages/DiscreteMath.tsx new file mode 100644 index 0000000..7e0b99f --- /dev/null +++ b/src/pages/theme-pages/DiscreteMath.tsx @@ -0,0 +1,12 @@ +import ComingSoon from "@/components/ComingSoon"; + +const DiscreteMath = () => { + return ( + + ); +}; + +export default DiscreteMath; \ No newline at end of file diff --git a/src/pages/theme-pages/Games.tsx b/src/pages/theme-pages/Games.tsx new file mode 100644 index 0000000..8cb70fa --- /dev/null +++ b/src/pages/theme-pages/Games.tsx @@ -0,0 +1,12 @@ +import ComingSoon from "@/components/ComingSoon"; + +const Games = () => { + return ( + + ); +}; + +export default Games; \ No newline at end of file diff --git a/src/pages/theme-pages/SchoolConnect.tsx b/src/pages/theme-pages/SchoolConnect.tsx new file mode 100644 index 0000000..54f3af9 --- /dev/null +++ b/src/pages/theme-pages/SchoolConnect.tsx @@ -0,0 +1,12 @@ +import ComingSoon from "@/components/ComingSoon"; + +const SchoolConnect = () => { + return ( + + ); +}; + +export default SchoolConnect; \ No newline at end of file diff --git a/src/pages/theme-pages/SocialChoice.tsx b/src/pages/theme-pages/SocialChoice.tsx new file mode 100644 index 0000000..5886fae --- /dev/null +++ b/src/pages/theme-pages/SocialChoice.tsx @@ -0,0 +1,12 @@ +import ComingSoon from "@/components/ComingSoon"; + +const SocialChoice = () => { + return ( + + ); +}; + +export default SocialChoice; \ No newline at end of file diff --git a/tailwind.config.ts b/tailwind.config.ts index 8706086..b821551 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -52,6 +52,10 @@ export default { DEFAULT: 'hsl(var(--card))', foreground: 'hsl(var(--card-foreground))' }, + surface: 'hsl(var(--surface))', + 'surface-variant': 'hsl(var(--surface-variant))', + outline: 'hsl(var(--outline))', + 'outline-variant': 'hsl(var(--outline-variant))', sidebar: { DEFAULT: 'hsl(var(--sidebar-background))', foreground: 'hsl(var(--sidebar-foreground))', @@ -68,6 +72,14 @@ export default { md: 'calc(var(--radius) - 2px)', sm: 'calc(var(--radius) - 4px)' }, + boxShadow: { + 'card': 'var(--shadow-card)', + 'card-hover': 'var(--shadow-card-hover)', + }, + backgroundImage: { + 'gradient-primary': 'var(--gradient-primary)', + 'gradient-secondary': 'var(--gradient-secondary)', + }, keyframes: { 'accordion-down': { from: {