diff --git a/apps/portal/public/assets/images/Hero Image.png b/apps/portal/public/assets/images/Hero Image.png new file mode 100644 index 00000000..ae98954d Binary files /dev/null and b/apps/portal/public/assets/images/Hero Image.png differ diff --git a/apps/portal/public/assets/images/Why_us.png b/apps/portal/public/assets/images/Why_us.png new file mode 100644 index 00000000..60a82d57 Binary files /dev/null and b/apps/portal/public/assets/images/Why_us.png differ diff --git a/apps/portal/public/assets/images/acronis-quick-assist.svg b/apps/portal/public/assets/images/acronis-quick-assist.svg new file mode 100644 index 00000000..1c07a324 --- /dev/null +++ b/apps/portal/public/assets/images/acronis-quick-assist.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/portal/public/assets/images/arconis.png b/apps/portal/public/assets/images/arconis.png new file mode 100644 index 00000000..d261179c Binary files /dev/null and b/apps/portal/public/assets/images/arconis.png differ diff --git a/apps/portal/public/assets/images/teamviewer-qs.svg b/apps/portal/public/assets/images/teamviewer-qs.svg new file mode 100644 index 00000000..33e5923d --- /dev/null +++ b/apps/portal/public/assets/images/teamviewer-qs.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/portal/public/assets/images/teamviewer.png b/apps/portal/public/assets/images/teamviewer.png new file mode 100644 index 00000000..bb1abe0b Binary files /dev/null and b/apps/portal/public/assets/images/teamviewer.png differ diff --git a/apps/portal/src/components/templates/PublicShell/PublicShell.tsx b/apps/portal/src/components/templates/PublicShell/PublicShell.tsx index 1663ca76..ae917f49 100644 --- a/apps/portal/src/components/templates/PublicShell/PublicShell.tsx +++ b/apps/portal/src/components/templates/PublicShell/PublicShell.tsx @@ -34,64 +34,71 @@ export function PublicShell({ children }: PublicShellProps) {
-
+
- Assist Solutions + Assist Solution -
-
+
{children}
diff --git a/apps/portal/src/features/landing-page/views/PublicLandingLoadingView.tsx b/apps/portal/src/features/landing-page/views/PublicLandingLoadingView.tsx index 38595f30..c0ca81d8 100644 --- a/apps/portal/src/features/landing-page/views/PublicLandingLoadingView.tsx +++ b/apps/portal/src/features/landing-page/views/PublicLandingLoadingView.tsx @@ -2,45 +2,108 @@ import { Skeleton } from "@/components/atoms/loading-skeleton"; export function PublicLandingLoadingView() { return ( -
+
{/* Hero Section Skeleton */} -
-
- -
- - +
+
+
+
+ + +
+
+ + +
+
+ + +
-
- - +
+
-
- - -
- {/* Concept Section Skeleton */} -
-
- - -
-
- {Array.from({ length: 3 }).map((_, index) => ( -
- - -
- - + {/* Solutions Carousel Skeleton */} +
+
+ +
+ {Array.from({ length: 4 }).map((_, idx) => ( +
+
+ ))} +
+
+
+ + {/* Trust and Excellence Skeleton */} +
+
+ +
+ + + +
+ {Array.from({ length: 3 }).map((_, idx) => ( +
+ + +
+ ))} +
+ +
+
+
+ + {/* Support Downloads Skeleton */} +
+ +
+ {Array.from({ length: 2 }).map((_, idx) => ( +
+ + +
))}
+ + {/* Contact Skeleton */} +
+
+ +
+
+ +
+ + +
+ + + + + + +
+
+ + + +
+
+
+
); } diff --git a/apps/portal/src/features/landing-page/views/PublicLandingView.tsx b/apps/portal/src/features/landing-page/views/PublicLandingView.tsx index 1c0fcf42..2f4afe55 100644 --- a/apps/portal/src/features/landing-page/views/PublicLandingView.tsx +++ b/apps/portal/src/features/landing-page/views/PublicLandingView.tsx @@ -1,212 +1,443 @@ +"use client"; + +import Image from "next/image"; import Link from "next/link"; +import { useCallback, useEffect, useRef } from "react"; import { ArrowRight, Wifi, Smartphone, Lock, BadgeCheck, - Globe, Wrench, Building2, Tv, + MapPin, + Mail, + MessageSquare, + PhoneCall, + Train, } from "lucide-react"; /** * PublicLandingView - Marketing-focused landing page * - * Purpose: Hook visitors, build trust, guide to shop + * Purpose: Hook visitors, build trust, guide to shop. * Contains: * - Hero with tagline - * - Value props (One Stop Solution, English Support, Onsite Support) - ONLY here - * - Brief service tease (links to /services) - * - CTA to contact + * - Solutions carousel + * - Trust & Support sections */ export function PublicLandingView() { + const carouselRef = useRef(null); + + const services = [ + { + title: "Internet Plans", + description: + "Utilizing NTT's optical fiber network, we deliver one of the most reliable Internet connections in Japan.", + icon: , + href: "/services/internet", + }, + { + title: "Phone Plans", + description: + "Using NTT DOCOMO's vast mobile network, we deliver one of the most cost-friendly SIM card services in Japan.", + icon: , + href: "/services/sim", + }, + { + title: "Business Solutions", + description: + "Dedicated Internet Access, office network setup, data center services, and ongoing tech support.", + icon: , + href: "/services/business", + }, + { + title: "VPN", + description: + "Choose any of our VPN server locations that connect directly from Tokyo with static routing.", + icon: , + href: "/services/vpn", + }, + { + title: "TV Services", + description: "A variety of options for customers such as Satellite TV and Optical Fiber TV.", + icon: , + href: "/services/tv", + }, + { + title: "Onsite Support", + description: + "Professional technical support at your residence or office for setup, configuration, and troubleshooting.", + icon: , + href: "/services/onsite", + }, + ]; + const extendedServices = [...services, ...services, ...services]; + + const supportDownloads = [ + { + title: "Acronis Quick Assist", + href: "https://www.acronis.com/en/products/cloud/quick-assist/download/", + image: "/assets/images/arconis.png", + }, + { + title: "TeamViewer QS", + href: "https://get.teamviewer.com/tokyo", + image: "/assets/images/teamviewer.png", + }, + ]; + + const scrollServices = useCallback( + (direction: 1 | -1) => { + const container = carouselRef.current; + if (!container) return; + const card = container.querySelector("[data-service-card]"); + const gap = + Number.parseFloat(getComputedStyle(container).columnGap || "0") || + Number.parseFloat(getComputedStyle(container).gap || "0") || + 24; + const amount = card ? card.clientWidth + gap : container.clientWidth; + + const nearEnd = container.scrollLeft >= container.scrollWidth - container.clientWidth - 10; + const atStart = container.scrollLeft <= 0; + + if (direction > 0 && nearEnd) { + container.scrollTo({ left: 0, behavior: "smooth" }); + return; + } + + if (direction < 0 && atStart) { + container.scrollTo({ + left: container.scrollWidth - container.clientWidth, + behavior: "smooth", + }); + return; + } + + container.scrollBy({ left: direction * amount, behavior: "smooth" }); + }, + [carouselRef] + ); + + useEffect(() => { + const container = carouselRef.current; + if (container) { + container.scrollLeft = container.scrollWidth / 3; + } + + const interval = window.setInterval(() => { + scrollServices(1); + }, 10000); + return () => window.clearInterval(interval); + }, [scrollServices]); + + useEffect(() => { + const container = carouselRef.current; + if (!container) return; + + const handleScroll = () => { + const segmentWidth = container.scrollWidth / 3; + const threshold = segmentWidth * 0.05; + + if (container.scrollLeft >= segmentWidth * 2 - threshold) { + container.scrollLeft -= segmentWidth; + } else if (container.scrollLeft <= threshold) { + container.scrollLeft += segmentWidth; + } + }; + + container.addEventListener("scroll", handleScroll, { passive: true }); + return () => container.removeEventListener("scroll", handleScroll); + }, []); + return ( -
+
{/* Hero Section */} -
-
- -
-
- - - - - Reliable Connectivity in Japan -
-

- A One Stop Solution - - for Your IT Needs - -

-

- Serving Japan's international community with reliable, English-supported internet, - mobile, and VPN solutions. -

-
-
- - Browse Services - - - - Contact Us - -
-
- - {/* CONCEPT Section - Value Propositions (ONLY on homepage) */} -
-
-

- Our Concept -

-

- Why customers choose us -

-
-
- {/* One Stop Solution */} -
-
- -
-

One Stop Solution

-

- All you need is just to contact us and we will take care of everything. +

+
+
+

+ One Stop Solution + for Your IT Needs +

+

+ Serving Japan's international community with reliable, English-supported + internet, mobile, and VPN solutions and many more.

-
- - {/* English Support */} -
-
- -
-

English Support

-

- We always assist you in English. No language barrier to worry about. -

-
- - {/* Onsite Support */} -
-
- -
-

Onsite Support

-

- Our tech staff can visit your residence for setup and troubleshooting. -

-
-
-
- - {/* Services Teaser - Brief preview linking to /services */} -
-

- Our Services -

-

What we offer

-
- - - - Internet - - - - - - SIM & eSIM - - - - - - VPN - - - - - - Business - - - - - - Onsite Support - - - - - - TV Services - - -
- - Browse all services - - -
- - {/* CTA Section */} -
-
-
-
-
-

- Ready to get connected? -

-

- Contact us anytime — our bilingual team is here to help you find the right solution. -

-
- - Contact Us - - +
Browse Services + + + Need Assistance? + +
+
+ +
+
+ Team collaborating in a modern office +
+
+
+
+ + {/* Solutions Carousel */} +
+
+
+

Solutions

+
+
+
+ {extendedServices.map((service, index) => ( + +
+
{service.icon}
+

{service.title}

+

{service.description}

+
+ + ))} +
+
+ + +
+
+
+
+ + {/* Trust and Excellence Section */} +
+
+
+ Team collaborating with trust and excellence +
+
+
+

+ Built on Trust and Excellence +

+

+ For over two decades, we've been helping expats & businesses navigate complex + technological challenges with confidence. +

+
+
    + {["One Stop Solution", "English Support", "Onsite Support"].map(item => ( +
  • + + {item} +
  • + ))} +
+ + About our company + + +
+
+
+ + {/* Support Downloads */} +
+

+ SUPPORT +

+
+ {supportDownloads.map(item => ( +
+
+

{item.title}

+
+
+ {item.title} +
+ + Download + +
+ ))} +
+
+ + {/* Contact Section */} +
+
+

CONTACT US

+
+
+
+
+ + By Online Form (Anytime) +
+
+ + + + +