2026-03-04 11:59:22 +09:00
|
|
|
"use client";
|
|
|
|
|
|
2026-03-06 14:48:34 +09:00
|
|
|
import { useRef } from "react";
|
refactor: complete shadcn/ui migration and unify raw HTML with component library
- Migrate all molecule components (DataTable, PaginationBar, FilterDropdown,
AlertBanner, FormField, SectionCard, SubCard, MetricCard, AnimatedCard,
OtpInput) to shadcn/ui primitives with legacy backups and comparison stories
- Install 24 shadcn/ui primitives (accordion, alert, badge, button, card,
checkbox, collapsible, dialog, dropdown-menu, input-otp, input, label,
pagination, popover, radio-group, select, separator, sheet, skeleton,
table, tabs, toggle-group, toggle, tooltip) with barrel exports
- Replace 69 raw HTML elements across all features with shadcn components:
35+ <button> → Button, 5 <select> → Select, 15+ <label> → Label,
6 <input type=checkbox> → Checkbox, 7 <input type=radio> → RadioGroup
- Add TextRotate animation component and integrate into hero section
with rotating service names (Internet, Phone Plans, VPN, IT Support, Business)
- Add destructive color token aliases for error state consistency
- Add CLAUDE.md rules for shadcn migration process
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:21:36 +09:00
|
|
|
import { LayoutGroup, motion, useInView } from "framer-motion";
|
2026-03-04 11:59:22 +09:00
|
|
|
import { ArrowRight } from "lucide-react";
|
2026-03-04 13:42:03 +09:00
|
|
|
import { Button } from "@/components/atoms/button";
|
refactor: complete shadcn/ui migration and unify raw HTML with component library
- Migrate all molecule components (DataTable, PaginationBar, FilterDropdown,
AlertBanner, FormField, SectionCard, SubCard, MetricCard, AnimatedCard,
OtpInput) to shadcn/ui primitives with legacy backups and comparison stories
- Install 24 shadcn/ui primitives (accordion, alert, badge, button, card,
checkbox, collapsible, dialog, dropdown-menu, input-otp, input, label,
pagination, popover, radio-group, select, separator, sheet, skeleton,
table, tabs, toggle-group, toggle, tooltip) with barrel exports
- Replace 69 raw HTML elements across all features with shadcn components:
35+ <button> → Button, 5 <select> → Select, 15+ <label> → Label,
6 <input type=checkbox> → Checkbox, 7 <input type=radio> → RadioGroup
- Add TextRotate animation component and integrate into hero section
with rotating service names (Internet, Phone Plans, VPN, IT Support, Business)
- Add destructive color token aliases for error state consistency
- Add CLAUDE.md rules for shadcn migration process
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:21:36 +09:00
|
|
|
import TextRotate from "@/components/fancy/text/text-rotate";
|
|
|
|
|
|
|
|
|
|
const SERVICE_WORDS = ["Internet", "Phone Plans", "VPN", "IT Support", "Business"];
|
2026-03-04 11:59:22 +09:00
|
|
|
|
|
|
|
|
interface HeroSectionProps {
|
|
|
|
|
heroCTARef: React.RefObject<HTMLDivElement | null>;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function HeroSection({ heroCTARef }: HeroSectionProps) {
|
2026-03-06 14:48:34 +09:00
|
|
|
const heroRef = useRef<HTMLDivElement>(null);
|
|
|
|
|
const heroInView = useInView(heroRef, { once: true, amount: 0.1 });
|
2026-03-04 11:59:22 +09:00
|
|
|
|
|
|
|
|
return (
|
2026-03-06 14:48:34 +09:00
|
|
|
<motion.div
|
2026-03-04 17:13:07 +09:00
|
|
|
ref={heroRef}
|
2026-03-06 14:48:34 +09:00
|
|
|
initial={{ opacity: 0, y: 32 }}
|
|
|
|
|
animate={heroInView ? { opacity: 1, y: 0 } : { opacity: 0, y: 32 }}
|
|
|
|
|
transition={{ duration: 0.7, ease: "easeOut" as const }}
|
|
|
|
|
className="relative flex-1 flex items-center py-16 sm:py-20 lg:py-24 overflow-hidden"
|
2026-03-04 11:59:22 +09:00
|
|
|
>
|
|
|
|
|
{/* Gradient Background */}
|
|
|
|
|
<div className="absolute inset-0 bg-gradient-to-br from-surface-sunken via-background to-info-bg/80" />
|
|
|
|
|
|
|
|
|
|
{/* Dot Grid Pattern Overlay */}
|
|
|
|
|
<div
|
|
|
|
|
className="absolute inset-0 pointer-events-none"
|
2026-03-04 13:42:03 +09:00
|
|
|
aria-hidden="true"
|
2026-03-04 11:59:22 +09:00
|
|
|
style={{
|
2026-03-04 17:13:07 +09:00
|
|
|
backgroundImage: `radial-gradient(circle at center, color-mix(in oklch, var(--primary) 15%, transparent) 1px, transparent 1px)`,
|
2026-03-04 11:59:22 +09:00
|
|
|
backgroundSize: "24px 24px",
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
{/* Subtle gradient accent in corner */}
|
|
|
|
|
<div
|
|
|
|
|
className="absolute -top-32 -right-32 w-96 h-96 rounded-full pointer-events-none"
|
2026-03-04 13:42:03 +09:00
|
|
|
aria-hidden="true"
|
2026-03-04 11:59:22 +09:00
|
|
|
style={{
|
2026-03-04 17:13:07 +09:00
|
|
|
background:
|
|
|
|
|
"radial-gradient(circle, color-mix(in oklch, var(--info) 25%, transparent) 0%, transparent 70%)",
|
2026-03-04 11:59:22 +09:00
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
|
2026-03-04 13:11:20 +09:00
|
|
|
<div className="relative mx-auto max-w-3xl px-6 sm:px-10 lg:px-14 text-center">
|
refactor: complete shadcn/ui migration and unify raw HTML with component library
- Migrate all molecule components (DataTable, PaginationBar, FilterDropdown,
AlertBanner, FormField, SectionCard, SubCard, MetricCard, AnimatedCard,
OtpInput) to shadcn/ui primitives with legacy backups and comparison stories
- Install 24 shadcn/ui primitives (accordion, alert, badge, button, card,
checkbox, collapsible, dialog, dropdown-menu, input-otp, input, label,
pagination, popover, radio-group, select, separator, sheet, skeleton,
table, tabs, toggle-group, toggle, tooltip) with barrel exports
- Replace 69 raw HTML elements across all features with shadcn components:
35+ <button> → Button, 5 <select> → Select, 15+ <label> → Label,
6 <input type=checkbox> → Checkbox, 7 <input type=radio> → RadioGroup
- Add TextRotate animation component and integrate into hero section
with rotating service names (Internet, Phone Plans, VPN, IT Support, Business)
- Add destructive color token aliases for error state consistency
- Add CLAUDE.md rules for shadcn migration process
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:21:36 +09:00
|
|
|
<LayoutGroup>
|
|
|
|
|
<h1 className="text-4xl sm:text-5xl lg:text-6xl font-extrabold leading-tight text-foreground font-heading">
|
|
|
|
|
<span className="block">Seamless IT Solutions</span>
|
|
|
|
|
<motion.span
|
|
|
|
|
className="flex items-center justify-center gap-2 sm:gap-3 mt-2"
|
|
|
|
|
layout
|
|
|
|
|
transition={{ type: "spring", damping: 30, stiffness: 400 }}
|
|
|
|
|
>
|
|
|
|
|
<span className="text-foreground">for</span>
|
|
|
|
|
<TextRotate
|
|
|
|
|
texts={SERVICE_WORDS}
|
|
|
|
|
mainClassName="text-white px-3 sm:px-4 bg-primary overflow-hidden py-1 sm:py-1.5 justify-center rounded-lg"
|
|
|
|
|
staggerFrom="last"
|
|
|
|
|
initial={{ y: "100%" }}
|
|
|
|
|
animate={{ y: 0 }}
|
|
|
|
|
exit={{ y: "-120%" }}
|
|
|
|
|
staggerDuration={0.025}
|
|
|
|
|
splitLevelClassName="overflow-hidden pb-0.5 sm:pb-1"
|
|
|
|
|
transition={{ type: "spring", damping: 30, stiffness: 400 }}
|
|
|
|
|
rotationInterval={2500}
|
|
|
|
|
/>
|
|
|
|
|
</motion.span>
|
|
|
|
|
</h1>
|
|
|
|
|
</LayoutGroup>
|
2026-03-04 13:11:20 +09:00
|
|
|
<p className="mt-6 text-base sm:text-lg text-muted-foreground leading-relaxed font-semibold max-w-2xl mx-auto">
|
2026-03-09 13:01:41 +09:00
|
|
|
From connectivity to communication, we handle the complexity so you can focus on what
|
|
|
|
|
matters — with dedicated English support across Japan.
|
2026-03-04 13:11:20 +09:00
|
|
|
</p>
|
|
|
|
|
<div
|
|
|
|
|
ref={heroCTARef}
|
|
|
|
|
className="mt-8 flex flex-col sm:flex-row items-center justify-center gap-3 sm:gap-4"
|
|
|
|
|
>
|
2026-03-04 13:42:03 +09:00
|
|
|
<Button
|
|
|
|
|
as="a"
|
2026-03-04 13:11:20 +09:00
|
|
|
href="/services"
|
2026-03-04 13:42:03 +09:00
|
|
|
variant="pill"
|
|
|
|
|
size="lg"
|
|
|
|
|
rightIcon={<ArrowRight className="h-5 w-5" />}
|
2026-03-04 11:59:22 +09:00
|
|
|
>
|
2026-03-04 14:50:45 +09:00
|
|
|
Find Your Plan
|
2026-03-04 13:42:03 +09:00
|
|
|
</Button>
|
2026-03-04 14:50:45 +09:00
|
|
|
<Button as="a" href="#contact" variant="pillOutline" size="lg">
|
|
|
|
|
Talk to Us
|
2026-03-04 13:42:03 +09:00
|
|
|
</Button>
|
2026-03-04 11:59:22 +09:00
|
|
|
</div>
|
|
|
|
|
</div>
|
2026-03-06 14:48:34 +09:00
|
|
|
</motion.div>
|
2026-03-04 11:59:22 +09:00
|
|
|
);
|
|
|
|
|
}
|