폰트가 교체되는 순간 글자 폭이 13% 튀고 있었다
웹폰트가 오기 전에는 시스템 폰트로 그려진다. 맑은 고딕은 Pretendard 보다 13% 넓어서 교체되는 순간 줄바꿈이 다시 잡힌다. 폴백 폰트에 size-adjust 로 치수를 맞췄다. 실측 차이 0.0%. OS 마다 시스템 폰트가 다르므로 폴백도 따로 정의했다.
AI가 만든 티는 못 만들어서가 아니라 결정을 안 해서 난다. 그 결정을 여섯 단계로 강제하는 스킬.
npx designpaca Node 20.11+ · 설치 대상을 감지해 골라준다
여섯 단계
각 단계에는 통과 조건이 있다. 통과하지 못하면 다음으로 가지 않는다. 아래는 같은 브리프가 단계마다 무엇으로 변했는지다.
수제 커피 로스터리의 원두 정기구독 랜딩 만들어줘
무엇을, 누구에게, 어떤 제약인지 세 줄로 압축한다. 규모를 판정해 경로를 고른다.
누구에게: 홈카페 3년차 이상. 산미와 로스팅 프로파일을 구분한다
실제로 존재하는 사이트 3개를 서로 다른 층위에서 고른다. 구조, 톤, 디테일.
R2 = 독립 문학 출판사. 커피 업계 밖에서 톤을 가져온다
레퍼런스를 하나의 축으로 합성한다. 감수할 리스크를 하나 고른다.
감상은 이름에만, 화면에는 수치만
코드를 쓰기 전에 숫자를 정한다. 성능 예산도 여기서 확정한다.
--measure: 33em / --leading-normal: 1.7 / JS 예산 0KB
레이아웃, 재질, 입체, 모션 순서로. 이펙트를 다 꺼도 완성돼 있어야 한다.
<h1>산미 8.5 · 바디 6.0 · 로스팅 라이트</h1>
자기 결과물을 남의 것처럼 본다. 게이트 12개는 전부 '아니오'여야 한다.
게이트 12/12 통과 · 슬롭 지문 0건 · 320px 오버플로 31px 수정
SVG 필터
질감을 만드는 필터 데모는 많다. 손이 실제로 줄어드는 자리는 따로 있다. 아래 넷은 왼쪽이 매번 손으로 맞추던 것, 오른쪽이 같은 소재에 선언 하나만 얹은 것이다. 아래 수치는 이 화면을 그대로 캡처해 잰 값이다.
산미 8.5 · 로스팅 2일차
산미 8.5 · 로스팅 2일차사진 위 캡션이 대비를 못 넘긴다. 사진마다 밝기가 달라 반투명 박스를 손으로 맞추게 된다.
글자 알파를 부풀려 그 모양대로만 색을 채운다. 박스가 아니라 글자를 따라가므로 사진을 덜 가린다.
흰 글자 대비 1.70:1 → 4.79:1
상태를 색으로만 구분하면 남성 12명 중 1명에게 같은 배지가 된다. 내 화면만 봐서는 못 잡는다.
feColorMatrix 한 줄. 이것만은 linearRGB 로 둔다 — 색각 변환은 물리적인 빛의 혼합이다.
배지 셋의 최소 색거리 82 → 2 · 주의와 실패가 같은 색
조각이 녹아 붙는 표현에 캔버스나 물리 라이브러리를 켠다. 로더와 메뉴 전환에서 반복된다.
블러한 뒤 알파만 세워 잘라낸다. 붙을지 말지는 취향이 아니라 간격과 블러 반경의 비율로 정해진다.
덩어리 3개 → 1개 · JS 0줄
산미 8.5
산미 8.5반투명 패널은 뒤를 흐리게만 만든다. 실제 유리는 빛을 휜다.
변위 지도를 backdrop-filter 에 넘긴다. 노이즈로 만들면 값이 중립으로 수렴해 아무 일도 안 일어난다.
가장자리에서 격자가 눌린다 · Chromium 전용
한글 조판
영어권 디자인 도구에는 한글 조판 규칙이 없다. 그래서 기본값을 그대로 쓰면 아래 셋이 동시에 무너진다. 왼쪽이 기본값, 오른쪽이 이 스킬이 정한 값이다. 글자도 폭도 폰트도 같다.
기본값
스페셜티커피의 로스팅프로파일을 구분하려면 산미와 바디를 수치로 봐야 한다.
word-break: keep-all
스페셜티커피의 로스팅프로파일을 구분하려면 산미와 바디를 수치로 봐야 한다.
기본값은 어절 한가운데를 끊는다. 왼쪽 마지막 줄을 보라 — 한 단어가 두 줄에 걸쳐 있다.
line-height 1.45
스페셜티커피의 로스팅프로파일을 구분하려면 산미와 바디를 수치로 봐야 한다.
line-height 1.75
스페셜티커피의 로스팅프로파일을 구분하려면 산미와 바디를 수치로 봐야 한다.
라틴 표준 1.4~1.5 는 받침이 있는 글자에 좁다. 줄이 서로 붙어 보인다.
11px
스페셜티커피의 로스팅프로파일을 구분하려면 산미와 바디를 수치로 봐야 한다.
15px
스페셜티커피의 로스팅프로파일을 구분하려면 산미와 바디를 수치로 봐야 한다.
라틴에서 11px 은 라벨로 쓴다. 한글은 획이 많아 같은 크기에서 뭉갠다.
같은 파이프라인을 두 브리프에 돌린 결과다. 1단계에서 톤을 다른 업종에서 가져오게 강제하기 때문에 같은 도구를 써도 같은 화면이 나오지 않는다. 둘 다 수치 자리가 비어 있는 것도 우연이 아니다.
이 페이지의 수치
문장을 다듬는 것으로 해결되는 것은 문장뿐이다. radius 어휘 수, 반투명 패널 개수, 타입 단계 수는 그대로 남는다. 그래서 이 페이지 자신의 형태 수치를 공개한다. 결과가 나쁘게 나와도 그대로 싣는다.
값은 프로덕션 빌드에서 측정한다. 아직 측정하지 않은 항목은 비워둔다. 지어낸 숫자보다 구멍이 정직하다. 이 페이지는 제품 데모이므로 three.js 를 얹으며 JS 예산을 올렸다. 올렸다는 사실을 여기 적는 것이 규칙이다.
남을 검사한 결과가 아니라 자신을 검사한 결과다.
폰트가 교체되는 순간 글자 폭이 13% 튀고 있었다
웹폰트가 오기 전에는 시스템 폰트로 그려진다. 맑은 고딕은 Pretendard 보다 13% 넓어서 교체되는 순간 줄바꿈이 다시 잡힌다. 폴백 폰트에 size-adjust 로 치수를 맞췄다. 실측 차이 0.0%. OS 마다 시스템 폰트가 다르므로 폴백도 따로 정의했다.
유리 카드를 29개 뿌렸다. 재질만 바뀌었을 뿐 구조는 카드 나열 그대로였다
우리 규칙이 '카드는 elevation 이 진짜 위계를 나를 때만'이라고 정해두고 있었다. 수치는 조판으로, 규칙은 어긋난 목록으로, 감사 기록은 로그로 바꿨다. 유리는 5개만 남았다.
“backdrop-filter 에 SVG 를 얹으면 Chrome 이 버린다” 고 적었는데 사실이 아니었다
한 번 실패하고 브라우저 탓으로 적어뒀다. 다시 재보니 Chrome 151 에서 computed 값이 none 이 아니라 url(#id) 로 살아 있고 배경도 실제로 굴절된다. 진짜 원인은 feImage 의 width/height 를 요소 크기와 맞추지 않은 것이었다 — backdrop-filter 는 필터 이미지를 자동으로 조정하지 않는다. 한 번 실패한 것을 ‘안 되는 것’ 으로 적으면 그 문장이 다음 사람의 상한선이 된다.
가로로 444px 넘쳤다. 레이아웃 전체가 어긋나 있었다
main 에서 그리드 클래스가 빠져 있었다. subgrid 는 부모가 그리드일 때만 작동하므로 모든 섹션이 정렬선을 잃은 상태였다. 눈으로는 어색한 정도였고 폭을 재고서야 드러났다.
스크롤을 끝까지 내려도 파이프라인 6단계 중 뒤 3개가 안 보였다
scroll-driven animation 의 범위 끝에 페이지 하단 요소는 도달하지 못한다. 이펙트를 끄면 보이고 켜면 사라지는 것은 폴백이 있는 것과 다르다. 한 번 보이면 유지되는 방식으로 바꿨다.
다크 밴드 안 버튼의 대비가 2.88:1. 기준은 4.5:1
밴드가 강조색만 반전시키고 그 위 글자색은 흰색 그대로였다. 반전 대응 토큰을 하나 더 두고 함께 바꿨다.
열세 건 모두 만들면서 걸린 것이고, 걸린 뒤에 고쳤다. 사람이 잡은 것이 셋이다. 카드가 전형적이라는 말, 폰트를 제대로 다루지 못한다는 말, 그리고 우리 스킬을 진짜로 쓴 게 맞냐는 말.
근거 없는 금지는 지켜지지 않는다. 사용자가 명시적으로 요구하면 규칙보다 그쪽이 이긴다.
설치 대상을 감지해 기본 선택해준다. 스킬 파일을 직접 고쳤다면 업데이트가 그 파일을 건드리지 않는다.
npx designpaca