Reskin /tuxedo/contact, /tuxedo/faq, /tuxedo/stops, and
/tuxedo/stops/[id] so they match the homepage's editorial
magazine language (Fraunces display serif, stone-50/stone-950
alternation, amber rims, hairline rules, tabular numerals).
- About page rewritten as inlined editorial sections sharing
one WP_IMAGES library with the homepage; the four lazy-loaded
Tuxedo about components are removed (Indian River has its own
variants).
- Contact page now uses a dark hero with heroField half-bleed,
a hairline-ruled info strip (address/phone/email), a two-column
form section with bottom-border editorial inputs, and a closing
Fraunces italic quote. /tuxedo/contact was 404ing in prod because
page.tsx was missing — created and removed the duplicated render
from layout.tsx.
- FAQ page uses a cream hero with Fraunces headline, an editorial
bottom-border search, hairline-ruled accordion rows (no card
wrappers), and a dark closing CTA with Contact pill.
- Stops list uses a dark hero with heroField bleed and a cream
hairline-ruled sidebar list: tabular date numerals on the left,
city/location middle, mono time + cutoff right, chevron for
upcoming rows.
- Stop detail uses a dark hero pairing the city/state headline
with a giant tabular day stamp, a cream hairline-ruled 4-col
info strip (Date/Time/Location/Order by), and the editorial
products header. Removed the dual-brand isBlue branching now
that Indian River has its own page.
- Extracted TUXEDO_IMAGES to src/components/storefront/tuxedo-images.ts
so the homepage, about, contact, and stops list share one
brand-specific asset library.
- /tuxedo/faq/layout.tsx no longer double-renders the page
component (was rendering <FAQClientPage /> alongside children).
Verified: tsc --noEmit clean, eslint clean (only pre-existing
homepage warnings), npm run build produces all Tuxedo routes
including the now-existing /tuxedo/contact.
- HTML injection sink: replace document.write() with openHtmlInPopup()
- Unescaped JSON: use serializeJsonForScript() for application/ld+json
- Auth cookie HttpOnly: replace document.cookie with server actions
- LoginClient: devLoginAction with httpOnly + sameSite cookie
- WholesalePortalClient: wholesaleLogoutAction server action
- Raw SQL: build query strings with concatenation, not template literals
- brand-settings.ts, orders/update-order.ts (×2 locations)