# 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.

); } return (
{submitError && ( {submitError} )}
void form.handleSubmit(event)} className="space-y-5">
form.setValue("name", e.target.value)} onBlur={() => form.setTouchedField("name")} placeholder="Your name" className="bg-muted/20" /> form.setValue("email", e.target.value)} onBlur={() => form.setTouchedField("email")} placeholder="your@email.com" className="bg-muted/20" />
form.setValue("phone", e.target.value)} onBlur={() => form.setTouchedField("phone")} placeholder="+81 90-1234-5678" className="bg-muted/20" /> form.setValue("subject", e.target.value)} onBlur={() => form.setTouchedField("subject")} placeholder="How can we help?" className="bg-muted/20" />