swiper/react CLS — SSR Placeholder와 isClient 마운트
JS 로드 전 동일 비율 자리 확보 후 CSR에서만 Swiper 마운트
swiper/react는 클라이언트 JS가 있어야 슬라이드 DOM·높이가 잡힙니다. SSR에서 빈 영역으로 두거나 하이드레이션 때 갑자기 Swiper를 끼우면 레이아웃이 밀리며 CLS가 납니다.
BannerSwiper는 useEffect로 isClient를 true로 올린 뒤에만 <Swiper>를 렌더합니다. 그 전에는 max-w-[689px]와 aspect-[12/5] 스켈레톤(또는 고정 width/height 이미지)으로 같은 자리를 미리 채웁니다.
로딩 중에도 동일 비율 플레이스홀더를 유지해, 데이터 도착·Swiper 마운트 사이 레이아웃 이동을 줄였고 CLS 0.1을 확보했습니다.
- `isClient` 게이트로 Swiper를 hydration 이후에만 마운트
- SSR Placeholder가 배너와 같은 aspect·너비를 예약
- 이력서 성과의 CLS 0.1과 대응
- src/widgets/banner/ui/BannerSwiper.tsx