Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
49802c0
feat(web): add Hero section with Terminal Chic theme and typewriter a…
Mar 3, 2026
5eb1b5c
feat(web): add landing page sections - FeatureGrid, Pricing, Stats, F…
Mar 3, 2026
db6d10a
fix(web): memory leaks in useTypewriter and AnimatedCounter hooks
BillChirico Mar 4, 2026
405d585
fix(web): add missing semantic CSS tokens for landing components
BillChirico Mar 4, 2026
8c01343
fix(web): wire up CTA buttons to bot invite URL
BillChirico Mar 4, 2026
5a493ef
fix(web): update stale landing page tests
BillChirico Mar 4, 2026
4ec14de
fix(web): resolve remaining lint issues
BillChirico Mar 4, 2026
e7e07c0
fix(web): add testimonial IDs type and update lockfile
BillChirico Mar 4, 2026
978d89d
fix(landing): handle null bot invite URL in footer CTA
BillChirico Mar 4, 2026
bca628f
fix(web): use Inter font as default sans-serif
BillChirico Mar 4, 2026
6191554
fix(landing): use GitHub link for free tier, handle null bot invite
BillChirico Mar 4, 2026
4bfe414
test: fix framer-motion mock to support refs
BillChirico Mar 4, 2026
152534c
fix(landing): remove non-null assertions for bot invite URL
BillChirico Mar 4, 2026
73b6bf0
fix: add useReducedMotion support for accessibility
BillChirico Mar 4, 2026
79e2ad7
fix: remove duplicate --font-mono from globals.css
BillChirico Mar 4, 2026
5c9eef3
fix: initialize startTime to null for TypeScript strict mode
BillChirico Mar 4, 2026
30f29d8
fix(a11y): change hero headline to semantic h1
BillChirico Mar 4, 2026
f6f2cae
fix(landing): use fictional company names in testimonials
BillChirico Mar 4, 2026
f19eb3c
fix(test): improve Framer Motion mock for ESM compatibility
BillChirico Mar 4, 2026
66120bd
fix(test): use async import in framer-motion mock for ESM compatibility
Mar 4, 2026
e83b855
ci: add Railway preview deployment for PRs
Mar 4, 2026
23a7acf
fix(ci): add closed trigger and NEXT_PUBLIC_DISCORD_CLIENT_ID for pre…
BillChirico Mar 4, 2026
08bcb3b
style: fix linter warnings in landing components
BillChirico Mar 4, 2026
44ad7b2
fix(ci): pin pnpm/action-setup to commit SHA for supply-chain security
BillChirico Mar 4, 2026
5cb6ebc
chore: update project configuration and improve layout styling
BillChirico Mar 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"diff": "^8.0.3",
"framer-motion": "^12.34.5",
"lucide-react": "^0.525.0",
"next": "^16.1.6",
"next-auth": "^4.24.13",
Expand Down
118 changes: 83 additions & 35 deletions web/src/app/globals.css
Original file line number Diff line number Diff line change
@@ -1,6 +1,24 @@
@import "tailwindcss";

/* JetBrains Mono for headlines, Inter for body (loaded in layout.tsx) */
@theme {
--font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;

/* Terminal Chic Colors */
--color-terminal-green: #22c55e;
--color-terminal-cursor: #22c55e;
--color-terminal-bg: #0a0a0a;
--color-terminal-border: #1f1f1f;
--color-terminal-text: #e4e4e7;
--color-terminal-muted: #71717a;

/* Light mode Terminal Chic */
--color-terminal-light-bg: #fafafa;
--color-terminal-light-border: #e4e4e7;
--color-terminal-light-text: #18181b;
--color-terminal-light-muted: #71717a;

/* Existing shadcn colors */
--color-border: hsl(var(--border));
--color-input: hsl(var(--input));
--color-ring: hsl(var(--ring));
Expand All @@ -25,8 +43,13 @@
--radius-lg: var(--radius);
--radius-md: calc(var(--radius) - 2px);
--radius-sm: calc(var(--radius) - 4px);

/* Animations */
--animate-accordion-down: accordion-down 0.2s ease-out;
--animate-accordion-up: accordion-up 0.2s ease-out;
--animate-blink: blink 1s step-end infinite;
--animate-typewriter: typewriter 0.1s steps(1) forwards;

@keyframes accordion-down {
from {
height: 0;
Expand All @@ -43,52 +66,62 @@
height: 0;
}
}
@keyframes blink {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0;
}
}
}

