diff --git a/app/app/billing/page.tsx b/app/app/billing/page.tsx
new file mode 100644
index 0000000..a410601
--- /dev/null
+++ b/app/app/billing/page.tsx
@@ -0,0 +1,151 @@
+"use client";
+
+import { Check } from "lucide-react";
+
+export default function BillingPage() {
+ const plans = [
+ {
+ name: "Free",
+ price: "$0",
+ description: "Perfect for getting started",
+ features: [
+ "10 messages/month",
+ "Access to featured characters",
+ "Basic support",
+ ],
+ current: true,
+ },
+ {
+ name: "Pro",
+ price: "$9.99",
+ period: "/month",
+ description: "For serious enthusiasts",
+ features: [
+ "Unlimited messages",
+ "Priority character creation",
+ "Custom characters",
+ "Ad-free experience",
+ "Priority support",
+ ],
+ current: false,
+ },
+ {
+ name: "Premium",
+ price: "$29.99",
+ period: "/month",
+ description: "Maximum experience",
+ features: [
+ "Everything in Pro",
+ "Advanced AI models",
+ "Character voice customization",
+ "Private character storage",
+ "White-label options",
+ "24/7 VIP support",
+ ],
+ current: false,
+ },
+ ];
+
+ return (
+
+ {/* Header */}
+
+
Billing & Plans
+
Manage your subscription
+
+
+ {/* Current Plan */}
+
+
CURRENT PLAN
+
Free Plan
+
You're currently on the free plan
+
+
+ {/* Plans Grid */}
+
+ {plans.map((plan, index) => (
+
+ {/* Badge */}
+ {plan.current && (
+
+ Current Plan
+
+ )}
+
+ {/* Plan Name */}
+
{plan.name}
+
{plan.description}
+
+ {/* Price */}
+
+ {plan.price}
+ {plan.period && {plan.period}}
+
+
+ {/* CTA */}
+
+
+ {/* Features */}
+
+ {plan.features.map((feature, idx) => (
+ -
+
+ {feature}
+
+ ))}
+
+
+ ))}
+
+
+ {/* Billing History */}
+
+
Billing History
+
+
+
+
+ | Date |
+ Description |
+ Amount |
+ Status |
+
+
+
+ {[
+ { date: "Dec 1, 2024", desc: "Free Plan", amount: "$0.00", status: "Active" },
+ ].map((row, idx) => (
+
+ | {row.date} |
+ {row.desc} |
+ {row.amount} |
+
+
+ {row.status}
+
+ |
+
+ ))}
+
+
+
+
+
+ );
+}
diff --git a/app/app/create/page.tsx b/app/app/create/page.tsx
new file mode 100644
index 0000000..e441160
--- /dev/null
+++ b/app/app/create/page.tsx
@@ -0,0 +1,207 @@
+"use client";
+
+import { Upload, Wand2, Save, X } from "lucide-react";
+import { useState } from "react";
+
+export default function CreatePage() {
+ const [characterData, setCharacterData] = useState({
+ name: "",
+ avatar: "",
+ description: "",
+ personality: "",
+ category: "Fantasy",
+ });
+
+ const [step, setStep] = useState(1);
+
+ const handleChange = (e: React.ChangeEvent) => {
+ const { name, value } = e.target;
+ setCharacterData((prev) => ({ ...prev, [name]: value }));
+ };
+
+ const handleNext = () => {
+ if (step < 4) setStep(step + 1);
+ };
+
+ const handlePrev = () => {
+ if (step > 1) setStep(step - 1);
+ };
+
+ return (
+
+ {/* Header */}
+
+
Create Character
+
Build your own AI character in 4 simple steps
+
+
+ {/* Progress */}
+
+ {[1, 2, 3, 4].map((num) => (
+
+ ))}
+
+
+ {/* Form */}
+
+ {/* Step 1: Basic Info */}
+ {step === 1 && (
+
+
+
+
+
+
+
+
+
+
+
+
+ Give your character a unique name and choose a category that best fits their personality.
+
+
+ )}
+
+ {/* Step 2: Avatar */}
+ {step === 2 && (
+
+
+
+
+ {/* Preview */}
+
+ ✨
+
+
+ {/* Upload Options */}
+
+
+
+
+
+
+
+ )}
+
+ {/* Step 3: Description */}
+ {step === 3 && (
+
+
+
+
+
+
+
+
+
+
+
+ )}
+
+ {/* Step 4: Review */}
+ {step === 4 && (
+
+
+
+
+ ✨
+
+
+
{characterData.name || "Character Name"}
+
{characterData.category}
+
+
+
+
+
+ Description:{" "}
+ {characterData.description || "No description provided"}
+
+
+
+
+
+ Personality:{" "}
+ {characterData.personality || "No personality traits provided"}
+
+
+
+
+
+ Review your character and click "Publish" to make them available to the community!
+
+
+ )}
+
+ {/* Actions */}
+
+
+ {step < 4 ? (
+
+ ) : (
+
+ )}
+
+
+
+ );
+}
diff --git a/app/app/favorites/page.tsx b/app/app/favorites/page.tsx
new file mode 100644
index 0000000..bc512fc
--- /dev/null
+++ b/app/app/favorites/page.tsx
@@ -0,0 +1,80 @@
+"use client";
+
+import { Heart, MessageCircle, Share2, Trash2 } from "lucide-react";
+
+function generateFavorites() {
+ const characters = [
+ { id: 1, name: "Luna", avatar: "🌙", category: "Fantasy", messages: 250 },
+ { id: 2, name: "Alex", avatar: "⚡", category: "Sci-Fi", messages: 180 },
+ { id: 3, name: "Sage", avatar: "🧙", category: "Fantasy", messages: 340 },
+ ];
+ return characters;
+}
+
+export default function FavoritesPage() {
+ const favorites = generateFavorites();
+
+ return (
+
+ {/* Header */}
+
+
Favorites
+
{favorites.length} favorite characters
+
+
+ {/* Grid */}
+
+ {favorites.map((char) => (
+
+ {/* Character Card */}
+
+ {char.avatar}
+
+
+
+ {/* Content */}
+
+
+
{char.name}
+
{char.category} Character
+
+
+ {/* Stats */}
+
+
+
+ {char.messages} messages
+
+
+
+ {/* Actions */}
+
+
+
+
+
+
+
+ ))}
+
+
+ {favorites.length === 0 && (
+
+
+
No favorite characters yet
+
+ )}
+
+ );
+}
diff --git a/app/app/layout.tsx b/app/app/layout.tsx
new file mode 100644
index 0000000..df817e3
--- /dev/null
+++ b/app/app/layout.tsx
@@ -0,0 +1,183 @@
+"use client";
+
+import { useState } from "react";
+import Link from "next/link";
+import {
+ Compass,
+ MessageCircle,
+ PlusCircle,
+ User,
+ LogOut,
+ ChevronDown,
+ Sparkles,
+ Bell,
+ Search,
+} from "lucide-react";
+
+export default function AppLayout({ children }: { children: React.ReactNode }) {
+ const [sidebarOpen, setSidebarOpen] = useState(true);
+ const [userMenuOpen, setUserMenuOpen] = useState(false);
+ const [activeTab, setActiveTab] = useState("discover");
+
+ const navigationItems = [
+ { id: "discover", label: "Discover", icon: Compass, href: "/app" },
+ { id: "roleplay", label: "Roleplay", icon: Sparkles, href: "/app/roleplay" },
+ { id: "create", label: "Create", icon: PlusCircle, href: "/app/create" },
+ { id: "messages", label: "Messages", icon: MessageCircle, href: "/app/messages" },
+ { id: "profile", label: "Profile", icon: User, href: "/app/profile" },
+ ];
+
+ return (
+
+ {/* Header */}
+
+
+ {/* Main Content */}
+
+ {/* Sidebar */}
+
+
+ {/* Main View */}
+
+ {children}
+
+
+
+ );
+}
diff --git a/app/app/messages/page.tsx b/app/app/messages/page.tsx
new file mode 100644
index 0000000..2f48f97
--- /dev/null
+++ b/app/app/messages/page.tsx
@@ -0,0 +1,120 @@
+"use client";
+
+import { MessageSquare, Trash2, MoreHorizontal } from "lucide-react";
+
+function generateMockMessages() {
+ const messages = [
+ {
+ id: 1,
+ character: "Luna",
+ avatar: "🌙",
+ preview: "That sounds interesting...",
+ timestamp: "2 hours ago",
+ unread: true,
+ },
+ {
+ id: 2,
+ character: "Alex",
+ avatar: "⚡",
+ preview: "Hey! How have you been?",
+ timestamp: "5 hours ago",
+ unread: false,
+ },
+ {
+ id: 3,
+ character: "Sage",
+ avatar: "🧙",
+ preview: "The ancient prophecy speaks of...",
+ timestamp: "Yesterday",
+ unread: false,
+ },
+ {
+ id: 4,
+ character: "Nova",
+ avatar: "✨",
+ preview: "Ready for another space adventure?",
+ timestamp: "2 days ago",
+ unread: false,
+ },
+ {
+ id: 5,
+ character: "Echo",
+ avatar: "🔮",
+ preview: "I sensed something in the shadows...",
+ timestamp: "3 days ago",
+ unread: false,
+ },
+ {
+ id: 6,
+ character: "Storm",
+ avatar: "⛈️",
+ preview: "The journey awaits us!",
+ timestamp: "1 week ago",
+ unread: false,
+ },
+ ];
+
+ return messages;
+}
+
+export default function MessagesPage() {
+ const messages = generateMockMessages();
+
+ return (
+
+ {/* Header */}
+
+
Messages
+
Your conversations with characters
+
+
+ {/* Messages List */}
+
+ {messages.map((msg) => (
+
+ {/* Avatar */}
+
+ {msg.avatar}
+
+
+ {/* Content */}
+
+
+
{msg.character}
+ {msg.unread &&
}
+
+
{msg.preview}
+
+
+ {/* Meta */}
+
+
{msg.timestamp}
+
+
+
+
+
+
+ ))}
+
+
+ {/* Empty State */}
+ {messages.length === 0 && (
+
+
+
No messages yet
+
Start a conversation with a character!
+
+ )}
+
+ );
+}
diff --git a/app/app/page.tsx b/app/app/page.tsx
new file mode 100644
index 0000000..e5e0f02
--- /dev/null
+++ b/app/app/page.tsx
@@ -0,0 +1,93 @@
+"use client";
+
+import { Heart, MessageCircle, Share2 } from "lucide-react";
+
+// Mock data generator
+function generateMockCharacters() {
+ const baseCharacters = [
+ { name: "Luna", avatar: "🌙", description: "Mysterious night elf" },
+ { name: "Alex", avatar: "⚡", description: "Energetic hacker" },
+ { name: "Sage", avatar: "🧙", description: "Wise wizard" },
+ { name: "Nova", avatar: "✨", description: "Cosmic explorer" },
+ ];
+
+ return Array.from({ length: 12 }, (_, i) => {
+ const char = baseCharacters[i % baseCharacters.length];
+ return {
+ id: i + 1,
+ ...char,
+ messages: Math.floor(Math.random() * 500) + 50,
+ likes: Math.floor(Math.random() * 1000) + 100,
+ };
+ });
+}
+
+export default function DiscoverPage() {
+ const characters = generateMockCharacters();
+
+ return (
+
+ {/* Header */}
+
+
Discover
+
Explore trending characters and conversations
+
+
+ {/* Waterfall Grid */}
+
+ {characters.map((char) => (
+
+ {/* Character Card Header */}
+
+ {char.avatar}
+
+
+ {/* Card Content */}
+
+ {/* Title */}
+
+
{char.name}
+
{char.description}
+
+
+ {/* Stats */}
+
+
+
+ {char.messages}
+
+
+
+ {char.likes}
+
+
+
+ {/* Actions */}
+
+
+
+
+
+
+
+ ))}
+
+
+ {/* Load More */}
+
+
+
+
+ );
+}
diff --git a/app/app/profile/page.tsx b/app/app/profile/page.tsx
new file mode 100644
index 0000000..ab79606
--- /dev/null
+++ b/app/app/profile/page.tsx
@@ -0,0 +1,125 @@
+"use client";
+
+import { Edit2, Copy, LogOut } from "lucide-react";
+import { useState } from "react";
+
+export default function ProfilePage() {
+ const [isEditing, setIsEditing] = useState(false);
+
+ return (
+
+ {/* Header */}
+
+
+
My Profile
+
Manage your account
+
+
+
+
+ {/* Profile Card */}
+
+ {/* Avatar & Basic Info */}
+
+

+
+
+
+
+
+
+
+
+
+ {isEditing && (
+
+ )}
+
+
+
+
+
+ {/* Email */}
+
+
+
+
Connected via Google OAuth
+
+
+ {/* Bio */}
+
+
+
+
+
+
+ {/* Stats */}
+
+
+
12
+
Favorite Characters
+
+
+
+
+
+ {/* Account Settings */}
+
+
Account Settings
+
+
+
+
+
+ {/* Logout */}
+
+
+ );
+}
diff --git a/app/app/roleplay/page.tsx b/app/app/roleplay/page.tsx
new file mode 100644
index 0000000..8b2c4e9
--- /dev/null
+++ b/app/app/roleplay/page.tsx
@@ -0,0 +1,129 @@
+"use client";
+
+import { Heart, MessageCircle, Share2, Filter } from "lucide-react";
+import { useState } from "react";
+
+function generateRoleplayCharacters() {
+ const categories = ["Fantasy", "Sci-Fi", "Romance", "Mystery", "Adventure"];
+ const baseCharacters = [
+ { name: "Luna", avatar: "🌙", category: "Fantasy" },
+ { name: "Alex", avatar: "⚡", category: "Sci-Fi" },
+ { name: "Sage", avatar: "🧙", category: "Fantasy" },
+ { name: "Nova", avatar: "✨", category: "Sci-Fi" },
+ { name: "Echo", avatar: "🔮", category: "Mystery" },
+ { name: "Storm", avatar: "⛈️", category: "Adventure" },
+ ];
+
+ return Array.from({ length: 12 }, (_, i) => {
+ const char = baseCharacters[i % baseCharacters.length];
+ return {
+ id: i + 1,
+ ...char,
+ messages: Math.floor(Math.random() * 500) + 50,
+ likes: Math.floor(Math.random() * 1000) + 100,
+ };
+ });
+}
+
+export default function RoleplayPage() {
+ const [selectedCategory, setSelectedCategory] = useState(null);
+ const characters = generateRoleplayCharacters();
+ const categories = ["Fantasy", "Sci-Fi", "Romance", "Mystery", "Adventure"];
+
+ const filtered = selectedCategory
+ ? characters.filter((c) => c.category === selectedCategory)
+ : characters;
+
+ return (
+
+ {/* Header */}
+
+
+
Roleplay
+
Immersive roleplay experiences
+
+
+ {/* Category Filter */}
+
+
+ {categories.map((cat) => (
+
+ ))}
+
+
+
+ {/* Grid */}
+
+ {filtered.map((char) => (
+
+ {/* Character Card */}
+
+
{char.avatar}
+
+ {char.category}
+
+
+
+ {/* Content */}
+
+
+
{char.name}
+
{char.category} Character
+
+
+ {/* Stats */}
+
+
+
+ {char.messages}
+
+
+
+ {char.likes}
+
+
+
+ {/* Actions */}
+
+
+
+
+
+
+ ))}
+
+
+ {filtered.length === 0 && (
+
+
No characters found in this category
+
+ )}
+
+ );
+}
diff --git a/app/app/settings/page.tsx b/app/app/settings/page.tsx
new file mode 100644
index 0000000..8a16f8e
--- /dev/null
+++ b/app/app/settings/page.tsx
@@ -0,0 +1,117 @@
+"use client";
+
+import { Save, Bell, Lock } from "lucide-react";
+import { useState } from "react";
+
+export default function SettingsPage() {
+ const [settings, setSettings] = useState({
+ emailNotifications: true,
+ pushNotifications: false,
+ marketingEmails: false,
+ publicProfile: true,
+ dataCollection: true,
+ });
+
+ const handleToggle = (key: keyof typeof settings) => {
+ setSettings((prev) => ({ ...prev, [key]: !prev[key] }));
+ };
+
+ return (
+
+ {/* Header */}
+
+
Settings
+
Manage your preferences
+
+
+ {/* Notification Settings */}
+
+
+
+
Notifications
+
+
+
+ {[
+ {
+ key: "emailNotifications" as const,
+ label: "Email Notifications",
+ desc: "Receive updates about new characters and messages",
+ },
+ {
+ key: "pushNotifications" as const,
+ label: "Push Notifications",
+ desc: "Get notifications on your device",
+ },
+ {
+ key: "marketingEmails" as const,
+ label: "Marketing Emails",
+ desc: "Receive promotional content and special offers",
+ },
+ ].map((item) => (
+
+
+
{item.label}
+
{item.desc}
+
+
+
+ ))}
+
+
+
+ {/* Privacy Settings */}
+
+
+
+
Privacy
+
+
+
+ {[
+ {
+ key: "publicProfile" as const,
+ label: "Public Profile",
+ desc: "Allow other users to see your profile",
+ },
+ {
+ key: "dataCollection" as const,
+ label: "Data Collection",
+ desc: "Allow us to collect usage data for improvements",
+ },
+ ].map((item) => (
+
+
+
{item.label}
+
{item.desc}
+
+
+
+ ))}
+
+
+
+ {/* Save Button */}
+
+
+ );
+}
diff --git a/app/globals.css b/app/globals.css
index a2dc41e..5153141 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -1,26 +1,33 @@
@import "tailwindcss";
+@tailwind utilities;
:root {
- --background: #ffffff;
- --foreground: #171717;
+ --primary: #000;
+ --secondary: #fff;
+ --accent: #ff0066;
+ --muted: #8a8a8a;
+ --border: #e5e5e5;
}
-@theme inline {
- --color-background: var(--background);
- --color-foreground: var(--foreground);
- --font-sans: var(--font-geist-sans);
- --font-mono: var(--font-geist-mono);
-}
-
-@media (prefers-color-scheme: dark) {
- :root {
- --background: #0a0a0a;
- --foreground: #ededed;
- }
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
}
body {
- background: var(--background);
- color: var(--foreground);
- font-family: Arial, Helvetica, sans-serif;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", sans-serif;
+ background: #fafafa;
+ color: var(--primary);
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+}
+
+button {
+ font-family: inherit;
+ border: none;
+ cursor: pointer;
}
diff --git a/app/login/page.tsx b/app/login/page.tsx
new file mode 100644
index 0000000..de19e9f
--- /dev/null
+++ b/app/login/page.tsx
@@ -0,0 +1,134 @@
+"use client";
+
+import Link from "next/link";
+import { useState } from "react";
+
+export default function LoginPage() {
+ const [isLoading, setIsLoading] = useState(false);
+
+ const handleGoogleLogin = () => {
+ setIsLoading(true);
+ window.location.href = `${process.env.NEXT_PUBLIC_API_URL}/login/google`;
+ };
+
+ return (
+
+ {/* Header */}
+
+
+
+
+ RP
+
+
RoleplayAI
+
+
+
+
+ {/* Main Content */}
+
+
+
+ {/* Welcome Section */}
+
+
Welcome Back
+
Sign in to continue to RoleplayAI
+
+
+ {/* Google OAuth Button */}
+
+
+
+
+ {/* Divider */}
+
+
+ {/* Email Form */}
+
+
+ {/* Agreement Text */}
+
+ By signing in, you agree to our{" "}
+
+ Terms of Service
+ {" "}
+ and{" "}
+
+ Privacy Policy
+
+
+
+ {/* Footer Links */}
+
+
+
+ {/* Trust Indicators */}
+
+
+
+
+ );
+}
diff --git a/app/page.tsx b/app/page.tsx
index 3f36f7c..d3d4991 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,65 +1,171 @@
-import Image from "next/image";
+"use client";
+
+import Link from "next/link";
+import { ArrowRight, Sparkles, Users, Zap } from "lucide-react";
export default function Home() {
return (
-
-
-
-
-
- To get started, edit the page.tsx file.
+
+ {/* Navigation */}
+
+
+ {/* Hero Section */}
+
+
+
+ AI Characters,
+
+
+ Real Conversations
+
-
- Looking for a starting point or more instructions? Head over to{" "}
-
- Templates
- {" "}
- or the{" "}
-
- Learning
- {" "}
- center.
+
+ Engage in immersive roleplay conversations with AI characters. Create, discover, and connect.
+
+
+ Start Free
+
+
+
-
-
-
- Deploy Now
-
-
- Documentation
-
+
+ {/* Hero Visual */}
+
+
+
✨
+
AI-powered conversations await
+
-
+
+
+ {/* Features Section */}
+
+
+
Why Choose RoleplayAI?
+
+
+ {[
+ {
+ icon: Sparkles,
+ title: "Rich Characters",
+ description: "Explore a diverse library of AI characters with unique personalities and backgrounds",
+ },
+ {
+ icon: Users,
+ title: "Discover & Share",
+ description: "Find trending conversations and share your roleplay moments with the community",
+ },
+ {
+ icon: Zap,
+ title: "Instant Creation",
+ description: "Create your own AI characters in seconds with our intuitive builder",
+ },
+ ].map((item, i) => (
+
+
+
{item.title}
+
{item.description}
+
+ ))}
+
+
+
+
+ {/* Showcase Section */}
+
+ Featured Characters
+
+
+ {[1, 2, 3, 4].map((i) => (
+
+
+
Character {i}
+
Popular choice
+
+
+ ))}
+
+
+
+ {/* CTA Section */}
+
+
+
Ready to explore?
+
+ Join thousands of users enjoying immersive AI conversations
+
+
+ Get Started for Free
+
+
+
+
+ {/* Footer */}
+
);
}
diff --git a/package-lock.json b/package-lock.json
index 9004a5c..0477a9b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,6 +8,8 @@
"name": "character-roleplay-frontend",
"version": "0.1.0",
"dependencies": {
+ "@tailwindcss/cli": "^4.3.0",
+ "lucide-react": "^1.16.0",
"next": "16.2.6",
"react": "19.2.4",
"react-dom": "19.2.4"
@@ -19,7 +21,7 @@
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "16.2.6",
- "tailwindcss": "^4",
+ "tailwindcss": "^4.3.0",
"typescript": "^5"
}
},
@@ -280,7 +282,6 @@
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
"integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
- "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -302,7 +303,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
"integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
- "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -989,7 +989,6 @@
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0",
@@ -1000,7 +999,6 @@
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
@@ -1011,7 +1009,6 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
@@ -1021,14 +1018,12 @@
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
- "dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.31",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
@@ -1039,7 +1034,6 @@
"version": "0.2.12",
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
"integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
- "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -1240,6 +1234,313 @@
"node": ">=12.4.0"
}
},
+ "node_modules/@parcel/watcher": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz",
+ "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-libc": "^2.0.3",
+ "is-glob": "^4.0.3",
+ "node-addon-api": "^7.0.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.5.6",
+ "@parcel/watcher-darwin-arm64": "2.5.6",
+ "@parcel/watcher-darwin-x64": "2.5.6",
+ "@parcel/watcher-freebsd-x64": "2.5.6",
+ "@parcel/watcher-linux-arm-glibc": "2.5.6",
+ "@parcel/watcher-linux-arm-musl": "2.5.6",
+ "@parcel/watcher-linux-arm64-glibc": "2.5.6",
+ "@parcel/watcher-linux-arm64-musl": "2.5.6",
+ "@parcel/watcher-linux-x64-glibc": "2.5.6",
+ "@parcel/watcher-linux-x64-musl": "2.5.6",
+ "@parcel/watcher-win32-arm64": "2.5.6",
+ "@parcel/watcher-win32-ia32": "2.5.6",
+ "@parcel/watcher-win32-x64": "2.5.6"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz",
+ "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz",
+ "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz",
+ "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-freebsd-x64": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz",
+ "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz",
+ "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-musl": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz",
+ "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz",
+ "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz",
+ "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz",
+ "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz",
+ "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz",
+ "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-ia32": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz",
+ "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz",
+ "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher/node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/@rtsao/scc": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
@@ -1256,11 +1557,28 @@
"tslib": "^2.8.0"
}
},
+ "node_modules/@tailwindcss/cli": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.3.0.tgz",
+ "integrity": "sha512-X9kdlqyMopO9fewbgHsEeuy31YzMHbdZ9VsKt004tB+mxSg1CNbyhZYCzvhciN0AM4R4b5lvIprPjtNq7iQxpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@parcel/watcher": "^2.5.1",
+ "@tailwindcss/node": "4.3.0",
+ "@tailwindcss/oxide": "4.3.0",
+ "enhanced-resolve": "^5.21.0",
+ "mri": "^1.2.0",
+ "picocolors": "^1.1.1",
+ "tailwindcss": "4.3.0"
+ },
+ "bin": {
+ "tailwindcss": "dist/index.mjs"
+ }
+ },
"node_modules/@tailwindcss/node": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz",
"integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/remapping": "^2.3.5",
@@ -1276,7 +1594,6 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz",
"integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 20"
@@ -1303,7 +1620,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1320,7 +1636,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1337,7 +1652,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1354,7 +1668,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1371,7 +1684,6 @@
"cpu": [
"arm"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1388,7 +1700,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1405,7 +1716,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1422,7 +1732,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1439,7 +1748,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1464,7 +1772,6 @@
"cpu": [
"wasm32"
],
- "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -1486,7 +1793,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1503,7 +1809,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1531,7 +1836,6 @@
"version": "0.10.2",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz",
"integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==",
- "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -2801,7 +3105,6 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
- "devOptional": true,
"license": "Apache-2.0",
"engines": {
"node": ">=8"
@@ -2853,7 +3156,6 @@
"version": "5.21.3",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.3.tgz",
"integrity": "sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==",
- "dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.4",
@@ -3801,7 +4103,6 @@
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true,
"license": "ISC"
},
"node_modules/has-bigints": {
@@ -4129,7 +4430,6 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -4175,7 +4475,6 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
@@ -4418,7 +4717,6 @@
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
"integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
- "dev": true,
"license": "MIT",
"bin": {
"jiti": "lib/jiti-cli.mjs"
@@ -4555,7 +4853,6 @@
"version": "1.32.0",
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
"integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
- "dev": true,
"license": "MPL-2.0",
"dependencies": {
"detect-libc": "^2.0.3"
@@ -4588,7 +4885,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4609,7 +4905,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4630,7 +4925,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4651,7 +4945,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4672,7 +4965,6 @@
"cpu": [
"arm"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4693,7 +4985,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4714,7 +5005,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4735,7 +5025,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4756,7 +5045,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4777,7 +5065,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4798,7 +5085,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4858,11 +5144,19 @@
"yallist": "^3.0.2"
}
},
+ "node_modules/lucide-react": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.16.0.tgz",
+ "integrity": "sha512-dYwyPzb4MEKpGUmNYk3WKWPnMrHs3FKM+q94kAnJrcDIqqn1hq2xY8scaS2ovsOCM5D51ey2gaRG3PBb1vgoYQ==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
"node_modules/magic-string": {
"version": "0.30.21",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.5"
@@ -4925,6 +5219,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/mri": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -5054,6 +5357,12 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "license": "MIT"
+ },
"node_modules/node-exports-info": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz",
@@ -6069,14 +6378,12 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz",
"integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==",
- "dev": true,
"license": "MIT"
},
"node_modules/tapable": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
"integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
diff --git a/package.json b/package.json
index a9ae5c7..4318efd 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,8 @@
"lint": "eslint"
},
"dependencies": {
+ "@tailwindcss/cli": "^4.3.0",
+ "lucide-react": "^1.16.0",
"next": "16.2.6",
"react": "19.2.4",
"react-dom": "19.2.4"
@@ -20,7 +22,7 @@
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "16.2.6",
- "tailwindcss": "^4",
+ "tailwindcss": "^4.3.0",
"typescript": "^5"
}
}