feat(skill): absorb external design skills, restore interview gate, add review route

- Restore the step-0 interview as a mechanical gate the skill explicitly
  depends on; add harness.md (per-harness question tools, limits,
  fallbacks) and brief-interview.md (slots, question cards, rounds).
- Add 10 reference docs absorbed from external design skills
  (accessibility, interaction-feel, elevation, color, icons, product-copy,
  component-systems, critique, change-review, print-email) and extend
  existing references.
- Add a review-only route and two hard-gate clauses (truncated content
  reachability, three-flashes limit).
- design-gate: split tap targets into WCAG 2.5.8 and 44px contract layers,
  run axe-core when available, and fix false positives found on a real
  site (decorative alt="", stacked wordmark line count, url-only pages).
- lint-skill: fail if the interview gate section or its links disappear.
- Ship agents/openai.yaml and THIRD_PARTY_NOTICES.md.
This commit is contained in:
Yun Chan 2026-09-24 13:26:03 +09:00
parent 79e79c120b
commit 6805fb2be7
37 changed files with 5688 additions and 128 deletions

View file

@ -15,6 +15,13 @@
| 숫자가 흔들리거나 자간이 이상하다 | §5 OpenType |
| 한글이 들어간다 | §6. 조판 규칙 자체는 `antipatterns.md` §8 |
| 배포 전 | §7 라이선스, §8 체크리스트 |
| 헤딩 크기·자간·행간을 어떻게 조정할지 원칙이 필요하다 | §9 |
| 폰트 기능(`font-synthesis`, OpenType, 동적 숫자)을 더 쓰고 싶다 | §10 |
| 줄바꿈·위도우·justify 문제가 있다 | §11 |
| 밑줄이나 `text-box` 트림이 필요하다 | §12 |
| 텍스트가 잘려서 전체 값을 볼 수 없다 | §13. **하드 게이트** |
| 폰트 스무딩·선택 가능성·장식 텍스트 디테일이 필요하다 | §14 |
| 배포 직전 타이포 전용 빠른 점검이 필요하다 | §15 |
---
@ -330,3 +337,288 @@ font-family: "Switzer", "Pretendard Variable", system-ui, sans-serif;
- [ ] 폰트를 못 받은 상태로 페이지를 열어봤다. 그 상태로도 읽힌다
> 근거: research/references/03-trends-2026.md §7, 04-ai-slop-signatures.md §8 (조사일 2026-08-20)
---
## 9. 위계와 자간·행간 보강
### 9-1. 자간·행간은 크기의 함수다 — 통합 원칙
이 문서와 `tokens.md`에 이미 흩어져 있는 개별 규칙은 하나의 원리를 공유한다. **글자가 커질수록 자간은 좁아지고 행간은 타이트해지며, 글자가 작아질수록 자간은 넓어지고 행간은 느슨해진다.** 큰 디스플레이 텍스트에서 음수 자간을 후보로 두는 이유([tokens.md](tokens.md) §1 "함께 정해야 하는 것")도, 작은 대문자 라벨에 양의 자간을 주는 이유(§5의 `all-small-caps` 예시)도, 헤딩 행간을 좁히고(1.1~1.2대) 본문 행간을 넓히는(1.5~1.6, 한글 1.6~1.8, [tokens.md](tokens.md) §1) 이유도 같은 함수의 다른 지점일 뿐이다.
이 절은 **새 강제 수치를 만들지 않는다.** `tokens.md`·`antipatterns.md` §2가 이미 정한 값과 "보편 하한을 선언하지 않는다"는 방향은 그대로 유지한다. 여기서 더하는 것은 흩어진 개별 사례를 하나의 원리로 묶어 읽는 프레임뿐이다 [SKILL-BETTER-TYPE].
### 9-2. 타입을 능동적 디자인 요소로 쓰기 — 관찰 후보
**언제**: 헤드라인이나 숫자 자체가 화면의 시각적 주인공일 때(히어로 숫자, 잡지형 표지, 데이터 하나를 강조하는 카드).
이런 자리에서는 타입 처리 자체가 콘텐츠를 담기만 하는 중립적 그릇이 아니라 디자인의 능동적인 부분이 될 수 있다[SKILL-FRONTEND-DESIGN]. 예: 큰 사이즈, 의도적 절단(뷰포트 경계 밖으로 흘러나가는 글자), 겹침, 회전, 색 분리 같은 처리는 타이포그래피가 "읽히는" 것을 넘어 그 자체로 이미지가 되게 한다 — 이 나열 자체는 출처 없음(designpaca 확장)이다. **관찰 후보**다 — 본문·UI 라벨·폼처럼 기능이 우선인 텍스트에는 적용하지 않는다. 가독성이 과업에 실제로 필요한 자리(§13의 하드 게이트가 도는 자리)에서는 장식이 접근을 이기지 않는다.
### 9-3. Display와 Text는 다른 폰트다
"Display"라는 이름이 큰 사이즈용 최적화를 보장하지 않는다. 반대도 마찬가지다. SF Pro, Heldane 같은 일부 패밀리는 **큰 사이즈용 Display 변형과 작은 사이즈용 Text 변형을 별도 파일로 낸다** — Text 변형은 작은 크기에서도 읽히도록 획이 굵고 속공간이 넓게 그려지고, Display 변형은 큰 크기에서만 의도가 살도록 더 섬세하게 그려진다 [SKILL-BETTER-TYPE]. 가변 폰트라면 `font-optical-sizing: auto`(§2)가 이 전환을 자동으로 처리하지만, Display/Text가 별도 정적 파일로만 나오는 패밀리는 **설정하는 크기에 맞는 변형을 직접 골라야 한다.** 헤딩에 Display 파일을, 본문에 Text 파일을 매핑하지 않으면 한쪽에서 항상 맞지 않는 파일을 쓰게 된다.
### 9-4. 헤딩 위계 — 내림차순과, 본문보다 작아지지 않는 하한 (프로젝트 계약)
**프로젝트 계약**이다. 타입 스케일을 정했다면(`tokens.md` §1) 그 스케일에 헤딩 레벨을 매핑하는 기본 규칙이지, 위계가 "실제로 읽힌다"는 것을 증명하는 검사 자체는 아니다. 위계가 실제로 구별되는지는 `tokens.md` "제목 역할이 실제로 구분되는지 확인한다" 절의 실측 방법(여러 폭에서 계산된 크기를 재는 것)을 그대로 따른다 — 단일 비율 하나로 위계를 증명할 수 있다는 태도는 [design-foundations.md](design-foundations.md) §1이 이미 잘못된 일반화로 지목했다.
규칙은 두 가지다 [SKILL-BETTER-TYPE].
1. **헤딩 레벨은 타입 스케일의 내림차순 단계에 매핑한다.** h1이 h2보다, h2가 h3보다 시각적으로 작아서는 안 된다. 스케일 단계가 부족해 인접 레벨이 같은 크기를 공유해야 하면, 굵기나 자간으로 구별을 유지한다.
2. **헤딩은 본문보다 작아지지 않는다.** 예외는 의도적으로 라벨형 오버라인(예: "CASE STUDY"처럼 본문 위에 놓이는 작은 대문자 태그)으로 쓸 때뿐이다. 어떤 시맨틱 요소를 쓸지는 [accessibility.md](accessibility.md) 소관이고, 이 규칙은 고른 요소의 시각적 크기만 다룬다 — `<h3>`를 골랐다고 브라우저 기본 크기를 그대로 두지 않는다.
---
## 10. 폰트 렌더링 제어 보강
### 10-1. font-synthesis — shorthand 대신 longhand
`font-synthesis: none`은 굵기·기울임·small-caps·상하첨자 **합성을 한 번에 다 끈다.** 폴백 스택 전체에서 필수 강조(굵게, 기울임)가 실제 글리프로 구별되는지 검증하기 전에 이 shorthand를 쓰면, 폴백으로 떨어졌을 때 강조가 조용히 사라진다 — 오류도 보고도 없이.
**한 모드만 끄고 싶으면 shorthand 대신 개별 속성을 쓴다** [SKILL-BETTER-TYPE].
```css
/* 브랜드 워드마크처럼 합성된 굵기가 눈에 띄게 다를 때만, 검증 후 좁게 적용 */
.brand-wordmark {
font-synthesis-weight: none;
}
/* shorthand는 폴백 전체의 강조 표현을 확인한 뒤에만 */
.isolated-treatment {
font-synthesis: none;
}
```
### 10-2. OpenType 확장 기능
§5가 이미 다루는 `tabular-nums`·`oldstyle-nums`·`diagonal-fractions`·`ordinal`·`all-small-caps`·`ss01` 외에, 자주 쓰는 나머지 기능이다 [SKILL-BETTER-TYPE].
```css
/* 0과 O를 구별해야 하는 곳 — 일련번호, 인증코드, 주문번호 */
.serial { font-variant-numeric: slashed-zero; }
/* 리가처(fi, fl 합자 등)를 명시적으로 켠다. 대부분 기본 켜짐이지만 폰트가 다르면 확인한다 */
.prose { font-variant-ligatures: common-ligatures; }
/* 위·아래 첨자. 폰트가 실제 첨자 글리프를 담고 있어야 한다 — 없으면 인위적 축소로 대체된다 */
.formula-sup { font-variant-position: super; } /* x² 의 2 */
.formula-sub { font-variant-position: sub; } /* H₂O 의 2 */
/* 문자 변형(character variant). 슬롯 번호의 의미는 폰트마다 다르다 */
.logo { font-feature-settings: "cv11" 1; }
```
`ss01`~`ss20`(스타일 세트), `cv01`~`cv99`(문자 변형)는 번호가 폰트마다 다른 의미를 가지므로 쓰기 전에 그 폰트의 OpenType 기능 문서를 확인한다. 표준 속성(`font-variant-*`)이 있는 기능은 그것을 먼저 쓴다 — `font-feature-settings`는 표준 속성이 없는 기능에만 쓰는 마지막 수단이라는 §5의 원칙은 여기서도 그대로다.
### 10-3. 숫자가 흔들리면 안 되는 곳 — tabular-nums 확장
§5는 이미 "수치를 나열하는 곳"(표·대시보드·가격표)에 `tabular-nums`를 요구한다. 같은 이유가 **값이 실시간으로 바뀌는 자리**에도 그대로 적용된다 — 타이머, 카운트다운, 실시간 가격, 진행률 퍼센트처럼 숫자가 갱신될 때마다 폭이 바뀌면 주변 레이아웃이 갱신마다 흔들린다 [SKILL-BETTER-TYPE].
```css
/* 정적인 표뿐 아니라, 매초 값이 바뀌는 타이머에도 같은 이유로 필요하다 */
.countdown-digit { font-variant-numeric: tabular-nums; }
```
---
## 11. 줄바꿈과 정렬
### 11-1. 자동 줄바꿈 선언 — text-wrap:balance / pretty
**지원 상태 (확인 2026-09-24)** [WEB-BASELINE].
| 선언 | 상태 | 지원 브라우저 |
|---|---|---|
| `text-wrap: balance` | Baseline **Newly available**(아직 Widely 아님) | Chrome/Chrome Android 114, Edge 114, Firefox/Firefox Android 121, Safari/Safari iOS 17.5 |
| `text-wrap: pretty` | Baseline **Limited**(Baseline 아님) — **Firefox 미구현** | Chrome/Chrome Android 117, Edge 117, Safari/Safari iOS 26 |
두 값 모두 미지원 브라우저에서는 기본 줄바꿈으로 조용히 저하된다(레이아웃이 깨지지 않는다) — **점진적 향상으로 쓴다.** Firefox 비중이 큰 프로젝트라면 `pretty`가 주요 엔진 셋 중 Firefox만 미지원이라는 점을 감안한다.
```css
/* 두 줄 헤딩이 한쪽으로 쏠리지 않게 폭을 맞춘다 */
h1, h2, h3 { text-wrap: balance; }
/* 설명 문단의 위도우를 줄인다. 장문에는 쓰지 않는다(아래 §11-2) */
.lead, .description { text-wrap: pretty; }
```
`balance`는 브라우저가 몇 줄을 넘으면 스스로 적용을 포기한다 — 헤딩·소제목처럼 짧은 텍스트에 쓴다. 장문 본문에는 `balance`도 `pretty`도 쓰지 않는다. 문단 전체를 고르게 만들려는 시도는 공간을 낭비하고 가독성을 해칠 수 있다 [SKILL-BETTER-TYPE].
### 11-2. widow · orphan · river
- **widow(과부행)**: 문단이나 헤드라인의 마지막 줄에 단어 하나만 남는 것.
- **orphan(고아행)**: 문단의 첫 줄이 혼자 떨어져 남는 것.
- **river(리버)**: justify 정렬에서 여러 줄에 걸쳐 흰 공백이 세로로 이어져 보이는 것.
세 가지 모두 **관찰 후보**다. 헤드라인·리드 문단에서는 `text-wrap: balance`/`pretty`(§11-1)로 대부분 해소되고, 미지원 브라우저나 예외적인 문구 길이에서는 수동 개행(`&nbsp;`로 마지막 두 단어를 묶기)으로 보정한다. river는 justify 정렬(§11-4)에서만 나타나므로 인터페이스 본문에 justify를 쓰지 않으면 대부분 발생하지 않는다 [SKILL-DESIGN-REVIEW]. 실제 콘텐츠 길이와 뷰포트 폭으로 렌더해 확인한다 — 코드만 보고는 판정할 수 없다.
### 11-3. overflow-wrap과 white-space
- `overflow-wrap: anywhere` — 긴 단어·URL·ID가 컨테이너를 밀어내지 않게 강제로 끊는다. [preflight.md](preflight.md)의 배포 전 체크리스트가 이미 이 값을 요구한다. `break-word`보다 레이아웃 계산에서 더 안전한 값이다.
- `white-space: nowrap` — 배지·라벨처럼 줄바꿈되면 의미가 깨지는 짧은 텍스트에 쓴다. 컨테이너보다 라벨이 길어질 가능성이 있으면 `text-overflow: ellipsis`(§13)를 함께 둔다.
한글 문서에서 `word-break`가 자소를 끊는 문제와 그 대응은 [antipatterns.md](antipatterns.md) §8이 정본이다 — 여기서는 라틴 문자열·URL·ID에 쓰는 `overflow-wrap`만 다룬다. 둘은 다른 문제를 푼다. `overflow-wrap`은 끊을 지점이 없는 긴 토큰의 예외 처리이고, 한글 `word-break` 규칙은 정상적인 어절 단위 줄바꿈 자체를 다룬다.
### 11-4. justify 사용 제한
**관찰 후보**다 — [antipatterns.md](antipatterns.md) §3의 판정과 같다. `text-align: start`를 인터페이스 기본으로 하고, `justify`는 자동 하이픈네이션이 걸린 좁은 에디토리얼 컬럼처럼 특정 레이아웃에서만 검토한다 [SKILL-BETTER-TYPE]. 인터페이스의 나머지 자리(카드 설명, 폼 도움말, 버튼 라벨)에 justify를 쓰면 단어 사이 공백이 불규칙해지고 §11-2의 river가 나타나기 쉽다. 한글은 어절 단위로 줄바꿈되므로 river가 나타나는 양상이 라틴과 다르다 — 실제 렌더로 확인한다.
### 11-5. 문장부호
한국어 문장부호(따옴표, 줄임표, 붙임표, 값과 단위 사이 공백 처리)의 관례는 [product-copy.md](product-copy.md) §11이 정본이다. 이 문서는 줄바꿈·렌더 규칙만 다루고 문장부호 자체는 다루지 않는다.
---
## 12. 밑줄과 트리밍
### 12-1. 밑줄 메트릭
폰트가 내장한 밑줄 위치·두께를 기본값으로 쓴다.
```css
a {
text-underline-position: from-font;
text-decoration-thickness: from-font;
text-decoration-skip-ink: auto; /* 하강부(g, y, p)를 밑줄이 가로지르지 않게 */
}
```
`from-font`가 원하는 두께를 안 주거나 폰트가 메트릭을 제공하지 않으면 수동으로 조정한다 [SKILL-BETTER-TYPE].
```css
a {
text-decoration-thickness: 1px; /* 실측 조정 — 시작값 */
text-underline-offset: 3px; /* 실측 조정 — 시작값 */
text-decoration-skip-ink: auto;
}
```
**관찰 후보 — 실측으로 확인한다.** 밑줄에서 애니메이션이 안정적으로 동작하는 속성은 `color`뿐이라는 관찰이 있다. `text-decoration-thickness`나 `text-underline-offset`을 트랜지션에 넣으면 브라우저마다 다르게(또는 전혀) 움직일 수 있다. 두께·오프셋이 변하는 밑줄 애니메이션(왼쪽에서 자라나는 효과 등)이 필요하면 `text-decoration`을 쓰지 말고 별도 요소(가상 요소 `::after`의 `transform: scaleX()`)로 구축하는 대안을 검토한다. 점선 밑줄(`text-decoration-style: dotted`)은 약어·정의어 같은 부가 정보 힌트의 관례로 쓴다.
### 12-2. text-box trim — 점진적 향상
**지원 상태 (확인 2026-09-24)** — 두 추적기가 서로 다르게 보고한다 [WEB-BASELINE]. MDN은 Baseline **Newly available**(2026년 8월부터)로 표시하지만, webstatus.dev는 여전히 **Limited**로 표시하며(Chrome/Chrome Android 133, Edge 133, Safari/Safari iOS 18.2, **Firefox 지원 정보 없음**) 두 출처가 어긋난다. Firefox의 실제 지원 시점은 이 조사 시점 기준 확인되지 않았다.
`text-box`는 글자 위·아래의 행간 여백(폰트가 내장한 ascender/descender 공간) 중 시각적으로 불필요한 부분을 잘라낸다 — 배지·필처럼 텍스트를 컨테이너에 광학적으로 정확히 맞춰야 하는 좁은 자리에 쓴다.
```css
/* 위아래 모두 트림 */
.badge { text-box: trim-both cap alphabetic; }
/* 위쪽만 (큰 헤딩이 컨테이너 상단에 붙어야 할 때) */
.heading { text-box: trim-start cap; }
/* 아래쪽만 */
.label { text-box: trim-end alphabetic; }
```
미지원 브라우저에서는 이 선언이 무시되고 기존 여백이 그대로 남는다 — 레이아웃이 깨지지 않으므로 **점진적 향상으로 쓴다.** 광학 정렬이 하드 게이트인 자리는 없다. 지원 브라우저에서 더 정확해지는 정도로 다룬다.
---
## 13. 잘린 텍스트 — 전체 값에 도달하는 수단 (하드 게이트)
**하드 게이트**다. 정보 접근 자체가 걸린 문제이기 때문이다. 이 규칙은 [SKILL.md](../SKILL.md)의 규범·기능 하드 게이트, [accessibility.md](accessibility.md), [critique.md](critique.md)의 에스컬레이션 표와 같은 판정을 공유한다.
절단 자체는 금지가 아니다.
```css
/* 한 줄 절단 */
.truncate {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* 여러 줄 절단 */
.clamp {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
```
**금지되는 것은 잘린 정보가 어디서도 완전한 형태로 확인될 수 없는 상태다.** 잘려나간 값이 의미를 가지면(전체 파일명, 긴 이메일 제목, 잘린 가격 설명), 다음 중 하나로 전체 값에 도달할 수단을 남긴다.
- 네이티브 `title` 속성 또는 커스텀 툴팁으로 hover·focus 시 전체 텍스트 노출(키보드 포커스에서도 동작해야 한다 — [accessibility.md](accessibility.md)의 포커스 규칙을 따른다)
- 클릭·탭으로 여는 확장 뷰(상세 페이지, 모달, 아코디언)
- `aria-label`로 스크린리더에 전체 값을 노출(시각 텍스트와 스크린리더가 읽는 텍스트가 달라지는 것이므로 남용하지 않는다)
전체 값에 도달할 수단이 하나도 없는 절단은 통과시키지 않는다. 검증은 실제 콘텐츠 중 가장 긴 값으로 렌더한 뒤, 마우스 없이 키보드만으로 전체 값에 닿을 수 있는지 확인하는 것이다 [SKILL-BETTER-TYPE].
---
## 14. 렌더링과 선택 디테일
### 14-1. 폰트 스무딩은 루트에서 한 번
```css
:root {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
```
**관찰 후보.** macOS에서 글자를 얇게 렌더하는 이 두 속성은 쓸지 말지부터 실제 렌더로 정한다(가는 서체·작은 크기에서는 획이 약해질 수 있다). 쓰기로 했다면 **루트에 한 번만** 선언한다. 컴포넌트마다 반복해서 적용하면 스무딩 방식이 요소 경계에서 갈라져 보이는 자리가 생긴다 [SKILL-BETTER-TYPE].
### 14-2. 시스템 폰트 폴백 스택 예시
브랜드 서체를 아직 못 구했거나 로딩 실패에 대비할 때, 또는 브리프가 "네이티브 느낌"을 요구할 때 쓸 수 있는 시작 스택이다 [SKILL-APPLE-DESIGN]. **기본값으로 강요하지 않는다** — 브랜드 서체가 정해졌으면 그 폴백 체인(§4)을 우선한다.
```css
font-family:
system-ui, -apple-system, "Segoe UI",
Roboto, "Helvetica Neue", Arial,
"Apple SD Gothic Neo", "Malgun Gothic",
sans-serif;
```
한글이 섞이는 프로젝트는 §6-3의 순서 규칙(라틴 폰트를 먼저, 한글 폰트를 뒤에)이 시스템 스택에도 그대로 적용된다.
### 14-3. 텍스트 선택 가능성 유지
텍스트는 기본적으로 선택 가능해야 한다. `::selection`으로 선택 영역의 배경·글자색을 브랜드에 맞게 바꾸는 것은 괜찮다 — 단, 그 조합으로도 선택된 글자가 읽혀야 한다(대비를 확인한다) [SKILL-BETTER-TYPE].
```css
::selection {
background: var(--accent);
color: var(--accent-ink);
}
```
**`user-select: none`은 드래그·제스처 표면에서만 쓴다** — 정렬 핸들, 캔버스 위 라벨, 스와이프 카드처럼 선택이 제스처와 충돌하는 자리다. 인터페이스 전역에 걸거나, 버튼 라벨이 드래그 중 하이라이트될 가능성만으로 걸지 않는다. 본문·카드 설명·에러 메시지처럼 사용자가 복사하고 싶어할 수 있는 텍스트에 `user-select: none`이 걸려 있으면 그 자체가 완성도 미달 신호다.
### 14-4. 장식적 텍스트 기법 — 관찰 후보
**언제**: 에디토리얼 인트로, 인용구, 잡지형 섹션 오프닝처럼 타이포그래피가 §9-2의 능동적 요소로 쓰이는 자리.
| 기법 | 용도 |
|---|---|
| `::first-letter` | 드롭캡 |
| `::first-line` | 첫 줄만 다른 스타일(작은 대문자 등) |
| `-webkit-text-stroke` | 텍스트 외곽선. 가변 폰트에서는 겹치는 글자 모양이 병합되지 않은 채 보일 수 있다 — 정적 폰트로 확인한다 |
| `text-shadow` | 텍스트 그림자. [elevation.md](elevation.md)의 그림자 원칙(광원 하나로 통일)과 같은 기준을 따른다 |
본문·UI 텍스트에는 쓰지 않는다. `background-clip: text`(그라디언트 텍스트)는 이미 `antipatterns.md`가 다룬다 [SKILL-BETTER-TYPE].
---
## 15. 타이포 마감 전 빠른 점검
§8의 배포 전 체크리스트가 로딩·라이선스를 다룬다면, 이 표는 **렌더된 실수**를 잡는다. 실제 콘텐츠로 채운 화면에서 확인한다.
| 발견 | 조치 |
|---|---|
| 합성된 굵기·기울임이 디자인과 다르게 보인다 | 실제 페이스를 로드한다. 검증된 모드만 `font-synthesis-*: none`(§10-1) |
| Display 전용 파일을 작은 본문 크기에 그대로 쓴다 | 크기에 맞는 Text/Display 변형을 고른다(§9-3) |
| 자식 헤딩이 부모보다 시각적으로 강하다 | 해당 섹션의 위계를 스케일 내림차순에 다시 매핑한다(§9-4) |
| 헤딩 요소를 시각 크기만 보고 골랐다 | 시맨틱을 먼저 고르고([accessibility.md](accessibility.md)) 시각 크기는 CSS로 정한다(§9-4) |
| 문단 마지막 줄에 단어 하나(위도우) | `text-wrap: pretty`(§11-1, 지원 상태 확인) 또는 수동 개행 |
| 두 줄 헤딩이 한쪽으로 쏠린다 | `text-wrap: balance`(§11-1) |
| 인터페이스에 justify 정렬이 쓰인다 | `text-align: start`로. justify는 에디토리얼 컬럼에만(§11-4) |
| 밑줄이 하강부를 가로지른다 | `text-decoration-skip-ink: auto`, `from-font` 메트릭(§12-1) |
| 밑줄 두께·오프셋을 트랜지션에 걸어 애니메이션이 브라우저마다 다르게 움직인다 | `color`만 트랜지션하거나 별도 요소로 구축한다(§12-1) |
| 절단된 텍스트에 전체 값 도달 수단이 없다 | §13 — **하드 게이트**, 배포 차단 |
| 인터페이스 전역에서 텍스트 선택이 막혀 있다 | 복원하고, 드래그·제스처와 충돌하는 자리에만 남긴다(§14-3) |
| 갱신되는 숫자(타이머·카운터·실시간 가격)의 폭이 매번 바뀐다 | `tabular-nums`(§10-3) |
> 근거: [SKILL-BETTER-TYPE], [SKILL-FRONTEND-DESIGN], [SKILL-DESIGN-REVIEW], [SKILL-APPLE-DESIGN], [WEB-BASELINE](확인 2026-09-24)