migrate web to next 16 template and redesign landing page (#526)
* migrate web to next-template stack (next 16, react 19, tailwind 4)
replace all infrastructure with next-template conventions:
- next.js 14 -> 16 (turbopack default, typed routes, react compiler)
- react 18 -> 19
- tailwind css 3 -> 4 (css-first config, oklch theme system)
- eslint 8 (.eslintrc) -> 9 (flat config with stricter rules)
- add shadcn/ui, base-ui, cva component primitives
- upgrade theme toggle to light/dark/system dropdown
- migrate hardcoded neutral classes to semantic oklch tokens
- drop unused @tailwindcss/forms, autoprefixer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* add no-misused-promises config for async JSX handlers, warn on array index keys
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* base-vega
* sync frosty web with next-template runtime and claude tooling for cloudflare parity
* gitignore .dev.vars per cloudflare best practice
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* add observability configuration to wrangler.jsonc
* remove marquee emote background from hero section
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* improve CLAUDE.md and AGENTS.md files across project
Remove redundant root CLAUDE.md (kept in .claude/ instead), add Commands
and Source Structure sections to Flutter AGENTS.md, clarify global vs
feature store placement, and fill gaps in web AGENTS.md (shadcn base-vega
style, constants.ts, no-array-index-key rule, commit conventions).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* switch shadcn theme from neutral to violet, replace twitch-purple with primary token
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* initial redesign
* auto-infer nativeButton in Button wrapper when render prop is used
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* replace skeleton carousel with real screenshots and video, add responsive phone scaling and mobile menu
- Replace PhoneSkeleton with PhoneFrame/PhoneMedia using actual app screenshots and video
- Fluid phone sizing via aspect-ratio with responsive max-h/max-w caps
- Non-circular carousel with swipe gestures, dot indicator, and hover opacity boost
- Video plays only when focused, pauses when off-screen
- Collapse header actions into dropdown menu on mobile, add Contact link
- Viewport-height layout with no scrolling on any screen size
- Remove footer, move contact to header
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* improve header consistency, carousel layout, and responsive centering
- add icons to all header buttons (Contact, Donate, GitHub)
- switch theme toggle to ghost variant for consistency
- bump header collapse breakpoint from md to lg
- move carousel arrows to overlay positions with animated enter/exit
- hide arrows at first/last slide
- fix vertical centering of phone+description group across all screen sizes
- add smooth blur+slide transition for description text
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* add contact dropdown with copy email toast
- replace direct mailto link with dropdown: send email or copy email
- install sonner for toast notifications, show top-center on copy
- extract emailAddress constant for clipboard use
- add copy option to mobile hamburger menu too
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* replace mobile hamburger menu with icon buttons
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* redesign hero copy, badge-style download buttons, and mobile layout
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* add consistent padding and object-contain to carousel media
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* add emote physics background to hero section
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* move container styling to hero panel, refresh emote set with 2025 trending picks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* add staggered entrance animations and remove grid gap
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* add 30-day cache headers for video and logo assets
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* add emote collisions and aspect-ratio tracking, refine hero layout
Emote physics: add particle-particle elastic collisions, per-particle
width measurement for correct aspect ratios, new emotes (aga, WW, o7,
FLASHBANG, LULW, Deadass), bump count to 30. Layout: absolute-position
header with z-20, increase mobile carousel ratio to 2fr/4fr, reserve
min-h-10 for description text, remove panel rounding.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix carousel lint warnings: useSyncExternalStore, ref naming, stable keys
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* add seo metadata, sitemap, and robots.txt
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* add privacy link to header and footer credit
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* update privacy policy content and restyle with mono layout
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* reorder header nav and add mobile hamburger menu
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refresh web dependencies and smooth footer credit hover transition
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 22:53:43 -05:00
|
|
|
@import 'tailwindcss';
|
|
|
|
|
@import 'tw-animate-css';
|
|
|
|
|
@import 'shadcn/tailwind.css';
|
|
|
|
|
|
|
|
|
|
@custom-variant dark (&:where(.dark, .dark *));
|
|
|
|
|
|
|
|
|
|
@theme inline {
|
|
|
|
|
--font-sans: var(--font-sans);
|
|
|
|
|
--font-mono: var(--font-mono);
|
|
|
|
|
--color-sidebar-ring: var(--sidebar-ring);
|
|
|
|
|
--color-sidebar-border: var(--sidebar-border);
|
|
|
|
|
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
|
|
|
--color-sidebar-accent: var(--sidebar-accent);
|
|
|
|
|
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
|
|
|
--color-sidebar-primary: var(--sidebar-primary);
|
|
|
|
|
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
|
|
|
--color-sidebar: var(--sidebar);
|
|
|
|
|
--color-chart-5: var(--chart-5);
|
|
|
|
|
--color-chart-4: var(--chart-4);
|
|
|
|
|
--color-chart-3: var(--chart-3);
|
|
|
|
|
--color-chart-2: var(--chart-2);
|
|
|
|
|
--color-chart-1: var(--chart-1);
|
|
|
|
|
--color-ring: var(--ring);
|
|
|
|
|
--color-input: var(--input);
|
|
|
|
|
--color-border: var(--border);
|
|
|
|
|
--color-destructive: var(--destructive);
|
|
|
|
|
--color-accent-foreground: var(--accent-foreground);
|
|
|
|
|
--color-accent: var(--accent);
|
|
|
|
|
--color-muted-foreground: var(--muted-foreground);
|
|
|
|
|
--color-muted: var(--muted);
|
|
|
|
|
--color-secondary-foreground: var(--secondary-foreground);
|
|
|
|
|
--color-secondary: var(--secondary);
|
|
|
|
|
--color-primary-foreground: var(--primary-foreground);
|
|
|
|
|
--color-primary: var(--primary);
|
|
|
|
|
--color-popover-foreground: var(--popover-foreground);
|
|
|
|
|
--color-popover: var(--popover);
|
|
|
|
|
--color-card-foreground: var(--card-foreground);
|
|
|
|
|
--color-card: var(--card);
|
|
|
|
|
--color-foreground: var(--foreground);
|
|
|
|
|
--color-background: var(--background);
|
|
|
|
|
--radius-sm: calc(var(--radius) - 4px);
|
|
|
|
|
--radius-md: calc(var(--radius) - 2px);
|
|
|
|
|
--radius-lg: var(--radius);
|
|
|
|
|
--radius-xl: calc(var(--radius) + 4px);
|
|
|
|
|
--radius-2xl: calc(var(--radius) + 8px);
|
|
|
|
|
--radius-3xl: calc(var(--radius) + 12px);
|
|
|
|
|
--radius-4xl: calc(var(--radius) + 16px);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
:root {
|
|
|
|
|
--background: oklch(1 0 0);
|
|
|
|
|
--foreground: oklch(0.145 0 0);
|
|
|
|
|
--card: oklch(1 0 0);
|
|
|
|
|
--card-foreground: oklch(0.145 0 0);
|
|
|
|
|
--popover: oklch(1 0 0);
|
|
|
|
|
--popover-foreground: oklch(0.145 0 0);
|
|
|
|
|
--primary: oklch(0.541 0.281 293.009);
|
|
|
|
|
--primary-foreground: oklch(0.969 0.016 293.756);
|
|
|
|
|
--secondary: oklch(0.967 0.001 286.375);
|
|
|
|
|
--secondary-foreground: oklch(0.21 0.006 285.885);
|
|
|
|
|
--muted: oklch(0.97 0 0);
|
|
|
|
|
--muted-foreground: oklch(0.556 0 0);
|
|
|
|
|
--accent: oklch(0.97 0 0);
|
|
|
|
|
--accent-foreground: oklch(0.205 0 0);
|
|
|
|
|
--destructive: oklch(0.58 0.22 27);
|
|
|
|
|
--border: oklch(0.922 0 0);
|
|
|
|
|
--input: oklch(0.922 0 0);
|
|
|
|
|
--ring: oklch(0.708 0 0);
|
|
|
|
|
--chart-1: oklch(0.811 0.111 293.571);
|
|
|
|
|
--chart-2: oklch(0.606 0.25 292.717);
|
|
|
|
|
--chart-3: oklch(0.541 0.281 293.009);
|
|
|
|
|
--chart-4: oklch(0.491 0.27 292.581);
|
|
|
|
|
--chart-5: oklch(0.432 0.232 292.759);
|
|
|
|
|
--radius: 0.625rem;
|
|
|
|
|
--sidebar: oklch(0.985 0 0);
|
|
|
|
|
--sidebar-foreground: oklch(0.145 0 0);
|
|
|
|
|
--sidebar-primary: oklch(0.541 0.281 293.009);
|
|
|
|
|
--sidebar-primary-foreground: oklch(0.969 0.016 293.756);
|
|
|
|
|
--sidebar-accent: oklch(0.97 0 0);
|
|
|
|
|
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
|
|
|
--sidebar-border: oklch(0.922 0 0);
|
|
|
|
|
--sidebar-ring: oklch(0.708 0 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.dark {
|
|
|
|
|
--background: oklch(0.145 0 0);
|
|
|
|
|
--foreground: oklch(0.985 0 0);
|
|
|
|
|
--card: oklch(0.205 0 0);
|
|
|
|
|
--card-foreground: oklch(0.985 0 0);
|
|
|
|
|
--popover: oklch(0.205 0 0);
|
|
|
|
|
--popover-foreground: oklch(0.985 0 0);
|
|
|
|
|
--primary: oklch(0.606 0.25 292.717);
|
|
|
|
|
--primary-foreground: oklch(0.969 0.016 293.756);
|
|
|
|
|
--secondary: oklch(0.274 0.006 286.033);
|
|
|
|
|
--secondary-foreground: oklch(0.985 0 0);
|
|
|
|
|
--muted: oklch(0.269 0 0);
|
|
|
|
|
--muted-foreground: oklch(0.708 0 0);
|
|
|
|
|
--accent: oklch(0.371 0 0);
|
|
|
|
|
--accent-foreground: oklch(0.985 0 0);
|
|
|
|
|
--destructive: oklch(0.704 0.191 22.216);
|
|
|
|
|
--border: oklch(1 0 0 / 10%);
|
|
|
|
|
--input: oklch(1 0 0 / 15%);
|
|
|
|
|
--ring: oklch(0.556 0 0);
|
|
|
|
|
--chart-1: oklch(0.811 0.111 293.571);
|
|
|
|
|
--chart-2: oklch(0.606 0.25 292.717);
|
|
|
|
|
--chart-3: oklch(0.541 0.281 293.009);
|
|
|
|
|
--chart-4: oklch(0.491 0.27 292.581);
|
|
|
|
|
--chart-5: oklch(0.432 0.232 292.759);
|
|
|
|
|
--sidebar: oklch(0.205 0 0);
|
|
|
|
|
--sidebar-foreground: oklch(0.985 0 0);
|
|
|
|
|
--sidebar-primary: oklch(0.606 0.25 292.717);
|
|
|
|
|
--sidebar-primary-foreground: oklch(0.969 0.016 293.756);
|
|
|
|
|
--sidebar-accent: oklch(0.269 0 0);
|
|
|
|
|
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
|
|
|
--sidebar-border: oklch(1 0 0 / 10%);
|
|
|
|
|
--sidebar-ring: oklch(0.556 0 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@layer base {
|
|
|
|
|
* {
|
|
|
|
|
@apply border-border outline-ring/50;
|
|
|
|
|
}
|
|
|
|
|
body {
|
|
|
|
|
@apply bg-background text-foreground;
|
|
|
|
|
}
|
|
|
|
|
}
|