diff --git a/web/src/app/admin/traces/components/timeline-chart.tsx b/web/src/app/admin/traces/components/timeline-chart.tsx index 1d40152d78..ed3be48624 100644 --- a/web/src/app/admin/traces/components/timeline-chart.tsx +++ b/web/src/app/admin/traces/components/timeline-chart.tsx @@ -216,7 +216,7 @@ export function TimelineChart({ spawned_agent: 'bg-purple-500', } - const color = baseColors[type as keyof typeof baseColors] || 'bg-gray-500' + const color = baseColors[type as keyof typeof baseColors] || 'bg-muted-foreground' if (isSelected) { return `${color} ring-2 ring-offset-2 ring-offset-background ring-blue-600` @@ -306,14 +306,14 @@ export function TimelineChart({ {/* Connection line to parent */} {event.parentId && depth > 0 && (
- +
)} @@ -404,7 +404,7 @@ export function TimelineChart({ transform: 'translateY(-50%)', }} > -
+
{seconds}s diff --git a/web/src/app/evals/evals-table.tsx b/web/src/app/evals/evals-table.tsx index 2fc6501e09..a4cd3dc176 100644 --- a/web/src/app/evals/evals-table.tsx +++ b/web/src/app/evals/evals-table.tsx @@ -301,7 +301,7 @@ export function EvalsTable({ results, isAdmin }: EvalsTableProps) { }} />
- + {formatScore(result.avgScore)}
diff --git a/web/src/app/home-client.tsx b/web/src/app/home-client.tsx index 31cbc77579..d91172a880 100644 --- a/web/src/app/home-client.tsx +++ b/web/src/app/home-client.tsx @@ -146,10 +146,10 @@ export default function HomeClient() { BENCHMARK RESULTS
-

+

BuffBench Results

-

+

State of the art coding agent evaluation using generated workflows and judging from open source repositories

@@ -162,7 +162,7 @@ export default function HomeClient() { transition={{ duration: 0.7, delay: 0.2 }} className="relative" > -
+
Codebuff vs Claude Code Performance Comparison -
+
175+
-
+
Real Tasks
-
+
Git commit reconstruction from open source projects
@@ -198,15 +198,15 @@ export default function HomeClient() { whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ duration: 0.5, delay: 0.6 }} - className="bg-zinc-800/50 border border-zinc-700/50 rounded-lg p-6" + className="border rounded-lg p-6 bg-white border-border shadow-sm dark:bg-zinc-800/50 dark:border-zinc-700/50" > -
+
5
-
+
Turn Conversations
-
+
Prompting agent simulates human for multiple turns
@@ -216,15 +216,15 @@ export default function HomeClient() { whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ duration: 0.5, delay: 0.8 }} - className="bg-zinc-800/50 border border-zinc-700/50 rounded-lg p-6" + className="border rounded-lg p-6 bg-white border-border shadow-sm dark:bg-zinc-800/50 dark:border-zinc-700/50" > -
+
4D
-
+
Scoring System
-
+
Completion, efficiency, code quality, and overall scores
@@ -239,7 +239,7 @@ export default function HomeClient() { whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ duration: 0.5, delay: 1.0 }} - className="inline-flex items-center gap-2 text-green-400 hover:text-green-300 transition-colors" + className="inline-flex items-center gap-2 text-green-600 hover:text-green-500 dark:text-green-400 dark:hover:text-green-300 transition-colors" > View evaluation methodology diff --git a/web/src/app/invites/[token]/page.tsx b/web/src/app/invites/[token]/page.tsx index 0a9a9899f1..18ec248500 100644 --- a/web/src/app/invites/[token]/page.tsx +++ b/web/src/app/invites/[token]/page.tsx @@ -92,14 +92,14 @@ export default function InvitationPage() { if (loading) { return ( -
- +
+ - - + + - +
@@ -108,20 +108,20 @@ export default function InvitationPage() { if (error) { return ( -
- +
+
- - Invalid Invitation + + Invalid Invitation
- {error} + {error}
@@ -133,16 +133,16 @@ export default function InvitationPage() { if (success) { return ( -
- +
+
- - + + Welcome to {invitation?.organization_name}!
- + You've successfully joined the organization. Redirecting...
@@ -158,30 +158,30 @@ export default function InvitationPage() { const isExpired = new Date(invitation.expires_at) < new Date() return ( -
- +
+
- + Organization Invitation
- + {invitation.inviter_name} has invited you to join{' '} {invitation.organization_name}
-
- Organization: {invitation.organization_name} +
+ Organization: {invitation.organization_name}
-
- Role: {invitation.role} +
+ Role: {invitation.role}
-
- Email: {invitation.email} +
+ Email: {invitation.email}
-
+
Expires: {new Date(invitation.expires_at).toLocaleDateString()} @@ -191,11 +191,11 @@ export default function InvitationPage() { {isExpired ? (
-

This invitation has expired.

+

This invitation has expired.

@@ -203,10 +203,10 @@ export default function InvitationPage() { ) : (
{status === 'loading' ? ( - + ) : !session ? (
-

+

Please sign in to accept this invitation.

) : session.user?.email !== invitation.email ? (
-

+

This invitation is for {invitation.email}, but you're signed in as {session.user?.email}.

@@ -238,7 +238,7 @@ export default function InvitationPage() { diff --git a/web/src/app/layout.tsx b/web/src/app/layout.tsx index 05c0ee71ae..7d57201964 100644 --- a/web/src/app/layout.tsx +++ b/web/src/app/layout.tsx @@ -59,7 +59,7 @@ export default function RootLayout({ diff --git a/web/src/app/orgs/[slug]/repositories/page.tsx b/web/src/app/orgs/[slug]/repositories/page.tsx index 272a3a717b..6af2796ce0 100644 --- a/web/src/app/orgs/[slug]/repositories/page.tsx +++ b/web/src/app/orgs/[slug]/repositories/page.tsx @@ -23,9 +23,9 @@ export default function RepositoriesPage() {
-
+
-
+
diff --git a/web/src/app/orgs/[slug]/team/page.tsx b/web/src/app/orgs/[slug]/team/page.tsx index 6cf1ac48f6..34ff5cabb6 100644 --- a/web/src/app/orgs/[slug]/team/page.tsx +++ b/web/src/app/orgs/[slug]/team/page.tsx @@ -23,10 +23,10 @@ export default function TeamPage() {
-
+
-
-
+
+
diff --git a/web/src/app/orgs/new/page.tsx b/web/src/app/orgs/new/page.tsx index a960d8aab4..81f9beb818 100644 --- a/web/src/app/orgs/new/page.tsx +++ b/web/src/app/orgs/new/page.tsx @@ -121,8 +121,8 @@ const CreateOrganizationPage = () => {
-
-
+
+
diff --git a/web/src/app/orgs/page.tsx b/web/src/app/orgs/page.tsx index 61fbc11a9e..3603f259e8 100644 --- a/web/src/app/orgs/page.tsx +++ b/web/src/app/orgs/page.tsx @@ -49,10 +49,10 @@ const OrganizationsPage = () => {
-
+
{[1, 2, 3].map((i) => ( -
+
))}
@@ -110,13 +110,13 @@ const OrganizationsPage = () => { Array.from({ length: 3 }).map((_, i) => ( -
-
+
+
-
-
+
+
@@ -159,9 +159,9 @@ const OrganizationsPage = () => { )) ) : ( // Empty state with integrated features - + - +

No Organization Yet

diff --git a/web/src/app/pricing/pricing-client.tsx b/web/src/app/pricing/pricing-client.tsx index 618c561987..b12bab15eb 100644 --- a/web/src/app/pricing/pricing-client.tsx +++ b/web/src/app/pricing/pricing-client.tsx @@ -157,7 +157,7 @@ function SubscribeButton({ className={cn( 'inline-flex items-center justify-center gap-2 rounded-lg px-3 py-2 sm:px-10 sm:py-3.5 text-xs sm:text-base font-semibold transition-all duration-200', isCurrent - ? 'bg-white/10 text-white/60 border border-white/20 cursor-default' + ? 'bg-muted text-muted-foreground border border-border cursor-default dark:bg-white/10 dark:text-white/60 dark:border-white/20' : isHighlighted ? 'bg-acid-green text-black hover:bg-acid-green/90 shadow-[0_0_30px_rgba(0,255,149,0.2)] hover:shadow-[0_0_50px_rgba(0,255,149,0.3)]' : 'bg-acid-green/10 text-acid-green border border-acid-green/30 hover:bg-acid-green/20 shadow-none hover:shadow-none', @@ -220,7 +220,7 @@ function PricingCardsGrid() { ? 'border-acid-green/60 bg-acid-green/[0.08] shadow-[0_0_50px_rgba(0,255,149,0.18)] ring-1 ring-acid-green/30' : isHighlighted ? 'border-acid-green/40 bg-acid-green/[0.06] shadow-[0_0_40px_rgba(0,255,149,0.12)] hover:shadow-[0_0_60px_rgba(0,255,149,0.2)]' - : 'border-acid-green/15 bg-black/40 hover:border-acid-green/30 hover:bg-black/60', + : 'border-acid-green/20 bg-muted/60 hover:border-acid-green/40 hover:bg-muted dark:border-acid-green/15 dark:bg-black/40 dark:hover:border-acid-green/30 dark:hover:bg-black/60', )} > {isCurrentPlan && ( @@ -231,15 +231,15 @@ function PricingCardsGrid() {
)}
- + ${tier.monthlyPrice} - + /mo
-

+

{USAGE_MULTIPLIER[price]} usage

@@ -334,7 +334,7 @@ export function StrongHeroSection({ compact }: { compact?: boolean }) {
{/* Team plan */} -
+
-

Team

+

Team

- + $19 - + /user/month
    -
  • +
  • Team management dashboard
  • -
  • +
  • Pooled credit usage
  • -
  • +
  • Pay-as-you-go at 1¢ per credit @@ -452,10 +452,10 @@ function TeamPlanIllustration() {
-
+
Reach out to support@codebuff.com @@ -463,33 +463,33 @@ function TeamPlanIllustration() {
{/* Enterprise plan */} -
+
-

Enterprise

-
+

Enterprise

+
Custom Pricing
    -
  • - +
  • + Everything in Team
  • -
  • - +
  • + Dedicated support
  • -
  • - +
  • + Custom integrations
-
+
Reach out to founders@codebuff.com diff --git a/web/src/app/profile/components/referrals-section.tsx b/web/src/app/profile/components/referrals-section.tsx index e1f79d02c3..392c8fef9b 100644 --- a/web/src/app/profile/components/referrals-section.tsx +++ b/web/src/app/profile/components/referrals-section.tsx @@ -169,7 +169,7 @@ export function ReferralsSection() { value={link} placeholder={'Your referral link'} readOnly - className="bg-gray-100 dark:bg-gray-800 pr-10 focus-visible:ring-0 focus-visible:ring-transparent focus-visible:ring-offset-0" + className="bg-muted pr-10 focus-visible:ring-0 focus-visible:ring-transparent focus-visible:ring-offset-0" /> )} + ) + if (isMermaid) { return ( -
-
-
- mermaid diagram +
+
+
+
+ mermaid
- +
-
+
@@ -200,67 +230,74 @@ export function CodeDemo({ children, language, rawContent }: CodeDemoProps) { } return ( -
-
+
+ {/* Header bar */} +
+
+
+ {displayLang} +
+ +
+ + {/* Code area */} +
- {({ className, style, tokens, getLineProps, getTokenProps }) => { - return ( -
-                {tokens.map((line, i) => {
-                  // eslint-disable-next-line @typescript-eslint/no-unused-vars
-                  const { key: _lineKey, ...lineProps } = getLineProps({ line })
-                  return (
-                    
+ {({ className, style, tokens, getLineProps, getTokenProps }) => ( +
+              {tokens.map((line, i) => {
+                // eslint-disable-next-line @typescript-eslint/no-unused-vars
+                const { key: _lineKey, ...lineProps } = getLineProps({ line })
+                return (
+                  
+ {isMultiLine && ( + + {i + 1} + + )} + {line.map((token, tokenIndex) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { key: _tokenKey, ...tokenProps } = getTokenProps( - { token, key: tokenIndex }, - ) - // Override colors for special languages in render loop + const { key: _tokenKey, ...tokenProps } = getTokenProps({ + token, + key: tokenIndex, + }) const color = tokenColor || tokenProps.style?.color - return ( ) })} -
- ) - })} -
- ) - }} + +
+ ) + })} +
+ )}
-
) } diff --git a/web/src/components/docs/mdx/mdx-components.tsx b/web/src/components/docs/mdx/mdx-components.tsx index 2ca5ee7f04..e016073e7e 100644 --- a/web/src/components/docs/mdx/mdx-components.tsx +++ b/web/src/components/docs/mdx/mdx-components.tsx @@ -271,7 +271,7 @@ const components = { pre: ({ className, ...props }: HTMLAttributes) => (
) => (
      {
                 width={200}
                 height={100}
                 priority
-                className="rounded-sm"
+                className="rounded-sm brightness-0 dark:brightness-100"
               />
             
           
diff --git a/web/src/components/navbar/navbar.tsx b/web/src/components/navbar/navbar.tsx index 8496fa84c4..ef4c99464c 100644 --- a/web/src/components/navbar/navbar.tsx +++ b/web/src/components/navbar/navbar.tsx @@ -8,6 +8,7 @@ import { useSession } from 'next-auth/react' import { UserDropdown } from './user-dropdown' +import { ThemeSwitcher } from '../theme-switcher' import { Icons } from '../icons' import { Button } from '../ui/button' import { @@ -41,7 +42,7 @@ export const Navbar = () => { width={200} height={100} priority - className="rounded-sm transition-all duration-300 group-hover:brightness-110" + className="rounded-sm transition-all duration-300 brightness-0 dark:brightness-100 group-hover:brightness-[0.7] dark:group-hover:brightness-110" />
diff --git a/web/src/components/theme-provider.tsx b/web/src/components/theme-provider.tsx index 4c77ee977c..d4ca9047e2 100644 --- a/web/src/components/theme-provider.tsx +++ b/web/src/components/theme-provider.tsx @@ -2,16 +2,10 @@ import { ThemeProvider as NextThemesProvider } from 'next-themes' import { type ThemeProviderProps } from 'next-themes/dist/types' -import { useEffect } from 'react' export const ThemeProvider = ({ children, ...props }: ThemeProviderProps) => { - // Force dark mode and disable theme switching - useEffect(() => { - document.documentElement.classList.add('dark') - }, []) - return ( - + {children} ) diff --git a/web/src/components/theme-switcher.tsx b/web/src/components/theme-switcher.tsx index ee2e426829..8e0ae70cde 100644 --- a/web/src/components/theme-switcher.tsx +++ b/web/src/components/theme-switcher.tsx @@ -1,6 +1,8 @@ 'use client' import type { ComponentProps } from 'react' +import { useTheme } from 'next-themes' +import { useEffect, useState } from 'react' import { Icons } from '@/components/icons' import { Button } from '@/components/ui/button' @@ -10,16 +12,31 @@ type ThemeSwitcherProps = { } export const ThemeSwitcher = ({ className }: ThemeSwitcherProps) => { - // Theme switcher is disabled, always showing dark mode icon + const { resolvedTheme, setTheme } = useTheme() + const [mounted, setMounted] = useState(false) + + // Avoid hydration mismatch + useEffect(() => setMounted(true), []) + + if (!mounted) { + return ( + + ) + } + + const isDark = resolvedTheme === 'dark' + return ( ) } diff --git a/web/src/components/ui/enhanced-copy-button.tsx b/web/src/components/ui/enhanced-copy-button.tsx index 4a58abadeb..9caab5d0d5 100644 --- a/web/src/components/ui/enhanced-copy-button.tsx +++ b/web/src/components/ui/enhanced-copy-button.tsx @@ -111,11 +111,11 @@ export function TerminalCopyButton({ } as React.CSSProperties } className={cn( - 'bg-zinc-800/60 border rounded-md overflow-hidden group relative', + 'bg-[#0d1117] border rounded-md overflow-hidden group relative', size === 'default' ? 'px-3 py-2.5' : 'px-3 py-4', pulseBorder ? `border-[${BlockColor.AcidMatrix}80]` - : `border-zinc-700/50 hover:border-[${BlockColor.AcidMatrix}50] hover:shadow-[var(--acid-matrix-shadow)]`, + : `border-white/10 hover:border-[${BlockColor.AcidMatrix}50] hover:shadow-[var(--acid-matrix-shadow)]`, 'flex items-center justify-between h-full', 'transition-all duration-300', )} diff --git a/web/src/components/ui/hero.tsx b/web/src/components/ui/hero.tsx index 29a14f4b02..2401aa14a3 100644 --- a/web/src/components/ui/hero.tsx +++ b/web/src/components/ui/hero.tsx @@ -13,7 +13,7 @@ export function Hero() { transition={{ duration: 0.7 }} > ( diff --git a/web/src/components/ui/landing/feature/highlight-text.tsx b/web/src/components/ui/landing/feature/highlight-text.tsx index 923f6e9bf7..d2fb33ae38 100644 --- a/web/src/components/ui/landing/feature/highlight-text.tsx +++ b/web/src/components/ui/landing/feature/highlight-text.tsx @@ -13,16 +13,17 @@ export function HighlightText({ text, isLight, icon = '⚡' }: HighlightTextProp -
{icon}
+
{icon}
{text}
) diff --git a/web/src/components/ui/landing/feature/index.tsx b/web/src/components/ui/landing/feature/index.tsx index 9b276b3423..8e872b3b9a 100644 --- a/web/src/components/ui/landing/feature/index.tsx +++ b/web/src/components/ui/landing/feature/index.tsx @@ -25,6 +25,7 @@ function LearnMoreLink({ isLight: boolean textColor?: string }) { + const darkIsBlack = isLight || textColor === 'text-black' return ( {text} → @@ -127,9 +127,9 @@ export function FeatureSection({
= { + 'rgb(0, 0, 0)': 'var(--section-bg-black)', + 'rgba(3, 29, 10, 1)': 'var(--section-bg-dark-forest-green)', + 'rgb(18, 73, 33)': 'var(--section-bg-generative-green)', +} + const _defaultAnimationProps = { initial: { opacity: 0, y: 20 }, whileInView: { opacity: 1, y: 0 }, @@ -39,11 +47,14 @@ export function Section({ style: customStyle, ...props }: SectionProps) { + const isMobile = useIsMobile() + + const effectiveBg = background ? (BG_CSS_VAR[background] ?? background) : background + const style = { - backgroundColor: background, + backgroundColor: effectiveBg, ...customStyle, } - const isMobile = useIsMobile() const content = contained ? (
diff --git a/web/src/content/tips/knowledge-files.mdx b/web/src/content/tips/knowledge-files.mdx index 5d20178d26..d510899650 100644 --- a/web/src/content/tips/knowledge-files.mdx +++ b/web/src/content/tips/knowledge-files.mdx @@ -107,12 +107,14 @@ Then add your global preferences: ### When to Use Home Directory vs Project Knowledge Files + | Home Directory (`~/.knowledge.md`) | Project (`knowledge.md`) | -|-----------------------------------|------------------------------------| +|------------------------------------|--------------------------| | Personal coding preferences | Project-specific conventions | | Preferred frameworks/tools | Architecture decisions | | Communication style | Build and deploy commands | | Global defaults | Team coding standards | + Both files are loaded—project knowledge files add to (and can override) your home directory preferences. diff --git a/web/src/styles/globals.css b/web/src/styles/globals.css index 0e9008d1cb..f3f39d1622 100644 --- a/web/src/styles/globals.css +++ b/web/src/styles/globals.css @@ -38,6 +38,46 @@ } :root { + /* Section background colors — light mode equivalents of dark brand colors */ + --section-bg-black: hsl(0 0% 99%); + --section-bg-dark-forest-green: hsl(138 60% 97%); + --section-bg-generative-green: hsl(138 40% 95%); + + --background: 0 0% 100%; + --foreground: 240 10% 3.9%; + --card: 0 0% 100%; + --card-foreground: 240 10% 3.9%; + --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%; + --destructive-foreground: 0 0% 98%; + --border: 240 5.9% 90%; + --input: 240 5.9% 90%; + --ring: 240 10% 3.9%; + --sidebar-background: 0 0% 98%; + --sidebar-foreground: 240 5.3% 26.1%; + --sidebar-primary: 240 5.9% 10%; + --sidebar-primary-foreground: 0 0% 98%; + --sidebar-accent: 240 4.8% 95.9%; + --sidebar-accent-foreground: 240 5.9% 10%; + --sidebar-border: 220 13% 91%; + --sidebar-ring: 217.2 91.2% 59.8%; + } + + .dark { + /* Section background colors — dark mode (original brand colors) */ + --section-bg-black: rgb(0, 0, 0); + --section-bg-dark-forest-green: rgba(3, 29, 10, 1); + --section-bg-generative-green: rgb(18, 73, 33); + --background: 240 10% 3.9%; --foreground: 0 0% 98%; --card: 240 10% 3.9%; @@ -115,7 +155,7 @@ } .hero-subtext { - @apply text-lg md:text-xl text-zinc-300 max-w-3xl mx-auto font-paragraph; + @apply text-lg md:text-xl text-muted-foreground max-w-3xl mx-auto font-paragraph; } /* Terminal demo section */ @@ -192,7 +232,7 @@ font-size: 0.9em; font-weight: inherit; border-radius: 2px; - background-color: rgba(255, 255, 255, 0.1); + background-color: hsl(var(--muted)); } /* Ensure proper text wrapping in headings on mobile */