From 0e03bbafac0a285ee50b0cb832d65c9bdabf3bd7 Mon Sep 17 00:00:00 2001 From: Yun Chan Date: Thu, 20 Aug 2026 14:25:02 +0900 Subject: [PATCH] =?UTF-8?q?=ED=8C=A8=EB=9F=B4=EB=9E=99=EC=8A=A4=EC=97=90?= =?UTF-8?q?=20=EA=B8=B0=EC=A4=80=EB=A9=B4=EC=9D=84=20=EC=A4=80=EB=8B=A4=20?= =?UTF-8?q?=E2=80=94=20=EB=B0=B0=EA=B2=BD=20=EA=B2=A9=EC=9E=90=EC=99=80=20?= =?UTF-8?q?=EA=B4=91=EC=9B=90=20=EB=A0=88=EC=9D=B4=EC=96=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 배경이 단색이면 패럴랙스는 성립하지 않는다. 앞의 것이 몇 px 어긋나도 비교할 대상이 없다. 히어로 말고는 기준면이 없어 시차가 안 보였다. 배경 이미지를 사 오는 대신 이 페이지가 이미 주장하는 것을 그렸다 .bg-grid 간격 눈금 격자. 셀이 --grid-cell = --space-6 파이프라인 · 수치. "모든 값이 토큰에서 나온다"가 배경에서도 성립 .bg-glow 광원 블롭. 섹션마다 --glow-x 로 자리를 옮긴다 재료 · 설치. 히어로의 빛이 마지막 CTA 에서 돌아온다 실측 3층 (스크롤 1000 -> 1600) 격자 +14.9px · 산출물 -14px · 단계명 0 한 층은 반드시 고정이다. 전부 움직이면 그냥 흔들리는 페이지다 그리드 wide 트랙을 좁은 화면에서 닫는다 고정 10rem 이라 모바일에서도 좌우 80px 이 살아남아, 390px 에서 본문이 x=112 부터 시작하고 폭이 278px 로 줄어 제목이 네 줄로 접혔다. --wide-pad 를 clamp 로 바꿔 닫았다. 이제 전부 x=32 에서 시작하고 두 줄이다 파이프라인 정렬선을 하나로 제목 x=371 / 리드 x=435 / 스파인 x=143 이던 것을 전부 x=183 으로. 제목·리드·브리프를 스파인과 같은 컨테이너에 넣었다 히어로 높이를 콘텐츠에 맞춘다 모바일에서 콘텐츠 390px 에 736px 을 씌워 여백이 화면의 41% 였고 다음 섹션이 화면 밖으로 밀려 스크롤 단서까지 사라졌다. 모바일 min-height 제거(736 -> 554), 데스크톱 88dvh -> 78dvh 배경 마스크 62% -> 82% 로 늘려 하단의 죽은 띠를 없앴다 스킬 motion.md 에 "패럴랙스에는 기준면이 필요하다" 를 추가. 페이지가 주장하는 것을 배경으로 그리는 표와, 한 층은 고정이라는 규칙. 390px / 1440px 실렌더: 가로 스크롤 0, 대비 실패 0. 테스트 22개 통과 --- apps/site/design.md | 30 ++++++++++++ apps/site/src/components/Hero.astro | 11 +++-- apps/site/src/components/Install.astro | 2 +- apps/site/src/components/Materials.astro | 2 +- apps/site/src/components/Metrics.astro | 2 +- apps/site/src/components/Pipeline.astro | 27 +++++++---- apps/site/src/styles/base.css | 59 +++++++++++++++++++++++- apps/site/src/styles/tokens.css | 12 +++++ packages/skill/references/motion.md | 32 +++++++++++++ 9 files changed, 158 insertions(+), 19 deletions(-) diff --git a/apps/site/design.md b/apps/site/design.md index f13727c..fe35366 100644 --- a/apps/site/design.md +++ b/apps/site/design.md @@ -204,6 +204,36 @@ WebGL 게이트: `prefers-reduced-motion` 이면 **아예 시작하지 않는다 마지막 줄이 결정이다. 숫자가 스크롤에 흔들리면 그 값도 흔들려 보인다. +## 배경 레이어 — 패럴랙스의 기준면 + +**배경이 단색이면 패럴랙스는 성립하지 않는다.** 앞의 것이 몇 px 어긋나도 비교할 대상이 없다. +히어로 말고는 기준면이 없어서 시차가 안 보였다. + +배경 이미지를 사 오는 대신 **이 페이지가 이미 주장하는 것**을 그렸다. + +| 레이어 | 무엇 | 어디 | 근거 | +|---|---|---|---| +| `.bg-grid` | 간격 눈금 격자. 셀이 `--grid-cell = --space-6` | 파이프라인 · 수치 | "모든 값이 토큰에서 나온다"가 배경에서도 성립해야 한다. 계기판의 눈금이기도 하다 | +| `.bg-glow` | 광원 블롭 두 개. 섹션마다 `--glow-x` 로 자리를 옮긴다 | 재료 · 설치 | 히어로의 빛이 페이지를 관통해 마지막 CTA 에서 돌아온다 | + +격자는 가장자리를 마스크로 지운다 — 화면 끝까지 가면 배경이 아니라 **표**가 된다. +배경이 가장 적게 움직인다. 앞의 것보다 크게 움직이면 앞으로 튀어나와 보인다. + +**실측 3층** (스크롤 1000 → 1600): 격자 **+14.9px** · 산출물 **-14px** · 단계명 **0**. +한 층은 반드시 고정이다. 전부 움직이면 기준이 없어 그냥 흔들리는 페이지가 된다. + +## 그리드의 `wide` 트랙을 좁은 화면에서 닫는다 + +`--wide-pad: clamp(0rem, -3.7rem + 15.2vw, 10rem)` + +고정 `10rem` 으로 두는 동안 **모바일에서도 좌우 80px 씩 살아남아** 390px 화면에서 +본문이 `x=112` 부터 시작하고 폭이 278px 로 줄었다. 파이프라인 제목이 네 줄로 접혔다. +닫고 나서 모든 텍스트가 `x=32` 에서 시작하고 제목이 두 줄이 됐다. + +같은 이유로 파이프라인의 제목·리드·브리프를 스파인과 한 컨테이너에 넣었다. +섹션 기본 그리드에 두면 제목 `x=371` · 리드 `x=435` · 스파인 `x=143` 으로 **정렬선이 셋**이 된다. +지금은 전부 `x=183` 이다. + ## 디자인 SSOT 토큰이 없어서 깨져 있던 세 축을 채웠다. diff --git a/apps/site/src/components/Hero.astro b/apps/site/src/components/Hero.astro index 2d65bb1..7f01df0 100644 --- a/apps/site/src/components/Hero.astro +++ b/apps/site/src/components/Hero.astro @@ -55,7 +55,7 @@ const { c, ui } = Astro.props; position: relative; isolation: isolate; overflow: clip; - min-height: min(88dvh, 52rem); + min-height: min(78dvh, 46rem); display: grid; align-content: center; padding-block: calc(var(--header-h) + var(--space-6)) var(--space-7); @@ -72,8 +72,8 @@ const { c, ui } = Astro.props; /* 아래로 갈수록 지운다. black 은 색이 아니라 마스크 알파다. 없으면 히어로 하단에서 배경이 가로선으로 뚝 끊겨 다음 섹션과 두 장의 종이처럼 보인다. */ - -webkit-mask-image: linear-gradient(to bottom, black 0%, black 62%, transparent 96%); - mask-image: linear-gradient(to bottom, black 0%, black 62%, transparent 96%); + -webkit-mask-image: linear-gradient(to bottom, black 0%, black 82%, transparent 100%); + mask-image: linear-gradient(to bottom, black 0%, black 82%, transparent 100%); } .hero-fallback, .hero-canvas, @@ -143,7 +143,10 @@ const { c, ui } = Astro.props; } @media (max-width: 900px) { - .hero { min-height: min(94dvh, 46rem); } + /* min-height 를 걸지 않는다. 콘텐츠가 390px 인데 736px 을 씌우면 + 여백이 화면의 41% 를 먹고, 다음 섹션이 화면 밖으로 밀려나 + 스크롤할 것이 있다는 단서까지 사라진다. */ + .hero { min-height: 0; } .hero-grid { grid-template-columns: 1fr; gap: var(--space-5); } .hero-title { max-width: 100%; } /* 세로 화면에서는 글자가 위쪽 절반을 다 쓴다. 가로 방향 스크림으로는 diff --git a/apps/site/src/components/Install.astro b/apps/site/src/components/Install.astro index 2bc5e5f..5568e42 100644 --- a/apps/site/src/components/Install.astro +++ b/apps/site/src/components/Install.astro @@ -7,7 +7,7 @@ const { c, ui } = Astro.props; --- -
+

