barsa bde9f706ce feat: add VPN services and call history management features
- Implemented VpnServicesService for managing VPN plans and activation fees.
- Created SimCallHistoryFormatterService for formatting call history data.
- Developed SimCallHistoryParserService to parse call history CSV files.
- Added AnimatedContainer and AnimatedBackground components for UI animations.
- Introduced BentoServiceCard, FloatingGlassCard, GlowButton, and ValuePropCard components for landing page.
- Implemented useCountUp hook for animated number counting.
- Added cancellation months utility functions for subscription management.
2026-01-13 16:19:39 +09:00

274 lines
9.9 KiB
TypeScript

import {
ArrowRight,
Wifi,
Smartphone,
Lock,
BadgeCheck,
Globe,
Wrench,
Building2,
Tv,
} from "lucide-react";
import {
GlowButton,
ValuePropCard,
BentoServiceCard,
FloatingGlassCard,
AnimatedBackground,
} from "../components";
/**
* PublicLandingView - Modern SaaS Premium Landing Page
*
* Purpose: Hook visitors, build trust, guide to shop
* Features:
* - Asymmetric hero with floating glass cards
* - Glass morphism value proposition cards
* - Bento grid services section
* - Glowing CTA with depth layers
*/
export function PublicLandingView() {
return (
<div className="space-y-24 pb-12">
{/* ===== HERO SECTION ===== */}
<section className="relative min-h-[70vh] flex items-center pt-8 sm:pt-0">
<AnimatedBackground />
<div className="w-full grid lg:grid-cols-2 gap-12 lg:gap-8 items-center">
{/* Left: Content */}
<div className="space-y-8">
{/* Badge */}
<div
className="animate-in fade-in slide-in-from-bottom-4 duration-500"
style={{ animationDelay: "0ms" }}
>
<span className="inline-flex items-center gap-2 rounded-full bg-primary/5 border border-primary/10 px-4 py-1.5 text-sm text-primary font-medium">
<span className="relative flex h-2 w-2">
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75" />
<span className="relative inline-flex rounded-full h-2 w-2 bg-primary" />
</span>
Reliable Connectivity in Japan
</span>
</div>
{/* Headline */}
<div
className="space-y-4 animate-in fade-in slide-in-from-bottom-6 duration-700"
style={{ animationDelay: "100ms" }}
>
<h1 className="text-display-lg lg:text-display-xl text-foreground">
A One Stop Solution
<span className="block cp-gradient-text pb-2 mt-2">for Your IT Needs</span>
</h1>
</div>
{/* Subtitle */}
<p
className="text-lg sm:text-xl text-muted-foreground max-w-xl leading-relaxed animate-in fade-in slide-in-from-bottom-8 duration-700"
style={{ animationDelay: "200ms" }}
>
Serving Japan&apos;s international community with reliable, English-supported
internet, mobile, and VPN solutions.
</p>
{/* CTAs */}
<div
className="flex flex-col sm:flex-row items-start sm:items-center gap-4 pt-2 animate-in fade-in slide-in-from-bottom-8 duration-700"
style={{ animationDelay: "300ms" }}
>
<GlowButton href="/services">
Browse Services
<ArrowRight className="h-5 w-5 ml-1" />
</GlowButton>
<GlowButton href="/contact" variant="secondary">
Contact Us
</GlowButton>
</div>
</div>
{/* Right: Floating Glass Cards (hidden on mobile) */}
<div className="hidden lg:block relative h-[400px]">
<FloatingGlassCard
icon={Wifi}
title="High-Speed Internet"
subtitle="Fiber & WiFi solutions"
accentColor="blue"
className="absolute top-0 right-0 cp-float animate-in fade-in slide-in-from-right-12 duration-700"
style={{ animationDelay: "500ms" }}
/>
<FloatingGlassCard
icon={Smartphone}
title="Mobile SIM"
subtitle="Voice & data plans"
accentColor="green"
className="absolute top-1/3 right-1/4 cp-float-delayed animate-in fade-in slide-in-from-right-12 duration-700"
style={{ animationDelay: "650ms" }}
/>
<FloatingGlassCard
icon={Lock}
title="VPN Security"
subtitle="Privacy protection"
accentColor="purple"
className="absolute bottom-0 right-1/6 cp-float-slow animate-in fade-in slide-in-from-right-12 duration-700"
style={{ animationDelay: "800ms" }}
/>
</div>
</div>
</section>
{/* ===== VALUE PROPS SECTION ===== */}
<section className="max-w-5xl mx-auto">
<div className="text-center mb-12">
<p className="text-sm font-semibold text-primary uppercase tracking-wider mb-3">
Our Concept
</p>
<h2 className="text-display-md text-foreground">Why customers choose us</h2>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8 cp-stagger-children">
<ValuePropCard
icon={BadgeCheck}
title="One Stop Solution"
description="All you need is just to contact us and we will take care of everything."
/>
<ValuePropCard
icon={Globe}
title="English Support"
description="We always assist you in English. No language barrier to worry about."
/>
<ValuePropCard
icon={Wrench}
title="Onsite Support"
description="Our tech staff can visit your residence for setup and troubleshooting."
/>
</div>
</section>
{/* ===== SERVICES BENTO GRID ===== */}
<section className="max-w-6xl mx-auto">
<div className="text-center mb-12">
<p className="text-sm font-semibold text-primary uppercase tracking-wider mb-3">
Our Services
</p>
<h2 className="text-display-md text-foreground">What we offer</h2>
</div>
{/* Bento Grid */}
<div className="grid grid-cols-1 md:grid-cols-6 gap-4 auto-rows-[minmax(180px,auto)] cp-stagger-children">
{/* Internet - Featured (spans 3 cols, 2 rows) */}
<BentoServiceCard
href="/services/internet"
icon={Wifi}
title="Internet"
description="High-speed fiber and WiFi solutions for homes and businesses across Japan."
accentColor="blue"
size="large"
className="md:col-span-3 md:row-span-2"
/>
{/* SIM - Medium (spans 2 cols) */}
<BentoServiceCard
href="/services/sim"
icon={Smartphone}
title="SIM & eSIM"
description="Flexible voice and data plans with no contracts required."
accentColor="green"
size="medium"
className="md:col-span-2"
/>
{/* VPN - Small (spans 1 col) */}
<BentoServiceCard
href="/services/vpn"
icon={Lock}
title="VPN"
accentColor="purple"
size="small"
className="md:col-span-1"
/>
{/* Business - Small (spans 1 col) */}
<BentoServiceCard
href="/services/business"
icon={Building2}
title="Business"
accentColor="amber"
size="small"
className="md:col-span-1"
/>
{/* Onsite - Small (spans 1 col) */}
<BentoServiceCard
href="/services/onsite"
icon={Wrench}
title="Onsite"
accentColor="rose"
size="small"
className="md:col-span-1"
/>
{/* TV - Medium (spans 4 cols) */}
<BentoServiceCard
href="/services/tv"
icon={Tv}
title="TV Services"
description="International TV packages and streaming solutions for your home entertainment."
accentColor="cyan"
size="medium"
className="md:col-span-4"
/>
</div>
</section>
{/* ===== CTA SECTION ===== */}
<section className="relative py-20 -mx-[var(--cp-page-padding)] px-[var(--cp-page-padding)]">
{/* Background layers */}
<div className="absolute inset-0 bg-gradient-to-br from-primary/5 via-primary/10 to-accent-gradient/5" />
<div className="absolute inset-0 bg-[radial-gradient(ellipse_at_center,_oklch(0.55_0.18_260_/_0.15),_transparent_70%)]" />
{/* Decorative floating rings */}
<div
className="absolute top-10 left-10 w-32 h-32 rounded-full border border-primary/10 cp-float hidden sm:block"
aria-hidden="true"
/>
<div
className="absolute bottom-10 right-10 w-24 h-24 rounded-full border border-accent-gradient/10 cp-float-delayed hidden sm:block"
aria-hidden="true"
/>
<div
className="absolute top-1/2 right-1/4 w-16 h-16 rounded-full bg-primary/5 blur-xl hidden md:block"
aria-hidden="true"
/>
{/* Content */}
<div className="relative max-w-2xl mx-auto text-center space-y-8">
<h2
className="text-display-md text-foreground animate-in fade-in slide-in-from-bottom-6 duration-600"
style={{ animationDelay: "0ms" }}
>
Ready to get connected?
</h2>
<p
className="text-lg text-muted-foreground max-w-lg mx-auto leading-relaxed animate-in fade-in slide-in-from-bottom-6 duration-600"
style={{ animationDelay: "100ms" }}
>
Contact us anytime our bilingual team is here to help you find the right solution.
</p>
<div
className="flex flex-col sm:flex-row items-center justify-center gap-4 pt-4 animate-in fade-in slide-in-from-bottom-6 duration-600"
style={{ animationDelay: "200ms" }}
>
<GlowButton href="/contact">
Contact Us
<ArrowRight className="h-5 w-5 ml-1" />
</GlowButton>
<GlowButton href="/services" variant="secondary">
Browse Services
</GlowButton>
</div>
</div>
</section>
</div>
);
}