diff --git a/apps/portal/src/app/(public)/(site)/about/page.tsx b/apps/portal/src/app/(public)/(site)/about/page.tsx
new file mode 100644
index 00000000..f95bf359
--- /dev/null
+++ b/apps/portal/src/app/(public)/(site)/about/page.tsx
@@ -0,0 +1,11 @@
+/**
+ * Public About Page
+ *
+ * Corporate profile and company information.
+ */
+
+import { AboutUsView } from "@/features/marketing/views/AboutUsView";
+
+export default function AboutPage() {
+ return ;
+}
diff --git a/apps/portal/src/app/(public)/(site)/services/business/page.tsx b/apps/portal/src/app/(public)/(site)/services/business/page.tsx
new file mode 100644
index 00000000..257b79fc
--- /dev/null
+++ b/apps/portal/src/app/(public)/(site)/services/business/page.tsx
@@ -0,0 +1,97 @@
+import { Button } from "@/components/atoms";
+import {
+ ServerStackIcon,
+ ComputerDesktopIcon,
+ WrenchScrewdriverIcon,
+ GlobeAltIcon,
+} from "@heroicons/react/24/outline";
+
+export default function BusinessSolutionsPage() {
+ return (
+
+ {/* Header */}
+
+
+ Business Solutions
+
+
+ We provide comprehensive business solutions including DIA (Dedicated Internet Access) with
+ SLA and bandwidth guarantees to ensure your business stays connected.
+
+
+
+
+ {/* Office LAN Setup */}
+
+
+
+
+
Office LAN Setup
+
+ Whether you are upgrading your current LAN for greater bandwidth and reliability or
+ installing a new LAN for a new facility, Assist Solutions will ensure you make informed
+ decisions. From cable installation and data switches to configuration of routers and
+ firewalls, we help you determine a cost-effective and reliable way to do this.
+
+
+
+ {/* Onsite & Remote Tech Support */}
+
+
+
+
+
Onsite & Remote Tech Support
+
+ We provide onsite and remote support to make sure your network is up and running as
+ quickly as possible. Assist Solutions can help with your IT needs so you can grow your
+ business with ease and stability. From computer networks to phone and printer
+ installations, our team will complete your project to your highest satisfaction.
+
+
+
+ {/* Dedicated Internet Access (DIA) */}
+
+
+
+
+
+ Dedicated Internet Access (DIA)
+
+
+ Dedicated Internet Access is designed for businesses that need greater Internet capacity
+ and a dedicated connection between their existing Local Area Network (LAN) and the
+ public Internet. We are able to provide a bandwidth guarantee with a service level
+ agreement depending on what is most suitable for your business.
+
+
+
+ {/* Data Center Service */}
+
+
+
+
+
Data Center Service
+
+ Our Data Center Service provides high-quality data center facilities in Equinix (Tokyo
+ Tennozu Isle) and GDC (Gotenyama) and many value-added network services to help
+ establish stable infrastructure platforms. This improves both reliability and efficiency
+ in your company.
+
+
+
+
+ {/* CTA */}
+
+
+ Interested in our Business Solutions?
+
+
+ Contact us today to discuss your requirements and how we can help your business grow.
+
+
+
+
+ );
+}
diff --git a/apps/portal/src/app/(public)/(site)/services/internet/configure/page.tsx b/apps/portal/src/app/(public)/(site)/services/internet/configure/page.tsx
new file mode 100644
index 00000000..fc4a373f
--- /dev/null
+++ b/apps/portal/src/app/(public)/(site)/services/internet/configure/page.tsx
@@ -0,0 +1,17 @@
+/**
+ * Public Internet Configure Page
+ *
+ * Configure internet plan for unauthenticated users.
+ */
+
+import { PublicInternetConfigureView } from "@/features/catalog/views/PublicInternetConfigure";
+import { RedirectAuthenticatedToAccountServices } from "@/features/catalog/components/common/RedirectAuthenticatedToAccountServices";
+
+export default function PublicInternetConfigurePage() {
+ return (
+ <>
+
+
+ >
+ );
+}
diff --git a/apps/portal/src/app/(public)/(site)/services/internet/page.tsx b/apps/portal/src/app/(public)/(site)/services/internet/page.tsx
new file mode 100644
index 00000000..7d414020
--- /dev/null
+++ b/apps/portal/src/app/(public)/(site)/services/internet/page.tsx
@@ -0,0 +1,17 @@
+/**
+ * Public Internet Plans Page
+ *
+ * Displays internet plans for unauthenticated users.
+ */
+
+import { PublicInternetPlansView } from "@/features/catalog/views/PublicInternetPlans";
+import { RedirectAuthenticatedToAccountServices } from "@/features/catalog/components/common/RedirectAuthenticatedToAccountServices";
+
+export default function PublicInternetPlansPage() {
+ return (
+ <>
+
+
+ >
+ );
+}
diff --git a/apps/portal/src/app/(public)/(site)/services/onsite/page.tsx b/apps/portal/src/app/(public)/(site)/services/onsite/page.tsx
new file mode 100644
index 00000000..2aadbed2
--- /dev/null
+++ b/apps/portal/src/app/(public)/(site)/services/onsite/page.tsx
@@ -0,0 +1,147 @@
+import { Button } from "@/components/atoms";
+import {
+ UserGroupIcon,
+ ComputerDesktopIcon,
+ TvIcon,
+ ChatBubbleLeftRightIcon,
+} from "@heroicons/react/24/outline";
+
+export default function OnsiteSupportPage() {
+ return (
+
+ {/* Header */}
+
+
+ Onsite Support
+
+
+ We dispatch our skillful in-house tech staff to your residence or office for your needs.
+
+
+
+ {/* Main Services */}
+
+
+
Need Our Technical Support?
+
+ We can provide you with on-site technical support service. If you would like for our
+ technicians to visit your residence and provide technical assistance, please let us
+ know.
+
+
+ We also provide "Remote Access Services" which allows our technicians to do support via
+ Remote Access Software over the Internet connection to fix up the issue (depends on what
+ the issue is).
+
+
+
+
+
+
+
+
+
+
+ {/* Pricing Cards */}
+
+ {/* Onsite Network & Computer Support */}
+
+
+
+
+
+ Onsite Network & Computer Support
+
+
+
Basic Service Fee
+
15,000 JPY
+
+
+
+ {/* Remote Support */}
+
+
+
+
+
+ Remote Network & Computer Support
+
+
+
Basic Service Fee
+
5,000 JPY
+
+
+
+ {/* Onsite TV Support */}
+
+
+
+
+
Onsite TV Support Service
+
+
Basic Service Fee
+
15,000 JPY
+
+
+
+
+ {/* FAQ Section */}
+
+
+ Frequently Asked Questions
+
+
+
+
+
+ My home requires multiple Wi-Fi routers. Would you be able to assist with this?
+
+
+ Yes, the Assist Solutions technical team is able to visit your residence for device
+ set up including Wi-Fi routers, printers, Apple TVs etc. Our tech consulting team will
+ be able to make suggestions based on your residence layout and requirements. Please
+ contact us for a free consultation.
+
+
+
+
+
+ I am already subscribed to a different Internet provider but require more Wi-Fi
+ coverage. Would I be able to just opt for the Onsite Support service without switching
+ over my entire home Internet service?
+
+
+ Yes, we are able to offer the Onsite Support service as a standalone service.
+
+
+
+
+
+ Do you offer this service outside of Tokyo?
+
+
+
+ Our In-Home Technical Assistance service can be provided in Tokyo, Saitama and
+ Kanagawa prefecture.
+
+
+ *Please note that this service may not available in some areas within the above
+ prefectures. For more information, please contact us.
+
+
+
+
+
+
+ {/* CTA */}
+
+
Ready to get started?
+
+
+
+ );
+}
diff --git a/apps/portal/src/app/(public)/(site)/services/page.tsx b/apps/portal/src/app/(public)/(site)/services/page.tsx
new file mode 100644
index 00000000..04fb7f2c
--- /dev/null
+++ b/apps/portal/src/app/(public)/(site)/services/page.tsx
@@ -0,0 +1,149 @@
+import Link from "next/link";
+import {
+ BuildingOfficeIcon,
+ WrenchScrewdriverIcon,
+ TvIcon,
+ ArrowRightIcon,
+ ServerIcon,
+ DevicePhoneMobileIcon,
+ ShieldCheckIcon,
+} from "@heroicons/react/24/outline";
+
+export default function ServicesPage() {
+ return (
+
+ {/* Header */}
+
+
+ Our Services
+
+
+ From high-speed internet to onsite support, we provide comprehensive solutions for your
+ home and business.
+
+
+
+
+ {/* Internet */}
+
+
+
+
+
+
+ Internet
+
+
+ NTT fiber with speeds up to 10Gbps and professional installation support. Fast and
+ reliable connectivity.
+
+
+ View Plans{" "}
+
+
+
+
+
+ {/* SIM & eSIM */}
+
+
+
+
+
+
+ SIM & eSIM
+
+
+ Data, voice & SMS on NTT Docomo's nationwide network. Available as physical SIM or
+ instant eSIM.
+
+
+ View Plans{" "}
+
+
+
+
+
+ {/* VPN */}
+
+
+
+
+
+
+ VPN
+
+
+ Access US/UK content with a pre-configured router. Easy plug & play setup for seamless
+ streaming.
+
+
+ View Plans{" "}
+
+
+
+
+
+ {/* Business Solutions */}
+
+
+
+
+
+
+ Business Solutions
+
+
+ Dedicated Internet Access (DIA), Office LAN setup, Data Center services, and
+ onsite/remote tech support.
+
+
+ Learn more{" "}
+
+
+
+
+
+ {/* Onsite Support */}
+
+
+
+
+
+
+ Onsite Support
+
+
+ Professional technical support at your residence or office. Network setup, device
+ configuration, and troubleshooting.
+
+
+ Learn more{" "}
+
+
+
+
+
+ {/* TV Services */}
+
+
+
+
+
+
+ TV Services
+
+
+ Satellite, Cable, and Optical Fiber TV services. We arrange subscriptions for major
+ Japanese TV providers.
+
+
+ Learn more{" "}
+
+
+
+
+
+
+ );
+}
diff --git a/apps/portal/src/app/(public)/(site)/services/sim/configure/page.tsx b/apps/portal/src/app/(public)/(site)/services/sim/configure/page.tsx
new file mode 100644
index 00000000..09bf21fd
--- /dev/null
+++ b/apps/portal/src/app/(public)/(site)/services/sim/configure/page.tsx
@@ -0,0 +1,17 @@
+/**
+ * Public SIM Configure Page
+ *
+ * Configure SIM plan for unauthenticated users.
+ */
+
+import { PublicSimConfigureView } from "@/features/catalog/views/PublicSimConfigure";
+import { RedirectAuthenticatedToAccountServices } from "@/features/catalog/components/common/RedirectAuthenticatedToAccountServices";
+
+export default function PublicSimConfigurePage() {
+ return (
+ <>
+
+
+ >
+ );
+}
diff --git a/apps/portal/src/app/(public)/(site)/services/sim/page.tsx b/apps/portal/src/app/(public)/(site)/services/sim/page.tsx
new file mode 100644
index 00000000..99c71361
--- /dev/null
+++ b/apps/portal/src/app/(public)/(site)/services/sim/page.tsx
@@ -0,0 +1,17 @@
+/**
+ * Public SIM Plans Page
+ *
+ * Displays SIM plans for unauthenticated users.
+ */
+
+import { PublicSimPlansView } from "@/features/catalog/views/PublicSimPlans";
+import { RedirectAuthenticatedToAccountServices } from "@/features/catalog/components/common/RedirectAuthenticatedToAccountServices";
+
+export default function PublicSimPlansPage() {
+ return (
+ <>
+
+
+ >
+ );
+}
diff --git a/apps/portal/src/app/(public)/(site)/services/tv/page.tsx b/apps/portal/src/app/(public)/(site)/services/tv/page.tsx
new file mode 100644
index 00000000..ad643621
--- /dev/null
+++ b/apps/portal/src/app/(public)/(site)/services/tv/page.tsx
@@ -0,0 +1,729 @@
+import { Button } from "@/components/atoms";
+import {
+ TvIcon,
+ FilmIcon,
+ MusicalNoteIcon,
+ TrophyIcon,
+ NewspaperIcon,
+ SparklesIcon,
+ EllipsisHorizontalCircleIcon,
+ AcademicCapIcon,
+ GlobeAsiaAustraliaIcon,
+} from "@heroicons/react/24/outline";
+
+export default function TVServicesPage() {
+ return (
+
+ {/* Header */}
+
+
+ TV Services
+
+
+ Providing a variety of options for our customers such as Satellite TV, Cable TV and
+ Optical Fiber TV.
+
+
+
+ {/* Intro */}
+
+
Service Lineup
+
+ We are proud to act as agents for Japan's major paid TV service providers, and we will
+ arrange your services on your behalf (no service fee required for us to arrange your
+ services). Usually each building has their pre-assigned main TV service providers. To find
+ out which TV service you can apply for, please feel free to contact us anytime.
+
+ Is Assist Solutions directly providing the TV service?
+
+
+ As partners, we are able to refer you to each cable TV company available at your home.
+ However, once the service starts, the cable TV service itself will be directly
+ provided by each cable TV company.
+
+
+
+
+
+ Would I be able to choose any cable TV service that Assist Solutions is partnered
+ with?
+
+
+ In Japan, most cable TV companies have predetermined service areas. We will be able to
+ check which services are available for your home. Please contact us for a free
+ consultation.
+
+ );
+}
diff --git a/apps/portal/src/app/(public)/(site)/services/vpn/page.tsx b/apps/portal/src/app/(public)/(site)/services/vpn/page.tsx
new file mode 100644
index 00000000..7236a8f5
--- /dev/null
+++ b/apps/portal/src/app/(public)/(site)/services/vpn/page.tsx
@@ -0,0 +1,17 @@
+/**
+ * Public VPN Plans Page
+ *
+ * Displays VPN plans for unauthenticated users.
+ */
+
+import { PublicVpnPlansView } from "@/features/catalog/views/PublicVpnPlans";
+import { RedirectAuthenticatedToAccountServices } from "@/features/catalog/components/common/RedirectAuthenticatedToAccountServices";
+
+export default function PublicVpnPlansPage() {
+ return (
+ <>
+
+
+ >
+ );
+}
diff --git a/apps/portal/src/app/account/my-services/[id]/internet/cancel/page.tsx b/apps/portal/src/app/account/my-services/[id]/internet/cancel/page.tsx
new file mode 100644
index 00000000..e1684c84
--- /dev/null
+++ b/apps/portal/src/app/account/my-services/[id]/internet/cancel/page.tsx
@@ -0,0 +1,5 @@
+import InternetCancelContainer from "@/features/subscriptions/views/InternetCancel";
+
+export default function AccountInternetCancelPage() {
+ return ;
+}
diff --git a/apps/portal/src/app/account/my-services/[id]/loading.tsx b/apps/portal/src/app/account/my-services/[id]/loading.tsx
new file mode 100644
index 00000000..70d2b15f
--- /dev/null
+++ b/apps/portal/src/app/account/my-services/[id]/loading.tsx
@@ -0,0 +1,19 @@
+import { RouteLoading } from "@/components/molecules/RouteLoading";
+import { ServerIcon } from "@heroicons/react/24/outline";
+import { LoadingCard } from "@/components/atoms/loading-skeleton";
+
+export default function AccountServiceDetailLoading() {
+ return (
+ }
+ title="Service"
+ description="Service details"
+ mode="content"
+ >
+
+
+
+
+
+ );
+}
diff --git a/apps/portal/src/app/account/my-services/[id]/page.tsx b/apps/portal/src/app/account/my-services/[id]/page.tsx
new file mode 100644
index 00000000..2324febc
--- /dev/null
+++ b/apps/portal/src/app/account/my-services/[id]/page.tsx
@@ -0,0 +1,5 @@
+import SubscriptionDetailContainer from "@/features/subscriptions/views/SubscriptionDetail";
+
+export default function AccountServiceDetailPage() {
+ return ;
+}
diff --git a/apps/portal/src/app/account/my-services/[id]/sim/call-history/page.tsx b/apps/portal/src/app/account/my-services/[id]/sim/call-history/page.tsx
new file mode 100644
index 00000000..16e52603
--- /dev/null
+++ b/apps/portal/src/app/account/my-services/[id]/sim/call-history/page.tsx
@@ -0,0 +1,5 @@
+import SimCallHistoryContainer from "@/features/subscriptions/views/SimCallHistory";
+
+export default function AccountSimCallHistoryPage() {
+ return ;
+}
diff --git a/apps/portal/src/app/account/my-services/[id]/sim/cancel/page.tsx b/apps/portal/src/app/account/my-services/[id]/sim/cancel/page.tsx
new file mode 100644
index 00000000..f9aaf9a4
--- /dev/null
+++ b/apps/portal/src/app/account/my-services/[id]/sim/cancel/page.tsx
@@ -0,0 +1,5 @@
+import SimCancelContainer from "@/features/subscriptions/views/SimCancel";
+
+export default function AccountSimCancelPage() {
+ return ;
+}
diff --git a/apps/portal/src/app/account/my-services/[id]/sim/change-plan/page.tsx b/apps/portal/src/app/account/my-services/[id]/sim/change-plan/page.tsx
new file mode 100644
index 00000000..8ff1da30
--- /dev/null
+++ b/apps/portal/src/app/account/my-services/[id]/sim/change-plan/page.tsx
@@ -0,0 +1,5 @@
+import SimChangePlanContainer from "@/features/subscriptions/views/SimChangePlan";
+
+export default function AccountSimChangePlanPage() {
+ return ;
+}
diff --git a/apps/portal/src/app/account/my-services/[id]/sim/reissue/page.tsx b/apps/portal/src/app/account/my-services/[id]/sim/reissue/page.tsx
new file mode 100644
index 00000000..1936a048
--- /dev/null
+++ b/apps/portal/src/app/account/my-services/[id]/sim/reissue/page.tsx
@@ -0,0 +1,5 @@
+import SimReissueContainer from "@/features/subscriptions/views/SimReissue";
+
+export default function AccountSimReissuePage() {
+ return ;
+}
diff --git a/apps/portal/src/app/account/my-services/[id]/sim/top-up/page.tsx b/apps/portal/src/app/account/my-services/[id]/sim/top-up/page.tsx
new file mode 100644
index 00000000..89629c2e
--- /dev/null
+++ b/apps/portal/src/app/account/my-services/[id]/sim/top-up/page.tsx
@@ -0,0 +1,5 @@
+import SimTopUpContainer from "@/features/subscriptions/views/SimTopUp";
+
+export default function AccountSimTopUpPage() {
+ return ;
+}
diff --git a/apps/portal/src/app/account/my-services/loading.tsx b/apps/portal/src/app/account/my-services/loading.tsx
new file mode 100644
index 00000000..3db64007
--- /dev/null
+++ b/apps/portal/src/app/account/my-services/loading.tsx
@@ -0,0 +1,16 @@
+import { RouteLoading } from "@/components/molecules/RouteLoading";
+import { ServerIcon } from "@heroicons/react/24/outline";
+import { LoadingTable } from "@/components/atoms/loading-skeleton";
+
+export default function AccountServicesLoading() {
+ return (
+ }
+ title="Services"
+ description="View and manage your services"
+ mode="content"
+ >
+
+
+ );
+}
diff --git a/apps/portal/src/app/account/my-services/page.tsx b/apps/portal/src/app/account/my-services/page.tsx
new file mode 100644
index 00000000..13e6e5bb
--- /dev/null
+++ b/apps/portal/src/app/account/my-services/page.tsx
@@ -0,0 +1,5 @@
+import SubscriptionsListContainer from "@/features/subscriptions/views/SubscriptionsList";
+
+export default function AccountServicesPage() {
+ return ;
+}
diff --git a/apps/portal/src/app/account/services/internet/configure/page.tsx b/apps/portal/src/app/account/services/internet/configure/page.tsx
new file mode 100644
index 00000000..f4c70ebb
--- /dev/null
+++ b/apps/portal/src/app/account/services/internet/configure/page.tsx
@@ -0,0 +1,5 @@
+import { InternetConfigureContainer } from "@/features/catalog/views/InternetConfigure";
+
+export default function AccountInternetConfigurePage() {
+ return ;
+}
diff --git a/apps/portal/src/app/account/services/internet/page.tsx b/apps/portal/src/app/account/services/internet/page.tsx
new file mode 100644
index 00000000..469f6ade
--- /dev/null
+++ b/apps/portal/src/app/account/services/internet/page.tsx
@@ -0,0 +1,5 @@
+import { InternetPlansContainer } from "@/features/catalog/views/InternetPlans";
+
+export default function AccountInternetPlansPage() {
+ return ;
+}
diff --git a/apps/portal/src/app/account/services/layout.tsx b/apps/portal/src/app/account/services/layout.tsx
new file mode 100644
index 00000000..f0737f4d
--- /dev/null
+++ b/apps/portal/src/app/account/services/layout.tsx
@@ -0,0 +1,5 @@
+import type { ReactNode } from "react";
+
+export default function AccountShopLayout({ children }: { children: ReactNode }) {
+ return <>{children}>;
+}
diff --git a/apps/portal/src/app/account/services/sim/configure/page.tsx b/apps/portal/src/app/account/services/sim/configure/page.tsx
new file mode 100644
index 00000000..ab66d78c
--- /dev/null
+++ b/apps/portal/src/app/account/services/sim/configure/page.tsx
@@ -0,0 +1,5 @@
+import { SimConfigureContainer } from "@/features/catalog/views/SimConfigure";
+
+export default function AccountSimConfigurePage() {
+ return ;
+}
diff --git a/apps/portal/src/app/account/services/sim/page.tsx b/apps/portal/src/app/account/services/sim/page.tsx
new file mode 100644
index 00000000..e00978cf
--- /dev/null
+++ b/apps/portal/src/app/account/services/sim/page.tsx
@@ -0,0 +1,5 @@
+import { SimPlansContainer } from "@/features/catalog/views/SimPlans";
+
+export default function AccountSimPlansPage() {
+ return ;
+}
diff --git a/apps/portal/src/app/account/services/vpn/page.tsx b/apps/portal/src/app/account/services/vpn/page.tsx
new file mode 100644
index 00000000..701c37c7
--- /dev/null
+++ b/apps/portal/src/app/account/services/vpn/page.tsx
@@ -0,0 +1,5 @@
+import { VpnPlansView } from "@/features/catalog/views/VpnPlans";
+
+export default function AccountVpnPlansPage() {
+ return ;
+}
diff --git a/apps/portal/src/components/organisms/SiteFooter/SiteFooter.tsx b/apps/portal/src/components/organisms/SiteFooter/SiteFooter.tsx
new file mode 100644
index 00000000..c5e32cb2
--- /dev/null
+++ b/apps/portal/src/components/organisms/SiteFooter/SiteFooter.tsx
@@ -0,0 +1,124 @@
+/**
+ * SiteFooter
+ *
+ * Shared footer component for all public-facing pages.
+ * Contains company info, address, services links, and company links.
+ */
+
+import Link from "next/link";
+import { Logo } from "@/components/atoms/logo";
+import { PhoneIcon, MapPinIcon } from "@heroicons/react/24/outline";
+
+export function SiteFooter() {
+ return (
+
+ );
+}
diff --git a/apps/portal/src/components/organisms/SiteFooter/index.ts b/apps/portal/src/components/organisms/SiteFooter/index.ts
new file mode 100644
index 00000000..a0c8466d
--- /dev/null
+++ b/apps/portal/src/components/organisms/SiteFooter/index.ts
@@ -0,0 +1 @@
+export { SiteFooter } from "./SiteFooter";
diff --git a/apps/portal/src/components/templates/PublicShell/index.ts b/apps/portal/src/components/templates/PublicShell/index.ts
new file mode 100644
index 00000000..b54dab1b
--- /dev/null
+++ b/apps/portal/src/components/templates/PublicShell/index.ts
@@ -0,0 +1,2 @@
+export { PublicShell } from "./PublicShell";
+export type { PublicShellProps } from "./PublicShell";
diff --git a/apps/portal/src/features/catalog/components/common/RedirectAuthenticatedToAccountServices.tsx b/apps/portal/src/features/catalog/components/common/RedirectAuthenticatedToAccountServices.tsx
new file mode 100644
index 00000000..e8a128e2
--- /dev/null
+++ b/apps/portal/src/features/catalog/components/common/RedirectAuthenticatedToAccountServices.tsx
@@ -0,0 +1,36 @@
+"use client";
+
+import { useEffect } from "react";
+import { usePathname, useRouter, useSearchParams } from "next/navigation";
+import { useAuthStore } from "@/features/auth/services/auth.store";
+
+type Props = {
+ /**
+ * Absolute target path (no querystring). When omitted, the current pathname is transformed:
+ * `/services/...` -> `/account/services/...`.
+ */
+ targetPath?: string;
+};
+
+export function RedirectAuthenticatedToAccountServices({ targetPath }: Props) {
+ const router = useRouter();
+ const pathname = usePathname();
+ const searchParams = useSearchParams();
+ const isAuthenticated = useAuthStore(state => state.isAuthenticated);
+ const hasCheckedAuth = useAuthStore(state => state.hasCheckedAuth);
+
+ useEffect(() => {
+ if (!hasCheckedAuth) return;
+ if (!isAuthenticated) return;
+
+ // Simple path transformation: /services/* → /account/services/*
+ const nextPath =
+ targetPath ??
+ (pathname.startsWith("/services") ? `/account${pathname}` : "/account/services");
+
+ const query = searchParams?.toString() ?? "";
+ router.replace(query ? `${nextPath}?${query}` : nextPath);
+ }, [hasCheckedAuth, isAuthenticated, pathname, router, searchParams, targetPath]);
+
+ return null;
+}
diff --git a/apps/portal/src/features/catalog/hooks/useServicesBasePath.ts b/apps/portal/src/features/catalog/hooks/useServicesBasePath.ts
new file mode 100644
index 00000000..6d6e7f3f
--- /dev/null
+++ b/apps/portal/src/features/catalog/hooks/useServicesBasePath.ts
@@ -0,0 +1,17 @@
+"use client";
+
+import { usePathname } from "next/navigation";
+
+/**
+ * Returns the active services base path for the current shell.
+ *
+ * - Public services: `/services`
+ * - Account services (inside AppShell): `/account/services`
+ */
+export function useServicesBasePath(): "/services" | "/account/services" {
+ const pathname = usePathname();
+ if (pathname.startsWith("/account/services")) {
+ return "/account/services";
+ }
+ return "/services";
+}
diff --git a/apps/portal/src/features/marketing/views/AboutUsView.tsx b/apps/portal/src/features/marketing/views/AboutUsView.tsx
new file mode 100644
index 00000000..0d1d13ae
--- /dev/null
+++ b/apps/portal/src/features/marketing/views/AboutUsView.tsx
@@ -0,0 +1,204 @@
+"use client";
+
+import {
+ BuildingOffice2Icon,
+ UserGroupIcon,
+ CalendarIcon,
+ BanknotesIcon,
+ PhoneIcon,
+ MapPinIcon,
+ ClockIcon,
+ CheckCircleIcon,
+} from "@heroicons/react/24/outline";
+
+/**
+ * AboutUsView - Corporate profile and company information
+ *
+ * Displays company background, corporate data, business activities,
+ * and mission statement for Assist Solutions.
+ */
+export function AboutUsView() {
+ return (
+
+ {/* Header */}
+
+
About Us
+
+ We specialize in serving Japan's international community with the most reliable and
+ cost-efficient IT solutions available.
+
+
+
+ {/* Who We Are Section */}
+
+
+
+
+
+
Who We Are
+
+
+
+ Assist Solutions Corp. is a privately-owned entrepreneurial IT service company. We
+ specialize in serving Japan's international community with the most reliable and
+ cost-efficient IT & TV solutions available.
+
+
+ We are dedicated to providing comfortable support for our customer's diverse needs
+ in both English and Japanese. We believe that our excellent bi-lingual support and
+ flexible service along with our knowledge and experience in the field are what sets us
+ apart from the rest of the information technology and broadcasting industry.
+
+
+
+
+ {/* Corporate Data Section */}
+
+
+
+
+
+
Corporate Data
+
+
+ Assist Solutions is a privately-owned entrepreneurial IT supporting company, focused on
+ the international community in Japan.
+
Mon - Fri 9:30AM - 6:00PM — In-office Tech Support Team
+
Mon - Sat 10:00AM - 9:00PM — Onsite Tech Support Team
+
+
+
+ {/* Representative */}
+
+
Representative Director
+
Daisuke Nagakawa
+
+
+ {/* Employees */}
+
+
Employees
+
+ 21 Staff Members (as of March 31st, 2025)
+
+
+
+ {/* Established */}
+
+
+
+ Established
+
+
March 8, 2002
+
+
+ {/* Capital */}
+
+
+
+ Paid-in Capital
+
+
40,000,000 JPY
+
+
+
+
+ {/* Business Activities Section */}
+
+
Business Activities
+
+ {[
+ "IT Consulting Services",
+ "TV Consulting Services",
+ "Internet Connection Service Provision (SonixNet ISP)",
+ "VPN Connection Service Provision (SonixNet US/UK Remote Access)",
+ "Agent for Telecommunication Services",
+ "Agent for Internet Services",
+ "Agent for TV Services",
+ "Onsite Support Service for IT",
+ "Onsite Support Service for TV",
+ "Server Management Service",
+ "Network Management Service",
+ ].map((activity, index) => (
+
+
+ {activity}
+
+ ))}
+
+
+
+ {/* Mission Statement Section */}
+
+
Mission Statement
+
+ We will achieve business success by pursuing the following:
+
+
+ {[
+ "Provide the most customer-oriented service in this industry in Japan.",
+ "Through our service, we save client's time and enrich customers' lives.",
+ "We always have the latest and most efficient knowledge required for our service.",
+ "Be a responsible participant in Japan's international community.",
+ "Maintain high ethical standards in all business activities.",
+ ].map((mission, index) => (
+