@layer base {
:root {
--background: 0 0% 100%;
--foreground: 240 10% 3.9%;
/* Terminal Chic Light Mode */
--background: 0 0% 98%;
--foreground: 240 10% 10%;
--card: 0 0% 100%;
--card-foreground: 240 10% 3.9%;
--card-foreground: 240 10% 10%;
--popover: 0 0% 100%;
--popover-foreground: 240 10% 3.9%;
--primary: 240 5.9% 10%;
--primary-foreground: 0 0% 98%;
--secondary: 240 4.8% 95.9%;
--secondary-foreground: 240 5.9% 10%;
--muted: 240 4.8% 95.9%;
--muted-foreground: 240 3.8% 46.1%;
--accent: 240 4.8% 95.9%;
--accent-foreground: 240 5.9% 10%;
--destructive: 0 84.2% 60.2%;
--popover-foreground: 240 10% 10%;
--primary: 142 76% 36%;
--primary-foreground: 0 0% 100%;
--secondary: 240 5% 96%;
--secondary-foreground: 240 10% 10%;
--muted: 240 5% 96%;
--muted-foreground: 240 4% 46%;
--accent: 240 5% 96%;
--accent-foreground: 240 10% 10%;
--destructive: 0 84% 60%;
--destructive-foreground: 0 0% 98%;
--border: 240 5.9% 90%;
--input: 240 5.9% 90%;
--ring: 240 5.9% 10%;
--border: 240 6% 90%;
--input: 240 6% 90%;
--ring: 142 76% 36%;
--radius: 0.5rem;
}

.dark {
--background: 240 10% 3.9%;
--foreground: 0 0% 98%;
--card: 240 10% 3.9%;
--card-foreground: 0 0% 98%;
--popover: 240 10% 3.9%;
--popover-foreground: 0 0% 98%;
--primary: 0 0% 98%;
--primary-foreground: 240 5.9% 10%;
--secondary: 240 3.7% 15.9%;
--secondary-foreground: 0 0% 98%;
--muted: 240 3.7% 15.9%;
--muted-foreground: 240 5% 64.9%;
--accent: 240 3.7% 15.9%;
--accent-foreground: 0 0% 98%;
--destructive: 0 62.8% 30.6%;
/* Terminal Chic Dark Mode */
--background: 0 0% 4%;
--foreground: 0 0% 89%;
--card: 0 0% 6%;
--card-foreground: 0 0% 89%;
--popover: 0 0% 6%;
--popover-foreground: 0 0% 89%;
--primary: 142 76% 46%;
--primary-foreground: 0 0% 100%;
--secondary: 0 0% 12%;
--secondary-foreground: 0 0% 89%;
--muted: 0 0% 12%;
--muted-foreground: 0 0% 46%;
--accent: 0 0% 12%;
--accent-foreground: 0 0% 89%;
--destructive: 0 62% 30%;
--destructive-foreground: 0 0% 98%;
--border: 240 3.7% 15.9%;
--input: 240 3.7% 15.9%;
--ring: 240 4.9% 83.9%;
--border: 0 0% 12%;
--input: 0 0% 12%;
--ring: 142 76% 46%;
}
}

Expand All @@ -97,6 +130,21 @@
@apply border-border;
}
body {
@apply bg-background text-foreground;
@apply bg-background text-foreground antialiased;
font-feature-settings: "rlig" 1, "calt" 1;
}
}

/* Terminal cursor blink animation */
.terminal-cursor {
animation: blink 1s step-end infinite;
}

@keyframes blink {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0;
}
}
24 changes: 18 additions & 6 deletions web/src/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,32 @@
import type { Metadata } from 'next';
import { Inter } from 'next/font/google';
import { Inter, JetBrains_Mono } from 'next/font/google';
import { Providers } from '@/components/providers';
import './globals.css';

const inter = Inter({ subsets: ['latin'] });
const inter = Inter({
subsets: ['latin'],
variable: '--font-inter',
});

const jetbrainsMono = JetBrains_Mono({
subsets: ['latin'],
variable: '--font-mono',
});

export const metadata: Metadata = {
title: 'Bill Bot Dashboard',
title: 'Volvox Bot - AI-Powered Discord Bot',
description:
'Manage your Bill Bot Discord server — moderation, AI chat, configuration, and more.',
'The AI-powered Discord bot for modern communities. Moderation, AI chat, dynamic welcomes, spam detection, and a fully configurable web dashboard.',
};

export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en" suppressHydrationWarning>
<body className={inter.className}>
<html
lang="en"
suppressHydrationWarning
className={`${inter.variable} ${jetbrainsMono.variable}`}
>
<body className="font-sans">
<Providers>{children}</Providers>
</body>
</html>
Expand Down
Loading
Loading