fix(deepfield): 히어로 텍스트 대비 복구 — 좌측 앵커 스크림 + 파티클 블룸 완화

세로 중앙이 투명한 스크림 위에 헤드라인이 놓여(items-center) 글자 뒤
받침이 없었고, AdditiveBlending 파티클 3000개가 텍스트 뒤를 밝게 씻어내
흰 글씨가 안 보이던 문제 수정.

- page.tsx: 스크림을 좌측 앵커 다크(좌→우 0.94→0) + 상하 비네트 2겹으로 교체
- HeroField: StaticField radial 광원 밝기 완화(0.45→0.30, 0.16→0.10) + 우측 이동
- HeroField: 파티클 수 3000→1600(lite 800→500), 셰이더 알파 0.45+0.25→0.28+0.18

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YQNcycdLJVtoSKN1tHZU6Q
This commit is contained in:
2026-06-26 18:21:39 +09:00
parent b705f35c2d
commit d10fe981f0
2 changed files with 15 additions and 10 deletions

View File

@@ -23,10 +23,10 @@ function StaticField() {
style={{ style={{
backgroundColor: 'var(--jsm-dark-bg, #070d1a)', backgroundColor: 'var(--jsm-dark-bg, #070d1a)',
backgroundImage: [ backgroundImage: [
// 광원1: 우상단 — accent blue-700 // 광원1: 우상단 — accent blue-700 (텍스트 컬럼에서 떨어진 우측에 배치, 밝기 완화)
'radial-gradient(60% 55% at 75% 25%, rgba(29,78,216,0.45) 0%, transparent 45%)', 'radial-gradient(58% 52% at 78% 22%, rgba(29,78,216,0.30) 0%, transparent 46%)',
// 광원2: 하단 — bright blue (sky-400) // 광원2: 하단 — bright blue (sky-400), 좌측 텍스트와 겹치지 않게 우측 이동 + 밝기 완화
'radial-gradient(55% 50% at 15% 85%, rgba(56,189,248,0.16) 0%, transparent 40%)', 'radial-gradient(52% 48% at 82% 88%, rgba(56,189,248,0.10) 0%, transparent 42%)',
].join(','), ].join(','),
}} }}
/> />
@@ -83,9 +83,9 @@ const VERTEX_SHADER = /* glsl */ `
// 색: seed로 두 파랑 사이 보간 // 색: seed로 두 파랑 사이 보간
vColor = mix(C_DEEP, C_BRIGHT, aSeed); vColor = mix(C_DEEP, C_BRIGHT, aSeed);
// 불투명도: 스크롤로 소멸, 깊이로 약간 페이드 // 불투명도: 스크롤로 소멸, 깊이로 약간 페이드 (전체 톤 다운 — 텍스트 가독성 우선)
float depthFade = smoothstep(-3.0, 0.5, mvPosition.z); float depthFade = smoothstep(-3.0, 0.5, mvPosition.z);
vAlpha = (1.0 - uScroll) * (0.45 + depthFade * 0.25); vAlpha = (1.0 - uScroll) * (0.28 + depthFade * 0.18);
} }
`; `;
@@ -121,7 +121,8 @@ export default function HeroField({ className }: Props) {
if (!canvas) return; if (!canvas) return;
const isFull = effectiveMode === 'full'; const isFull = effectiveMode === 'full';
const COUNT = isFull ? 3000 : 800; // 밀도 완화 — 가산 혼합 파티클이 겹쳐 텍스트 뒤를 밝게 씻어내는(화이트 블룸) 현상 억제
const COUNT = isFull ? 1600 : 500;
let disposed = false; let disposed = false;
let rafId = 0; let rafId = 0;

View File

@@ -84,13 +84,17 @@ export default async function Home() {
{/* -mt-16 pt-16: 고정 헤더 아래로 끌어올려 상단 라이트 띠 제거 + 풀 뷰포트 확보 */} {/* -mt-16 pt-16: 고정 헤더 아래로 끌어올려 상단 라이트 띠 제거 + 풀 뷰포트 확보 */}
<section className="relative -mt-16 flex min-h-[100svh] items-center overflow-hidden"> <section className="relative -mt-16 flex min-h-[100svh] items-center overflow-hidden">
<HeroField className="absolute inset-0" /> <HeroField className="absolute inset-0" />
{/* 콘텐츠 가독성용 하단 스크림 (radial 광원 위 텍스트 대비) */} {/* 콘텐츠 가독성용 스크림 — 좌측 앵커 다크(텍스트 컬럼 받침) + 상하 비네트.
텍스트는 좌측 정렬(max-w-4xl)이므로 좌→우 어둠 그라데이션으로 글자 뒤를 항상 어둡게 깔고,
우측은 파티클 필드가 비치게 둔다. 모바일(좁은 폭)에선 좌측 스크림이 거의 전체를 덮어 가독성 확보. */}
<div <div
aria-hidden aria-hidden
className="pointer-events-none absolute inset-0" className="pointer-events-none absolute inset-0"
style={{ style={{
background: background: [
'linear-gradient(to bottom, rgba(7,13,26,0.55) 0%, transparent 28%, transparent 60%, rgba(7,13,26,0.75) 100%)', 'linear-gradient(to right, rgba(7,13,26,0.94) 0%, rgba(7,13,26,0.80) 34%, rgba(7,13,26,0.34) 64%, rgba(7,13,26,0) 100%)',
'linear-gradient(to bottom, rgba(7,13,26,0.50) 0%, rgba(7,13,26,0) 26%, rgba(7,13,26,0) 64%, rgba(7,13,26,0.82) 100%)',
].join(','),
}} }}
/> />
<div className="relative z-10 mx-auto w-full max-w-6xl px-6 pt-28 pb-24 lg:px-8 lg:pt-32"> <div className="relative z-10 mx-auto w-full max-w-6xl px-6 pt-28 pb-24 lg:px-8 lg:pt-32">