designpaca/apps/site/public/work/saebyeok-cheonggwa/design.md
Yun Chan 8e3cdb0d3b
Some checks are pending
ci / build (push) Waiting to run
feat(site): rework 19 marketing showcases for composition diversity
Measured convergence before: split hero 13/19, top-bar nav 19/19,
one-line notice footer 14/19, body Pretendard 17/21, 10 similarity
pairs above 0.78. Each showcase got a pre-assigned hero family, nav
form, footer form, type pair, background, accent hue, radius, motion
grammar and material from outputs/rework-2026-10-06/plan.md; direction
cards and the chosen reason are recorded in every design.md.

After: 0 similarity warnings, 19 distinct display faces, 7 hero
families, 5 nav forms, 5 footer forms, no scroll reveals, 5 showcases
with SVG filter materials. Example contact values replace bracket
placeholders under the existing fictional-brand notices. Thumbnails,
OG images, card copy and three e2e assertions updated; dead CSS in
dure-enrollment and hannam-jari removed; similarity.mjs learns the new
font families.
2026-10-06 16:55:50 +09:00

106 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# design.md — 새벽청과 (2026-10-06 재작업)
## 진행 상태
- 0단계 완료 — 현행 감사(띠 7개 교대·전면 사진 히어로·상단 바·가운뎃점 라벨), 보존 자산 확정
- 1단계 완료 — R1 KAMIS 실측, R2 phillips·natoora(기존 실측 재사용), R3 APG Tabs, garak 미검증
- 2단계 완료 — 카드 3장 가운데 A "시세표 한 장" 선택(위임)
- 3단계 완료 — tokens.css 재정의(Gasoek One / Noto Sans KR, #e4e8f4, 140° 녹, radius 4px)
- 4단계 완료 — 레이아웃 → 모션(카운터). 재질 없음
- 5단계 완료 — html-validate·stylelint·no-hanja·showcase-audit·design-gate 통과, E2E 1건 예정된 깨짐(아래)
- 6단계 완료 — 이 문서
## 브리프
- 청과 도매 직거래 "새벽청과". 새벽 경매에서 낙찰받은 과일의 산지·등급·당도·규격·낙찰가를 공개하고 그날 아침 보낸다. 카페·식당 납품은 전날 21:00 마감, 품목당 3상자부터.
- 방문자: 매일 과일 값을 확인하는 매장 사장. 목표 행동: 오늘 낙찰가를 읽고 상자 수로 기준 금액을 계산해 발주 메모를 남긴다.
- 배정 제약(outputs/rework-2026-10-06/plan.md): 데이터·도구가 주인 히어로(시세표 첫 화면, 표제 작게) · 탭·세그먼트 내비(품목/일자) · 연락처·영업시간 카드 푸터 · Gasoek One / Noto Sans KR · 밝음·쿨 새벽 #e4e8f4, 띠 교대 제거 · 140° 녹 · radius 4px · 숫자 카운터 · 재질 없음 · 흘림 이미지.
- 화면: index.html 한 장. 2차 페이지 없음.
## 미확정
- 푸터 카드의 점포 위치·전화·메일은 예시 값이다(사용자 결정 2026-10-06, 푸터 고지에 명시). 실제 상호가 정해지면 세 칸만 바꾼다.
- 시세표의 품목·가격·시간은 예시 값이다(표 아래와 푸터에 고지). 전일 낙찰가는 오늘 값에서 전일 대비를 뺀 계산값이다(일자별 탭 아래에 적음).
## 레퍼런스
| 슬롯 | 출처 | 가져온 원리 |
|---|---|---|
| R1 구조 | KAMIS 중도매인 판매가격 https://www.kamis.or.kr/customer/price/wholesale/item.do (2026-10-06 텍스트 페처) | 표제는 작고, 날짜·품목·등급 선택 UI 바로 아래 시세표가 온다. 일자가 열로 선다 → 일자별 탭 |
| R2 톤 | phillips.com (2026-08-24 실측 재사용) | 날짜·경매 상태가 제목보다 앞에 선다. 화면은 무채에 가깝고 출품작만 색을 갖는다 |
| R2′ 같은 시장 | natoora.com (2026-08-24 실측 재사용) | 품목마다 산지를 문장으로 붙인다 |
| R3 디테일 | WAI-ARIA APG Tabs (accessibility.md §4.2·§4.4) | roving tabindex, 화살표 wrap, Home/End, 자동 활성화 |
| 미검증 | garak.co.kr (페처가 링크 모음만 반환) | 경매 시각 02:00/08:30은 기존 사실 근거(tokens.css 머리)를 유지 |
## 방향
지문: 히어로 데이터·도구(시세표 한 장) · Gasoek One / Noto Sans KR · 밝음·쿨 #e4e8f4 · 140° 녹 #22673a · radius 4px · 흐름 "시세표(품목/일자 탭) + 선택 로트 → 읽는 법 + 유통 5단계(새벽 통로 사진 왼쪽 흘림) → 입고 사진 3장 흘림 + 제철 달력 → 납품 조건 + 수량 계산 → 연락처·영업시간 카드 푸터" · 내비 탭·세그먼트(고정 없음) · 푸터 연락처·영업시간 카드 · 이미지 화면 가장자리 흘림, 캡션 옆 · 모션 낙찰가 카운터(전일가 → 오늘가, 감소 모션은 즉시)
컨셉: 카페·식당 사장이 오늘 새벽 낙찰가를 품목별로 한 표에서 읽고, 상자 수로 기준 금액을 계산해 발주 메모를 남긴다.
프리셋: quiet-commerce 뼈대에 "값이 주인"인 시세표. 단일 스타일, 리믹스 아님.
표현 리스크: Gasoek One을 낙찰가 숫자(36~52px)에 쓴다 — 표의 숫자가 표제보다 큰 것이 이 페이지의 긴장이다. 검증: 1440·390 캡처에서 숫자 열이 첫 시선인지(흐림 사본) 확인했다.
체크포인트(위임): A 시세표 한 장(선택) / B 품목 카드 6장(기각 — 열 비교를 잃고 격자 패밀리로 넘어감) / C 등락 보드(기각 — 7일 가격은 브리프에 없는 값). A를 고른 이유: 배정이 "시세표가 첫 화면"이고 R1 KAMIS가 선택 UI 아래 표를 두며, 기존 E2E가 한 표에서 6행을 고르는 동작을 단언한다.
반사실: 첫 화면 고유 요소 — 6품목 낙찰가·전일 대비 값, 02:00/08:30 경매 시각, 당도 Bx 열과 무화과 "—". 같은 업종 치환에서 값이 전부 바뀌어야 하고, 다른 업종 치환에서 낙찰가·전일 대비·경매 열이 무의미하다 → 통과.
수렴(같은 세션 cheongon-care·rfs-cfd — 셋 다 "도구가 주인" 배정): B-1 구도 같음, 표제 서체·CTA 다름, eyebrow·캡션은 셋 다 없음(없음을 같음으로 세면 3/5). B-2 섹션 흐름 첫 블록만 같고 내비·푸터·이미지 처리·모션·글 묶음 다름 → 1/6 통과. 구도 패밀리가 같은 것은 plan.md 배정(분포 상한 4)이다.
보존 자산: 시세표 6행 데이터와 선택 로트 동기화, 제철 달력 8품목, 발주 계산·복사, 날짜 도장 스크립트, 이미지 4장, 사실 문구 전부.
## 토큰과 예산
값은 `styles/tokens.css` 한 곳. 역할: 바탕 #e4e8f4 하나(띠 없음), 표·패널만 #f5f7fc로 한 단계 밝게, 강조 #22673a는 선택 행·탭·버튼·상승 표기에만. 모노 없음 — 숫자는 `tabular-nums`. 타입: 본문 16px / 표 13·19px / 낙찰가 26→36px / 선택 로트 36→52px / h1 22→28px(작게) / h2 26→36px.
예산(tokens §5 기본선)과 실측(2026-10-06, Chromium 1440):
- JS 150KB → 인라인 약 7KB.
- 첫 화면 이미지 0, 사진 4장 lazy. LCP 364ms(요소 `.board-lead`), CLS 0.024(1440)·0.012(390). E2E 기준(LCP ≤3.5s, CLS ≤0.1, 동일 출처 ≤2MB) 통과.
- 폰트 100KB → **초과: 약 480KB**(Noto Sans KR 가변 서브셋 18조각 ≈ 330KB + Gasoek One 10조각 ≈ 150KB, Google Fonts 유니코드 범위 슬라이스). 한글 두 패밀리를 배정받았고 본문 글자 범위가 넓어 슬라이스 수가 늘었다. `display=swap`. Gasoek One을 `text=` 파라미터로 줄이면 15KB 안팎이 되지만 표제 글자를 바꿀 때마다 목록을 맞춰야 해 쓰지 않았다(바꾸려면 "하지 않기로 한 것" 참조).
## 이펙트와 폴백
- 낙찰가 카운터: 마크업에 최종값이 있고 스크립트가 `data-from`(전일가)에서 `data-to`로 600ms 동안 100원 단위로 센다. `prefers-reduced-motion: reduce`면 아무것도 하지 않는다(실측: 로드 직후 최종값). 일자별 탭은 처음 열릴 때 한 번 센다. 열 폭을 9.5rem으로 고정해 세는 동안 레이아웃이 흔들리지 않는다.
- 탭: JS 없으면 품목별 패널만 보인다(일자별은 `hidden`). 인쇄에서는 둘 다 펼친다.
- 가로 넘침 표(제철 달력, 좁은 폭의 시세표)만 JS가 `tabindex=0`·`role=region`을 붙인다. 넘치지 않는 폭에서는 탭 정지점이 생기지 않는다.
- 재질·필터·3D 없음.
## 하지 않기로 한 것
- 전면 배경 사진(새벽 통로)을 히어로에서 뺐다 — 표가 주인이다. 사진은 2절 왼쪽 흘림으로 옮겼다.
- 상단 바 내비·sticky·backdrop-filter를 없앴다. 섹션 4개짜리 한 장이고, 내비 역할은 탭이 맡는다.
- 어두운 띠 교대·`--band-*` 토큰 재정의를 없앴다.
- IBM Plex Mono와 Pretendard를 내렸다. 모노는 한글 라벨을 흩뜨렸다.
- 가운뎃점 메타 문자열을 가시 텍스트에서 전부 없앴다(머리줄, 등급·당도, 선택 상자 옵션, 제철 상태, 영업시간). `#seasonCount`는 "N품목: 사과, 배"가 됐다 — E2E 정규식 수정 필요(검증 절).
- 7일 가격 그래프(카드 C)는 없는 데이터라 만들지 않았다.
- 좁은 폭에서 시세표를 카드로 바꾸지 않았다. 비교 표이므로 열 우선순위(산지·당도·규격 숨김, 320px 이하 등급도 숨김)로 줄이고 선택 로트에서 보여 준다.
- 주소·전화·메일을 지어 넣지 않았다(placeholder).
## 검증
- 검증 줄: html-validate 0 오류 · stylelint 0 · no-hanja PASS(3파일) · showcase-audit PASS 6/6(320~2560) · design-gate 충족 13 / 미검증 0 / 실패 0(꺼짐 3: static·visual·webkit) · recent-showcases-e2e 새벽청과 블록 PASS 10/11(FAIL 1 = `#seasonCount` 가운뎃점 정규식, 예정된 깨짐) · axe 위반 0 · 키보드: Tab 순서 skip → 상호 → 탭(정지점 1) → 행 6 → 달 버튼 → 폼 → 복사, ArrowRight/Home이 탭을 옮기고 패널을 바꾼다(실측).
- 대비(실측 계산): 바탕 위 ink 14.1 · muted 6.96 · faint 4.80 · accent 5.59 / 표면 위 accent 6.38 · faint 5.49 / 선택 행 위 accent 5.25 · faint 4.52 / 흰 글자 on accent 6.84. 어두운 배경·그라디언트 위 텍스트 없음.
- 시각 루브릭(약한 축부터, 캡처 `outputs` 밖 스크래치 `sbc/shots/1440-*.png`, `390-*.png`):
- R6 이미지 1 — 역할은 적혀 있고 크롭에서 주피사체가 남지만(포도 5:4 크롭은 송이 중앙 유지), 통로(야간)와 입고 사진(주간 스튜디오)의 조도가 한 세계로 읽히지 않는다.
- R7 카피 1 — h1 "오늘 새벽 경매 낙찰가"는 다른 청과 도매에도 성립하는 문장이다(표제를 작게 두라는 배정이라 사실은 표가 말한다). 섹션 제목은 사실 문장(전날 21:00, 나주 배·영동 포도). 번역체·은유·가운뎃점 라벨 없음, 합니다체 통일.
- R8 구분성 1 — 반사실 통과, 고유 요소 셋. 같은 세션의 도구형 둘과 구도 패밀리가 같고 eyebrow·캡션 "없음"을 같음으로 세면 B-1 3/5다. B-2는 1/6.
- R9 마감 1 — 200% 확대 검사는 하지 않았다(미검증). 1440 캡처에서 숫자 열 정렬·radius 4px 통일은 확인.
- R1 첫인상 2 — 1440·390 첫 화면만 보고 "청과 도매상의 오늘 새벽 경매 낙찰가 6품목"이 읽힌다. 반례: 리드를 안 읽으면 낙찰가를 판매가로 오해할 수 있다.
- R2 위계 2 — 흐림 사본 시선 1 낙찰가 열 → 2 선택 로트 38,000원 → 3 표제·탭, 의도와 같다. 크기(36/52 vs 16)·굵기·색 세 가지로 구분. 반례: 표의 38,000과 로트의 38,000원이 같은 값이라 둘째 시선이 중복이다.
- R3 묶음 2 — 시작선 160(제목·표·탭)·176(표 셀 패딩)·776(흘림 본문) 셋. 섹션 간격 space-8 > 묶음 안 space-3. 반례: 선택 로트 dl 칸(468·636·805)이 표 열과 맞지 않는다.
- R4 타이포 2 — 합성 볼드·이탤릭 없음(Gasoek One 단일 웨이트, `font-synthesis-style: none`), 자간 0, h1 1줄, 모노 없음. 반례: Gasoek One 콤마가 굵어 "38,000"이 빽빽하다.
- R5 리듬 2 — 시세표 아래 여백 space-7 뒤에 흘림 사진이 여백 0으로 붙는 극단, 52px 숫자 vs 13px 라벨. 반례: 390에서는 섹션 간격이 모두 space-8로 같아 보인다.
- R10 모바일 2 — 390 첫 화면에 상호·표제·시세표 6행·탭이 보인다. 데스크톱 축소가 아니라 열을 줄이고 선택 로트가 숨긴 열을 받는다.
- 합계 17/20, 0점 없음, R1 2점 — 통과선 충족.
- 미검증: 200% 확대 마감 검사, WebKit 렌더, 실기기 INP, 폰트 예산(초과를 명시했다).
## 피드백 기록 · 보존 목록
- 2026-10-02 사용자: 명사 수수께끼 표제·은유·잠언 금지, 시세·낙찰가·입고·납품 같은 업종 어휘로 쓴다 → 유지.
- 보존: 데이터 값·진실 라벨("예시 낙찰가", "안내용 계산"), E2E가 보는 id·data 속성.
## 변경 기록
- 2026-09-12 화면 보정: 사진 위 반투명 표를 불투명 종이 표면으로 분리, tabular 숫자 우측 정렬.
- 2026-10-02 카피: "오늘 새벽 두 시의 값" → "오늘 새벽 경매 시세", 은유·대구를 정보 문장으로. 레드팀 06: 히어로 사진 불투명도 0.85, 한글 라벨을 모노에서 본문 서체로.
- 2026-10-06 재작업(이 문서): 전면 사진 히어로·상단 바·띠 7개 교대를 시세표 첫 화면·탭·단일 바탕으로 바꿨다. Gasoek One / Noto Sans KR, #e4e8f4, 140° 녹, radius 4px, 낙찰가 카운터, 흘림 사진, 연락처 카드 푸터. 페이지 높이 8,517 → 6,370px(1440). 가운뎃점 메타 문자열 0, eyebrow 0.