XMoravec
Project

Premium Showroom Website Case Study

02/15/2026 · 7 min read

A multilingual-ready showroom web platform focused on fast navigation, high-impact visual presentation, and reliable lead capture.

Next.jsReactTypeScriptTailwindResendUX

Project Intent

A production-focused Next.js build for a premium bathroom studio, with a strong visual-first homepage, dedicated service/gallery/contact routes, and a hardened contact API. Public project reference: acquamarea.sk.

  • Deliver a polished marketing website where imagery, readability, and conversion paths are equally prioritized.
  • Keep the implementation lean and maintainable using App Router conventions, typed metadata, and reusable component patterns.
  • Implement practical production behavior: responsive navigation, gallery lightbox, contact validation, and API-backed email delivery.

Architecture Snapshot

  • App Router structure with dedicated route segments for home, services, gallery, cooperations, contact, and privacy pages.
  • Route-level metadata and a generated sitemap to improve discoverability and keep SEO fundamentals in source control.
  • Tailwind styling with global design tokens, shared layout shell (Header + Footer), and utility-driven section composition.
  • Client-side interaction islands where needed (hero slideshow, mobile drawer, gallery modal, contact form state management).
  • Server-side contact pipeline via an API route using Resend, with environment-aware fallback behavior in non-configured contexts.

Shipped Feature Set

  • Rotating hero slideshow with timed transitions, route-driven CTAs, and optimized image loading on the homepage.
  • Responsive header with a desktop navigation bar and a mobile side-panel menu with open/close state handling.
  • Interactive gallery grid with a click-to-expand lightbox modal for browsing high-resolution visualization assets.
  • Contact flow with client-side field validation and backend email dispatch through a dedicated /api/contact endpoint.
  • Partner section rendering external brand logos via a generated Logo.dev URL strategy with optional token support.
  • Placeholder article image in use for now: /visualizations/viz5/panska-01.jpg (to be replaced with dedicated screenshots later).

Implementation Examples

Reusable code surfaces mirror the style used in project previews and deeper technical pages.

api-handler-pattern.ts

1export async function POST(req: NextRequest) {
2  try {
3    const { email, message } = await req.json();
4
5    if (!email || !message) {
6      return NextResponse.json({ ok: false, error: "Missing fields" }, { status: 400 });
7    }
8
9    await deliverMessage({ email, message });
10
11    return NextResponse.json({ ok: true });
12  } catch (error) {
13    return NextResponse.json(
14      { ok: false, error: (error as Error).message },
15      { status: 500 }
16    );
17  }
18}

ui-toggle-state.tsx

1export default function MobilePanel() {
2  const [isOpen, setIsOpen] = useState(false);
3
4  const togglePanel = () => {
5    setIsOpen((prev) => !prev);
6  };
7
8  return (
9    <button
10      aria-expanded={isOpen}
11      aria-label="Toggle navigation"
12      onClick={togglePanel}
13    >
14      {isOpen ? "Close" : "Open"}
15    </button>
16  );
17}

Current Focus

  • Content hardening pass to remove remaining generic template language and tighten service-specific messaging.
  • UI consistency pass across pages (spacing, headings, and typography rhythm) while preserving the existing visual identity.
  • Operational polish: stronger API input validation, safer HTML email rendering, and final production environment checks.