{c.h2}

diff --git a/apps/site/src/components/Materials.astro b/apps/site/src/components/Materials.astro index 52ca550..e4d902d 100644 --- a/apps/site/src/components/Materials.astro +++ b/apps/site/src/components/Materials.astro @@ -10,7 +10,7 @@ const { c } = Astro.props; 배경은 three.js 셰이더 플레인, 전경은 SVG 필터를 실제로 먹인 타일 3장. 둘 다 설명이 아니라 지금 이 화면에서 돌고 있는 것이다. */} -
+

{c.h2}

{c.lead}

diff --git a/apps/site/src/components/Metrics.astro b/apps/site/src/components/Metrics.astro index 4957d1e..64aac25 100644 --- a/apps/site/src/components/Metrics.astro +++ b/apps/site/src/components/Metrics.astro @@ -19,7 +19,7 @@ const rest = c.items.filter((m) => !m.feature); 흔들리면 그 값도 흔들리는 것처럼 읽힌다. 계기판의 바늘은 떨지 않는다. 움직임이 의미를 만드는 자리가 있으면, 움직이지 않는 것이 의미인 자리도 있다. */} -
+

{c.eyebrow}

{c.h2}

diff --git a/apps/site/src/components/Pipeline.astro b/apps/site/src/components/Pipeline.astro index 2cbe320..b65203b 100644 --- a/apps/site/src/components/Pipeline.astro +++ b/apps/site/src/components/Pipeline.astro @@ -14,17 +14,20 @@ const { c } = Astro.props; ③ 의미 —
    — 화면에 번호는 없지만 보조기술은 "6개 중 n번째"로 읽는다 role="list" 는 list-style:none 일 때 Safari/VoiceOver 가 목록 의미를 버리는 것을 되돌린다 */} -
    -

    {c.eyebrow}

    -

    {c.h2}

    -

    {c.lead}

    - -
    - {c.briefLabel} -

    {c.brief}

    -
    - +
    + {/* 제목·리드·브리프·스파인을 한 컨테이너에 담는다. + 섹션 기본 그리드에 두면 제목은 main 칼럼의 음수 마진으로 x=371, + 리드는 x=435, 스파인은 x=143 에 서서 정렬선이 셋이 된다. */}
    +

    {c.eyebrow}

    +

    {c.h2}

    +

    {c.lead}

    + +
    + {c.briefLabel} +

    {c.brief}

    +
    +
      { c.stages.map((s) => ( @@ -43,9 +46,13 @@ const { c } = Astro.props;