- {/* FAQ Section */}
-
-
-
- Frequently Asked Questions
-
-
- {FAQ_ITEMS.map((item, index) => {
- const isExpanded = expandedFaq === index;
- return (
-
-
setExpandedFaq(isExpanded ? null : index)}
- className="w-full flex items-center justify-between p-4 text-left hover:bg-muted/30 transition-colors"
- >
-
- {item.question}
-
-
-
- {isExpanded && (
-
- )}
-
- );
- })}
-
-
-
- {/* Contact Form */}
-
-
-
- Send a Message
-
-
- {submitError && (
-
- {submitError}
-
- )}
-
-
-
-
- By submitting, you agree to our{" "}
-
- Privacy Policy
-
- . We typically respond within 24 hours.
+ {/* Office Location */}
+
+
+
+
Our Office
+
+
+ 3F Azabu Maruka Bldg., 3-8-2 Higashi Azabu,
+
+ Minato-ku, Tokyo 106-0044
+
+
+ 5 min walk from Exit 6, Azabu-Juban Station
+
+ Get Directions
+
+
-
-
- {/* Office Location */}
-
-
- {/* Map */}
-
+ {/* Small Map */}
+
-
- {/* Address Info */}
-
-
-
-
-
-
-
Visit Our Office
-
- Walk-ins welcome during business hours
-
-
-
-
-
-
-
- Address
-
-
- 3F Azabu Maruka Bldg., 3-8-2 Higashi Azabu,
-
- Minato-ku, Tokyo 106-0044
-
-
-
-
-
- Contact
-
-
- Tel: 03-3560-1006
-
- Fax: 03-3560-1007
-
-
-
-
-
- Access
-
-
- 5 min walk from Exit 6 of Azabu-Juban Station
-
- (Subway Oedo Line / Nanboku Line)
-
-
-
-
- Get Directions
-
-
-
-
-
- {/* Existing Customer CTA */}
-
-
- Already have an account?{" "}
-
- Sign in
- {" "}
- to access your dashboard and support tickets.
-
-
);
}
diff --git a/apps/portal/src/features/support/views/PublicSupportView.tsx b/apps/portal/src/features/support/views/PublicSupportView.tsx
index 44b7a546..7b069d41 100644
--- a/apps/portal/src/features/support/views/PublicSupportView.tsx
+++ b/apps/portal/src/features/support/views/PublicSupportView.tsx
@@ -1,116 +1,270 @@
"use client";
+import { useState } from "react";
+import Image from "next/image";
import Link from "next/link";
-import { HelpCircle, MessageSquare, Mail, ChevronRight } from "lucide-react";
+import {
+ HelpCircle,
+ Wifi,
+ Smartphone,
+ Lock,
+ Building2,
+ CreditCard,
+ Wrench,
+ Download,
+ ChevronDown,
+ Send,
+} from "lucide-react";
+import { ContactForm } from "@/features/support/components";
+import { supportDownloads } from "@/features/landing-page/data";
+import { cn } from "@/shared/utils";
-const FAQ_ITEMS = [
+// =============================================================================
+// DATA
+// =============================================================================
+
+const KNOWLEDGE_BASE_CATEGORIES = [
{
- question: "Sample Question 1?",
- answer:
- "This is a sample answer for frequently asked question 1. Replace this with actual content when available.",
+ title: "Internet & Wi-Fi",
+ description: "Router setup, connection issues, speed troubleshooting",
+ icon: Wifi,
+ color: "text-blue-500",
+ bgColor: "bg-blue-500/10",
+ hoverBorder: "hover:border-blue-500/40",
},
{
- question: "Sample Question 2?",
- answer:
- "This is a sample answer for frequently asked question 2. Replace this with actual content when available.",
+ title: "Phone & SIM",
+ description: "SIM activation, plan changes, number porting",
+ icon: Smartphone,
+ color: "text-green-500",
+ bgColor: "bg-green-500/10",
+ hoverBorder: "hover:border-green-500/40",
},
{
- question: "Sample Question 3?",
- answer:
- "This is a sample answer for frequently asked question 3. Replace this with actual content when available.",
+ title: "VPN & Streaming",
+ description: "VPN router setup, streaming access, configuration",
+ icon: Lock,
+ color: "text-purple-500",
+ bgColor: "bg-purple-500/10",
+ hoverBorder: "hover:border-purple-500/40",
},
{
- question: "Sample Question 4?",
- answer:
- "This is a sample answer for frequently asked question 4. Replace this with actual content when available.",
+ title: "Business Solutions",
+ description: "Office networks, dedicated lines, enterprise support",
+ icon: Building2,
+ color: "text-orange-500",
+ bgColor: "bg-orange-500/10",
+ hoverBorder: "hover:border-orange-500/40",
+ },
+ {
+ title: "Billing & Account",
+ description: "Invoices, payments, account changes, contracts",
+ icon: CreditCard,
+ color: "text-pink-500",
+ bgColor: "bg-pink-500/10",
+ hoverBorder: "hover:border-pink-500/40",
+ },
+ {
+ title: "General Tech Support",
+ description: "Device help, software issues, general troubleshooting",
+ icon: Wrench,
+ color: "text-amber-500",
+ bgColor: "bg-amber-500/10",
+ hoverBorder: "hover:border-amber-500/40",
},
];
+const FAQ_ITEMS = [
+ {
+ question: "How do I set up my internet router?",
+ answer:
+ "After your installation appointment, connect the provided router to the NTT ONU device using the included LAN cable. Power on the router and connect to the Wi-Fi network using the credentials on the router label. If you need help, contact our support team or use our remote support tools.",
+ },
+ {
+ question: "How do I activate my SIM card?",
+ answer:
+ "Insert the SIM card into your unlocked phone. You should receive a confirmation email with APN settings. Go to Settings > Mobile Data > APN and enter the provided settings. Restart your phone and you should be connected within a few minutes.",
+ },
+ {
+ question: "What payment methods do you accept?",
+ answer:
+ "We accept major credit cards (Visa, Mastercard, American Express), bank transfers, and convenience store payments. Foreign credit cards are accepted for all our services.",
+ },
+ {
+ question: "How do I contact support outside business hours?",
+ answer:
+ "You can send us an email or submit a contact form at any time — we'll respond within 24 hours on the next business day. For urgent issues, our live chat may have extended availability.",
+ },
+ {
+ question: "Can I change my plan after signing up?",
+ answer:
+ "Yes, you can change your plan at any time. Contact our support team and we'll help you switch to a plan that better fits your needs. Changes typically take effect from the next billing cycle.",
+ },
+];
+
+// =============================================================================
+// COMPONENT
+// =============================================================================
+
/**
- * PublicSupportView - Public FAQ and support landing page
+ * PublicSupportView - Self-service support hub
*/
export function PublicSupportView() {
+ const [expandedFaq, setExpandedFaq] = useState
(null);
+
return (
-
+
{/* Header */}
-
-
+
+
-
How Can We Help?
-
- Questions about our services? Our English-speaking team is ready to assist. Find answers
- below or reach out directly.
+
+ How Can We Help?
+
+
+ Find answers, download remote support tools, or send us a message. Our English-speaking
+ team is ready to assist.
- {/* Contact Options */}
-
-
- {/* FAQ Section */}
-
-
- Frequently Asked Questions
-
-
- {FAQ_ITEMS.map((item, index) => (
-
-
-
- {item.question}
-
-
-
-
-
{item.answer}
+ {/* Knowledge Base Categories */}
+
+ Browse by Topic
+
+ {KNOWLEDGE_BASE_CATEGORIES.map(category => {
+ const Icon = category.icon;
+ return (
+
+
+
+
+
+
+
{category.title}
+
+ {category.description}
+
+
+
-
+ );
+ })}
+
+
+
+ {/* Remote Support Tools */}
+
+
+ Remote Support Tools
+
+
+ Download one of these tools so our technicians can assist you remotely.
+
+
-
+
- {/* Existing Customer */}
-
+ {/* FAQ */}
+
+
+ Frequently Asked Questions
+
+
+ {FAQ_ITEMS.map((item, index) => {
+ const isExpanded = expandedFaq === index;
+ return (
+
+
setExpandedFaq(isExpanded ? null : index)}
+ className="w-full flex items-center justify-between p-4 text-left hover:bg-muted/30 transition-colors"
+ >
+ {item.question}
+
+
+ {isExpanded && (
+
+ )}
+
+ );
+ })}
+
+
+
+ {/* Contact Form Fallback */}
+
+
+
+
+
+
Still Need Help?
+
+ Send us a message and we'll get back to you within 24 hours.
+
+
+
+
+
+
+
+ {/* Existing Customer CTA */}
+
Already have an account?{" "}
Sign in
{" "}
- to access your dashboard and support cases.
+ to access your dashboard and support tickets.
diff --git a/apps/portal/src/features/support/views/index.ts b/apps/portal/src/features/support/views/index.ts
index 4c038ea8..3d10f8fe 100644
--- a/apps/portal/src/features/support/views/index.ts
+++ b/apps/portal/src/features/support/views/index.ts
@@ -2,3 +2,5 @@ export * from "./NewSupportCaseView";
export * from "./SupportCasesView";
export * from "./SupportCaseDetailView";
export * from "./SupportHomeView";
+export * from "./PublicContactView";
+export * from "./PublicSupportView";
diff --git a/apps/portal/src/styles/utilities.css b/apps/portal/src/styles/utilities.css
index b932fed1..26a4ee4c 100644
--- a/apps/portal/src/styles/utilities.css
+++ b/apps/portal/src/styles/utilities.css
@@ -162,6 +162,17 @@
letter-spacing: var(--cp-tracking-tight);
}
+/* Semantic heading presets — composite utilities for common heading patterns.
+ Use these instead of manually combining text-display-* + font-* + leading-*. */
+
+@utility text-section-heading {
+ font-size: var(--cp-text-display-sm);
+ font-family: var(--font-display);
+ font-weight: var(--cp-font-semibold);
+ line-height: var(--cp-leading-tight);
+ letter-spacing: var(--cp-tracking-tight);
+}
+
@layer utilities {
/* ===== PAGE ENTRANCE ANIMATIONS ===== */
.cp-animate-in {
diff --git a/docs/plans/2026-03-04-public-pages-restructuring-design.md b/docs/plans/2026-03-04-public-pages-restructuring-design.md
new file mode 100644
index 00000000..34dcf0e5
--- /dev/null
+++ b/docs/plans/2026-03-04-public-pages-restructuring-design.md
@@ -0,0 +1,114 @@
+# Public Pages Restructuring Design
+
+**Date**: 2026-03-04
+**Scope**: Homepage hero update, Contact page cleanup, Support page creation, shared ContactForm component
+
+## Problem
+
+- Homepage hero text doesn't match desired branding ("A One Stop Solution for Your IT Needs")
+- Contact page mixes FAQ and contact form — unfocused
+- Support page is thin with placeholder content
+- Acronis/TeamViewer remote support tools are defined in data but not rendered anywhere
+- Contact form is hardcoded in PublicContactView — not reusable
+- `/help` just redirects to `/contact`, no dedicated support hub
+
+## Design
+
+### 1. Homepage (`/`)
+
+**Hero Section changes only** — rest of page (TrustStrip, ServicesGrid, WhyUsSection, CTABanner) stays as-is.
+
+- **Heading line 1**: "A One Stop Solution"
+- **Heading line 2** (primary color): "for Your IT Needs"
+- **Subtitle**: "From internet and mobile to VPN and on-site tech support — we handle it all in English so you don't have to."
+- **CTAs**: "Browse Services" (primary) + "Need Assistance?" (outline, links to `/contact`)
+
+### 2. Contact Page (`/contact`)
+
+Focused page for reaching a human. Two-column layout.
+
+**Left column — Contact Form**:
+
+- Reusable `ContactForm` component
+- Fields: Name, Email, Phone (optional), Subject, Message
+- Same Zod validation (`publicContactRequestSchema`)
+- Submit → POST `/api/support/contact` → success state
+
+**Right sidebar — Contact Info** (stacked cards):
+
+- Quick contact options: Phone (0120-660-470), Email (support@assist-solutions.jp), Live Chat
+- Business hours: Mon-Fri 9:30 AM - 6:00 PM JST
+- Office location: address, access info, "Get Directions" link
+- Small embedded Google Map
+
+**Removed from contact page**: FAQ section (moves to Support)
+
+### 3. Support Page (`/support`)
+
+Self-service support hub. Top-to-bottom flow.
+
+**Section 1: Header**
+
+- Icon + "How Can We Help?" heading
+- Subtitle about self-service and English support
+
+**Section 2: Knowledge Base Categories**
+
+- Grid of 6 category cards (2x3 on desktop, 1 col mobile):
+ - Internet & Wi-Fi
+ - Phone & SIM
+ - VPN & Streaming
+ - Business Solutions
+ - Billing & Account
+ - General Tech Support
+- Each card has icon, title, brief description
+- Cards can link to anchors or future article pages (placeholder for now)
+
+**Section 3: Remote Support Tools**
+
+- Uses existing `supportDownloads` data from `features/landing-page/data/services.tsx`
+- Two cards side-by-side: Acronis Quick Assist + TeamViewer QS
+- Each shows: logo image, title, description, use case, download link (external)
+
+**Section 4: FAQ**
+
+- Accordion-style FAQ items (moved from contact page)
+- Placeholder content for now, real content to be added later
+
+**Section 5: Contact Form Fallback**
+
+- "Still need help? Send us a message" heading
+- Reusable `ContactForm` component
+
+### 4. Shared ContactForm Component
+
+**Location**: `apps/portal/src/features/support/components/ContactForm.tsx`
+
+Extracted from current `PublicContactView`:
+
+- Same fields, same Zod schema, same API call
+- Accepts optional `className` prop
+- Self-contained: manages own submit state and success/error UI
+- Exported from `features/support/components/index.ts`
+
+## File Changes
+
+### New files
+
+- `features/support/components/ContactForm.tsx` — reusable form
+- `app/(public)/(site)/support/page.tsx` — support page route
+
+### Modified files
+
+- `features/landing-page/components/HeroSection.tsx` — new heading + subtitle
+- `features/support/views/PublicContactView.tsx` — two-column layout, remove FAQ, use ContactForm
+- `features/support/views/PublicSupportView.tsx` — full rewrite as support hub
+- `features/support/views/index.ts` — update exports if needed
+- `features/support/components/index.ts` — export ContactForm
+
+### Routing
+
+- `/` — homepage (updated hero)
+- `/contact` — contact page (cleaned up)
+- `/support` — new support hub page
+- `/help` — keep redirect to `/contact` (backwards compat)
diff --git a/docs/plans/2026-03-04-public-pages-restructuring-plan.md b/docs/plans/2026-03-04-public-pages-restructuring-plan.md
new file mode 100644
index 00000000..34e9c02c
--- /dev/null
+++ b/docs/plans/2026-03-04-public-pages-restructuring-plan.md
@@ -0,0 +1,883 @@
+# Public Pages Restructuring Implementation Plan
+
+> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
+
+**Goal:** Restructure public pages — update homepage hero, extract reusable ContactForm, clean up Contact page (form + sidebar), create Support page (knowledge base categories, remote tools, FAQ, contact form fallback).
+
+**Architecture:** Extract shared ContactForm from PublicContactView into `features/support/components/`. Rewrite PublicContactView as focused two-column contact page. Rewrite PublicSupportView as self-service hub. Update HeroSection text. Add `/support` route.
+
+**Tech Stack:** Next.js 15, React 19, Tailwind CSS, shadcn/ui atoms, Zod validation, lucide-react icons
+
+---
+
+### Task 1: Update Homepage Hero Text
+
+**Files:**
+
+- Modify: `apps/portal/src/features/landing-page/components/HeroSection.tsx:42-49`
+
+**Step 1: Update the hero heading and subtitle**
+
+Change lines 42-49 in `HeroSection.tsx`:
+
+```tsx
+// OLD:
+
+ English IT Support
+ for Expats in Japan
+
+
+ No Japanese required. Get reliable internet, mobile, and VPN services with full English
+ support. Serving expats and international businesses for over 20 years.
+
+
+// NEW:
+
+ A One Stop Solution
+ for Your IT Needs
+
+
+ From internet and mobile to VPN and on-site tech support — we handle it all in English so you don't have to.
+
+```
+
+**Step 2: Verify no lint errors**
+
+Run: `pnpm lint --filter @customer-portal/portal`
+
+**Step 3: Commit**
+
+```
+feat: update homepage hero text to "A One Stop Solution for Your IT Needs"
+```
+
+---
+
+### Task 2: Extract Reusable ContactForm Component
+
+**Files:**
+
+- Create: `apps/portal/src/features/support/components/ContactForm.tsx`
+- Create: `apps/portal/src/features/support/components/index.ts`
+
+**Step 1: Create the ContactForm component**
+
+Create `apps/portal/src/features/support/components/ContactForm.tsx`:
+
+```tsx
+"use client";
+
+import { useState, useCallback } from "react";
+import Link from "next/link";
+import { Button, Input } from "@/components/atoms";
+import { FormField } from "@/components/molecules/FormField/FormField";
+import { AlertBanner } from "@/components/molecules/AlertBanner/AlertBanner";
+import { useZodForm } from "@/shared/hooks";
+import { CheckCircle } from "lucide-react";
+import {
+ publicContactRequestSchema,
+ type PublicContactRequest,
+} from "@customer-portal/domain/support";
+import { apiClient, ApiError, isApiError } from "@/core/api";
+import { cn } from "@/shared/utils";
+
+interface ContactFormProps {
+ className?: string;
+}
+
+export function ContactForm({ className }: ContactFormProps) {
+ const [isSubmitted, setIsSubmitted] = useState(false);
+ const [submitError, setSubmitError] = useState(null);
+
+ const handleSubmit = useCallback(async (data: PublicContactRequest) => {
+ setSubmitError(null);
+
+ try {
+ await apiClient.POST("/api/support/contact", { body: data });
+ setIsSubmitted(true);
+ } catch (error) {
+ if (isApiError(error)) {
+ setSubmitError(error.message || "Failed to send message");
+ return;
+ }
+ if (error instanceof ApiError) {
+ setSubmitError(error.message || "Failed to send message");
+ return;
+ }
+ setSubmitError(error instanceof Error ? error.message : "Failed to send message");
+ }
+ }, []);
+
+ const form = useZodForm({
+ schema: publicContactRequestSchema,
+ initialValues: {
+ name: "",
+ email: "",
+ phone: "",
+ subject: "",
+ message: "",
+ },
+ onSubmit: handleSubmit,
+ });
+
+ if (isSubmitted) {
+ return (
+
+
+
+
+
Message Sent!
+
+ Thank you for contacting us. We'll get back to you within 24 hours.
+
+
+
+ Back to Home
+
+
+ Browse Services
+
+
+
+ );
+ }
+
+ return (
+
+ );
+}
+```
+
+**Step 2: Create barrel export**
+
+Create `apps/portal/src/features/support/components/index.ts`:
+
+```ts
+export { ContactForm } from "./ContactForm";
+```
+
+**Step 3: Verify no lint errors**
+
+Run: `pnpm lint --filter @customer-portal/portal`
+
+**Step 4: Commit**
+
+```
+feat: extract reusable ContactForm component from PublicContactView
+```
+
+---
+
+### Task 3: Rewrite Contact Page (Two-Column Layout)
+
+**Files:**
+
+- Modify: `apps/portal/src/features/support/views/PublicContactView.tsx` (full rewrite)
+
+**Step 1: Rewrite PublicContactView**
+
+Replace the entire content of `apps/portal/src/features/support/views/PublicContactView.tsx` with:
+
+```tsx
+"use client";
+
+import { Mail, MapPin, Phone, MessageSquare, Clock, Send, ExternalLink } from "lucide-react";
+import { ContactForm } from "@/features/support/components";
+
+/**
+ * PublicContactView - Focused contact page with form + sidebar info
+ */
+export function PublicContactView() {
+ return (
+
+ {/* Header */}
+
+
+
+
+
+ Get in Touch
+
+
+ Our English-speaking team is here to help. Fill out the form below or reach us through any
+ of the channels listed.
+
+
+
+ {/* Two-column layout: Form + Sidebar */}
+
+ {/* Contact Form - takes 2/3 width */}
+
+
+
+
+ {/* Sidebar - takes 1/3 width */}
+
+ {/* Phone */}
+
+
+
+
+ Call Us
+
+
0120-660-470
+
Toll-free in Japan
+
+
+
+ {/* Live Chat */}
+
{
+ /* Trigger chat */
+ }}
+ className="group flex items-center gap-4 bg-white rounded-2xl border border-border/60 p-5 hover:border-blue-500/40 hover:shadow-md transition-all duration-200 text-left w-full"
+ >
+
+
+
+
+
+ Live Chat
+
+
+
+
+
+
+ Available now
+
+
+
+
+ {/* Email */}
+
+
+
+
+
+
+ Email Us
+
+
support@assist-solutions.jp
+
+
+
+ {/* Business Hours */}
+
+
+
+
Business Hours
+
+
Mon - Fri, 9:30 AM - 6:00 PM JST
+
+
+ {/* Office Location */}
+
+
+
+
Our Office
+
+
+ 3F Azabu Maruka Bldg., 3-8-2 Higashi Azabu,
+
+ Minato-ku, Tokyo 106-0044
+
+
+ 5 min walk from Exit 6, Azabu-Juban Station
+
+
+ Get Directions
+
+
+
+
+ {/* Small Map */}
+
+
+
+
+
+
+ );
+}
+
+export default PublicContactView;
+```
+
+**Step 2: Verify no lint errors**
+
+Run: `pnpm lint --filter @customer-portal/portal`
+
+**Step 3: Commit**
+
+```
+feat: rewrite contact page with two-column layout using shared ContactForm
+```
+
+---
+
+### Task 4: Rewrite Support Page as Self-Service Hub
+
+**Files:**
+
+- Modify: `apps/portal/src/features/support/views/PublicSupportView.tsx` (full rewrite)
+
+**Step 1: Rewrite PublicSupportView**
+
+Replace the entire content of `apps/portal/src/features/support/views/PublicSupportView.tsx` with:
+
+```tsx
+"use client";
+
+import { useState } from "react";
+import Image from "next/image";
+import Link from "next/link";
+import {
+ HelpCircle,
+ Wifi,
+ Smartphone,
+ Lock,
+ Building2,
+ CreditCard,
+ Wrench,
+ Download,
+ ChevronDown,
+ Send,
+} from "lucide-react";
+import { ContactForm } from "@/features/support/components";
+import { supportDownloads } from "@/features/landing-page/data";
+import { cn } from "@/shared/utils";
+
+// =============================================================================
+// DATA
+// =============================================================================
+
+const KNOWLEDGE_BASE_CATEGORIES = [
+ {
+ title: "Internet & Wi-Fi",
+ description: "Router setup, connection issues, speed troubleshooting",
+ icon: Wifi,
+ color: "text-blue-500",
+ bgColor: "bg-blue-500/10",
+ hoverBorder: "hover:border-blue-500/40",
+ },
+ {
+ title: "Phone & SIM",
+ description: "SIM activation, plan changes, number porting",
+ icon: Smartphone,
+ color: "text-green-500",
+ bgColor: "bg-green-500/10",
+ hoverBorder: "hover:border-green-500/40",
+ },
+ {
+ title: "VPN & Streaming",
+ description: "VPN router setup, streaming access, configuration",
+ icon: Lock,
+ color: "text-purple-500",
+ bgColor: "bg-purple-500/10",
+ hoverBorder: "hover:border-purple-500/40",
+ },
+ {
+ title: "Business Solutions",
+ description: "Office networks, dedicated lines, enterprise support",
+ icon: Building2,
+ color: "text-orange-500",
+ bgColor: "bg-orange-500/10",
+ hoverBorder: "hover:border-orange-500/40",
+ },
+ {
+ title: "Billing & Account",
+ description: "Invoices, payments, account changes, contracts",
+ icon: CreditCard,
+ color: "text-pink-500",
+ bgColor: "bg-pink-500/10",
+ hoverBorder: "hover:border-pink-500/40",
+ },
+ {
+ title: "General Tech Support",
+ description: "Device help, software issues, general troubleshooting",
+ icon: Wrench,
+ color: "text-amber-500",
+ bgColor: "bg-amber-500/10",
+ hoverBorder: "hover:border-amber-500/40",
+ },
+];
+
+const FAQ_ITEMS = [
+ {
+ question: "How do I set up my internet router?",
+ answer:
+ "After your installation appointment, connect the provided router to the NTT ONU device using the included LAN cable. Power on the router and connect to the Wi-Fi network using the credentials on the router label. If you need help, contact our support team or use our remote support tools.",
+ },
+ {
+ question: "How do I activate my SIM card?",
+ answer:
+ "Insert the SIM card into your unlocked phone. You should receive a confirmation email with APN settings. Go to Settings > Mobile Data > APN and enter the provided settings. Restart your phone and you should be connected within a few minutes.",
+ },
+ {
+ question: "What payment methods do you accept?",
+ answer:
+ "We accept major credit cards (Visa, Mastercard, American Express), bank transfers, and convenience store payments. Foreign credit cards are accepted for all our services.",
+ },
+ {
+ question: "How do I contact support outside business hours?",
+ answer:
+ "You can send us an email or submit a contact form at any time — we'll respond within 24 hours on the next business day. For urgent issues, our live chat may have extended availability.",
+ },
+ {
+ question: "Can I change my plan after signing up?",
+ answer:
+ "Yes, you can change your plan at any time. Contact our support team and we'll help you switch to a plan that better fits your needs. Changes typically take effect from the next billing cycle.",
+ },
+];
+
+// =============================================================================
+// COMPONENT
+// =============================================================================
+
+/**
+ * PublicSupportView - Self-service support hub
+ */
+export function PublicSupportView() {
+ const [expandedFaq, setExpandedFaq] = useState(null);
+
+ return (
+
+ {/* Header */}
+
+
+
+
+
+ How Can We Help?
+
+
+ Find answers, download remote support tools, or send us a message. Our English-speaking
+ team is ready to assist.
+
+
+
+ {/* Knowledge Base Categories */}
+
+ Browse by Topic
+
+ {KNOWLEDGE_BASE_CATEGORIES.map(category => {
+ const Icon = category.icon;
+ return (
+
+
+
+
+
+
+
{category.title}
+
+ {category.description}
+
+
+
+
+ );
+ })}
+
+
+
+ {/* Remote Support Tools */}
+
+
+ Remote Support Tools
+
+
+ Download one of these tools so our technicians can assist you remotely.
+
+
+
+
+ {/* FAQ */}
+
+
+ Frequently Asked Questions
+
+
+ {FAQ_ITEMS.map((item, index) => {
+ const isExpanded = expandedFaq === index;
+ return (
+
+
setExpandedFaq(isExpanded ? null : index)}
+ className="w-full flex items-center justify-between p-4 text-left hover:bg-muted/30 transition-colors"
+ >
+ {item.question}
+
+
+ {isExpanded && (
+
+ )}
+
+ );
+ })}
+
+
+
+ {/* Contact Form Fallback */}
+
+
+
+
+
+
Still Need Help?
+
+ Send us a message and we'll get back to you within 24 hours.
+
+
+
+
+
+
+
+ {/* Existing Customer CTA */}
+
+
+ Already have an account?{" "}
+
+ Sign in
+ {" "}
+ to access your dashboard and support tickets.
+
+
+
+ );
+}
+
+export default PublicSupportView;
+```
+
+**Step 2: Verify no lint errors**
+
+Run: `pnpm lint --filter @customer-portal/portal`
+
+**Step 3: Commit**
+
+```
+feat: rewrite support page as self-service hub with knowledge base, remote tools, FAQ
+```
+
+---
+
+### Task 5: Add Support Page Route
+
+**Files:**
+
+- Create: `apps/portal/src/app/(public)/(site)/support/page.tsx`
+
+**Step 1: Create the support route page**
+
+Create `apps/portal/src/app/(public)/(site)/support/page.tsx`:
+
+```tsx
+/**
+ * Public Support Page
+ *
+ * Self-service support hub with knowledge base categories,
+ * remote support tools, FAQ, and contact form fallback.
+ */
+
+import type { Metadata } from "next";
+import { PublicSupportView } from "@/features/support/views/PublicSupportView";
+
+export const metadata: Metadata = {
+ title: "Support - Self-Service Help Center | Assist Solutions",
+ description:
+ "Find answers to common questions, download remote support tools, or contact our English-speaking team. No Japanese required.",
+ keywords: [
+ "IT support Japan",
+ "English tech support Tokyo",
+ "remote support Japan",
+ "expat tech help",
+ "Assist Solutions support",
+ ],
+ openGraph: {
+ title: "Support - Help Center | Assist Solutions",
+ description:
+ "Self-service support hub for expats in Japan. FAQ, remote support tools, and direct contact options.",
+ type: "website",
+ },
+};
+
+export default function SupportPage() {
+ return ;
+}
+```
+
+**Step 2: Verify no lint errors**
+
+Run: `pnpm lint --filter @customer-portal/portal`
+
+**Step 3: Verify type checking passes**
+
+Run: `pnpm type-check`
+
+**Step 4: Commit**
+
+```
+feat: add /support route for public support page
+```
+
+---
+
+### Task 6: Update Support Views Barrel Export
+
+**Files:**
+
+- Modify: `apps/portal/src/features/support/views/index.ts`
+
+**Step 1: Add PublicSupportView and PublicContactView to the barrel export**
+
+The current `views/index.ts` only exports authenticated views. Add the public views:
+
+```ts
+// Current content:
+export * from "./NewSupportCaseView";
+export * from "./SupportCasesView";
+export * from "./SupportCaseDetailView";
+export * from "./SupportHomeView";
+
+// Add these:
+export * from "./PublicContactView";
+export * from "./PublicSupportView";
+```
+
+Note: The contact page currently imports directly from the view file (`@/features/support/views/PublicContactView`), not from the barrel. After adding to barrel, update the contact page import in `apps/portal/src/app/(public)/(site)/contact/page.tsx` to use the barrel:
+
+```tsx
+// OLD:
+import { PublicContactView } from "@/features/support/views/PublicContactView";
+
+// NEW:
+import { PublicContactView } from "@/features/support/views";
+```
+
+And update the new support page import in `apps/portal/src/app/(public)/(site)/support/page.tsx`:
+
+```tsx
+// OLD:
+import { PublicSupportView } from "@/features/support/views/PublicSupportView";
+
+// NEW:
+import { PublicSupportView } from "@/features/support/views";
+```
+
+**Step 2: Verify no lint errors**
+
+Run: `pnpm lint --filter @customer-portal/portal`
+
+**Step 3: Verify type checking passes**
+
+Run: `pnpm type-check`
+
+**Step 4: Commit**
+
+```
+refactor: add public views to support barrel exports
+```
+
+---
+
+### Task 7: Final Verification
+
+**Step 1: Run full lint check**
+
+Run: `pnpm lint`
+
+**Step 2: Run type check**
+
+Run: `pnpm type-check`
+
+**Step 3: Verify all pages render** (manual or dev server if permitted)
+
+Check these routes work:
+
+- `/` — homepage with new hero text
+- `/contact` — two-column contact page
+- `/support` — self-service support hub
+- `/help` — still redirects to `/contact`