소개 페이지를 스킬 전체 경로로 다시 만들고, 배운 것을 스킬에 반영

방향을 글래스로 바꿀 때 2단계 재결정을 하고도 전체 경로로 올리지 않았다.
레퍼런스 없이 재질만 갈아끼운 결과가 스위스 미니멀 뼈대에 유리를 바른
페이지였고, design.md 는 초판 결정을 그대로 담고 있었다. 0단계부터 다시 돌았다.

1단계 — 레퍼런스 3개를 computed style 까지 실측
  R1 zed.dev      컨테이너 1120px 과 전체폭이 교대 · radius 2px 621회
  R2 lusion.co    3D 는 액자 안, 텍스트는 액자 밖 · 배경 흰색 · h1 36px
  R3 Codrops      DOM 이 구조를 소유하고 WebGL 은 uniform 만 만진다

2단계 — 프리셋 swiss-minimal → dark-instrument, 컨셉 "검사대 위의 물체"
        유리는 액자에만 남긴다(헤더 · 검사대 · 명령창)

4단계 — 히어로 재구성. 캔버스를 배경에서 빼 액자 안으로, 텍스트는 밖으로
        판독기가 통과한 게이트를 표시한다(값이 바뀔 때만 DOM 을 쓴다)
        파이프라인을 2열로 열어 625px → 1113px

5단계에서 실제로 걸린 것
  게이트 3  radius 4종 → 2종 (3px / 14px, pill 제거)
  게이트 1  base.css 토큰 밖 rgb() 7곳 → 토큰
  게이트 7  헤더 English 2.59:1 → ink 로 상향
  카운트    히어로 h1 4줄 → 2줄
  셰이더    판이 정면이라 프레넬이 구조적으로 0. 법선을 굽히고 UV 로 테두리
  셰이더    gl_FragCoord 를 렌더 타겟 크기로 나눠 UV 가 1 을 넘고 있었다
  수치      페이지가 실은 "타입 단계 5단계"가 실측 9종이었다. lang 속성이
            스케일을 재정의해 링크 하나가 16px 로 새고 있었다
  측정      대비 스크립트가 반투명 배경을 불투명으로 계산했다. 알파 합성으로 교정

스킬 반영
  three.md    §0-A 배치 원리(3D 는 액자 안) · 프레넬 0 함정 · gl_FragCoord 함정
  preflight.md 대비 측정 시 알파 합성. 검사 도구가 틀리면 통과도 의미가 없다

최종: 하드 게이트 12/12, 대비 실패 0, 320px 오버플로 0, 테스트 22개 통과
This commit is contained in:
Yun Chan 2026-08-20 13:33:28 +09:00
parent eb3ca69b5d
commit 9648d1d82a
15 changed files with 576 additions and 306 deletions

View file

