fix: Termius light mode colors, remove social proof/features/CTA sections
Docker Build / Build and Push Docker Image (push) Successful in 4m27s
Docker Build / Build and Push Docker Image (push) Successful in 4m27s
This commit is contained in:
+3
-96
@@ -17,7 +17,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
For commercial licensing, please contact admin@modelstoken.com
|
||||
*/
|
||||
import { Link } from '@tanstack/react-router'
|
||||
import { ArrowRight, Zap, Shield, Layers, BarChart3, Key, GitBranch, Users } from 'lucide-react'
|
||||
import { ArrowRight } from 'lucide-react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { useStatus } from '@/hooks/use-status'
|
||||
import { Button } from '@/components/ui/button'
|
||||
@@ -27,13 +27,6 @@ interface HeroProps {
|
||||
isAuthenticated?: boolean
|
||||
}
|
||||
|
||||
const features = [
|
||||
{ icon: Zap, title: 'Multi-model Routing', desc: 'Automatic failover and load balancing across providers' },
|
||||
{ icon: Key, title: 'Key Management', desc: 'Centralized API key lifecycle with usage tracking' },
|
||||
{ icon: Shield, title: 'Access Control', desc: 'Fine-grained permissions, rate limits, and token policies' },
|
||||
{ icon: BarChart3, title: 'Real-time Monitoring', desc: 'Live dashboards with latency and cost analytics' },
|
||||
]
|
||||
|
||||
const providers = [
|
||||
'OpenAI', 'Claude', 'Gemini', 'Mistral', 'DeepSeek',
|
||||
'Llama', 'Qwen', 'Cohere', 'Groq', 'Perplexity',
|
||||
@@ -65,7 +58,7 @@ export function Hero(props: HeroProps) {
|
||||
className='pointer-events-none absolute inset-0'
|
||||
style={{
|
||||
background:
|
||||
'radial-gradient(ellipse 60% 50% at 50% -10%, oklch(0.65 0.17 210 / 0.06) 0%, transparent 70%)',
|
||||
'radial-gradient(ellipse 60% 50% at 50% -10%, oklch(0.55 0.15 240 / 0.06) 0%, transparent 70%)',
|
||||
}}
|
||||
/>
|
||||
|
||||
@@ -111,28 +104,11 @@ export function Hero(props: HeroProps) {
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Social proof */}
|
||||
<div className='mt-6 flex items-center gap-2 justify-center lg:justify-start'>
|
||||
<div className='flex -space-x-2'>
|
||||
{Array.from({ length: 4 }).map((_, i) => (
|
||||
<div
|
||||
key={i}
|
||||
className='flex size-7 items-center justify-center rounded-full border-2 border-background bg-muted text-[10px] font-bold text-muted-foreground'
|
||||
>
|
||||
{String.fromCharCode(65 + i)}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<span className='text-xs text-muted-foreground'>
|
||||
<span className='font-semibold text-foreground'>1K+</span> {t('developers joined')}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Right: terminal demo */}
|
||||
<div className='w-full max-w-xl flex-1 lg:max-w-none'>
|
||||
<div className='overflow-hidden rounded-lg border border-border bg-card shadow-sm dark:shadow-[0_0_60px_-16px_oklch(0.65_0.17_210/0.12)]'>
|
||||
<div className='overflow-hidden rounded-lg border border-border bg-card shadow-sm dark:shadow-[0_0_60px_-16px_oklch(0.78_0.15_210/0.12)]'>
|
||||
{/* Title bar */}
|
||||
<div className='flex items-center gap-2 border-b border-border px-4 py-2'>
|
||||
<div className='flex gap-1.5'>
|
||||
@@ -208,75 +184,6 @@ export function Hero(props: HeroProps) {
|
||||
<div className='pointer-events-none absolute inset-y-0 right-0 w-16 bg-gradient-to-l from-background to-transparent' />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* ── Features (2x2 grid like company) ── */}
|
||||
<div className='pb-20'>
|
||||
<div className='mb-10 text-center'>
|
||||
<h2 className='text-2xl font-bold tracking-tight text-foreground'>
|
||||
{t('Features')}
|
||||
</h2>
|
||||
<p className='mt-2 text-sm text-muted-foreground'>
|
||||
{t('Everything you need to manage and route LLM API traffic')}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className='grid gap-4 md:grid-cols-2'>
|
||||
{features.map((feature) => (
|
||||
<div
|
||||
key={feature.title}
|
||||
className='group relative overflow-hidden rounded-xl border border-border bg-card p-6 transition-colors duration-200 hover:border-primary/30'
|
||||
>
|
||||
{/* Glow effect on hover */}
|
||||
<div className='pointer-events-none absolute -inset-px rounded-xl opacity-0 transition-opacity duration-300 group-hover:opacity-100' style={{ background: 'radial-gradient(200px circle at var(--mouse-x, 50%) var(--mouse-y, 50%), oklch(0.65 0.17 210 / 0.06), transparent 60%)' }} />
|
||||
<div className='relative'>
|
||||
<div className='mb-4 flex size-10 items-center justify-center rounded-lg border border-border bg-background'>
|
||||
<feature.icon className='size-5 text-primary' />
|
||||
</div>
|
||||
<h3 className='text-base font-semibold text-foreground'>
|
||||
{t(feature.title)}
|
||||
</h3>
|
||||
<p className='mt-2 text-sm leading-relaxed text-muted-foreground'>
|
||||
{t(feature.desc)}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* ── Setup / CTA section ── */}
|
||||
<div className='pb-24'>
|
||||
<div className='relative flex flex-col items-center justify-center overflow-hidden rounded-xl border border-border bg-card py-16 text-center'>
|
||||
<h2 className='text-2xl font-bold tracking-tight text-foreground'>
|
||||
{t('Ready to get started?')}
|
||||
</h2>
|
||||
<p className='mt-2 text-sm text-muted-foreground'>
|
||||
{t('Just 3 minutes to start using')}
|
||||
</p>
|
||||
<div className='mt-6 flex items-center gap-3'>
|
||||
{props.isAuthenticated ? (
|
||||
<Button
|
||||
className='group h-10 rounded-lg px-6 text-sm font-semibold'
|
||||
render={<Link to='/dashboard' />}
|
||||
>
|
||||
{t('Dashboard')}
|
||||
<ArrowRight className='ml-1 size-3.5 transition-transform duration-200 group-hover:translate-x-0.5' />
|
||||
</Button>
|
||||
) : (
|
||||
<Button
|
||||
className='group h-10 rounded-lg px-6 text-sm font-semibold'
|
||||
render={<Link to='/sign-up' />}
|
||||
>
|
||||
{t('Get Started')}
|
||||
<ArrowRight className='ml-1 size-3.5 transition-transform duration-200 group-hover:translate-x-0.5' />
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
{/* Decorative circles */}
|
||||
<div aria-hidden className='pointer-events-none absolute -top-20 -right-20 size-60 rounded-full bg-primary/5 blur-3xl' />
|
||||
<div aria-hidden className='pointer-events-none absolute -bottom-20 -left-20 size-60 rounded-full bg-primary/5 blur-3xl' />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Marquee keyframes */}
|
||||
|
||||
Vendored
+30
-30
@@ -100,49 +100,49 @@ For commercial licensing, please contact admin@modelstoken.com
|
||||
* in theme-presets.css. Default mirrors `--font-sans` so behavior is
|
||||
* identical when no font preference is set. */
|
||||
--font-body: var(--font-sans);
|
||||
/* Termius light: deep primary for buttons, cyan for accents/links */
|
||||
--background: oklch(0.985 0.002 260);
|
||||
--foreground: oklch(0.145 0.015 260);
|
||||
/* Termius-inspired light mode: pure white bg, deep navy text, teal accent */
|
||||
--background: oklch(0.995 0 0);
|
||||
--foreground: oklch(0.13 0.028 270);
|
||||
--card: oklch(1 0 0);
|
||||
--card-foreground: oklch(0.145 0.015 260);
|
||||
--card-foreground: oklch(0.13 0.028 270);
|
||||
--popover: oklch(1 0 0);
|
||||
--popover-foreground: oklch(0.145 0.015 260);
|
||||
--primary: oklch(0.16 0.02 260);
|
||||
--primary-foreground: oklch(0.985 0 0);
|
||||
--secondary: oklch(0.955 0.005 260);
|
||||
--secondary-foreground: oklch(0.205 0.015 260);
|
||||
--muted: oklch(0.955 0.005 260);
|
||||
--muted-foreground: oklch(0.48 0.012 260);
|
||||
--accent: oklch(0.945 0.01 260);
|
||||
--accent-foreground: oklch(0.145 0.015 260);
|
||||
--popover-foreground: oklch(0.13 0.028 270);
|
||||
--primary: oklch(0.55 0.15 240);
|
||||
--primary-foreground: oklch(0.995 0 0);
|
||||
--secondary: oklch(0.96 0.005 260);
|
||||
--secondary-foreground: oklch(0.18 0.02 270);
|
||||
--muted: oklch(0.96 0.005 260);
|
||||
--muted-foreground: oklch(0.45 0.015 260);
|
||||
--accent: oklch(0.95 0.008 260);
|
||||
--accent-foreground: oklch(0.13 0.028 270);
|
||||
--destructive: oklch(0.577 0.245 27.325);
|
||||
--destructive-foreground: oklch(0.985 0 0);
|
||||
--destructive-foreground: oklch(0.995 0 0);
|
||||
--success: oklch(0.596 0.145 163.225);
|
||||
--success-foreground: oklch(0.985 0 0);
|
||||
--success-foreground: oklch(0.995 0 0);
|
||||
--warning: oklch(0.681 0.162 75.834);
|
||||
--warning-foreground: oklch(0.145 0.015 260);
|
||||
--warning-foreground: oklch(0.13 0.028 270);
|
||||
--info: oklch(0.588 0.158 241.966);
|
||||
--info-foreground: oklch(0.985 0 0);
|
||||
--info-foreground: oklch(0.995 0 0);
|
||||
--neutral: oklch(0.55 0.01 260);
|
||||
--neutral-foreground: oklch(0.985 0 0);
|
||||
--border: oklch(0.91 0.005 260);
|
||||
--input: oklch(0.91 0.005 260);
|
||||
--ring: oklch(0.65 0.17 210);
|
||||
--chart-1: oklch(0.65 0.17 210);
|
||||
--neutral-foreground: oklch(0.995 0 0);
|
||||
--border: oklch(0.92 0.003 260);
|
||||
--input: oklch(0.92 0.003 260);
|
||||
--ring: oklch(0.55 0.15 240);
|
||||
--chart-1: oklch(0.55 0.15 240);
|
||||
--chart-2: oklch(0.596 0.145 163.225);
|
||||
--chart-3: oklch(0.681 0.162 75.834);
|
||||
--chart-4: oklch(0.627 0.265 303.9);
|
||||
--chart-5: oklch(0.645 0.246 16.439);
|
||||
--sidebar: oklch(0.975 0.003 260);
|
||||
--sidebar-foreground: oklch(0.145 0.015 260);
|
||||
--sidebar-primary: oklch(0.65 0.17 210);
|
||||
--sidebar-primary-foreground: oklch(1 0 0);
|
||||
--sidebar-foreground: oklch(0.13 0.028 270);
|
||||
--sidebar-primary: oklch(0.55 0.15 240);
|
||||
--sidebar-primary-foreground: oklch(0.995 0 0);
|
||||
--sidebar-accent: oklch(0.94 0.008 260);
|
||||
--sidebar-accent-foreground: oklch(0.145 0.015 260);
|
||||
--sidebar-border: oklch(0.91 0.005 260);
|
||||
--sidebar-ring: oklch(0.65 0.17 210);
|
||||
--skeleton-base: oklch(0.955 0.005 260);
|
||||
--skeleton-highlight: oklch(0.985 0.002 260);
|
||||
--sidebar-accent-foreground: oklch(0.13 0.028 270);
|
||||
--sidebar-border: oklch(0.92 0.003 260);
|
||||
--sidebar-ring: oklch(0.55 0.15 240);
|
||||
--skeleton-base: oklch(0.96 0.005 260);
|
||||
--skeleton-highlight: oklch(0.995 0 0);
|
||||
}
|
||||
|
||||
.dark {
|
||||
|
||||
Reference in New Issue
Block a user