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

12 KiB
Raw Permalink Blame History

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.