'use client'; import Link from 'next/link'; import { useState, useEffect } from 'react'; /* ═══════════════════════════════════════════════════ DESIGN TOKEN — 인테리어 페이지와 완전히 다른 팔레트 No gold, no cream, no warm amber. Editorial B&W + cool stone. ═══════════════════════════════════════════════════ */ const T = { ink: '#0C0B09', paper: '#F4F2EF', sand: '#E9E5DF', stone: '#7C7870', chalk: '#B8B3AB', white: '#FAFAF8', } as const; const BANNER_H = 40; const NAV_H = 56; /* ═══════════════════════════════════════════════════ FASHION IMAGES — picsum.photos (안정적, 항상 로드됨) seed 값은 항상 동일한 이미지를 반환하므로 일관성 유지 ═══════════════════════════════════════════════════ */ const IMG = { /* 히어로 — 세로형 풀스크린 */ hero: 'https://picsum.photos/seed/mellow-hero/900/1200', /* 상품 — 세로 portrait (3:4) */ p1: 'https://picsum.photos/seed/mellow-p1/480/640', p2: 'https://picsum.photos/seed/mellow-p2/480/640', p3: 'https://picsum.photos/seed/mellow-p3/480/640', p4: 'https://picsum.photos/seed/mellow-p4/480/640', p5: 'https://picsum.photos/seed/mellow-p5/480/640', p6: 'https://picsum.photos/seed/mellow-p6/480/640', p7: 'https://picsum.photos/seed/mellow-p7/480/640', p8: 'https://picsum.photos/seed/mellow-p8/480/640', /* 에디토리얼 배너 — 와이드 */ edit1: 'https://picsum.photos/seed/mellow-edit/1400/700', /* 브랜드 스토리 이미지 */ feat1: 'https://picsum.photos/seed/mellow-feat1/600/800', feat2: 'https://picsum.photos/seed/mellow-feat2/600/800', /* 룩북 — portrait strip */ lb1: 'https://picsum.photos/seed/mellow-lb1/400/533', lb2: 'https://picsum.photos/seed/mellow-lb2/400/533', lb3: 'https://picsum.photos/seed/mellow-lb3/400/533', lb4: 'https://picsum.photos/seed/mellow-lb4/400/533', lb5: 'https://picsum.photos/seed/mellow-lb5/400/533', } as const; /* ═══════════════════════════════════════════════════ DATA ═══════════════════════════════════════════════════ */ type Cat = '전체' | '아우터' | '상의' | '하의' | '액세서리'; const products = [ { id: 1, name: 'Structured Blazer', kr: '스트럭처드 블레이저', price: 328000, cat: '아우터' as Cat, img: IMG.p1, isNew: true }, { id: 2, name: 'Cocoon Coat', kr: '코쿤 코트', price: 498000, cat: '아우터' as Cat, img: IMG.p2, isBest: true }, { id: 3, name: 'Slip Midi Dress', kr: '슬립 미디 드레스', price: 218000, cat: '상의' as Cat, img: IMG.p3, isNew: true }, { id: 4, name: 'Relaxed Oxford', kr: '릴랙스드 옥스포드', price: 145000, cat: '상의' as Cat, img: IMG.p4 }, { id: 5, name: 'Wide Trousers', kr: '와이드 트라우저', price: 185000, cat: '하의' as Cat, img: IMG.p5 }, { id: 6, name: 'Barrel Denim', kr: '배럴 데님', price: 198000, cat: '하의' as Cat, img: IMG.p6, isBest: true }, { id: 7, name: 'Leather Mini Bag', kr: '레더 미니백', price: 278000, cat: '액세서리' as Cat, img: IMG.p7, isNew: true }, { id: 8, name: 'Square Sunglasses', kr: '스퀘어 선글라스', price: 128000, cat: '액세서리' as Cat, img: IMG.p8 }, ]; const reviews = [ { quote: '입고 나서 동료가 어디서 샀냐고 계속 물어봐요. 핏이 정말 완벽합니다.', name: '하윤서', city: '서울', item: 'Structured Blazer' }, { quote: '코쿤 코트, 사진보다 실물이 훨씬 좋아요. 소재감이 기대 이상입니다.', name: '이서진', city: '제주', item: 'Cocoon Coat' }, { quote: '슬립 드레스를 받았는데 바느질 하나하나에서 정성이 느껴져요.', name: '박도현', city: '부산', item: 'Slip Midi Dress' }, ]; /* ═══════════════════════════════════════════════════ MAIN PAGE ═══════════════════════════════════════════════════ */ export default function ShoppingPage() { const [activeCat, setActiveCat] = useState('전체'); const [scrolled, setScrolled] = useState(false); const [showTop, setShowTop] = useState(false); const [cart, setCart] = useState(0); useEffect(() => { const sc: HTMLElement = (document.querySelector('.main-content') as HTMLElement | null) ?? document.documentElement; const onScroll = () => { setScrolled(sc.scrollTop > 40); setShowTop(sc.scrollTop > 500); }; sc.addEventListener('scroll', onScroll, { passive: true }); /* reveal */ const obs = new IntersectionObserver( (entries) => entries.forEach(e => { if (e.isIntersecting) e.target.classList.add('ml-in'); }), { threshold: 0.07, root: sc === document.documentElement ? null : sc } ); document.querySelectorAll('.ml-reveal').forEach(el => obs.observe(el)); return () => { sc.removeEventListener('scroll', onScroll); obs.disconnect(); }; }, []); const cats: (Cat | '전체')[] = ['전체', '아우터', '상의', '하의', '액세서리']; const filtered = activeCat === '전체' ? products : products.filter(p => p.cat === activeCat); const scrollTop = () => { const sc = (document.querySelector('.main-content') as HTMLElement | null) ?? document.documentElement; sc.scrollTo({ top: 0, behavior: 'smooth' }); }; return (
{/* ── FONTS + GLOBAL ── */}