@ -165,7 +165,7 @@ a:hover { color: var(--accent); }
isolation: isolate;
background: var(--glass-tint);
border: 1px solid var(--glass-edge);
border-radius: var(--radius-md);
border-radius: var(--radius-frame);
box-shadow: var(--glass-hi), var(--shadow-2);
backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
-webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
@ -178,13 +178,7 @@ a:hover { color: var(--accent); }
z-index: -1;
border-radius: inherit;
pointer-events: none;
background:
linear-gradient(
180deg,
rgb(255 255 255 / 0.10) 0%,
rgb(255 255 255 / 0.02) 22%,
transparent 55%
);
background: var(--glass-sheen);
}
/* backdrop-filter 에 SVG 필터를 얹는 것은 쓰지 않는다.
Chrome 은 CSS.supports 로는 true 를 주면서 렌더에서 선언 전체를 버린다
@ -199,21 +193,15 @@ a:hover { color: var(--accent); }
border-radius: inherit;
pointer-events: none;
padding: 1px;
background: conic-gradient(
from 210deg,
rgb(255 255 255 / 0.32),
transparent 22%,
transparent 58%,
rgb(255 255 255 / 0.20) 74%,
transparent 92%
);
background: var(--glass-rim);
/* 아래 black 은 색이 아니라 마스크의 알파다. 팔레트와 무관하다 */
-webkit-mask:
linear-gradient(#000 0 0) content-box,
linear-gradient(#000 0 0);
linear-gradient(black 0 0) content-box,
linear-gradient(black 0 0);
-webkit-mask-composite: xor;
mask:
linear-gradient(#000 0 0) content-box,
linear-gradient(#000 0 0);
linear-gradient(black 0 0) content-box,
linear-gradient(black 0 0);
mask-composite: exclude;
}
@ -237,27 +225,20 @@ a:hover { color: var(--accent); }
/* 유리 위에 얹는 두 번째 판. 안쪽으로 갈수록 밝아진다 */
.glass-2 { background: var(--glass-tint-2); }
/* 이중 베젤: 유리판이 트레이 안에 앉는다 */
.shell {
background: var(--glass-tint);
border: 1px solid var(--glass-edge);
border-radius: var(--radius-shell);
padding: var(--shell-pad);
box-shadow: var(--glass-hi), var(--shadow-2);
backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
-webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
}
.core {
/* 액자. 이중 베젤을 버렸다 — 껍데기와 속의 radius 가 서로 달라
그것만으로 형태 어휘가 두 종 늘어난다(하드 게이트 #3).
그리고 안이 불투명한 이미지면 backdrop-filter 는 아무것도 하지 않는다.
유리로 읽히게 하는 것은 테두리 광과 위쪽 반사지 흐림이 아니다. */
.frame {
position: relative;
background: var(--surface-sunken);
border-radius: var(--radius-md);
box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.06);
}
@media (prefers-reduced-transparency: reduce) {
.shell {
background: color-mix(in oklab, var(--surface) 88%, var(--ink));
backdrop-filter: none;
}
border: 1px solid var(--glass-edge);
border-radius: var(--radius-frame);
box-shadow: var(--glass-hi), var(--core-hi), var(--shadow-2);
overflow: clip;
}
/* 이미지를 담는 액자만. 인라인 여백을 지운다 */
.frame > :is(img, picture, canvas) { display: block; width: 100%; height: auto; }
/* ---- 진입 연출 ----------------------------------------------
opacity 로 콘텐츠를 숨기지 않는다.

View file

@ -1,11 +1,15 @@
/* ============================================================
designpaca 소개 페이지 — 디자인 토큰
방향 재설정 2026-08-20: Ethereal Glass
프리셋: dark-instrument · 컨셉: 검사대 위의 물체
이 페이지는 SVG 필터와 three.js 를 파는 제품의 데모다.
리퀴드 글래스는 그 두 기술의 결합 그 자체이므로 여기서는
장식이 아니라 제품 시연이다. 다크 기반을 고른 것도 같은 이유다.
유리는 어두운 바탕 위에서만 굴절이 읽힌다.
다크를 "멋있어서" 고르지 않았다. 제품이 CLI 이고 사용자가 이
화면을 터미널 옆에 두고 본다. 프리셋이 요구하는 근거다.
유리는 액자에만 쓴다. 액자 안은 3D, 액자 밖은 글자 —
R2(lusion.co) 실측에서 가져온 원리다. 둘을 겹치면 3D 는 얼룩이
되고 글자는 대비를 잃는다. 실제로 한 번 그렇게 만들었다.
전체 결정 근거는 design.md.
============================================================ */
:root {
@ -33,11 +37,17 @@
--accent-ink: #04211D;
--accent-inverse: #0E7A6E;
--accent-ink-inverse: #FFFFFF;
/* 셰이더가 쓰는 두 번째 광색. 강조색이 아니라 광원이다 */
--glow-2: #6E7BFF;
/* 셰이더가 쓰는 두 번째 광색. 강조색이 아니라 광원이다.
보라기를 뺐다 — #6E7BFF 는 R 이 높아 보라-파랑으로 읽히고,
그것이 antipatterns.md 의 슬롭 지문이자 dark-instrument 가
"어두운 배경일수록 빠지기 쉬운 함정"으로 지목한 색이다. */
--glow-2: #3D7BD6;
/* ---- 유리 ------------------------------------------------
backdrop-filter 만으로는 흐린 유리다. 굴절은 SVG 가 만든다. */
유리는 액자에만 쓴다. 헤더 · 검사대 프레임 · 게이트 배지.
콘텐츠 카드에는 쓰지 않는다 — 유리는 무언가를 담을 때만
의미가 있고, 아무 데나 바르면 그냥 반투명한 상자다.
(R2 lusion.co 실측: 3D 를 액자에 가두고 텍스트는 액자 밖에 둔다) */
--glass-tint: rgb(255 255 255 / 0.045);
--glass-tint-2: rgb(255 255 255 / 0.085);
--glass-edge: rgb(255 255 255 / 0.14);
@ -47,17 +57,39 @@
--glass-hi:
inset 0 1px 0 rgb(255 255 255 / 0.22),
inset 0 -1px 0 rgb(255 255 255 / 0.05);
/* 표면 반사와 테두리 광. 값이 아니라 토큰으로 둬야 밝은 밴드에서
같은 자리를 뒤집을 수 있다 (하드 게이트 #1) */
--glass-sheen: linear-gradient(
180deg,
rgb(255 255 255 / 0.10) 0%,
rgb(255 255 255 / 0.02) 22%,
transparent 55%
);
--glass-rim: conic-gradient(
from 210deg,
rgb(255 255 255 / 0.32),
transparent 22%,
transparent 58%,
rgb(255 255 255 / 0.20) 74%,
transparent 92%
);
--core-hi: inset 0 1px 0 rgb(255 255 255 / 0.06);
--shadow-1: 0 1px 2px rgb(0 0 0 / 0.5);
--shadow-2: 0 2px 6px rgb(0 0 0 / 0.4), 0 12px 32px rgb(0 0 0 / 0.5);
--shadow-3: 0 6px 16px rgb(0 0 0 / 0.45), 0 32px 80px rgb(0 0 0 / 0.6);
--inset-hi: var(--glass-hi);
/* ---- 형태 ------------------------------------------------ */
--radius-sm: 10px;
--radius-md: 20px;
--shell-pad: 6px;
--radius-shell: calc(var(--radius-md) + var(--shell-pad));
/* ---- 형태 ------------------------------------------------
두 종류뿐이다. 하드 게이트 #3 은 3종부터 실패로 본다.
3px — 요소. R1 zed.dev 실측에서 border-radius 2px 가 621회로
압도적이었다. 개발자 도구는 각져야 정밀해 보인다
14px — 액자. R2 lusion.co 가 3D 캔버스를 감싼 값이 15px 이다
pill(999px) 을 없앴다. 계기판에 알약은 없다. */
--radius-sm: 3px;
--radius-frame: 14px;
/* ---- 간격 ------------------------------------------------ */
--space-1: 0.25rem;
@ -98,12 +130,14 @@
--font-sans: "Pretendard Variable", Pretendard,
"KO Fallback Win", "KO Fallback Mac", system-ui, sans-serif;
--step--1: 0.8125rem;
--step-0: 1.0625rem;
--step-1: 1.328rem;
--step-2: 1.660rem;
--step-3: 2.076rem;
--step-4: 2.595rem;
/* 히어로에 힘을 준다 */
/* 페이지에서 가장 큰 글자. 히어로가 아니라 수치 섹션이 쓴다 —
히어로의 힘은 타이포가 아니라 검사대 액자에서 나온다 */
--display: clamp(3rem, 1.2rem + 7.2vw, 7rem);
--leading-tight: 1.06;
@ -122,6 +156,7 @@
[lang="en"] {
--font-sans: "Switzer", "EN Fallback", system-ui, -apple-system, sans-serif;
--step--1: 0.8125rem;
--step-0: 1rem;
--step-1: 1.25rem;
--step-2: 1.5625rem;