체인지로그
버전별 변경 이력 — 플랫폼 릴리스와 패키지 SemVer를 한눈에. 버전 정책·릴리스 규칙과 패키지별 SemVer 로그는 맨 아래 「릴리스 운영 정책」을 펼쳐 보세요.
- 플랫폼 라벨0.21.0
- @wds/ui-web0.21.0
- @wds/tokens0.10.0
- @wds/fonts0.2.1
- wiz_ui?
전체 48개 변경
`@wds/ui-web` minor — ChatMessage 진행 라벨(activityLabel). WIZON↔WDS 정합(uplift 20 D2-1): 활동 진위 규율을 문서에서 구현으로 승격.
- feat(chat): ChatMessage activityLabel — 진행 라벨
- Flutter 패리티
- 순수 가산(비파괴)
- 패키지: @wds/ui-web 0.21.0 · @wds/mcp 0.3.11(동봉 llms.json 색인을 0.21.0에 맞춰 갱신, 코드 무변경). tokens 0.10.0 무변경.
자세히
- feat(chat): ChatMessage
activityLabel— 진행 라벨 (uplift 20 D2-1, HYBRID): assistant 메시지의 진행 단계 라벨("문서 검색 중")을 thinking 인디케이터에 인접한 단일 라인으로 표시한다.ai-chat패턴의 활동 진위 규율(라벨은 실제 단계 이벤트가 있을 때만·없으면 침묵·시간기반 가짜 완료 금지)을 컴포넌트 구현으로 승격 — 값이 없으면 렌더하지 않고, 바뀌면 그 자리에서 텍스트가 교체·fade된다. 실패·타임아웃은activityTone="error"로 실제 상태를 드러낸다(신규 설계). ChatThread엔 두지 않는다(순수 스크롤 컨테이너 단일책임·이중 aria-live 회피 — 활동은 메시지 소유). 별도aria-live없이ChatThread의role="log"가 낭독한다. - Flutter 패리티:
WizChatMessage(activityLabel, activityTone)+WizChatActivityToneenum 동시. 골든 무변경(라벨 미사용 resting). - 순수 가산(비파괴) — 기존 소비처 무영향. 웹 10 + Flutter 13 테스트 GREEN. 누적 단계는
Accordion레시피(문서). - 패키지:
@wds/ui-web0.21.0 ·@wds/mcp0.3.11(동봉llms.json색인을 0.21.0에 맞춰 갱신, 코드 무변경). tokens 0.10.0 무변경.
`@wds/ui-web` minor — WIZON↔WDS 양방향 정합(uplift 20) 3종 순수 확장 묶음: 비밀 값 입력·최근성 그룹핑·GFM task list.
- feat(input): Input revealable — 비밀 값(secret) 입력
- feat(lib): 최근성(recency) 그룹핑 유틸
- feat(markdown): GFM task list 지원
- 순수 가산(비파괴)
- 패키지: @wds/ui-web 0.20.0 · @wds/mcp 0.3.10(동봉 llms.json 색인을 0.20.0에 맞춰 갱신, 코드 무변경). tokens 0.10.0 무변경.
자세히
- feat(input): Input
revealable— 비밀 값(secret) 입력 (uplift 20 D4-1, W→D): 자격증명·API 키를 마스킹하고 후행 슬롯의 표시/가리기 토글로 확인하는revealable(+revealLabel). 켜면type을 내부에서password↔text로 제어(소비자type무시)하고clearable·trailingIcon보다 우선한다. 접근성은 고정 접근명 +aria-pressed(라벨 스왑 중복 안내 회피). WIZONcomponents/input/RULES.md의secretvariant를 WDS 코어로 승격. FlutterWizInput(revealable)패리티 동시(Semanticstoggled), foundationWizInteractableShell에toggled(aria-pressed 등가) 신설 — 다른 토글 버튼도 재사용. - feat(lib): 최근성(recency) 그룹핑 유틸 (uplift 20 D6-9, W→D):
groupByRecency·relativeDayGroup·recencyBucketKey— 대화·문서 목록을 오늘·어제·지난 7일·지난 30일·달·연월 버킷으로 묶는 순수 함수(언어 중립 키, 입력 순서 보존, 로컬 day 경계). WIZONapp.js자체 구현을 코어로 승격.adaptive-list-detail패턴에 "히스토리 조직" 데모/레시피. - feat(markdown): GFM task list 지원 (uplift 20 DR-05): 체크리스트(
- [ ]/- [x]) 렌더. - 순수 가산(비파괴) — 기존 소비처 무영향. 웹 27 + Flutter 1531 테스트 GREEN, 골든·a11y 포함.
- 패키지:
@wds/ui-web0.20.0 ·@wds/mcp0.3.10(동봉llms.json색인을 0.20.0에 맞춰 갱신, 코드 무변경). tokens 0.10.0 무변경.
타이포그래피 — 장문 리딩 leading 2티어. WIZON↔WDS 양방향 정합(uplift 20) 첫 확정 채택분.
- feat(tokens): 장문 리딩 leading 신설
- docs(uplift 20)
- 패키지: @wds/tokens 0.10.0 · @wds/mcp 0.3.9(동봉 llms.json 색인 토큰 422→424 갱신). ui-web 0.19.1 무변경.
자세히
- feat(tokens): 장문 리딩 leading 신설: 본문
line-height.normal(1.6) 위로 읽기 흐름용 단계를 추가한다 —--wds-line-height-reading(1.72, 문단이 이어지는 장문)·--wds-line-height-document(1.82, 최장문). WDS는container.prose(760px) 폭은 갖고 있었으나 그 폭에서 줄 추적을 돕는 leading 티어가 없어 소비처가 매번 하드코딩했다. Flutter 패리티 자동(lineHeightReading/lineHeightDocument). 기존 leading(tight·snug·normal·label)과 15-스타일 타이포 매트릭스는 무변경(순수 가산). - docs(uplift 20): WIZON↔WDS 양방향 정합 매트릭스 SSOT 신설 — 6도메인 32 관심사를 7축 루브릭으로 비교해 4택 판정(W→D/D→W/HYBRID/DIVERGE)하고 양쪽을 동시 정렬하는 프로그램. 결정 레코드 DR-01(state-layer는 WDS가 이미 M3 빌드타임 합성 보유 → 판정 D→W로 뒤집힘)·DR-02(리딩 leading 채택) 기록.
- 패키지:
@wds/tokens0.10.0 ·@wds/mcp0.3.9(동봉llms.json색인 토큰 422→424 갱신). ui-web 0.19.1 무변경.
멀티브랜드 — 풀-semantic(모노크롬/반전) 브랜드 등록 경로 + WIZON 잉크 테마 등록 (doc 221 W-1). `@wds/tokens` 0.9.0 minor(플랫폼 라벨 0.19.2, ui-web 무변경).
- feat(tokens): 풀-semantic 브랜드 오버라이드
- feat(tokens): WIZON 잉크 테마 등록
- 불변
- 패키지: @wds/tokens 0.9.0 · @wds/mcp 0.3.8(동봉 llms.json 색인의 tokens 버전 갱신).
자세히
- feat(tokens): 풀-semantic 브랜드 오버라이드: ADR-020 브랜드 오버레이가 hue 솔버로 표현 불가능한 테마(그레이스케일 잉크, action-primary 흑↔백 반전)를 등록할 수 있도록, 브랜드 JSON에 선택적
semantic: { light, dark }(role→hex 직접 오버라이드)를 추가. 솔버 산출 위에 병합되고(미지정 role은 wiz 상속), 빌드타임 AA 게이트가 병합 후 대비를 검증한다(text↔surface 페어 추가, 부분 브랜드는 무영향). - feat(tokens): WIZON 잉크 테마 등록:
tokens/brands/wizon.json—data-brand="wizon"등록 브랜드(코어 default 아님, wiz 기본 유지). 웹[data-brand='wizon']+ FlutterWizColorsWizon/WizThemeData자동 생성. 값 출처 doc 221. - 불변: wiz 기본 테마 CSS·Dart는 byte-identical(브랜드 append-only). 다른 브랜드에 잉크가 강요되지 않는다.
- 패키지:
@wds/tokens0.9.0 ·@wds/mcp0.3.8(동봉llms.json색인의 tokens 버전 갱신).
인터랙션 물리 — 러버밴드 오버스크롤 release 스프링백을 임계감쇠(ζ=1) 스프링으로 정교화(Tier 1①).
- fix(motion): useDragScroll 오버스크롤 release 스프링백 = ζ=1 임계감쇠
- 패키지: @wds/ui-web 0.19.1 · @wds/mcp 0.3.7(동봉 llms.json 색인을 0.19.1에 맞춰 갱신).
자세히
- fix(motion):
useDragScroll오버스크롤 release 스프링백 = ζ=1 임계감쇠: 경계 밖으로 당긴 러버밴드 콘텐츠가 손을 뗐을 때 경계를 지나치지 않고 곧장 정착하도록, 복귀 애니메이션을 CSS transition(--wds-spring-spatial-fast, ~1.5% 오버슈트)에서 임계감쇠(ζ=1, 오버슈트 0) rAF JS 스프링(animateSpringBack, momentum-scroll 엔진)으로 교체. 드래그 중 오프셋 속도를 EMA로 추적해 release 속도를 스프링에 시드하므로 손→복귀가 속도 불연속 없이 이어진다.reduced-motion이면 즉시 복귀. 공개 API·옵션 불변(ScrollRail 등overscroll소비처 하위호환). - 패키지:
@wds/ui-web0.19.1 ·@wds/mcp0.3.7(동봉llms.json색인을 0.19.1에 맞춰 갱신).
그리드 시스템 G-C — subgrid 정렬(컬럼·행) + Grid 행 트랙.
- feat(layout): <GridItem subgrid> — 컬럼·행 축 정렬
- feat(layout): <Grid rows> · <GridItem rowSpan/rowStart>
- 비-지정 경로는 완전 무변경(additive·하위호환). Baseline 2023(~97%).
- 패키지: @wds/ui-web 0.19.0 · @wds/mcp 0.3.6(동봉 llms.json 색인을 0.19.0에 맞춰 갱신).
자세히
- feat(layout):
<GridItem subgrid>— 컬럼·행 축 정렬: 아이템을 그리드로 만들되 자체 트랙 대신 부모(master)의 라인·거터를 상속(grid-template-columns/rows: subgrid).subgrid는 축 인지형(true='columns'·'columns'·'rows'·'both'). 컬럼 subgrid는 여러 master 컬럼을 점유하는 블록 안의 중첩GridItem을 전역 12칸 리듬에 정렬하고, 행 subgrid는 여러 카드의 헤더/본문/푸터를 본문 길이와 무관하게 같은 행에 정렬한다(카드 그리드·비교 표의 행 리듬).Table.responsiveCards와 같은 컨테이너 정렬 계열. - feat(layout):
<Grid rows>·<GridItem rowSpan/rowStart>: 명시 행 트랙(grid-template-rows: repeat(rows, auto))과 행 배치(grid-row) — 컬럼columns/span/start와 대칭. 행 subgrid에서 카드가 공유할 행 트랙을 지정한다. - 비-지정 경로는 완전 무변경(additive·하위호환). Baseline 2023(~97%).
- 패키지:
@wds/ui-web0.19.0 ·@wds/mcp0.3.6(동봉llms.json색인을 0.19.0에 맞춰 갱신).
그리드 시스템 G-C — 프리미티브 현대화(device-breakpoint → CSS container query).
- feat(layout): <Grid container> opt-in 적응형 컬럼
- fix(layout): GridOverlay 검수 오버레이 @container 교정
- docs(layout)
- 패키지: @wds/ui-web 0.18.0 · @wds/mcp 0.3.5(동봉 llms.json 색인을 0.18.0에 맞춰 갱신).
자세히
- feat(layout):
<Grid container>opt-in 적응형 컬럼: 뷰포트가 아니라 그리드 자기 배치 폭을 CSS container query로 판정해 컬럼을 적응(compact 4<600· medium 8600–840· expanded 12≥840, ADR-012). 요소는 자기 컨테이너가 될 수 없으므로 container-type는 보이지 않는 셸(named containerwds-grid)에 두고 실제 grid를 자손에 둔다(Table.responsiveCards선례). 컬럼 카운트는 토큰var()로 SSOT 유지,@container임계값 600/840만 리터럴.ref/className/children은 grid에 그대로 → Grid 시맨틱 불변, 비-container 경로 완전 무변경(하위호환). 사이드바·split·모달 등 좁은 컨텍스트 안에서도 실제 배치 폭으로 재배열 — FlutterWizGrid(LayoutBuilder)와 같은 "컨테이너 기준" 멘탈모델. - fix(layout): GridOverlay 검수 오버레이
@container교정: 자동 모드 규칙 주체가.frame자신이라 실제로는 조상.article(doc) 폭에 반응하던 개념 오류를, named container(grid-frame) +.stage자손 래퍼로 프레임 자기 폭 기준 판정으로 교정. readout·오버레이 앵커도 stage 기준 정합. - docs(layout): 07-layout-system에
GridContainerDemo(같은 뷰포트 3폭 → 4/8/12열 시연) 추가. FlutterWizGrid에 웹 패리티 노트(auto는 아직 뷰포트 파생, 완전 패리티는 LayoutBuilder constraints 기반이 후속). - 패키지:
@wds/ui-web0.18.0 ·@wds/mcp0.3.5(동봉llms.json색인을 0.18.0에 맞춰 갱신).
`@wds/tokens` 패치 — AI Shell contract v2 focus-ring 역할.
- AI Shell contract v2 (focus-ring)
- 패키지: @wds/tokens 0.8.1 · @wds/mcp 0.3.4(동봉 llms.json 색인을 0.8.1에 맞춰 갱신).
자세히
- AI Shell contract v2 (focus-ring):
--wds-ai-shell-focus-ring(색 역할,--wds-color-focus-ringsemantic 위임) 신설. 셸의 포커스 가능 요소(컴포저·사이드바 항목·팝오버)가 브랜드 일관된 키보드 포커스 링(WCAG 2.4.7)을 공유하도록 foundation focus-ring을 계약 역할로 승격. opt-inai-shell.css에만 추가(공통wds.cssbyte-identical 불변 — 격리 증명), FlutterWizAiShellTokens.focusRingcodegen 대응. 레이아웃 치수 역할은 계약 문서 정의·easing 역할은 백로그(계약 타입 시스템 확장 필요). - 패키지:
@wds/tokens0.8.1 ·@wds/mcp0.3.4(동봉llms.json색인을 0.8.1에 맞춰 갱신).
플레이그라운드 빌더 UX 재편(P1~P4) + 날짜 컴포넌트 SSR 하이드레이션 픽스(게시 패키지로 외부 소비자 전달).
- 플레이그라운드 빌더 UX 재편
- fix(빌더)
- fix(date-range-picker · calendar)
- test
- 패키지: @wds/ui-web 0.17.2 · @wds/mcp 0.3.3(동봉 llms.json 색인을 0.17.2에 맞춰 갱신).
자세히
- 플레이그라운드 빌더 UX 재편(P1~P4): 흩어졌던 환경 시뮬 4종(RTL·모션·색각·텍스트 확대)을 툴바 시뮬 팝오버 하나로 통합(활성 개수 배지) · 컴포넌트 전환을 좌측 목록 대신 타이틀 "이름 ⌄" ⌘K 팔레트로(Apple HIG 내비 타이틀 관용구) · Flutter 사이드 패널 제거, 캔버스 웹\|Flutter 토글로 일원화 · 좌측 패널을 편집(속성·환경)/검사(코드·토큰·접근성) 2클러스터로 구획(검사 섹션에 "React · Flutter"·"axe" 메타 라벨) · 툴바 3영역(나가기·타이틀·디자인\|코드 / 뷰 세그먼트[단일·비교·변형·조합]+뷰포트 / 플랫폼·시뮬·테마·⋯ 오버플로) — 아이콘 모드 토글을 텍스트 뷰 세그먼트로 · 색각 5옵션 전체 노출 · 뷰포트 프리셋을 핵심 3개(폰·데스크탑·와이드)로 · 모션 아이덴티티(모드·플랫폼 전환 시 스테이지 스프링 등장 + 값 변경 시 프레임 pulse 링,
--wds-spring-*, reduced-motion 정지). - fix(빌더): 나가기가 항상 홈으로 가던 것을 진입 문서(
from) 복귀로 복원(오픈 리다이렉트 방지) · 테마 버튼이 프리뷰만 바꾸던 것을 빌더 크롬(툴바·패널·캔버스)까지 라이트↔다크 토글하도록 스코프 · 좁은 패널에서 넓은 SegmentedButton이 잘리던 오버플로 해소(그리드 열minmax(0,1fr)). - fix(date-range-picker · calendar): 비제어 날짜 컴포넌트가 렌더 중
new Date()(오늘)에 의존해 SSR(서버 TZ)↔클라이언트(브라우저 TZ)의 오늘이 다르면 나던 하이드레이션 에러를 해소. DateRangePicker는 트리거 텍스트가 갈리던 것을suppressHydrationWarning으로 한 단계만 스코프(React #418), Calendar는 today 마커(aria-current·.today)와 비제어 roving tabindex 셀을 마운트 전엔 결정적 값(표시 월 1일)으로 두고 마운트 후 실제 오늘로 전환. - test: SSR 하이드레이션 회귀 하네스 추가 — 렌더 중
new Date()로 SSR↔클라 출력이 갈리는 컴포넌트를 "서버 day A → 클라 day B" 교차로 검증(날짜 계열 4종). - 패키지:
@wds/ui-web0.17.2 ·@wds/mcp0.3.3(동봉llms.json색인을 0.17.2에 맞춰 갱신).
`@wds/tokens` 독립 릴리스 — AI workspace 셸 opt-in 계약(`--wds-ai-shell-*`) 신설(WIZON doc 130→132 정합). 플랫폼 라벨(0.17.x)과 별개 버전 라인이라 여기 서사로 남긴다.
- **AI Shell contract (--wds-ai-shell-*)**: AI workspace 셸 역할 토큰 10종(surface 5·action-primary 4·motion 1)을 @wds/tokens/ai-shell.css로 opt-in export
- Flutter 패리티
- 계약 문서
- 패키지: @wds/tokens 0.8.0 · @wds/build-tokens 0.4.0.
자세히
- **AI Shell contract (
--wds-ai-shell-*)**: AI workspace 셸 역할 토큰 10종(surface 5·action-primary 4·motion 1)을@wds/tokens/ai-shell.css로 opt-in export —wds.css와 분리돼 미채택 앱 무영향(공통 출력 byte-identical 게이트 유지). 신규contract토큰 버킷은 전 토큰 alias 강제(색=semantic·모션=core spring, 리터럴=빌드 실패)·:root+양[data-theme]재선언(중첩 재테마)·전체@layer wds.tokens. - Flutter 패리티:
WizAiShellTokens(wiz_tokens.dart codegen) — WizColorScheme/WizSprings에 위임, tree-shake로 opt-in 등가. - 계약 문서:
docs/ai/AI-SHELL-CONTRACT.md(역할·레이아웃 영역·a11y·금지 패턴·승격 기준 7). - 패키지:
@wds/tokens0.8.0 ·@wds/build-tokens0.4.0.
0.17.0 hotfix — xlsx 어댑터 optional peer 범위를 npmjs 해석 가능하게 완화.
- fix
- 패키지: @wds/ui-web 0.17.1.
자세히
- fix:
@wds/ui-web의xlsxpeer를>=0.20.2→*로. SheetJS가 npm을 떠나 npmjs의 xlsx 최신이 0.18.5뿐이라>=0.20.2가 해석 불가 →pnpm add @wds/ui-web(auto-install-peers)가ERR_PNPM_NO_MATCHING_VERSION으로 실패하던 것을 수정. 보안(CVE 회피)은 CDN 0.20.3 설치가 담당(CONSUMING §7.5). - 패키지:
@wds/ui-web0.17.1.
통합 FileViewer + opt-in 어댑터 6종 + FileUpload 미리보기 이관 + 파일 미리보기 충실도 고도화 릴리즈.
- 통합 FileViewer
- opt-in 어댑터 6종
- FileUpload 미리보기 이관
- 미리보기 충실도 고도화
- ImageViewer
- @wds/mcp
- 패키지: @wds/ui-web 0.17.0 · @wds/mcp 0.3.2.
자세히
- 통합 FileViewer: 이미지·영상·PDF·텍스트·마크다운·CSV를 한 전체화면 오버레이에서 렌더하는 뷰어(ImageViewer 상위집합). 렌더러 레지스트리 + capabilities 파생 액션바(하드코딩 분기 없음), 미지원 형식은 메타카드로 강등. zero-dep 코어.
- opt-in 어댑터 6종(
@wds/ui-web/viewers/*— 무거운 라이브러리는 optional peer라 코어 zero-dep 유지): docx(docx-preview+DOMPurify+sandbox) · hwp/hwpx(rhwp WASM) · pdf(pdf.js 캔버스, 내장 native-pdf 오버라이드·줌) · xlsx/xls/ods(SheetJS 값 + exceljs 서식·병합) · pptx(fflate 텍스트 아웃라인 + 임베디드 이미지·썸네일). - FileUpload 미리보기 이관: 미디어 전용 라이트박스 + 비이미지 메타카드 이원화를 단일 FileViewer로 통합. 전 파일 한 필름스트립 순회, 새
previewRenderers로 어댑터 passthrough(하위호환). - 미리보기 충실도 고도화(docs/uplift/19): 🔒 SheetJS npm 0.18.5 CVE 2건 → 공식 CDN 0.20.3 교체 · 텍스트 인코딩 자동 감지(BOM→UTF-8→EUC-KR, 한국 레거시 대응) · xlsx 셀 서식·병합 렌더 · pptx 임베디드 이미지 + 서버 변환 escape hatch 가이드(CONSUMING §7.6).
- ImageViewer: 필름스트립·영상 지원·물리 모션(드래그 디스미스·스와이프·관성)·라이트/다크 테마.
- @wds/mcp: File Upload 패턴을 Contract v2
agent-ready로 승격(patterns/file-upload.contract.json6 preset·실행형 assertion·repair map, FileUpload 표면data-wds-file-upload-*계측). - 패키지:
@wds/ui-web0.17.0 ·@wds/mcp0.3.2.
플레이그라운드 빌더 UX 개선 + SegmentedButton 오버플로우 슬라이딩 릴리즈.
- SegmentedButton 오버플로우 슬라이딩
- 빌더 캔버스 Figma 단축키
- 빌더 좌 패널 아트디렉션
- @wds/mcp
- 패키지: @wds/ui-web 0.16.0 · @wds/mcp 0.3.1.
자세히
- SegmentedButton 오버플로우 슬라이딩: 항목이 트랙 폭을 넘으면 쭈그러들거나 넘치는 대신 가로 슬라이딩(
overflow-x+ 드래그, ChipGroup과 통일). 뜬 타일(thumb)은 스크롤에 맞춰 정렬 유지, single·multi API·시맨틱 불변. - 빌더 캔버스 Figma 단축키: 줌/팬 단축키(⌘±·0·Shift1·Space 드래그)가 캔버스 클릭-포커스 없이 포인터가 캔버스 위(호버)면 발화하도록 수정(키보드 포커스도 병행 허용).
- 빌더 좌 패널 아트디렉션: 섹션마다 있던 균일 구분선을 제거하고 여백 리듬으로 정돈(디클러터). 툴바 뷰포트 세그먼트는 좁아지면 슬라이딩.
- @wds/mcp: 폼 필드 패턴 계약 리소스를 MCP 계약 표면에 노출.
- 패키지:
@wds/ui-web0.16.0 ·@wds/mcp0.3.1.
FileUpload 플랫폼별 UX 고도화 + 신규 ImageViewer 라이트박스 릴리즈.
- FileUpload 고도화
- 신규 ImageViewer
- LoginSurface
- 패키지: @wds/ui-web 0.15.0.
자세히
- FileUpload 고도화: 트리거 1언어(
variant=dropzone/button/tile)×파일표시 1언어(listType=list/picture-card)로 수렴 — 전 조합 가능, 루트 전체가 드롭 타깃, count·size(/quota) 요약 라인 공통.preview/onPreview(이미지=라이트박스·기타=메타 카드) 기본 on.responsive(ADR-012) 모바일에서 카드 코너 아이콘 대신 탭→BottomSheet 액션 시트(미리보기/삭제/재시도). 브랜드 중립 컬러FileTypeGlyph+ 파일타입 아이콘(FileZip·FileSpreadsheet, 웹+Flutter) +fileTypeIconOf매핑. - 신규 ImageViewer: 풀스크린 이미지 라이트박스(Apple Quick Look 관용구) — 이전/다음 내비+카운터·줌 0.25~4x(버튼/키/휠)·90° 회전·확대 시 드래그 팬·공용 오버레이 계약(portal·focus trap·inert·Escape/backdrop). FileUpload 이미지 미리보기가 이를 합성.
- LoginSurface: 인증 패널에 elevation.modal 그림자(shadow-lg)를 얹어 배경 위 위계 확보(0.14.1 패치 후속 통합).
- 패키지:
@wds/ui-web0.15.0.
Fixed
- @wds/ui-web/testing의 로그인 패턴 준수 헬퍼가 data-wds-provider 마커가 없는 텍스트 기반 소셜 로그인 버튼도 감지한다. 기업 로그인에서 Google로 로그인 같은 일반 버튼이 들어와도 계약 위반으로 잡아, WIZON 같은 소비 프로젝트가 임시 compat shim 없이 공식 패키지 기준으로 검증할 수 있게 했다.
- 패키지: @wds/ui-web 0.14.1.
자세히
@wds/ui-web/testing의 로그인 패턴 준수 헬퍼가data-wds-provider마커가 없는 텍스트 기반 소셜 로그인 버튼도 감지한다. 기업 로그인에서Google로 로그인같은 일반 버튼이 들어와도 계약 위반으로 잡아, WIZON 같은 소비 프로젝트가 임시 compat shim 없이 공식 패키지 기준으로 검증할 수 있게 했다.- 패키지:
@wds/ui-web0.14.1.
플레이그라운드 풀스크린 빌더 + 오버레이 모바일 바텀시트 표면 표준 릴리즈.
- 플레이그라운드 풀스크린 빌더
- 모바일 바텀시트 표면 표준
- 로그인 패턴 계약
- TimePicker 웹 입력 서피스 WDS-native 재작업(입력/휠 플랫폼 적응·다이얼).
- 패키지: @wds/ui-web 0.14.0 · @wds/mcp 0.3.0.
자세히
- 플레이그라운드 풀스크린 빌더: 디자인 빌더(탐색기·Figma식 줌/팬·라이브 토큰 편집·프리셋·머티리얼·변형 월·코드 readout)와 라이브 코드 시뮬레이터(하드닝 샌드박스 iframe에서 JSX 실행, 디자인⇄코드 토글·공유 링크·단축키 치트시트).
- 모바일 바텀시트 표면 표준: 오버레이 15종(BottomSheet·Modal·Popover·DropdownMenu·DatePicker·DateRangePicker·Calendar·ColorPicker·MultiSelect·Select·SideSheet·Tooltip·ScrollRail·SearchCommand·ReorderList)이 공용 모바일 시트 표면 + 드래그-디스미스 지오메트리 채택.
- 로그인 패턴 계약: 머신리더블 로그인 계약 + MCP 노출 + 컴포넌트 준수 마커(
data-wds-*). - TimePicker 웹 입력 서피스 WDS-native 재작업(입력/휠 플랫폼 적응·다이얼).
- 패키지:
@wds/ui-web0.14.0 ·@wds/mcp0.3.0.
Fixed
- @wds/mcp를 0.2.1로 올려 registry 패키지에 최신 llms.json을 동봉한다. 컴포넌트·아이콘·패턴·export 인덱스가 현재 소스와 어긋나지 않게 한다.
- verify-release-consistency가 루트 llms.json 변경을 @wds/mcp 출하 변경으로 보도록 해, 다음부터 AI/MCP 배포 패키지 버전 bump 누락을 차단한다.
- verify-publish-contents가 임시 npm cache를 기본 사용하도록 보강해 로컬/샌드박스 환경에서도 publish 내용 검증이 안정적으로 동작하게 했다.
자세히
@wds/mcp를 0.2.1로 올려 registry 패키지에 최신llms.json을 동봉한다. 컴포넌트·아이콘·패턴·export 인덱스가 현재 소스와 어긋나지 않게 한다.verify-release-consistency가 루트llms.json변경을@wds/mcp출하 변경으로 보도록 해, 다음부터 AI/MCP 배포 패키지 버전 bump 누락을 차단한다.verify-publish-contents가 임시 npm cache를 기본 사용하도록 보강해 로컬/샌드박스 환경에서도 publish 내용 검증이 안정적으로 동작하게 했다.
Fixed
- SearchCommand 모바일 높이와 관리자 검색 리포트 CSS를 존재하는 토큰·SSOT breakpoint 경계만 쓰도록 정리해 make check와 CI gate:check가 같은 기준으로 통과하게 했다.
자세히
SearchCommand모바일 높이와 관리자 검색 리포트 CSS를 존재하는 토큰·SSOT breakpoint 경계만 쓰도록 정리해make check와 CIgate:check가 같은 기준으로 통과하게 했다.
Release
- @wds/ui-web 게시 버전을 0.13.1로 올려 SearchCommand, 충돌 감지 플로팅 geometry, 포털 검색 고도화, 관리자 보안 흐름을 registry 소비자가 받을 수 있게 했다.
- CI가 사용하는 pnpm 9.15.0 frozen install과 로컬 pnpm 11 workspace 설정을 동시에 만족하도록 root pnpm.overrides를 유지했다.
자세히
@wds/ui-web게시 버전을0.13.1로 올려 SearchCommand, 충돌 감지 플로팅 geometry, 포털 검색 고도화, 관리자 보안 흐름을 registry 소비자가 받을 수 있게 했다.- CI가 사용하는
pnpm 9.15.0frozen install과 로컬 pnpm 11 workspace 설정을 동시에 만족하도록 rootpnpm.overrides를 유지했다.
검색 표면 · 플로팅 인터랙션 (`@wds/ui-web` 0.13.0, 2026-06-30)
- SearchCommand
- Tooltip, Popover, DropdownMenu, Select, DatePicker, ColorPicker, BottomSheet, Modal, SearchCommand에 브라우저 smoke 테스트를 보강해 문서 데모와 배포 패키지 표면의 실제 open/close·focus·scroll-lock 계약을 검증한다.
- Tooltip, 차트 콜아웃, anchored Popover, Select/Date/Dropdown 메뉴, Dropdown submenu, ColorPicker floating panel에 충돌 감지 geometry를 적용했다. 지원 브라우저는 native top layer와 CSS Anchor Positioning 힌트를 점진 사용하고, 미지원 브라우저는 WDS geometry fallback을 유지한다.
- SegmentedButton과 BadgeToggle의 선택 thumb 이동을 거리 기반 retarget motion으로 정리해 짧은 이동과 긴 이동의 체감 속도를 안정화했다.
- 포털 전역 검색은 SearchCommand를 소비하도록 바꾸고, 스니펫·매칭 라벨·최근 검색·선택 이벤트 기록·관리자 검색 품질 리포트를 보강했다.
자세히
- SearchCommand — 검색 입력, 결과 목록, 최근 항목 삭제, 키보드 선택, 데스크톱 modal, 모바일 full-screen 표면을 하나의 재사용 컴포넌트로 추가했다.
- Tooltip, Popover, DropdownMenu, Select, DatePicker, ColorPicker, BottomSheet, Modal, SearchCommand에 브라우저 smoke 테스트를 보강해 문서 데모와 배포 패키지 표면의 실제 open/close·focus·scroll-lock 계약을 검증한다.
- Tooltip, 차트 콜아웃, anchored Popover, Select/Date/Dropdown 메뉴, Dropdown submenu, ColorPicker floating panel에 충돌 감지 geometry를 적용했다. 지원 브라우저는 native top layer와 CSS Anchor Positioning 힌트를 점진 사용하고, 미지원 브라우저는 WDS geometry fallback을 유지한다.
- SegmentedButton과 BadgeToggle의 선택 thumb 이동을 거리 기반 retarget motion으로 정리해 짧은 이동과 긴 이동의 체감 속도를 안정화했다.
- 포털 전역 검색은
SearchCommand를 소비하도록 바꾸고, 스니펫·매칭 라벨·최근 검색·선택 이벤트 기록·관리자 검색 품질 리포트를 보강했다.
운영 · 배포 안전장치 (2026-06-30)
- 검색 인덱스 새벽 갱신용 GitLab schedule job을 추가했다.
- pnpm-workspace.yaml에 pnpm build 허용 목록과 postcss override를 모아 배포 패키지 검증 환경을 정리했다.
- 관리자 임시 비밀번호 변경 흐름과 관련 테스트를 추가했다.
자세히
- 검색 인덱스 새벽 갱신용 GitLab schedule job을 추가했다.
pnpm-workspace.yaml에 pnpm build 허용 목록과 postcss override를 모아 배포 패키지 검증 환경을 정리했다.- 관리자 임시 비밀번호 변경 흐름과 관련 테스트를 추가했다.
DateRangePicker 모바일 달력 아트디렉션 (`@wds/ui-web` 0.12.1, 2026-06-30)
- 모바일 BottomSheet에서 듀얼 캘린더가 시트 표면 안에 자연스럽게 놓이도록 달력 카드의 중복 테두리/표면을 제거했다.
- 날짜 셀과 범위 배경을 44px 터치 타깃 기준으로 정렬해 좁은 화면에서도 기간 하이라이트가 셀 밖으로 어긋나지 않게 했다.
- 모바일 시작일/종료일 요약은 같은 행을 유지하면서 달력은 세로 스택으로 표시한다.
자세히
- 모바일 BottomSheet에서 듀얼 캘린더가 시트 표면 안에 자연스럽게 놓이도록 달력 카드의 중복 테두리/표면을 제거했다.
- 날짜 셀과 범위 배경을 44px 터치 타깃 기준으로 정렬해 좁은 화면에서도 기간 하이라이트가 셀 밖으로 어긋나지 않게 했다.
- 모바일 시작일/종료일 요약은 같은 행을 유지하면서 달력은 세로 스택으로 표시한다.
DateRangePicker · Calendar 업무형 옵션 (`@wds/ui-web` 0.12.0, 2026-06-30)
- DateRangePicker PDA/업무형 옵션
- 주 시작 요일 옵션
- Calendar 월/연도 선택
- 기본값이 없는 DateRangePicker는 시작일과 종료일을 오늘로 초기화한다. 임의 선택 프리셋은 마지막 선택 항목 하나만 유지하고, 달력 선택과 동일하게 시작일/종료일 요약을 표시한다.
- 듀얼 달력은 인접월 날짜를 숨기고, 시작/종료 endpoint와 기간 배경을 분리해 단일일·월경계·동일월 범위를 안정적으로 표시한다.
- 토요일과 일요일 색상을 분리해 주말 인지가 빨라지도록 했다.
자세히
- DateRangePicker PDA/업무형 옵션 — 시작/종료 2-calendar 구조를 유지하면서 요약 위치(
rangeSummaryPlacement), 프리셋 섹션 라벨(presetSectionLabels), 푸터 구성(footerMode), 완성 범위 확정(requireCompleteRange), 날짜/범위 formatter를 추가했다. 기본 동작은 기존 reset+confirm, 상단 요약, 비제어 draft/confirm 계약을 유지한다. - 주 시작 요일 옵션 —
DateRangePicker,DatePicker,DayPicker가weekStartsOn을 공유한다. 기본은 월요일 시작이며, 일요일 시작을 선택하면 이번주 프리셋과 요일 헤더가 일~토 기준으로 계산된다. - Calendar 월/연도 선택 — 헤더에서 월/연도를 직접 선택할 수 있게 해 좌우 버튼만으로 이동하던 장거리 날짜 탐색 부담을 줄였다.
- 기본값이 없는
DateRangePicker는 시작일과 종료일을 오늘로 초기화한다. 임의 선택 프리셋은 마지막 선택 항목 하나만 유지하고, 달력 선택과 동일하게 시작일/종료일 요약을 표시한다. - 듀얼 달력은 인접월 날짜를 숨기고, 시작/종료 endpoint와 기간 배경을 분리해 단일일·월경계·동일월 범위를 안정적으로 표시한다.
- 토요일과 일요일 색상을 분리해 주말 인지가 빨라지도록 했다.
인증 표면 · 릴리즈 정합성 (`@wds/ui-web` 0.12.0, `@wds/tokens` 0.7.2)
- LoginSurface
- 토큰 space-5
- FileUpload compact breakpoint를 WDS breakpoint token과 맞추고, import review 흐름에서 dropzone/button 접근성 prop 전달과 좁은 화면 파일 리스트 wrapping을 보강했다.
- BottomSheet presentation control을 Popover compact sheet 모드까지 전달해 접근 가능한 title은 유지하면서 중복 visual header/close button을 생략할 수 있게 했다.
- ChipGroup edge scrolling control, chart hover tooltip collision, Sparkline error live-region announcement, SkeletonList divided-row spacing을 정리했다.
자세히
- LoginSurface — 비밀번호, passkey, SSO, Microsoft ProviderButton을 조합할 수 있는 인증 패널 레시피와 passkey feature-check helper를 추가했다.
- 토큰
space-5— 인증 방식 간격과 ProviderButton presentation을 정렬하기 위한 누락 spacing 토큰을 추가했다.
- FileUpload compact breakpoint를 WDS breakpoint token과 맞추고, import review 흐름에서 dropzone/button 접근성 prop 전달과 좁은 화면 파일 리스트 wrapping을 보강했다.
- BottomSheet presentation control을 Popover compact sheet 모드까지 전달해 접근 가능한 title은 유지하면서 중복 visual header/close button을 생략할 수 있게 했다.
- ChipGroup edge scrolling control, chart hover tooltip collision, Sparkline error live-region announcement, SkeletonList divided-row spacing을 정리했다.
인터랙션 모션 고도화 (`@wds/ui-web` 0.11.0, 2026-06-28)
- ScrollRail·ChipGroup의 경계 밖 드래그가 release 시 spring.spatial.fast로 복귀하도록 보강해 러버밴드 저항과 정착 전환을 분리했다.
- BottomSheet가 드래그 추적 상태와 release 정착 상태를 DOM/CSS에서 분리한다. 드래그 중에는 패널이 손을 즉시 따라오고, release 뒤에는 스프링 전환으로 half/full/원래 디텐트에 정착한다.
- 레이어 주석이 있는 생성 아이콘 산출물에 data-wds-icon-layer="primary|secondary" 훅을 반영해 AnimatedIcon byLayer가 실제 생성 아이콘에서도 레이어별 타이밍을 쓸 수 있게 했다.
- 모션 디자인 문서와 컴포넌트 문서를 WDS 자체 인터랙션 물리 기준으로 정리하고, 컴포넌트별 적용 현황을 최신 구현 기준으로 갱신했다.
자세히
- ScrollRail·ChipGroup의 경계 밖 드래그가 release 시
spring.spatial.fast로 복귀하도록 보강해 러버밴드 저항과 정착 전환을 분리했다. - BottomSheet가 드래그 추적 상태와 release 정착 상태를 DOM/CSS에서 분리한다. 드래그 중에는 패널이 손을 즉시 따라오고, release 뒤에는 스프링 전환으로 half/full/원래 디텐트에 정착한다.
- 레이어 주석이 있는 생성 아이콘 산출물에
data-wds-icon-layer="primary|secondary"훅을 반영해AnimatedIcon byLayer가 실제 생성 아이콘에서도 레이어별 타이밍을 쓸 수 있게 했다. - 모션 디자인 문서와 컴포넌트 문서를 WDS 자체 인터랙션 물리 기준으로 정리하고, 컴포넌트별 적용 현황을 최신 구현 기준으로 갱신했다.
시각 언어 — 표현 컴포넌트 + 보안 스팟 (`@wds/ui-web` 0.10.0, 2026-06-27)
기존 WDS 토큰으로 동작하는 "부드러운 SaaS" 시각 어휘를 컴포넌트로 정식화하고, 보안/인증 화면 자산을 더했다.
- IconTile·StepBadge·Callout·TintPanel
- BloomSpot security/auth 씬 3종(shieldLock·authenticator·passkey).
- Tooltip·ColorPicker floating 옵션
- shield-lock 코어 아이콘(총 153종).
- PieChart 범례 색칩이 미존재 토큰 참조로 각지게 렌더되던 버그(radius-sm로 교체).
자세히
IconTile·StepBadge·Callout·TintPanel— 틴트 아이콘 타일·단계 배지·인포 콜아웃·레이어드 틴트 패널(토큰 전용 RSC).BloomSpotsecurity/auth 씬 3종(shieldLock·authenticator·passkey).Tooltip·ColorPickerfloating옵션 — 오버플로 스크롤 컨테이너에서 잘리지 않게document.body로 포털(기본 false, 하위호환).shield-lock코어 아이콘(총 153종).
PieChart범례 색칩이 미존재 토큰 참조로 각지게 렌더되던 버그(radius-sm로 교체).
오너 어드민 콘솔 · 플레이그라운드 스튜디오 (포털, 2026-06-25~27)
- 오너 전용 /admin
- 플레이그라운드 스튜디오
자세히
- 오너 전용
/admin— 비밀번호 게이트→패스키 인증, 인증&접근 카드, 2단계 인증(TOTP) 설정 모달, 활성 세션·예비 키 관리. - 플레이그라운드 스튜디오 — 토큰 에디터·Share URL·Flutter 코드 탭·줌/팬·프리셋 라이브러리(24 컴포넌트 빠른 시작).
아트디렉션 전수 통일 · 모션 플레이어 (포털, 2026-06-27)
- 데모 스테이지 통일 규칙을 「구성과 정렬」·art-direction-reviewer에 codify, 84개 데모 전수 점검으로 shrink-wrap·치수 불일치·다줄 캡션 정리.
- Splitter 패널이 콘텐츠를 채우게 수정
- 패리티 "미등재" 격차를 빌드 실패로 전환(게이트 강화) + waiver 3종(icon-tile·step-badge·tint-panel) 등재.
- 라이브 모션 플레이어
자세히
- 데모 스테이지 통일 규칙을 「구성과 정렬」·art-direction-reviewer에 codify, 84개 데모 전수 점검으로 shrink-wrap·치수 불일치·다줄 캡션 정리.
Splitter패널이 콘텐츠를 채우게 수정 — 구분선이 패널 콘텐츠 아래로 overhang하던 것 해소.- 패리티 "미등재" 격차를 빌드 실패로 전환(게이트 강화) + waiver 3종(icon-tile·step-badge·tint-panel) 등재.
- 라이브 모션 플레이어 — 좌/우 박스 동일 높이, 이징 곡선에 X·Y축·베지어 제어점 시각화·시작점 잘림 해소.
코어 확장 — 아이콘 표준 베이스라인·카드 컴파운드 슬롯·Flutter 패리티·릴리스 노출 (2026-06-22)
@wds/ui-web에 표준 아이콘셋과 카드 조립 어휘를 확장하고, 릴리스가 사이트 표면에 자동 반영되도록 개선했다.
- 코어 아이콘셋 26 → 148
- Card 컴파운드 슬롯
- Flutter 컴포넌트 패리티
- 로그인 데모 패스키 어포던스를 코어 FingerprintIcon으로 도그푸딩.
- 체인지로그 페이지가 패키지 CHANGELOG.md를 자동 렌더
자세히
- 코어 아이콘셋 26 → 148 — 웹·모바일 앱 표준 베이스라인(내비/액션/사용자/커뮤니케이션/상태/레이아웃/파일/미디어/커머스/기기/시간/위치/소셜/텍스트/날씨). Tabler(MIT) 원호 기반으로 ADR-011 계약 충족, 웹+Flutter 글리프 동시 생성.
ICON_REGISTRY(name+category) export로 카탈로그/갤러리 자동 동기화 + 이름 검색. Card컴파운드 슬롯 —Card.Media/Card.Header/Card.Body/Card.Footer(기존 prop 슬롯과 하위호환).- Flutter 컴포넌트 패리티 —
WizSeparator·WizProgress포팅(패리티 34 → 36). - 로그인 데모 패스키 어포던스를 코어
FingerprintIcon으로 도그푸딩.
- 체인지로그 페이지가 패키지
CHANGELOG.md를 자동 렌더 —changeset version마다 패키지 SemVer 릴리스가 페이지에 자동 노출돼 드리프트 0. 헤더 버전 배지에 플랫폼 라벨 + 패키지 버전을 병기하고, 업데이트 가이드에 설치 버전 검증(pnpm ls)·캐시 폴백 안내를 추가.
차트 시스템 — 데이터 시각화 13종 (E5-3, 기획안 09, 2026-06-19~21)
@wds/ui-web에 자체 SVG zero-dep 차트(ADR-018)를 13종으로 확장. 각 차트는 순수 코어를 Flutter wiz_charts 포팅 단위와 1:1 공유하고, sr-only 데이터 표를 a11y 정본으로 둔다(SVG는 aria-hidden, 채널 분리). @wds/ui-web 공개 배럴 추가
- 웹 차트 13종
- ChartExport(웹 전용)
- Flutter 패리티
- 커스터마이징(기획안 09)
- 차트 색은 CORE chart-1..8(색맹 안전)을 var()로 소비
자세히
- 웹 차트 13종 — 데카르트
LineChart·BarChart·AreaChart·ComboChart+ScatterChart(추세선)·Sparkline(무축 초소형)·PieChart(파이/도넛)·HeatmapChart(매트릭스)·FunnelChart(전환 사다리꼴)·GaugeChart(KPI 방사형)·RadarChart(다변량 스파이더)·StockChart(시계열 금융 차트). 전부src/index.ts공개 배럴 export. ChartExport(웹 전용) — 컨테이너 DOM(sr-only 표 + SVG)을 읽어 모든 차트에 CSV/PNG/SVG 내보내기. 카드 헤더 통합 아이콘 트리거(DropdownMenu신규triggerVariant="icon"+DownloadIcon).- Flutter 패리티 — 순수 코어(차트 math)는 신규 패키지
wiz_charts0.1.0(fixture로 JS↔Dart 부동소수 동치 핀),WizLineChart…WizStockChart위젯은wiz_ui0.6.0(wiz_charts의존)에서 Canvas + 골든으로 검증. 데카르트/방사형은 각도 math 공유, 폴리곤/사다리꼴은 좌표까지 공유, 호(파이/게이지)만 네이티브. - 커스터마이징(기획안 09) — 범례 위치·클릭 토글(시리즈 켜기/끄기)·스케일(time/log)·이중 Y축·누적·계단·가로·콤보 1급.
- 차트 색은 CORE
chart-1..8(색맹 안전)을var()로 소비 — 다크data-theme재바인딩.
AI 가이드라인 비주얼-우선 고도화 (12 섹션, 기획안 10·11, 2026-06-19~21)
12 AI 가이드라인 섹션을 "AI가 답을 어떻게 그리는가"(마크다운 ↔ 카드/차트 판정)와 "불확실할 때 어떻게 행동하는가"(되묻기·신뢰도·우아한 실패)로 확장. WDS를 AI 응답 콘텐츠 시각화의 정본 레퍼런스로 끌어올린다. 전부 portal/(데모·문서)
- 응답 렌더 판정 + 데이터 답변 카드
- 되묻기(③ ClarifyCard) WIZON 패리티 재설계
- 공유 리치 링크 카드 + 도구 결과 셸
- Copilot UX
자세히
- 응답 렌더 판정 + 데이터 답변 카드 — 수치·구조화 데이터는 텍스트가 아니라 WDS 차트·카드로 답한다는 규칙을 결정 매트릭스로 코드화. 날씨 카드는 WDS형 "살아있는 하늘"(그라데이션 + 절제 모션 6컨디션).
- 되묻기(③ ClarifyCard) WIZON 패리티 재설계 — 실제
RequiredInputCard분석 기반(다중 선택·자유 입력·확인·다단계). 가벼운 질문 슬랩(답변 위젯은 리치 유지). - 공유 리치 링크 카드 + 도구 결과 셸 — 웹페이지 요약·도구 결과(부분·자막없음·실패 회복)·멀티소스 합성·결과 카드 내 플레이어 점프 + 탭(요약/아티클/원문).
- Copilot UX — 문서 안 인라인 보조(자동완성·인라인 편집·묻기)·다음 편집 예측(NES)·근거(신뢰도 + 출처).
연속 곡률 — 전역 squircle (Continuous Curvature P3, 기획안 08, 2026-06-18)
원호(arc) 모서리를 연속 곡률(스쿼클, superellipse)로 전환. 곡률은 반지름·동심 공식과 직교한다(같은 radius 위에서 곡선만 교체). 웹·Flutter 동시 랜딩 + 통합 패리티 게이트.
- 웹 전역 ENABLE
- Flutter 전역 squircle(ADR-017)
- docs/adr/ADR-017
- 웹 비주얼 베이스라인 39종(둥근 표면 라우트·specimen) squircle 리베이스(풀/원형 표면은 squircle≈round라 무변화·byte-identical 유지).
- Flutter 골든(lib·example) squircle 리베이스(귀속 최소 diff). web↔Flutter component_parity_diff·login_parity_diff ≤7% 게이트 유지(squircle↔squircle, 회귀 아님).
자세히
- 웹 전역 ENABLE —
tokens/wds-base.css:--wds-corner-shape기본round→squircle+.wds-root :where(*)전역 규칙(낮은 특이도)으로border-radius가 있는 모든 WDS 표면이 곡률을 따른다. Chromium 139+ 초타원, 미지원 브라우저는 원호로 자연 폴백(점진적 향상). - Flutter 전역 squircle(ADR-017) —
WizShape(+WizShape.clip= ClipRSuperellipse/ClipRRect 헬퍼) +RoundedSuperellipseBorder로 13개 표면 컴포넌트: Card·Button(P2) + Input·Alert·Modal·Toast·DropdownMenu·Select·Popover·KnowledgeCard·AgentCard·AiChatInput·Tooltip(P3). 풀/원형·divider는 squircle≈round/N-A라 미변경. Flutter 최소 SDK 3.24→3.32 상향. - docs/adr/ADR-017 — 연속 곡률 채택·Flutter SDK 상향·기본값 승격 결정 기록.
- 웹 비주얼 베이스라인 39종(둥근 표면 라우트·specimen) squircle 리베이스(풀/원형 표면은 squircle≈round라 무변화·byte-identical 유지).
- Flutter 골든(lib·example) squircle 리베이스(귀속 최소 diff). web↔Flutter
component_parity_diff·login_parity_diff≤7% 게이트 유지(squircle↔squircle, 회귀 아님).
v0.10 플랫폼 정합성 우플리프트 — R1~R5 (감사 후속, 2026-06-15~16)
docs/uplift/06-v010-platform-readiness-audit.md(전문 에이전트팀 감사)로 도출한 플랫폼 정합성 트랙. @wds/ui-web 공개 export·런타임 동작은 비파괴
- changesets 도입(R1-1)
- @wds/ui-web dist 빌드 파이프라인(R1-2, ADR-015)
- CSS 카스케이드 레이어(R1-3, ADR-016)
- docs/PLATFORM_VERSION.md
- docs/COMPATIBILITY.md(R1-4)
- 체인지로그 페이지(R1 후속)
- 컴포넌트 패리티 게이트(R2-1)
- docs/PARITY_MATRIX.md(R2-2, 생성물) + scripts/generate-parity-matrix.mjs + lint:parity-matrix 신선도 게이트
- 웹↔Flutter API 표면 대조 게이트(R2-3)
- Modal component 토큰(R2-4)
- 컴포넌트 시각 패리티 게이트(R2-5)
- Alert/Badge/Card/Toast component 토큰(R3-4)
- 접근성 게이트 확대(R4)
- 측정·시각 도해(R5)
- 버전 거버넌스 실행(R1-4)
- docs/adr/ADR-009
자세히
- changesets 도입(R1-1) —
.changeset/config.json(@wds/ui-web·@wds/build-tokens독립 SemVer,@wds/portal·@wds/build-iconsignore) + 루트changeset/version-packages/release스크립트. Dartwiz_ui는 git tag 정본(범위 밖). @wds/ui-webdist 빌드 파이프라인(R1-2, ADR-015) — Vite library mode(preserveModules+rollup-preserve-directives로 RSC'use client'지시어 보존),publint·attw게이트. 소비자는 src 직노출 대신 빌드 산출물을 소비.- CSS 카스케이드 레이어(R1-3, ADR-016) — 토큰·베이스·컴포넌트 CSS를
@layer wds.tokens < wds.base < wds.components로 발행. 앱 비레이어 스타일이 항상 우선해 소비처 오버라이드 특이성 경쟁을 제거. - docs/PLATFORM_VERSION.md — 플랫폼 릴리스 라벨 0.10.0 정본(패키지 독립 SemVer 매핑).
- docs/COMPATIBILITY.md(R1-4) — 패키지 호환 매트릭스 + deprecation 정책 + deprecated 표면 6종(
mobileprop 5 +Card.shadow, 제거 타깃 1.0.0). - 체인지로그 페이지(R1 후속) —
/docs/changelog— 루트CHANGELOG.md(플랫폼 서사 정본)를 빌드타임에 읽어 렌더(드리프트 0). 헤더 버전 배지가 체인지로그로 링크.
- 컴포넌트 패리티 게이트(R2-1) —
portal/lib/parity-gate.ts(+test) — 필수 카테고리(actions·inputs·feedback·loading)는 Flutter 패리티 또는portal/parity-waiver.json등재 강제.make check자동 편입. Flutter 배럴 하한(≥16)으로 ENOENT false-green 차단. - docs/PARITY_MATRIX.md(R2-2, 생성물) +
scripts/generate-parity-matrix.mjs+lint:parity-matrix신선도 게이트 — 웹 72 · 패리티 29 · 웹 전용 43(전부 waiver 등재). - 웹↔Flutter API 표면 대조 게이트(R2-3) — variant/size 멤버 드리프트 차단. IconButtonSize 미사용
lg제거(웹 정본 수렴). - Modal component 토큰(R2-4) — scrim·surface를 component 계층 토큰으로 승격.
- 컴포넌트 시각 패리티 게이트(R2-5) — 웹 9종 specimen(Playwright 캡처) ↔ Flutter 골든. 크로스엔진(Chromium↔Skia) 한계로 per-pixel 대신 스칼라 3체크(치수·잉크량·평균색) + 크로스플랫폼 톨러런트 골든.
- Alert/Badge/Card/Toast component 토큰(R3-4) — semantic alias라 렌더 byte-identical(웹
make check+ Flutter 골든 20/20). 토큰 계층 SSOT 회복. - 접근성 게이트 확대(R4) — 오버레이 배경
inert+ Toast 포커스 일시정지·aria-atomic; axe 게이트를 Modal·Drawer·Tabs·RadioGroup·DropdownMenu·Popover·Tooltip로 확대; Flutter 44dp comfortable 탭타깃 + textScaler 2.0× 가드. - 측정·시각 도해(R5) — 라이브 대비 미터(전경/배경 토큰 → 대비비 + AA/AAA·DD-6 증명), 스프링 오버슈트 궤적 비주얼라이저(ζ 0.8 vs 1.0), FormMessage·ProviderButton 플레이그라운드 보강.
- 버전 거버넌스 실행(R1-4) —
changeset version최초 적용 →@wds/ui-web·@wds/build-tokens0.1.0 → 0.2.0(레지스트리 publish는 R-2 유지). 헤더/푸터 버전 배지를 죽은 하드코딩(site.tsversion0.1.0)에서 플랫폼 라벨 SSOT(platformVersion←docs/PLATFORM_VERSION.md)로 연결,portal/lib/site.test.ts가 정합 강제. - docs/adr/ADR-009 — 루트
package.jsonversion=0.0.0은 private orchestrator(배포 단위 아님), 토큰 스키마 버전 =@wds/build-tokens버전 명문화.
문서 — DESIGN_SYSTEM · FRONTEND_GUIDE 작성 (문서 8종 완비, 2026-06-13)
P6 종결 후속
- docs/DESIGN_SYSTEM.md
- docs/FRONTEND_GUIDE.md
- MASTER_PLAN §16: 문서 8종 [x](8종 정본 완비)
자세히
- docs/DESIGN_SYSTEM.md — 크로스플랫폼 디자인 언어 정본: 토큰 SSOT 파이프라인 (3계층·codegen), 토큰 카테고리, 테마(토널 ADR-013·state layer), 색·대비 거버넌스 (WCAG AA·axe), 컴포넌트 시스템·패리티, 적응형(ADR-012), 레이아웃, 패턴, 접근성, DD-4 토큰 강제, 거버넌스. ARCHITECTURE/COMPONENT_API/플랫폼 가이드로 분기
- docs/FRONTEND_GUIDE.md — 웹 개발자 소비 정본(FLUTTER_GUIDE 대칭): 스택·워크스페이스,
@wds/ui-web소비(RSC·ref·토큰), 컴포넌트/데모 추가법, MDX 저작 요약, 반응형, 품질 게이트(make check/check-full·시각 회귀·axe), 개발 워크플로 - MASTER_PLAN §16: 문서 8종 [x](8종 정본 완비)
Phase 6 — Backend / Infra Base 구축 — **P6 종결** (2026-06-13)
Design System Platform 운영 + 데모 연동용 Base Backend(Backend Scope Control). 풀스택이 docker compose로 기동하고, 포털 Login 패턴이 실제 core-api와 연동된다. 6슬라이스(P6.1~6.6) 원자 커밋, 통합 테스트 19/19, 보안·Java·DB 3중 리뷰 반영.
- 인프라(P6.1)
- core-api 스캐폴드(P6.1)
- 인증·인가(P6.2)
- 감사로그·파일·리소스(P6.3)
- 풀스택(P6.4)
- 연동 데모·CI(P6.5)
- .gitlab-ci.yml backend 잡(gate:backend·gate:ai-service·release:images)
- 가이드 문서 3종(P6.6)
- 3중 리뷰(security/java/database-reviewer) 병렬 실행 → HIGH 전건 반영: 레이트리밋 IP 스푸핑 차단(nginx XFF→remote_addr) · .env.example 시크릿 플레이스홀더화 · 업로드 content-type 강등 · INCR/EXPIRE 원자화 · 시드 멱등 · N+1 제거(@EntityGraph) · 함수 인덱스 적중(lower(email) JPQL)
- 운영 전환 체크리스트(데모 범위 수용분)는 BACKEND_GUIDE §9에 명문화
자세히
- 인프라(P6.1) —
infra/docker/docker-compose.yml: PostgreSQL 17+pgvector 0.8 · Redis 7.4 · MinIO. 시크릿 하드코딩 0(${VAR:?}필수 env +.env.example), 호스트 포트 127.0.0.1 비표준 대역(ssh 터널 충돌 회피).make infra-up/backend-test - core-api 스캐폴드(P6.1) — Spring Boot 4.0.7 · Java 21 · Gradle(Kotlin DSL), actuator health/prometheus, RestTestClient 헬스 스모크
- 인증·인가(P6.2) — Flyway 스키마(조직/사용자/역할/감사로그) + JWT HS256 (access 15m·refresh 14d jti 회전, Redis GETDEL) + RBAC(ADMIN/EDITOR/VIEWER, @PreAuthorize) + 로그인 레이트리밋(Lua 원자 카운터) + 사용자 열거 방어. Testcontainers 통합 테스트
- 감사로그·파일·리소스(P6.3) — 감사로그(JdbcClient append-only, REQUIRES_NEW, 실패 메트릭) + MinIO 업로드/presigned 다운로드(content-type 화이트리스트, inline XSS 차단) + DS 리소스 API 초안(조직 격리)
- 풀스택(P6.4) — FastAPI ai-service 스캐폴드(uv) + core-api/ai-service Dockerfile (멀티스테이지·비루트) + Nginx 단일 진입점(58080, actuator는 health만 외부) + Prometheus/Grafana(데이터소스 프로비저닝).
make stack-up으로 8컨테이너 기동 - 연동 데모·CI(P6.5) — 포털 Login 패턴 ↔ core-api 실연동 데모(
/docs/patterns/login) .gitlab-ci.ymlbackend 잡(gate:backend·gate:ai-service·release:images)- 가이드 문서 3종(P6.6) — BACKEND_GUIDE · DEPLOYMENT_GUIDE · GITLAB_CI_GUIDE. 문서 8종 중 6종 완성(잔여: DESIGN_SYSTEM · FRONTEND_GUIDE)
- 3중 리뷰(security/java/database-reviewer) 병렬 실행 → HIGH 전건 반영: 레이트리밋 IP 스푸핑 차단(nginx XFF→remote_addr) ·
.env.example시크릿 플레이스홀더화 · 업로드 content-type 강등 · INCR/EXPIRE 원자화 · 시드 멱등 · N+1 제거(@EntityGraph) · 함수 인덱스 적중(lower(email) JPQL) - 운영 전환 체크리스트(데모 범위 수용분)는 BACKEND_GUIDE §9에 명문화
Phase 5.4 — FLUTTER_GUIDE + 13 Developer Flutter 본문 + 태그 릴리스 — **P5 종결** (2026-06-13)
P5(Flutter Design System 변환)의 마지막 산출물 2종을 채우고 종결을 선언한다. 태그 wiz_ui-v0.5.0(AD-9
- docs/FLUTTER_GUIDE.md
- **13 Developer
- MASTER_PLAN §16 체크: Flutter DS 완료(패리티 실측치 기록)
자세히
- docs/FLUTTER_GUIDE.md — wiz_ui 소비 정본: 설치(path/git tag), WizTheme, 토큰 소비 규칙(DD-4의 Flutter 형태), 컴포넌트 15종 계약, 반응형, 품질 게이트 +패리티 하니스 절차, 릴리스 절차(AD-9). 문서 8종 중 FLUTTER_GUIDE 완성
- 13 Developer — Flutter 본문 — "P5 예정" 스텁 제거, 설치(git tag ref 고정)· WizTheme·웹↔Flutter 매핑 표·게이트 실 콘텐츠로 교체(라이브 렌더 확인)
- MASTER_PLAN §16 체크: Flutter DS 완료(패리티 실측치 기록)
Phase 5.3 — Pretendard 번들링 + 웹/Flutter 로그인 패리티 diff 실측 통과 (2026-06-13)
P5 DoD의 마지막 검증
- Pretendard 번들
- 패리티 하니스
- 측정 추이: 28.4%(초기) → 14.8%(캡처 보정·아이콘 폰트) → 6.2%(웹 결함 3건 수정) → 2.7%(베이스라인 윈도 문서화)
- WizTextLink·WizTabs가 테마 fontFamily를 잃던 결함
- 컴포넌트 텍스트 line-height 부재
- 로그인 데모: CSS 150deg 그라데이션을 박스 투영 길이로 환산(LayoutBuilder
자세히
- Pretendard 번들 — fonts/ 5웨이트(300~700, v1.3.9 static otf + OFL.txt), pubspec fonts 선언,
WizTheme.fontFamily = 'packages/wiz_ui/Pretendard'(에셋 바인딩 상수 — 토큰 sansFamily는 디자인 정본 이름으로 보존) - 패리티 하니스 — ① portal/e2e/capture-login-parity.mjs(웹 카드 요소 캡처+meta) ② login_parity_golden_test(FontManifest 전 폰트 로드 — Pretendard·MaterialIcons 실글리프, 웹과 동일 카드 폭 렌더, RepaintBoundary로 카드만 캡처) ③ login_parity_diff_test (픽셀 비교 게이트 ≤5%). 허용치 문서화: 채널차 ≤48/255(AA·감마) + 수직 ±2px (렌더러 line-box 글리프 배치 차이) — 색·구조·수평 배치는 허용치 없음
- 측정 추이: 28.4%(초기) → 14.8%(캡처 보정·아이콘 폰트) → 6.2%(웹 결함 3건 수정) → 2.7%(베이스라인 윈도 문서화)
- WizTextLink·WizTabs가 테마 fontFamily를 잃던 결함 — AnimatedDefaultTextStyle에 스타일을 통째로 교체 → 주변 DefaultTextStyle에 merge로 수정(Pretendard 상속 보존)
- 컴포넌트 텍스트 line-height 부재 — 웹은 페이지 기본 1.6을 상속하는데 Flutter는 폰트 메트릭(~1.17)이라 행마다 수 px씩 낮았음 → FormField(label/desc/error)· Checkbox 라벨·TextLink·Alert(title/body)에 lineHeightNormal 명시
- 로그인 데모: CSS 150deg 그라데이션을 박스 투영 길이로 환산(LayoutBuilder — Alignment 고정값은 분포가 압축됨) · 데모 텍스트 line-height 정합
Phase 5.2 — Flutter wiz_ui 반응형 레이아웃 시스템 (2026-06-13)
07 레이아웃 시스템의 Flutter 대응
- WizResponsive
- WizStack
- WizContainer
- WizGrid + WizGridItem
- WizSplit
- example Layout Demo
- 골든 6장(compact 360/medium 720/expanded 1080 × light/dark)
자세히
- WizResponsive —
WizWindowSizeClass(compact<600/medium/expanded≥840, 경계 SSOT = breakpoint 토큰) +sizeClassForWidth(순수 함수)·of(context)(MediaQuery 구독)·isCompact. 컨테이너 기준 분기는 LayoutBuilder +sizeClassForWidth조합으로 안내 - WizStack — 1D 프리미티브(방향·토큰 gap·align/justify·wrap→Wrap). 기본 align은 Flutter 관용 start(웹 CSS 기본 stretch와 의도적 차이, doc 명시)
- WizContainer — content(1200)/prose(760)/full 중앙 정렬 + 인라인 거터
- WizGrid + WizGridItem — CSS grid auto-placement 부분집합(순서 흘림·줄바꿈· start 강제·span 클램프). columns/gap 기본 = size class 자동(4·16/8·24/12·24) (웹 12 고정 기본과 의도적 차이 — 모바일 1순위). 행 stretch는 IntrinsicHeight, 무한 폭이면 명확한 FlutterError
- WizSplit — 52:48 분할(flex 토큰), compact면 세로 적층(웹과 동일 viewport 기준)
- example Layout Demo — size class 실시간 표시 + 그리드 reflow + Split/Container
- 골든 6장(compact 360/medium 720/expanded 1080 × light/dark) — 총 24장
Phase 5.1 — Flutter wiz_ui 컴포넌트 15종 완성 (2026-06-13)
P5 컴포넌트 목록(WizButton~WizKnowledgeCard 15종)을 완성했다. 5.0의 7종(보조 2종 포함) 위에 10종을 4그룹 병렬 에이전트로 추가(각 자기 파일만 → 메인 통합)
- 표시군
- 데이터군
- 오버레이군
- AI군
- 골든 8장 추가(display/data/ai/overlay × light/dark)
자세히
- 표시군 — WizCard(header/footer 슬롯·bodyPadding·shadow) · WizBadge(의미 6변형 × count/max[99+ 클램프]/dot) · WizAvatar(sm/md/lg, 이미지 errorBuilder→이니셜 폴백)
- 데이터군 — WizTabs(WizTab 목록+index, variant fixed/scrollable · level primary/secondary, 화살표/Home/End roving[skipTraversal], 인디케이터·tab-fade 웹 정합, SemanticsRole.tab\*) · WizTable(컬럼 정렬/고정폭·hover·caption·SemanticsRole.table 트리 — 웹처럼 표시 전용)
- 오버레이군 —
WizModal.show<T>(스크림=colors.overlay, emphasized-decelerate 등장, dismissible·Escape, 반환값 Future) + WizModalPanel(합성용) · WizToaster.show(우하단 스택, 5s 자동 닫힘+hover 일시정지, 변형 4종 좌측 3px 바) + WizToast(카드) - AI군 — WizAiChatInput(멀티라인+전송/중단, Enter 전송·Shift+Enter 줄바꿈[HW 키만, 모바일 관용 유지], streaming 상태) · WizAgentCard(idle/running/done/error, running 펄스 +reduced-motion 정지) · WizKnowledgeCard(웹 정본 부재 — Flutter 선행 설계, 소스타입 document/web/wiki·excerpt·meta·selected, AgentCard 시각 언어 일관)
- 골든 8장 추가(display/data/ai/overlay × light/dark) — 총 18장
Phase 5.0 — Flutter wiz_ui 1차 슬라이스: WizTheme + 컴포넌트 7종 + Login 패리티 데모 (2026-06-13)
P5(Flutter Design System 변환)의 MVP 슬라이스. P2 토큰 생성물 위에 WizTheme(light/dark)와 Wiz\* 컴포넌트 1차분을 올리고, **패리티 검증 1호
- WizTheme
- Wiz 컴포넌트 7종
- Flutter Login Demo (패리티 1호)
- 골든(시각 회귀)
자세히
- WizTheme — Material 3
ThemeData팩토리(WizTheme.light()/dark()) +WizThemeDataThemeExtension(semantic+component 색 페이로드, 필드별 Color.lerp) +WizTheme.of(context)(누락 시 명확한 FlutterError). 역할 타이포WizTextStyles(H1~Caption, em 자간 → px 환산) - Wiz 컴포넌트 7종 — WizButton(primary/secondary/ghost × sm/md/lg, fullWidth·loading, hover/pressed/focus 상태색 = Button.module.css 1:1) · WizInput(leading/trailing 슬롯, invalid, 포커스 3px 소프트 링) · WizCheckbox(indeterminate, mixed 시맨틱) · WizTextLink · WizAlert(4변형, 8% 틴트+좌측 3px 보더) · WizFormField · WizSpinner(트랙+헤드 아크). 공용
WizSizeenum +WizFocusRing(웹 outline-offset 정합, 레이아웃 불침범) - Flutter Login Demo (패리티 1호) — example 앱을 홈 내비게이션 구조로 확장(Token Demo + Login Demo, ChangeNotifier 테마 컨트롤러). split(≥600)/stack 적응, 브랜드 패널(그라데이션 150deg·Quintal Bloom 5원 CustomPainter·글로우), 폼 패널(이메일/비밀번호/표시 토글/상태 유지/ 에러 Alert/성공 상태) — 웹 login-pattern.module.css 값 정합
- 골든(시각 회귀) — 컴포넌트 그리드 6장(buttons/inputs/controls × light/dark) + 로그인 4장(split 1024·compact 380 × light/dark) 베이스라인
Phase 3.9 — 플레이그라운드 전 컴포넌트 확대 50종 (2026-06-12)
P3.7에서 대표 8종에 도입한 플레이그라운드(props 컨트롤 + 라이브 프리뷰 + 코드 자동 생성·복사)를 나머지 42종에 확대해 50종 전체가 옵션 조작·실시간 테스트·코드 복사를 지원한다.
- 플레이그라운드 42종 추가
- 레지스트리를 entries/ 그룹 파일 8개로 분리(shared.tsx 공통 헬퍼/타입 + inputs·controls·date-container·data·overlay-a·overlay-b·feedback·nav)
- 오버레이는 흐름 안 트리거+useState 래퍼로 렌더(겹침/모달 상태 안전), 코드 스니펫은 대표 사용형(open/onClose 등)으로 표기. Toast는 ToastProvider+useToast 래퍼, 데이터·컴파운드(Table·Tabs 등)는 고정 샘플 + 식별자 표기
자세히
- 플레이그라운드 42종 추가 — 입력·폼(IconButton·TextLink·Textarea·SearchField·Select·Autocomplete·Checkbox·RadioGroup·BadgeToggle·Switch·Slider·FormField) · 날짜·컨테이너(DatePicker·TimePicker·DayPicker·Card·Splitter) · 데이터(Table·DataGrid·Tabs·Accordion) · 오버레이(Modal·Drawer·BottomSheet·Popover·Tooltip·DropdownMenu·Command·Toast) · 피드백·표시(Progress·Skeleton·Spinner·Badge·Avatar·Separator) · 내비·기타(Breadcrumb·Pagination·Stepper·EmptyState·CopyButton·AiChatInput·AgentCard)
- 레지스트리를
entries/그룹 파일 8개로 분리(shared.tsx공통 헬퍼/타입 +inputs·controls·date-container·data·overlay-a·overlay-b·feedback·nav) —registry.tsx가 병합.num헬퍼 추가(number→Slider 컨트롤) - 오버레이는 흐름 안 트리거+useState 래퍼로 렌더(겹침/모달 상태 안전), 코드 스니펫은 대표 사용형(
open/onClose등)으로 표기. Toast는 ToastProvider+useToast 래퍼, 데이터·컴파운드(Table·Tabs 등)는 고정 샘플 + 식별자 표기
Phase 3.8 — DateRangePicker 달력 헤더 + 데모 per-demo 테마 토글 (2026-06-12)
- DateRangePicker 달력 헤더
- 데모 per-demo 테마 토글
- 데모 판 기본값을 라이트 고정에서 포털 테마 추종으로
- ThemeToggle의 인라인 테마 구독 로직을 공유 훅 useAmbientTheme로 추출(DRY)
- 코드 복사 버튼 통일
- MultiSelect/Select/TimePicker 텍스트 선택 차단
- 데모 테마 토글 겹침 해소
자세히
- DateRangePicker 달력 헤더 — 듀얼 먼스 달력 상단에 시작일/종료일 제목 + 현재 선택값(미선택 시 "선택 안 됨").
startLabel/endLabel로 제목과 aria-label을 한 소스로 동기화,showCalendarHeader로 표시 토글(기본 true). 시각 헤더는aria-hidden— Calendar의 기존 aria-label로 SR 구분은 유지. 플레이그라운드에 컨트롤 추가 - 데모 per-demo 테마 토글 — 문서 데모 판이 포털 테마(ambient)를 따르고, 판 우상단 토글로 그 데모만 라이트/다크 전환(override는 수동 시 고정).
Demo기본 분기를DemoPane(클라이언트) +useAmbientTheme훅으로 전환 — 137개 데모 일괄 적용.theme="light"|"dark"|"both"명시 분기는 보존
- 데모 판 기본값을 라이트 고정에서 포털 테마 추종으로 — 다크 토글이 데모까지 반영(기존엔
Demo theme기본 'light'가 판을 라이트로 못박아 "다크 미지원"처럼 보였음). 컴포넌트·토큰 다크 지원은 P2~P3.7에서 이미 완료된 상태였고, 본 변경은 표시 정책만 교정 ThemeToggle의 인라인 테마 구독 로직을 공유 훅useAmbientTheme로 추출(DRY)
- 코드 복사 버튼 통일 — 플레이그라운드 생성 코드가
@wds/ui-webCopyButton(상시 노출·위치 어긋남)을 따로 쓰던 것을 문서 전역CodeBlock(호버 노출, 터치 상시)으로 교체. 모든 코드블록이 동일한 복사 어포던스·위치(우상단 8/8)로 통일 - MultiSelect/Select/TimePicker 텍스트 선택 차단 — 빠른/더블 클릭 시 옵션·트리거 라벨이 브라우저 네이티브 텍스트 선택(
::selection)으로 강조되어 "전체 선택"처럼 보이던 문제. 트리거·옵션 리스트에user-select: none추가(Command·DropdownMenu와 동일 정책). 검색 입력(.searchInput)은 리스트 밖이라 선택·편집 그대로 유지 - 데모 테마 토글 겹침 해소 — per-demo 토글이
position: absolute라 풀폭·세로로 큰 데모(Command·Progress 등) 콘텐츠 우상단을 덮던 문제. DemoPane을 상단 바(토글)+캔버스(콘텐츠) 흐름 구조로 재구성해 토글이 레이아웃상 자리를 차지 — 패딩 매직넘버가 아니라 구조로 겹침을 원천 차단
Phase 3.7 — 아트디렉션 정비 + ColorPicker·FileUpload 2.0 + Playground (2026-06-12)
스크린샷 실측으로 보고된 정렬·간격·여백 결함의 전수 정비와 픽커/업로드 고도화, 그리고 문서에서 props를 실시간 조작하는 플레이그라운드 시스템(의존성 0, CSP-safe).
- Playground 시스템
- ColorPicker 2.0 (WIZ_OPS 사양 승격)
- FileUpload 2.0 (WIZ_OPS 사양 승격, 전송은 소비자 책임 유지)
- 아트디렉션 정비 18파일
- .prose 리스트 번짐 차단
- Playground 컨트롤 라벨은 surface-muted 패널 위라 text-subtle이 4.39:1로 AA 미달 → text-muted로 확정(axe 실측)
자세히
- Playground 시스템 — 실물 컴포넌트 프리뷰 + props 컨트롤 패널(boolean→Switch, enum→BadgeToggle/Select, string→Input, number→Slider) + JSX 코드 자동 생성·복사. eval 없는 순수 템플릿 조립이라 nonce CSP(DD-7)와 충돌하지 않음(react-live/Sandpack 불채택 근거). 대표 8종 적용: Button·Input·MultiSelect·DateRangePicker·Alert·Tag·FileUpload·ColorPicker
- ColorPicker 2.0 (WIZ_OPS 사양 승격) —
modes(spectrum/grid 120색 생성 팔레트/sliders RGB) 탭 전환,trigger(swatch/field), 표시 포맷 전환(HEX/RGB/HSL — onChange 출력은 HEX 고정), 최근 색(localStorage 최대 10), HEX 복사(CopyButton 합성), alpha 자동 감지(#RRGGBBAA/rgba/hsla), 체커보드 투명 표시, grid 셀 roving 화살표 이동 - FileUpload 2.0 (WIZ_OPS 사양 승격, 전송은 소비자 책임 유지) — 제어형
items(status idle/uploading/success/error + progress + errorMessage) 주입과onRetry재시도,listType='picture-card'(Object URL 썸네일, 언마운트 시 revoke), 표준 거부 코드(FILE_TOO_LARGE 등 5종 — 기존 한국어 reason과 병행),enablePaste(클립보드 붙여넣기),directory(폴더 선택+드롭 재귀 수집), aria-live 상태 통지
- 아트디렉션 정비 18파일 (axe·스크린샷 실측 결함): Stepper 한글 라벨
keep-all+중앙 정렬("장바구 니" 음절 분리 해소) · Pagination 줄임(…) 셀을 페이지 버튼과 동일 셀 메트릭으로 통일 · 리스트형 팝업 5종(Select·MultiSelect·TimePicker·Command·DropdownMenu) 옵션 행 어휘 통일(행 높이·패딩·hover·선택 표시 한 기준)+가는 스크롤바 · DataGrid 체크박스 칼럼 중앙·Pagination 여백 · 타이틀/본문 텍스트 표면keep-all전수(Modal·Drawer·BottomSheet·Card·Alert·Toast·Tooltip·EmptyState·AgentCard 등) .prose리스트 번짐 차단 — 마크다운 ul/ol 스타일을:where(:not([class]))로 한정. 데모 안 컴포넌트 리스트(Pagination 등)에 새던 disc 마커·padding-left·li 마진이 사용자 보고 결함("• 1 2• 3")의 근본 원인이었음(표 가드와 동일 패턴)- Playground 컨트롤 라벨은 surface-muted 패널 위라 text-subtle이 4.39:1로 AA 미달 → text-muted로 확정(axe 실측)
Phase 3.6 — DK 프로젝트 사양 승격 39→50종 + 모바일 표준 (2026-06-11)
DK 프론트(Project/DK)의 검증된 표준 컴포넌트 사양(WizDropDown 1,457줄·WizDatePickerEx 1,854줄 등)을 사양 승격 방식으로 통합
- BottomSheet
- MultiSelect
- DateRangePicker
- DataGrid
- Autocomplete
- TimePicker(interval·min/max) · DayPicker(요일/매월일 반복 토글) · Splitter(키보드 리사이즈 separator) · ColorPicker(HSV 스펙트럼·프리셋·EyeDropper) · FileUpload(드래그앤드롭, 전송은 소비자 책임) · BadgeToggle(필 단일 선택+"전체")
- 모바일 표준(COMPONENT_API §5)
- 컴포넌트 문서 11종 + 06 카탈로그 50종 그룹 재편 + DK 통합 노트
자세히
- BottomSheet — 모바일 선택 UI 표준 표면: 드래그 핸들 닫기·포커스 트랩·Escape·safe-area,
mobileprop의 공통 기반 - MultiSelect — 칩(+N 축약)·검색·"전체"(indeterminate)·그룹 선택·allowClear·모바일 시트(임시 선택→확인/취소)
- DateRangePicker — DK WizDatePickerEx 승격: "임의선택"(연도·오늘/이번주/이번달·월·분기·반기 프리셋, 2클릭 범위 결합)/"달력선택"(듀얼 먼스, 시작→끝 제약) 2탭 + 초기화/선택완료 푸터 + 취소 시 확정값 복원 +
presetType/presetLabel결과 - DataGrid — 편집형 그리드: 인라인 편집(text/number/select/checkbox)·정렬(aria-sort)·행 선택(indeterminate)·Pagination 합성·stickyHeader (Table은 정적 용도로 병존)
- Autocomplete — 비동기 태그 입력(서버 조회는 onQueryChange로 분리 — DK의 API 결합 제거판)
- TimePicker(interval·min/max) · DayPicker(요일/매월일 반복 토글) · Splitter(키보드 리사이즈 separator) · ColorPicker(HSV 스펙트럼·프리셋·EyeDropper) · FileUpload(드래그앤드롭, 전송은 소비자 책임) · BadgeToggle(필 단일 선택+"전체")
- 모바일 표준(COMPONENT_API §5): 선택형 오버레이의
mobile?: boolean+mobileTitle?계약 — 기존 Select·DatePicker에도 적용(DKmobileprop 인터페이스 호환) - 컴포넌트 문서 11종 + 06 카탈로그 50종 그룹 재편 + DK 통합 노트
Phase 3.5 — 컴포넌트 카탈로그 확장 7→39종 (2026-06-11)
- 신규 32종
- 입력·폼: IconButton · TextLink · Textarea · SearchField · Select(커스텀 리스트박스, 타이프어헤드) · Checkbox(indeterminate) · RadioGroup(roving tabindex) · Switch · Slider · FormField(라벨/오류 자동 배선) · DatePicker/Calendar(단일+범위, APG 그리드 키보드, ko-KR)
- 컨테이너: Tabs(컴파운드, APG) · Accordion(single/multiple)
- 오버레이: Drawer(3방향, 포커스 트랩) · Popover(자동 플립) · Tooltip(지연 표시) · DropdownMenu · Command(⌘K 어휘)
- 피드백: Toast(Provider/useToast, 자동 해제+hover 일시정지) · Alert · Progress · Skeleton · Spinner · Badge · Tag
- 내비·표시: Avatar · Separator · Breadcrumb · Pagination(줄임 로직) · Stepper · EmptyState · CopyButton(Copy 패턴 v1 승격)
- 아이콘 5종 추가(calendar·chevron-left·alert-triangle·check-circle·minus
- 컴포넌트 문서 39종 전체 + 06 카탈로그 개요(그룹별 표)
- 데모 래퍼: DatePickerDemo · DrawerDemo · ToastDemo · CommandDemo
- 상태 틴트를 surface 고정 혼합으로 표준화
- Tabs/Accordion 컴파운드에 평탄 명명 export 추가(TabsList 등)
- 같은 페이지 다중 nav 데모에 고유 라벨 부여(landmark-unique 해소)
자세히
- 신규 32종 (총 39종, 테스트 400개):
- 입력·폼: IconButton · TextLink · Textarea · SearchField · Select(커스텀 리스트박스, 타이프어헤드) · Checkbox(indeterminate) · RadioGroup(roving tabindex) · Switch · Slider · FormField(라벨/오류 자동 배선) · DatePicker/Calendar(단일+범위, APG 그리드 키보드, ko-KR)
- 컨테이너: Tabs(컴파운드, APG) · Accordion(single/multiple)
- 오버레이: Drawer(3방향, 포커스 트랩) · Popover(자동 플립) · Tooltip(지연 표시) · DropdownMenu · Command(⌘K 어휘)
- 피드백: Toast(Provider/useToast, 자동 해제+hover 일시정지) · Alert · Progress · Skeleton · Spinner · Badge · Tag
- 내비·표시: Avatar · Separator · Breadcrumb · Pagination(줄임 로직) · Stepper · EmptyState · CopyButton(Copy 패턴 v1 승격)
- 아이콘 5종 추가(calendar·chevron-left·alert-triangle·check-circle·minus — 총 18종)
- 컴포넌트 문서 39종 전체 + 06 카탈로그 개요(그룹별 표) — 사이드바·검색 연동
- 데모 래퍼: DatePickerDemo · DrawerDemo · ToastDemo · CommandDemo
- 상태 틴트를 surface 고정 혼합으로 표준화:
color-mix(... 8%, transparent)→color-mix(... 8%, var(--wds-color-surface))— 깔리는 배경(gray-50 등)과 무관하게 status-text AA 보장(axe 실측 4.4 → 4.59/다크 7.09) - Tabs/Accordion 컴파운드에 평탄 명명 export 추가(TabsList 등) — RSC에서 클라이언트 참조 점 접근 미해석 제약 대응(프로덕션 빌드 실측), 점 표기 API는 유지
- 같은 페이지 다중 nav 데모에 고유 라벨 부여(landmark-unique 해소)
Phase 3 — 컴포넌트 라이브러리 (2026-06-11)
- @wds/ui-web React 컴포넌트 라이브러리(MVP 7종): Button · Input · Card(시드 포팅) / Modal · Table · AiChatInput · AgentCard(신규). RSC 우선, CSS Modules + --wds-* 토큰 전용, 67개 테스트(커버리지 100% lines)
- build-icons 파이프라인
- stylelint 토큰 강제 게이트(DD-4 해소)
- 포털 컴포넌트 문서
- 05 아이코노그래피 본문
- 사이드바 중첩 내비(섹션 하위 문서) · 검색 인덱스 서브문서 포함
- docs/COMPONENT_API.md(컴포넌트 API 컨벤션 정본) · docs/adr/ADR-011-icon-tokens.md(DD-9 해소)
- 토큰: control.height-sm/md/lg · icon.size-*/icon.stroke · color.primary-strong 트리오 · button.height-* · input.height/input.border-invalid
- DD-6 해소 — Button 기본 채움 AA 확정
- 다크 primary-strong-active를 blue.400으로 확정
- AgentCard done/error 칩 틴트 12%→8%
- 포털 .prose table/th/td에 :where(:not([class])) 가드
- Modal 내부 header/footer 요소를 div로
- 포커스 트랩: 패널(tabIndex=-1) 초기 포커스 상태에서 Shift+Tab이 다이얼로그 밖으로 탈출하던 경로 차단 + 포커서블 0개 시 컨테이너 고정(ui-web·portal 양쪽)
- Modal 닫기·AiChatInput 전송 버튼 44px 히트 영역(시각 32px 유지)
- Table: caption 제공 시 가로 스크롤 래퍼가 키보드 도달 가능한 region(WCAG 2.1.1)
- AiChatInput: onStop 미제공 시 스트리밍 중단 버튼 비활성(무동작 버튼 차단)
- 검증: 문서 9페이지 × 라이트/다크 + 모달 열림 상태 axe 위반 0
자세히
- @wds/ui-web React 컴포넌트 라이브러리(MVP 7종): Button · Input · Card(시드 포팅) / Modal · Table · AiChatInput · AgentCard(신규). RSC 우선, CSS Modules +
--wds-*토큰 전용, 67개 테스트(커버리지 100% lines) - build-icons 파이프라인:
icons/*.svg(24×24 스트로크, ADR-011 규격) → React 컴포넌트 생성. 코어 아이콘셋 13종,icon.size-md/icon.stroke를 manifest에서 읽어 SSOT 동기,make icons배선 - stylelint 토큰 강제 게이트(DD-4 해소): 색·배경·그림자·라디우스·보더·아웃라인·폰트 속성에
var(--wds-*)만 허용 — 포털+ui-web 전 CSS 대상,pnpm lint:css - 포털 컴포넌트 문서:
/docs/components/<name>서브페이지 라우팅(SSG) + 컴포넌트별 MDX 7종(데모→변형→크기→상태→Props→접근성→토큰 순서 계약) + 06 개요. 라이브 데모는 라이브러리 실물 코드 렌더 - 05 아이코노그래피 본문: 원칙·크기 토큰·코어 셋 그리드(IconGrid)·파이프라인·접근성
- 사이드바 중첩 내비(섹션 하위 문서) · 검색 인덱스 서브문서 포함
docs/COMPONENT_API.md(컴포넌트 API 컨벤션 정본) ·docs/adr/ADR-011-icon-tokens.md(DD-9 해소)- 토큰:
control.height-sm/md/lg·icon.size-*/icon.stroke·color.primary-strong트리오 ·button.height-*·input.height/input.border-invalid
- DD-6 해소 — Button 기본 채움 AA 확정:
button.bg/-hover/-active를primary-strong트리오(라이트 700/800/900)로 재배선. 버튼 라벨은 항상 일반 크기(≤16px)라 Blue 600 채움(4.38:1)을 쓸 수 있는 버튼 상황이 없음을 axe 실측으로 확인. 재배선 후 중복이 된strong변형은 제거(variant 3종: primary·secondary·ghost), secondary 라벨은primary-text로 교체. 시드 대비 의도 변경으로 SEED_RECONCILE §3-1 + parity 게이트 등재 - 다크
primary-strong-active를 blue.400으로 확정 — 다크 잉크(on-primary) 계약상 pressed가 600으로 어두워지면 4.04:1 미달(신규 contrast 게이트가 검출) - AgentCard done/error 칩 틴트 12%→8% — 12%는 status-text와 4.39:1로 AA 미달(axe 실측)
- 포털
.prose table/th/td에:where(:not([class]))가드 — 마크다운 표 전용으로 한정, 데모 내 컴포넌트로의 스타일 번짐 차단 - Modal 내부 header/footer 요소를 div로 — body 포털 컨텍스트의 banner/contentinfo 랜드마크 중복 제거
- 포커스 트랩: 패널(tabIndex=-1) 초기 포커스 상태에서 Shift+Tab이 다이얼로그 밖으로 탈출하던 경로 차단 + 포커서블 0개 시 컨테이너 고정(ui-web·portal 양쪽)
- Modal 닫기·AiChatInput 전송 버튼 44px 히트 영역(시각 32px 유지)
- Table: caption 제공 시 가로 스크롤 래퍼가 키보드 도달 가능한 region(WCAG 2.1.1)
- AiChatInput:
onStop미제공 시 스트리밍 중단 버튼 비활성(무동작 버튼 차단) - 검증: 문서 9페이지 × 라이트/다크 + 모달 열림 상태 axe 위반 0
Phase 2 — 디자인 토큰 체계 (2026-06-10)
- W3C Design Tokens JSON SSOT 완성(3계층, 모호값 확정, 다크 재설계 규칙 4종)
- codegen Dart 타겟(AD-2: rem→px ×16, ThemeExtension-ready 클래스) + 교차타겟/라운드트립 게이트
- WCAG AA 대비 자동 게이트(contrast.test.ts) · 시드 패리티 게이트(INTENTIONAL_CHANGES 거버넌스)
- Flutter wiz_ui 패키지 + Token Demo
- 문서 02 파운데이션 · 03 디자인 토큰 · 11 다크 모드 본문, TokenTable 양 테마
- Copy 인터랙션(코드 블록·토큰명·헤딩 앵커)
자세히
- W3C Design Tokens JSON SSOT 완성(3계층, 모호값 확정, 다크 재설계 규칙 4종)
- codegen Dart 타겟(AD-2: rem→px ×16, ThemeExtension-ready 클래스) + 교차타겟/라운드트립 게이트
- WCAG AA 대비 자동 게이트(contrast.test.ts) · 시드 패리티 게이트(INTENTIONAL_CHANGES 거버넌스)
- Flutter
wiz_ui패키지 + Token Demo - 문서 02 파운데이션 · 03 디자인 토큰 · 11 다크 모드 본문, TokenTable 양 테마
- Copy 인터랙션(코드 블록·토큰명·헤딩 앵커) — Copy 패턴 v1
Phase 1 — Design System Portal 기반 (2026-06-10)
- 토큰 최소 슬라이스 + build-tokens(CSS 타겟) · Makefile 오케스트레이션
- Next.js 16 포털(App Router·MDX evaluate·TS strict)
- 14섹션 라우팅 + 01 소개 · 04 브랜드 · 07 레이아웃 본문
- 검색 UX 고도화(매치 강조·본문 하이라이트(Custom Highlight API)·최근 검색)
- Lighthouse 99/100 · axe 0 기준선
자세히
- 토큰 최소 슬라이스 + build-tokens(CSS 타겟) · Makefile 오케스트레이션
- Next.js 16 포털(App Router·MDX evaluate·TS strict) — 문서 셸(네비·TOC·⌘K 검색·테마 토글·반응형)
- 14섹션 라우팅 + 01 소개 · 04 브랜드 · 07 레이아웃 본문
- 검색 UX 고도화(매치 강조·본문 하이라이트(Custom Highlight API)·최근 검색)
- Lighthouse 99/100 · axe 0 기준선
릴리스 운영 정책 — 버전 정책 · 릴리스 규칙(CI) · 읽는 법 · 패키지 SemVer 로그
WIZ Design System은 버전을 두 층으로 나눠 추적합니다. 위 히어로의 플랫폼 릴리스 라벨(예: v0.11.0)은 우플리프트 묶음 단위의 큰 이정표이고, 각 패키지 버전(SemVer)은 산출물별로 독립적으로 올라갑니다 — 토큰 한 줄을 고치면 두 플랫폼이 함께 재생성되므로 같은 모노레포 커밋이 호환의 기준입니다.
버전 정책#
| 층위 | 정본(SSOT) | 올리는 방법 | 예시 |
|---|---|---|---|
| 플랫폼 릴리스 라벨 | docs/PLATFORM_VERSION.md | 우플리프트 묶음 종료 시 수동 | v0.10.0 |
| 패키지 SemVer | .changeset/*.md → changeset version | 변경마다 changeset 작성 → 일괄 bump | @wds/ui-web 0.2.0 |
Flutter wiz_ui | git tag (wiz_ui-vX.Y.Z) | 태그 릴리스 (ADR-009·AD-9) | wiz_ui-v0.5.0 |
헤더 배지는 portal/lib/site.ts의 platformVersion을 표시하며,
portal/lib/site.test.ts가 이 값과 docs/PLATFORM_VERSION.md의 정합을 강제합니다 —
표시 값이 어느 SSOT와도 연결되지 않는 죽은 하드코딩을 게이트로 차단합니다.
릴리스 규칙 (CI 강제)#
배포 패키지(@wds/ui-web · @wds/tokens · @wds/fonts)의 출하 소스가 바뀌면
반드시 pnpm changeset으로 체인지로그 항목을 추가합니다 — 같은 커밋에 포함하세요.
누락하면 CI verify:changeset 잡이 파이프라인을 RED로 만들어 배포를 막습니다.
| 패키지 | 출하 소스(이게 바뀌면 changeset 필요) |
|---|---|
@wds/ui-web | packages/ui-web/src/** · package.json |
@wds/tokens | tokens/**(JSON SSOT) · tokens/wds-base.css · package.json |
@wds/fonts | portal/public/fonts/** · package.json |
게이트는 push 커밋 범위(CI_COMMIT_BEFORE_SHA..CI_COMMIT_SHA)를 검사하며,
다음 셋 중 하나라도 같은 범위에 있으면 통과합니다 — .changeset/*.md 추가 ·
해당 package.json 버전 bump · 패키지 CHANGELOG.md 갱신. 더해 각 패키지의
package.json 버전과 CHANGELOG.md 최상단 버전의 드리프트를 경고로 가시화합니다.
로컬에서 미리 확인하려면 make verify-release(또는 pnpm verify:changeset)를 돌립니다 —
배포 패키지 변경이 없으면 깔끔히 통과합니다(스크립트: scripts/verify-release-consistency.mjs).
읽는 법#
위 릴리스 타임라인은 리포지토리 루트 CHANGELOG.md(플랫폼 서사 정본)를 빌드타임에 읽어
구조화 렌더합니다 — 단일 정본이라 드리프트 0입니다. 전체 변경 이력은
Keep a Changelog 1.1.0 형식을 따르며(AD-9),
변경 유형은 Added · Changed · Deprecated · Removed · Fixed · Security로 분류합니다.
카드의 색 배지(추가·변경·수정·제거·보안)가 이 유형에 1:1 대응합니다.
- 버전 태깅·자동 체인지로그 생성·패키지 publish는 GitLab 원격 연결(R-2) 시점에 활성화됩니다. 그 전까지 이 페이지가 단일 정본입니다.
- 아래 「패키지 릴리스 노트」는 각 패키지
CHANGELOG.md(changesets 자동 생성)에서 읽어옵니다.
패키지 릴리스 노트#
각 배포 패키지의 SemVer 릴리스 —
changeset version이 자동 생성합니다(드리프트 0). 설치·업데이트한 버전과 대조해 보세요.
@wds/ui-web#
0.21.0
Minor Changes
-
ChatMessage: 진행 라벨
activityLabel— 활동 진위 규율을 구현으로 승격 (uplift 20 D2-1)ai-chat패턴의 활동 진위 규율(실이벤트만·없으면 침묵·시간기반 가짜완료 금지)을 문서에서 컴포넌트 구현으로 승격한다. assistant 메시지의 진행 단계 라벨을 thinking 인디케이터에 인접한 단일 라인으로 표시한다. 순수 확장 — 기존 소비처 비파괴.activityLabel?— 진행 단계 라벨(“문서 검색 중”). 실제 단계 이벤트가 있을 때만 넘긴다. null·빈 문자열이면 렌더하지 않는다(없으면 침묵). 값이 바뀌면 그 자리에서 텍스트가 교체·fade된다.activityTone?—running(기본)·error(실패·타임아웃, 실제 상태 반영). 신규 설계(양쪽 다 미정의였음).- ChatThread엔 두지 않는다 — 순수 스크롤 컨테이너의 단일책임을 지키고, 활동 라벨은 메시지가 소유한다.
별도
aria-live도 두지 않는다(ChatThread의role="log"라이브 영역이 낭독 — 이중 낭독 회피). - Flutter 패리티:
WizChatMessage(activityLabel, activityTone)+WizChatActivityToneenum 동시 추가. - 누적 단계 표시는 새 컴포넌트 대신
Accordion레시피(문서). 문서:chat-message·ai-chat에 반영.
0.20.0
Minor Changes
-
Input: 비밀 값(secret) 입력 —
revealable로 마스킹 + 표시/가리기 토글 (uplift 20 D4-1)자격증명·API 키처럼 가려야 하는 값을 위한
revealableprop을 추가한다. WIZON이components/input/RULES.md에 명세한secretvariant(“reveal/hide controls with accessible names”)를 WDS 코어로 승격(W→D).clearable과 대칭인 순수 확장 — 기존 소비처 비파괴.revealable— 켜면type을 내부에서password↔text로 제어(소비자type무시)하고, 후행 슬롯에 표시/가리기 토글을 렌더한다.clearable·trailingIcon보다 우선하며 비활성이면 토글을 숨기고 마스킹만 유지한다.revealLabel— 표시 토글 접근 이름(고정, 기본 “비밀 값 표시”). 상태는aria-pressed로 전달해 라벨 스왑 중복 안내를 피한다.- Flutter 패리티:
WizInput(revealable, revealLabel)동시 추가. 토글 상태는 Semanticstoggled(웹aria-pressed동치)로 노출 — foundationWizInteractableShell에toggled파라미터 신설(다른 토글 버튼도 재사용 가능). - 문서:
input문서에 “비밀 값(secret)” 변형 섹션 + 데모, 플레이그라운드revealable노브·프리셋.
-
8ad2971: Markdown: GFM task list(
- [ ]/- [x]) 지원 — uplift 20 DR-05AI 답변에 자주 나오는 할일 목록을 구조로 렌더한다. 기존 안전 서브셋 방어선(AST→React 엘리먼트,
dangerouslySetInnerHTML미사용)은 그대로이며 의존성 증분 0이다.- 파싱: 리스트 항목 본문 앞의
[ ]/[x](대소문자 무관)를 마커로 인식해 본문에서 분리한다. 한 리스트에 task 항목과 일반 항목이 섞여도 되고, 순서 리스트에서도 동작한다(GFM 동일). - 렌더: 읽기 전용 체크박스로 그린다.
aria-hidden하지 않아 완료 여부가 보조기술에 그대로 전달된다(완료 상태가 본문 의미의 일부이므로). 사용자가 답변 본문을 토글할 수는 없다. - Flutter 패리티:
MdListItem신설 +WizMarkdown이 체크 글리프로 렌더하고Semantics.checked로 상태를 전달한다. 상호작용WizCheckbox는 44dp 탭 타깃 때문에 본문 행 간격을 무너뜨려 쓰지 않는다.
타입 변경(minor):
ListItem이readonly InlineNode[]에서{ children, checked? }객체가 됐다(신규 export).BlockNode의 list 항목을 직접 순회하는 코드는item→item.children으로 바꿔야 한다. Flutter도 대칭으로MdList.items가List<MdListItem>이 됐다.범위 주의: 같은 uplift 20 D1-4의 표(table)는 포함하지 않는다 —
markdown-parse.ts가 테이블을 “미지원(의도)“으로 명시하고 그 근거(AI 가이드라인 §“마크다운이 아니라 위젯 카드로”)가 유효한지 재판정 중이다(DR-04). 체크리스트는 데이터-viz가 아니라 이 규율의 대상이 아니다. - 파싱: 리스트 항목 본문 앞의
-
2cbbdb6: lib: 최근성(recency) 그룹핑 유틸 신설 — 히스토리 사이드바 섹션 묶기 (uplift 20 D6-9)
대화·문서 목록처럼 시간이 쌓이는 리스트를 최신성으로 묶는 순수 유틸을 배럴로 노출한다. WIZON이
app.js에 자체 구현했던 로직(오늘/어제/지난 7일/지난 30일/달)을 WDS 코어로 승격(W→D).relativeDayGroup(date, now?)— 날짜 → 언어 중립 버킷(today·yesterday·last-7-days·last-30-days·month·older). 로컬 day 경계 기준, 미래 날짜는today로 폴백.groupByRecency(items, getDate, now?)— 항목 배열 → 최근성 섹션(입력 순서 보존, 무효 날짜는 today 폴백).recencyBucketKey(bucket)— 섹션 병합 키.
라벨 문자열은 소비자가 i18n 매핑한다(유틸은 키만 반환 — WDS 범용화 원칙). 순수 함수·의존성 증분 0.
adaptive-list-detail패턴에 “히스토리 조직” 데모/레시피 추가. 태그·폴더는 제품 데이터 모델이라 소비자 소유.
0.19.1
Patch Changes
-
useDragScroll 오버스크롤: release 스프링백을 ζ=1 임계감쇠 JS 스프링으로 교체
러버밴드 오버스크롤(
overscroll)에서 손을 뗐을 때의 복귀 애니메이션을 CSS transition(spring-spatial-fast, ~1.5% 오버슈트)에서 임계감쇠(ζ=1, 오버슈트 0) rAF 스프링(animateSpringBack)으로 교체했다. 경계 밖으로 당긴 콘텐츠가 경계를 지나치지 않고 곧장 정착하며, 드래그 중 오프셋 속도를 EMA로 추적해 release 속도를 스프링에 시드하므로 손→복귀가 속도 불연속 없이 이어진다. reduced-motion이면 즉시 복귀(무애니메이션). 공개 API·옵션은 불변(ScrollRail·ChipGroup·SegmentedButton 호출 계약 무영향).
0.19.0
Minor Changes
-
62d72ca: feat(layout): GridItem
subgridopt-in prop — 부모 트랙 정렬 (G-C)<GridItem subgrid>가 아이템을 그리드로 만들되 자체 트랙 대신 부모(master)의 컬럼 라인· 거터를 그대로 상속한다(grid-template-columns: subgrid). 여러 master 컬럼을 점유하는 블록 안의 중첩GridItem이 전역 12칸 격자 리듬에 정렬되므로 중첩 콘텐츠가 어긋나지 않는다.span과 함께 써서 점유할 부모 컬럼 수를 지정한다(예:span={8} subgrid). Baseline 2023(~97%). 비-subgrid 경로는 완전 무변경 — additive·하위호환. -
f697848: feat(layout): Grid 행 트랙 + GridItem row subgrid — 카드 행간 정렬 (G-C)
Gridrows?: number— 명시 행 트랙(grid-template-rows: repeat(rows, auto)).GridItemrowSpan?/rowStart?— 행 배치(grid-row), 컬럼span/start와 대칭.GridItemsubgrid를 축 인지형으로 확장:boolean | 'columns' | 'rows' | 'both'(true='columns'하위호환).subgrid="rows"는 부모 행 트랙을 상속해 여러 카드의 헤더/본문/푸터가 본문 길이와 무관하게 같은 행에 정렬된다(카드 그리드·비교 표의 행 리듬).
비-지정 경로는 완전 무변경 — additive·하위호환.
0.18.0
Minor Changes
-
00fe469: feat(layout): Grid
containeropt-in prop — 자기 폭 기준 적응형 컬럼 (G-C)<Grid container>가 뷰포트가 아니라 그리드 자기 배치 폭을 CSS container query로 판정해 컬럼을 적응시킨다(compact 4 <600 · medium 8 600–840 · expanded 12 ≥840, ADR-012). 요소는 자기 컨테이너가 될 수 없으므로 container-type는 보이지 않는 셸에 두고 실제 grid를 자손으로 둔다(named containerwds-grid, Table.responsiveCards 선례). 컬럼 카운트는 토큰 var()로 SSOT 유지. 기본(비-container) 경로는 완전 무변경 — 순수 additive·하위호환.사이드바·split·모달 등 좁은 컨텍스트 안에서도 뷰포트가 아닌 실제 배치 폭으로 재배열 — Flutter WizGrid(LayoutBuilder)와 같은 “컨테이너 기준” 멘탈모델.
0.17.2
Patch Changes
-
fix: SSR 하이드레이션 불일치 해소 — Calendar·DateRangePicker(#418)
비제어 날짜 컴포넌트가 렌더 중
new Date()(오늘)에 의존해, SSR(서버 TZ)과 클라이언트(브라우저 TZ)의 오늘이 다르면 서버·클라 출력이 갈려 하이드레이션 에러가 났다. 포털은@wds/ui-web소스를 직접 소비해 이미 반영됐지만, 게시된 npm 패키지를 쓰는 소비자는 0.17.1에 이 픽스가 없어 별도 패치로 전달한다.- Calendar: today 마커(
aria-current="date"·.today)와 비제어 시 roving tabindex의 tabbable 셀이new Date()에 의존하던 것을, 마운트 전엔 결정적 값(표시 월 1일)으로 두고 마운트 직후 실제 오늘로 전환. 서버·첫 클라 렌더가 일치한다(장식 마커는 1프레임 지연, 포커스는 키보드 이동 전까지 훔치지 않으므로 무해). - DateRangePicker: 비제어 기본값이 오늘 범위라 트리거 텍스트가 SSR↔클라로 갈리던 것을, 트리거 값 span에
suppressHydrationWarning으로 한 단계만 스코프(React #418). 날짜처럼 서버·클라가 불가피하게 다른 콘텐츠에 대한 React 공식 이스케이프 해치.
- Calendar: today 마커(
0.17.1
Patch Changes
-
fix: xlsx 어댑터 peer 범위를
>=0.20.2→*로 완화(npmjs 해석 불가로 인한 소비자 설치 실패 수정).>=0.20.2는 CVE 회피 의도였으나, SheetJS가 npm을 떠나 npmjs의 xlsx 최신이 0.18.5뿐이라 이 범위를 만족하는 버전이 npmjs에 없다 →pnpm add @wds/ui-web(auto-install-peers) 시ERR_PNPM_NO_MATCHING_VERSION으로 설치 자체가 깨졌다(0.17.0 게시 후 registry-consumption 검증에서 발견).- optional peer의 버전은 peer 범위로 CVE를 강제할 수 없다(안전 버전이 npmjs에 없음) → 보안은 **CDN 설치(0.20.3+)**가 담당(CONSUMING §7.5). peer 범위는 npmjs 해석만 보장하도록
*로 둔다. - 어댑터 코드·동작 무변경.
- optional peer의 버전은 peer 범위로 CVE를 강제할 수 없다(안전 버전이 npmjs에 없음) → 보안은 **CDN 설치(0.20.3+)**가 담당(CONSUMING §7.5). peer 범위는 npmjs 해석만 보장하도록
0.17.0
Minor Changes
-
f1c7953: FileUpload 미리보기를 통합 FileViewer로 이관 — 이미지 전용 라이트박스 + 비이미지 메타카드 이원화를 하나로 통합.
기존엔 이미지·영상만 ImageViewer 라이트박스로 열고(미디어끼리만 순회), 그 외 문서는 확장자 글리프 + 용량·형식 메타카드 Modal로만 보여줬다. 이제 모든 파일이 통합 FileViewer 한 오버레이에서 열린다.
- 전 타입 인라인 렌더 — 이미지·영상·PDF·텍스트·마크다운·CSV를 코어가 실제 렌더(기존 txt/csv/pdf는 메타카드에 그쳤음). 미디어는 줌/회전, 문서는 스크롤.
- 한 필름스트립 순회 — 파일 종류에 상관없이 업로드한 전 파일을 ←/→·필름스트립으로 순회(기존은 미디어끼리만).
- 어댑터 passthrough — 새
previewRenderersprop(FileViewerProps['renderers'])으로 docx/pdf/hwp 등 opt-in 어댑터(@wds/ui-web/viewers/*)를 주입하면 해당 문서도 인라인 렌더. 미주입·미지원 타입은 FileViewer 메타카드로 폴백. - 내부
FileMediaLightbox+FilePreviewDialog(비공개)를 단일FilePreviewViewer로 대체. 공개 API는previewRenderersprop 추가만(하위호환). - Object URL revoke를 방어적으로 가드(
FilePreview·use-object-url— create만 스텁된 SSR/테스트 환경에서 throw 방지).
-
8983a04: FileViewer: CSV 스프레드시트 내장 렌더러 (zero-dep).
spreadsheet타입의 CSV를 자체 RFC 4180 파서(parse-csv)로 읽어 기존 WDS Table로 렌더합니다(sticky 헤더·compact·줄무늬, 500행 초과 시 안내). 따옴표 필드·이스케이프 따옴표·필드 내 콤마/개행을 처리합니다. xlsx/ods 등 바이너리 표는 어댑터가 필요하므로 “어댑터 필요” 메타카드로 강등됩니다. 신규 의존성 없음. -
d7b0db8: FileViewer: docx opt-in 어댑터 + Phase 2 어댑터 배관 (
@wds/ui-web/viewers/docx).무거운 문서 뷰어를 코어에 넣지 않고 선택적 서브패스로 분리하는 어댑터 메커니즘을 확립하고, 첫 어댑터로 docx를 제공합니다.
- 서브패스 export
@wds/ui-web/viewers/docx—docxRenderer(LazyFileRenderer)를 내보냅니다. 소비자가<FileViewer renderers={{ document: docxRenderer }} />로 등록. - optional peerDependencies —
docx-preview·dompurify를peerDependenciesMeta.optional로 선언(자동 설치 X). 미설치면load()가 reject → 메타카드 폴백.optionalDependencies를 쓰지 않아 코어 소비자에게 강제되지 않습니다. - 보안 — docx-preview를 오프-DOM에 렌더 → DOMPurify로 살균(script/on*/iframe/object 제거) →
sandbox="allow-same-origin"(allow-scripts 미부여) iframe으로 격리(이중 방어). blob/same-origin만 fetch. 25MB 초과는 렌더 시도 없이 강등. - 코어 zero-dep 유지 — 어댑터 라이브러리는 번들에서 external 처리, 코어 진입점(
.)은 이들을 import하지 않습니다(트리셰이킹 게이트 검증). - HWP(rhwp)·PDF(EmbedPDF) 어댑터는 이 레시피에 WASM/CSP 레이어만 더해 반복 적용합니다. 설계:
docs/uplift/18§2.4·§4.3·§4.4.
- 서브패스 export
-
2fb0fc9: FileViewer: 한글(HWP/HWPX) opt-in 어댑터 (
@wds/ui-web/viewers/hwp).docx에서 확립한 서브패스 어댑터 레시피에 WASM + CSP 레이어를 더해 한글 문서 뷰어를 제공합니다.
- 서브패스 export
@wds/ui-web/viewers/hwp—createHwpRenderer({ wasmUrl })(팩토리)와 기본hwpRenderer(LazyFileRenderer)를 내보냅니다. 소비자가<FileViewer renderers={{ hwp: createHwpRenderer({ wasmUrl: '/rhwp_bg.wasm' }) }} />로 등록. - optional peerDependencies —
@rhwp/core(Rust→WASM)를peerDependenciesMeta.optional로 선언(자동 설치 X). 미설치면load()가 reject → 메타카드 폴백. - WASM 호스팅 —
rhwp_bg.wasm(≈5.9MB)은 npm tarball에 넣지 않고 소비자가 same-origin 호스팅합니다.createHwpRenderer의wasmUrl로 경로를 주입(예:/rhwp_bg.wasm). init은 모듈 스코프 promise로 1회만. - 보안 — rhwp가 페이지별
renderPageSvg로 만든 SVG를sandbox="allow-same-origin"(allow-scripts 미부여) iframe + CSP 메타(default-src 'none', 인라인 스타일·data:/blob:이미지만)로 격리. sandbox 무스크립트 + CSP가 untrusted SVG의 스크립트/외부로드를 차단하므로 DOMPurify 불필요. 30MB 초과는 렌더 시도 없이 강등. - 코어 zero-dep 유지 —
@rhwp/core는 번들에서 external 처리, 코어 진입점(.)은 import하지 않습니다(트리셰이킹 게이트 검증).
설계:
docs/uplift/18§3.2·§4.2·§4.4. - 서브패스 export
-
cc41e51: FileViewer: PDF opt-in 어댑터 (
@wds/ui-web/viewers/pdf).pdf.js(pdfjs-dist) 기반 캔버스 렌더러로 코어 내장 native-pdf(브라우저 iframe)를 오버라이드한다. 브라우저 PDF 뷰어가 없거나(iOS Safari 인라인 실패 등) 크롬 없는 일관 렌더가 필요할 때 쓴다.
- 서브패스 export
@wds/ui-web/viewers/pdf—createPdfRenderer({ workerUrl })(팩토리) + 기본pdfRenderer(LazyFileRenderer).<FileViewer renderers={{ pdf: createPdfRenderer({ workerUrl: '/pdf.worker.min.mjs' }) }} />로 등록(내장 native-pdf 대체). - 셸 통합 —
capabilities: { zoom, scroll }를 선언해 셸 액션바의 줌 컨트롤(−/100%/+/1:1)과 세로 스크롤이 자동 활성. 페이지를 세로 컬럼 캔버스로 렌더. - optional peerDependencies —
pdfjs-dist(Apache-2.0)를peerDependenciesMeta.optional로 선언(자동 설치 X). 미설치면load()가 reject → 메타카드 폴백. - worker 호스팅 —
pdf.worker.min.mjs는 tarball 제외 — 소비자가 same-origin 호스팅(CDN 금지).createPdfRenderer의workerUrl로 주입(미지정 시 fake worker=메인 스레드 폴백). - 보안 — 캔버스 비트맵 렌더라 PDF의 HTML/스크립트가 주입될 여지가 없어(픽셀 출력) docx/hwp의 sandbox iframe이 불필요. 50MB 초과·암호화·파싱 실패는 메타카드로 강등.
- 코어 zero-dep 유지 —
pdfjs-dist는 번들에서 external 처리, 코어 진입점(.)은 import하지 않습니다(트리셰이킹 게이트 검증).
설계:
docs/uplift/18§3.1·§4.2(worker/wasm self-host). - 서브패스 export
-
d50729e: FileViewer: PowerPoint(pptx) opt-in 어댑터 (
@wds/ui-web/viewers/pptx) — 슬라이드 텍스트 아웃라인.완전 시각 렌더는 신뢰할 OSS 클라이언트 렌더러가 없어(서버 파이프라인 몫), 대신 슬라이드 텍스트 아웃라인을 제공한다: fflate로 OOXML(zip)을 열어
ppt/slides/slideN.xml의<a:t>텍스트 런을 문단별로 추출해 슬라이드 카드로 렌더.- 서브패스 export
@wds/ui-web/viewers/pptx—createPptxRenderer()+ 기본pptxRenderer(LazyFileRenderer).<FileViewer renderers={{ presentation: pptxRenderer }} />로 등록. - 텍스트 아웃라인 — 슬라이드별 카드(슬라이드 N + 첫 문단 제목 + 나머지 불릿). 완전 시각 재현이 아니라 가벼운 읽기용 미리보기.
- optional peerDependencies —
fflate(MIT, 순수 JS unzip)를peerDependenciesMeta.optional로 선언(자동 설치 X). 미설치면load()가 reject → 메타카드 폴백. - 보안 — 추출 텍스트는 React가 이스케이프하므로 iframe/살균 불필요. 10MB 초과·unzip/파싱 실패·슬라이드 0개는 메타카드로 강등.
- 코어 zero-dep 유지 —
fflate는 번들에서 external 처리, 코어 진입점(.)은 import하지 않습니다(트리셰이킹 게이트 검증).
설계:
docs/uplift/18§3.6(완전 pptx 렌더는 서버 escape hatch, 클라이언트는 텍스트 미리보기). - 서브패스 export
-
c2f4ddf: FileViewer: pptx 어댑터에 임베디드 이미지·썸네일 추가 (텍스트 아웃라인 강화).
기존 텍스트 아웃라인에 더해, fflate로 각 슬라이드가 참조하는 임베디드 이미지(slide rels →
ppt/media)와 덱 표지 썸네일(docProps/thumbnail)을 data URI로 추출해 표시한다. 추가 의존성 0(fflate 재사용).- 슬라이드별 이미지 갤러리 + 덱 상단 썸네일. 렌더 가능한 포맷(png/jpeg/gif/bmp/webp)만, emf/wmf·외부 링크·과대 크기(개별 4MB·슬라이드당 6개 초과)는 제외.
parsePptx(fflate, bytes)순수 함수 export + 유닛테스트 3종(문단·이미지·썸네일).- 보안: 이미지는 정적 data URI, 텍스트는 React 이스케이프 → iframe/살균 불필요.
- 완전 시각 충실도(도형·레이아웃)는 클라이언트 OSS 부재로 서버 변환(Gotenberg→PDF→pdf.js)을 CONSUMING §7.6에 문서화. 참고:
pptx-preview스파이크는 유효 덱 크래시로 기각(doc19 P3).
docs/uplift/19 P3.
-
b41bd0c: FileViewer: text·markdown·csv 인코딩 자동 감지 (UTF-8 가정 제거, EUC-KR 등 한국 레거시 대응).
기존엔
res.text()로 UTF-8을 가정해 EUC-KR(windows-949) 등 비-UTF-8 텍스트가 모지바케로 깨졌다. 이제 바이트를 받아 인코딩을 감지한다(추가 의존성 0 — 브라우저 내장TextDecoder).- 감지 순서: ①
charset힌트 > ②BOM(UTF-8/UTF-16LE/BE) > ③엄격 UTF-8(fatal:true) > ④EUC-KR 폴백 > ⑤관대 UTF-8. UTF-8은 오검출률이 극히 낮아 엄격 시도를 먼저 한다. FileViewerItem.charset?추가 — 소비자가 서버 메타로 인코딩을 알면 지정해 감지를 건너뛴다(하위호환, 미지정 시 자동 감지).- text·markdown·csv 렌더러 공통(
use-file-text.ts단일 지점). 순수decodeText(bytes, charset?)유닛테스트 7종. - 클리핑을 바이트가 아닌 디코드된 문자열에 적용(멀티바이트 경계 손상 방지).
docs/uplift/19 P1.
- 감지 순서: ①
-
5a3f81a: FileViewer: 통합 파일 뷰어 (Phase 1, zero-dep).
이미지·영상 전용
ImageViewer를 넘어, PDF·텍스트·마크다운까지 한 오버레이에서 렌더하는 통합 뷰어를 추가합니다.ImageViewer는 그대로 유지(하위호환).- 렌더러 레지스트리 —
FileRenderer/LazyFileRenderer계약. 타입별 렌더러를 등록/오버라이드하고, 렌더러가 선언한capabilities(zoom·rotate·paged·scroll…)에서 액션바 컨트롤을 파생합니다(하드코딩 분기 없음). - 내장 렌더러 5종(코어 zero-dep) — image·video·pdf(브라우저 네이티브 iframe)·text(
<pre>)·markdown(기존 Markdown 컴포넌트 위임). - 타입 판별 —
FileViewerItem.type을 주면 신뢰, 없으면name·mimeType으로 판별(resolveFileViewerType). hwp/hwpx는 전용 어댑터 대상으로 분리. - 우아한 강등 — 미지원 타입·어댑터 미설치·렌더 에러·대용량(
maxBytes) 초과 시 스테이지 내부 메타카드(파일명·형식·다운로드)로 조용히 폴백. - 어댑터 확장점 —
renderersprop으로 office·hwp 등 무거운 뷰어를 opt-in 등록(향후@wds/ui-web/viewers/*). 코어는 어댑터를 import하지 않아 zero-dep 유지. - 오버레이 계약(portal·포커스 트랩·inert·Escape·필름스트립·테마·진입 스프링·View Transition)은 ImageViewer와 동일한
lib/*프리미티브를 재사용합니다. 설계:docs/uplift/18-unified-file-viewer-spec.md.
- 렌더러 레지스트리 —
-
29ddd43: FileViewer: 엑셀(xlsx/xls/ods) opt-in 어댑터 (
@wds/ui-web/viewers/xlsx).SheetJS(xlsx)로 워크북을 파싱하고, 시트별 행렬을 WDS Table로 렌더(csv 렌더러와 동일한 표 표현 재사용). 코어 내장 csv 렌더러(‘spreadsheet’)를 오버라이드하며, SheetJS가 csv도 파싱하므로 등록 시 csv+xlsx+xls+ods를 모두 처리한다.
- 서브패스 export
@wds/ui-web/viewers/xlsx—createXlsxRenderer({ maxBytes })(팩토리) + 기본xlsxRenderer(LazyFileRenderer).<FileViewer renderers={{ spreadsheet: xlsxRenderer }} />로 등록. - Table 재사용 — csv 렌더러의 표 로직을 공용
SheetTable(WDS Table: 헤더·striped·sticky·500행 상한)로 추출해 csv·xlsx가 공유. 다중 시트는role="tablist"탭으로 전환. - optional peerDependencies —
xlsx(SheetJS, Apache-2.0)를peerDependenciesMeta.optional로 선언(자동 설치 X). 미설치면load()가 reject → 메타카드 폴백. - 보안 — 순수 JS 파싱(WASM 없음) → 셀을 문자열로 정규화해 Table로 안전 렌더(sandbox iframe 불필요). 15MB 초과는 렌더 시도 없이 강등.
- 코어 zero-dep 유지 —
xlsx는 번들에서 external 처리, 코어 진입점(.)은 import하지 않습니다(트리셰이킹 게이트 검증).
설계:
docs/uplift/18§3.3(표는 Table/DataGrid 재사용). - 서브패스 export
-
098cd01: FileViewer: xlsx 어댑터 서식 렌더 (exceljs — 셀 배경·글꼴·정렬·테두리·병합).
기존엔 SheetJS로 값만 표시했다(서식 손실). 이제
.xlsx는 exceljs로 셀 서식과 병합을 읽어 “엑셀답게” 렌더한다.- 이중 엔진 —
.xlsx+ exceljs 설치 시: 셀 배경색·글꼴(색/굵기/기울임/취소선)·가로/세로 정렬·테두리·**병합(colspan/rowspan)**을 FileViewer 전용SheetGrid로 렌더. xls·ods·csv나 exceljs 미설치·서식 파싱 실패 시 SheetJS 값 그리드(공용 SheetTable)로 자동 폴백. - optional peer 2개 —
exceljs(MIT, 서식) +xlsx(SheetJS, 값·xls/ods). 각각 독립.createXlsxRenderer({ styled: false })로 서식 끄고 값 그리드만 쓸 수 있다. - SheetGrid — WDS Table는 컬럼 모델이라 셀별 서식·병합을 표현 못 함 → 시맨틱
<table>+ WDS 토큰 + 셀별 인라인 스타일(색은 hex/rgba로 정규화된 값만). WDS Table 재사용 원칙(doc18 §3.3)의 의도적 예외(근거 코드/문서 기록). 값만 필요한 csv는 계속 SheetTable. - 보안/성능 — 셀 텍스트는 React 이스케이프, 색은 정규화 후 인라인 style만(스크립트 벡터 없음). 500행 초과는 잘라 안내.
- 코어 zero-dep 유지 — exceljs·xlsx는 external, 코어 진입점 무영향(트리셰이킹 게이트 검증).
docs/uplift/19 P2.
- 이중 엔진 —
-
438778e: ImageViewer: Apple 사진 스타일 필름스트립·영상 지원·확장 액션바.
- 필름스트립 — 항목 2개 이상이면 스테이지와 액션바 사이에 하단 썸네일 행이 노출됩니다. 활성 항목은 밝기·테두리로 강조되고 가운데로 자동 스크롤되며, 클릭으로 즉시 전환합니다. 영상 썸네일에는 재생 배지가 얹힙니다.
- 영상 지원 —
ImageViewerItem.kind: 'image' | 'video'추가.'video'면 네이티브 컨트롤(재생·탐색·볼륨·전체화면)로 렌더되고, 줌/회전 툴바는 자동으로 숨겨집니다. - 액션바 확장 — 다운로드 버튼(항상)과 삭제 버튼(
onDelete제공 시)을 추가했습니다. 삭제는 현재 항목 인덱스로 호출되며 hover 시 위험 톤으로 강조됩니다. - FileUpload 연동 — 미리보기가 이미지뿐 아니라 영상 파일도 라이트박스로 순회하고, 라이트박스 액션바의 삭제가 업로드 목록과 연결됩니다.
-
438778e: ImageViewer: 물리 기반 인터랙션 모션 5종 (전부 기존 WDS 모션 엔진 재사용).
- 진입 스프링 — 열릴 때 패널이
spring.spatial(ζ0.8)로 살짝 확대되며 등장하고 베일은spring.effect(ζ1.0)로 페이드 인(공유요소 줌 느낌). - Depth 항목 전환 — 항목을 넘기면
useViewTransition()으로 나가는 장면은 뒤로 물러나며(축소) 페이드, 들어오는 장면은 앞에서 다가오며(확대) 페이드하는 깊이 전환. 미지원·reduced-motion에선 즉시 교체. - 드래그-투-디스미스 — 이미지를 아래로 끌면 배경 베일 투명도와 배율이 거리를 따라가고,
projectMomentum투영 착지점이 25% 초과 또는 플릭 속도(>0.4px/ms)면 닫힌다. 미달이면spring.effect로 원위치 복귀. - 스와이프 넘기기 — 이미지를 좌우로 끌면 넘기고(같은 판정 물리), 경계에서는
rubberBandOffset(애플 고무줄) 저항. 세로/가로 축은 10px 잠금 후 확정. - 필름스트립 관성 센터링 — 활성 썸네일을
animateMomentumScroll(관성+자석 스프링)로 가운데 정착(오버플로 시).
새 물리 판정은 순수 함수
lib/lightbox-gesture.ts로 분리(단위 테스트). 모든 모션은prefers-reduced-motion에서 정지한다. - 진입 스프링 — 열릴 때 패널이
Patch Changes
-
5ed06e4: Promote the File Upload pattern to Contract v2
agent-ready. Publishespatterns/file-upload.contract.json(6 presets) with executable assertions, a matching repair map, approved/forbidden imports, copyable recipes, and test templates; the@wds/ui-web/testingfile-upload helper now emits the shared rule ids (getFileUploadPatternComplianceFindings,FILE_UPLOAD_RULE_IDS). Re-instruments the live FileUpload surface (FileUpload/FileSurface/FileCard/FileRow/FileStatus) with thedata-wds-file-upload-*markers the contract selectors depend on — additive attributes only, no behavior change. MCP now serves file-upload recipes/tests/review/repair through the existing pattern tools. -
e063001: 보안: xlsx(SheetJS) 어댑터 peer를 취약한 npm 0.18.5에서 공식 CDN 0.20.3으로 상향.
npm의
xlsx최신은 0.18.5(2022)에서 동결됐고 CVE-2023-30533(조작 파일 파싱 시 프로토타입 오염)·CVE-2024-22363(ReDoS)이 남아 있다. 수정판(0.20.2+)은 npm에 게시되지 않고 공식 CDN에만 있다. FileViewer의 xlsx 어댑터는 신뢰 불가 업로드 파일을 파싱하므로 실제 공격면이었다.peerDependencies.xlsx를^0.18.0→>=0.20.2(CVE 미해당 첫 버전)로 상향. 여전히 optional.- 소비자는 npm이 아닌 공식 CDN tarball로 설치해야 한다(
npm i https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz). 소비 가이드(docs/ai/CONSUMING.md §7.5)에 설치 커맨드·override·CVE 근거 문서화. - 어댑터 코드·API 무변경(
read/sheet_to_json시그니처 동일). 렌더 결과 동일.
docs/uplift/19 P0.
0.16.0
Minor Changes
- d5731b4: SegmentedButton: 항목이 트랙 폭을 넘으면 가로 슬라이딩(ChipGroup과 통일). 좁은 컨테이너에서 세그먼트가 쭈그러들거나 넘치는 대신
overflow-x스크롤 + 드래그(useDragScroll, 5px 임계값 아래 탭은 선택으로 보존)로 밀린다. 뜬 타일(thumb)은 스크롤에 맞춰 선택 세그먼트와 정렬을 유지한다. single·multi 모두 적용되며 기존 API·시맨틱(radiogroup/group·roving tabindex·제어/비제어)은 불변.
0.15.0
Minor Changes
- bfee6f4: FileUpload: converge to one trigger language + one file-display language.
variantnow expresses only the trigger (dropzone / button / tile) andlistTypeonly the display density (list rows / picture-card grid) — every combination works, andtile’s ”+” cell slots into the shared display (a ”+” row underlistType="list"). Unified across all surfaces: the root element is always the drop/paste target, rows gain the same colored file-type glyph and hover-revealed actions as cards (mobile: item tap opens the action sheet), the count·size(/quota) summary line renders for both densities, and preview is on by default everywhere (preview={false}to opt out). Defaults: tile → picture-card, others → list (unchanged). - 458e648: FileUpload: file-type visual cues for non-image files. New core icons
FileZipIconandFileSpreadsheetIcon(icons pipeline, web + Flutter registry), and a sharedfileTypeIconOfmapping (extension sets first, MIME fallback) that renders a type icon above the extension badge in picture-card/tile fallbacks and the preview meta card — documents/spreadsheets/archives/audio/video each get a distinct glyph. - 39428d3: FileUpload: tile polish + colored file-type glyphs. Cards now share one anatomy — a square media area (thumbnail or glyph) plus a solid filename footer — for image and non-image files alike. Non-previewable files render a new brand-neutral
FileTypeGlyph(folded-page silhouette with a category-colored band + extension label; document/sheet/slides/pdf/archive/audio/video each get a distinct color) instead of a monochrome line icon, so file types read at a glance without reproducing any third-party product logo. The+add-tile gains a label and stretches to card height. Removed thesummaryActionslot (and its upgrade-button demo) — the summary line now shows only count · size (/ quota). - 49f9490: FileUpload: platform-differentiated UX uplift. New
variant="tile"— a compact surface where the trigger is an in-grid ”+” tile (whole surface is a drop target) with a summary line ({n}개 파일 · total / maxTotalSize) and asummaryActionslot. Newpreview/onPreview— images open a Modal lightbox, other files a meta card (size/type) with in-dialog delete; enabled by default on tile, opt-in elsewhere. Newresponsive(ADR-012) — on mobile, card corner icons are replaced by a card tap that opens a BottomSheet action sheet (preview/delete/retry) and the dropzone copy switches to a tap prompt.formatFileSizegains a GB tier for quota display. - 4802ae0: New ImageViewer component — a full-screen image lightbox (Apple Quick Look idiom): prev/next navigation with a live counter, zoom 0.25–4x (buttons, +/-/0 keys, wheel), 90° rotation, drag-to-pan when zoomed, and the shared overlay contract (portal, focus trap, inert background, Escape/backdrop close). FileUpload’s image preview now composes it, navigating across the image files in the list; non-image files keep the meta-card dialog.
Patch Changes
- e608fb2: fix(LoginSurface): 인증 패널에 elevation.modal 역할 그림자(shadow-lg)를 얹어 배경 위에 떠 있게 함. 페이지 배경이 surface-raised와 같은 흰색일 때 패널이 배경에 묻혀 구분되지 않던 문제 해결(다이얼로그급 초점 표면 위계, Popover·Select·Toast와 같은 단일 토큰 관용구). 다크 테마는 surface-raised 틴트가 위계를 이어받는다.
0.14.1
Patch Changes
- d16cd11: Detect text-only social provider buttons in the login pattern compliance helper.
0.14.0
Minor Changes
- bfeee7b: Mobile bottom-sheet surface standard for overlay components: BottomSheet, Modal, Popover, DropdownMenu, DatePicker, DateRangePicker, Calendar, ColorPicker, MultiSelect, Select, SideSheet, Tooltip, ScrollRail, SearchCommand, ReorderList adopt the shared mobile sheet surface + drag-dismiss geometry (floating-geometry/floating-surface). AI docs (llms.json) regenerated accordingly.
- 220a579: TimePicker dial: art-direction pass to match the field/wheel surface vocabulary. The popup now sizes to the clock face (previously overflowed the trigger-width surface), gains a live title-l readout of the in-progress time (“09:--”) and an explicit cancel button on desktop (immediate-commit idiom kept), unifies stack rhythm to space-3, and draws the hand in the same primary-strong as the selected tick (removing the ad-hoc opacity). Clock-face tick size rationale documented (24-tick geometry cap; angular snap absorbs gaps).
- bc72712: TimePicker: rebuild the web
inputsurface with WDS-native controls. Hour/minute are now WDSSelectfields (typeahead digit jump, arrow navigation, listbox a11y inherited) and AM/PM is a WDSSegmentedButtonwith equal-width segments — replacing the native<select>controls entirely for consistent a11y, dark mode, and cross-browser rendering. Desktopwheelcontinues to fall back to this input surface; mobile keeps the thumb-friendly column wheel. Art direction unified (readout hierarchy, control heights, spacing rhythm). - 1268e56: TimePicker: add digit typeahead to the default
listmode (USWDS time-combo idiom). Typing digits on the trigger jumps the active option (“9” → 09:00, then “3” → 09:30) and opens the list when closed; the buffer resets after 500ms, matching the Select typeahead vocabulary. - a268d98: Add the WDS pattern contract platform for login: publish machine-readable login contracts, expose pattern contract lookup through MCP, and provide generic consumer-side pattern compliance assertions.
Patch Changes
- 4fe6423: LoginSurface/LoginMethods: emit
data-wds-login-surface(+ size) anddata-wds-login-methodsmarkers required by the login pattern contract compliance validator, soassertLoginPatternCompliancecan detect the surface and methods regions. - 1affd3b: Emit
data-wds-*pattern-contract markers on Button (variant/size/full-width), AuthMethodButton (auth-method), ProviderButton (provider/provider-action), FormMessage (form-message-variant), and OneTimeCodeInput — so the login pattern compliance validator can detect provider buttons, form-level errors, and one-time-code inputs.
0.13.2
Patch Changes
- Align SearchCommand and portal search report CSS with existing WDS tokens and breakpoint SSOT gates before package publishing.
0.13.1
Patch Changes
- Publish the SearchCommand and collision-aware floating surface payload under a new package version after the protected
wds-v0.13.0tag pipeline stopped before package/release jobs.
0.13.0
Minor Changes
-
Add
SearchCommandfor reusable search surfaces with query input, result lists, recent-item removal, keyboard selection, desktop modal, and mobile full-screen behavior.Add collision-aware floating geometry for tooltips, chart callouts, anchored popovers, select/date/dropdown menus, dropdown submenus, and floating color picker panels. Supported browsers now promote Popover panels to the native top layer with
showPopover(), progressively attach CSS Anchor Positioning hints, and retain WDS geometry fallback. Also add distance-aware selected-thumb retarget motion for segmented and badge selection controls.
0.12.1
Patch Changes
- DateRangePicker 모바일 BottomSheet 달력의 아트디렉션을 정리했다. 모바일에서는 듀얼 캘린더가 시트 표면 안에 자연스럽게 놓이도록 달력 카드 테두리와 중복 표면을 제거하고, 날짜 셀/범위 배경을 44px 터치 타깃 기준으로 맞춰 좁은 화면에서도 선택 영역이 어긋나지 않게 했다.
0.12.0
Minor Changes
-
52c7f2f: DateRangePicker에 업무형 기간 선택 화면을 위한 옵션과 기본 동작 개선을 추가했다. 시작/종료 요약 위치, 프리셋 섹션 라벨, 푸터 모드, 완성 범위 확정, 날짜/범위 formatter, 주 시작 요일을 조합할 수 있으며,
defaultValue가 없으면 시작일과 종료일을 오늘로 초기화한다. 임의 선택 프리셋은 마지막 항목 하나만 선택되며,이번주는 기본 월요일일요일이고토요일로 계산한다. DatePicker와 DayPicker도 동일한 주 시작 옵션을 노출한다. 듀얼 달력은 인접월 날짜를 숨기고 시작/종료 endpoint 강조를 분리하며, 토요일/일요일 색상 구분과 Calendar 헤더 월/연도 직접 선택을 제공한다.weekStartsOn="sunday"이면 일요일 -
b382b97: Add the LoginSurface authentication panel recipe, passkey feature-check helpers, and Microsoft ProviderButton support for composable login surfaces.
The release also adds the missing
space-5spacing token and refines auth method spacing and provider button presentation so password, passkey, SSO, and branded provider flows can be composed with consistent prominence.
Patch Changes
- 954eb37: Refine ChipGroup edge scrolling controls and chart hover tooltip collision handling for adaptive pattern demos.
- b77cffb: Add BottomSheet presentation controls and forward them through Popover’s compact sheet mode so contextual command sheets can keep an accessible title while omitting duplicate visual headers or close buttons.
- aeb62ae: Align FileUpload compact breakpoint handling with WDS breakpoint tokens so release gates and package CSS stay in sync.
- afd46a0: Forward FileUpload form accessibility props to the actual dropzone/button trigger and improve narrow-screen file list wrapping for import review flows.
- afd46a0: Avoid duplicate live region announcements when Sparkline renders chart error feedback and improve SkeletonList divided-row spacing.
0.11.0
Minor Changes
-
01b285c: Add
AnimatedIcon, a zero-dependency React wrapper for generated WDS icons with CSS-only motion presets, layer-aware selectors, and aprefers-reduced-motionstop gate. -
01b285c: Add
AnimatedNumber, a zero-dependency dashboard KPI count-up component withIntl.NumberFormat, tabular numeric styling, stable screen-reader text, and reduced-motion fallback. -
5095b34: ChipGroup 추가 — 단일 선택 칩 그룹(가로 스크롤). SegmentedButton(single)과 같은 radiogroup 시맨틱(role=radiogroup·radio, roving tabindex, 화살표 순환·즉시 선택, 비활성 건너뜀)을 갖지만, 연결형 트랙 대신 개별 알약을 가로로 늘어놓고 좁은 폭에서 줄바꿈 없이 스크롤한다. 옵션 수가 가변이거나 라벨이 길어 SegmentedButton이 한 줄에 안 들어가는 단일 선택에 쓴다(WDS 필터 칩 패턴). 다중 선택은 기존 Chip
variant="filter". 제어(value)/비제어(defaultValue)·sm/md·44px 히트영역, 색/간격/반경은 var(--wds-*) 토큰. 문서는 Chip 가족 컨테이너로 chip.mdx에 흡수. -
d460bfc: 가로 스크롤 컨테이너에 관성 + 자석 스냅 모션을 추가하고, ChipGroup 스크롤바를 숨김.
- 신규
lib/momentum-scroll: 드래그를 놓은 뒤 관성으로 미끄러지다 가장 가까운 항목에 스프링으로 정착하는 물리 엔진. 2단계 — ① 마찰 글라이드v(t)=v₀·d^t(d=0.998, ms당): release 속도에 비례해 미끄러진다(세게=길게·살짝=짧게, “힘 조절” 슬라이딩) ② 속도가 핸드오프 임계(180px/s) 아래로 내려오면 스프링 스냅: 그 지점에서 가장 가까운 항목으로 질량-스프링-감쇠 ODE를 semi-implicit 오일러로 정착(현재 속도 시드 → 연속). 정착 물리는 DSspring.spatial(ζ0.8). 스냅 후보는 [0,maxScroll]로 클램프 — 끝 항목이 start 정렬 불가여도 끝까지 정상 도달(앞 플릭이 뒤로 스냅되던 문제 해소). 분석용 투영 공식projectMomentum(reduced-motion 즉시 점프에 사용)도 노출. - 공용 훅
lib/useDragScroll: 드래그 중 포인터 속도를 EMA로 추적하고,momentum옵션을 주면 release 시 위 엔진을 구동. 마우스 전용(터치/펜은 네이티브 관성), 5px 임계로 클릭 보존, 드래그 직후 click 한 번 삼킴. - ScrollRail: 인라인 드래그 로직을 위 훅/엔진으로 이관(동작 보존+관성 정착으로 업그레이드).
nearestChildOffset공용화로 중복 제거. - ChipGroup: 마우스 드래그 관성 스크롤 + 칩 자석 스냅 추가(터치 스와이프·키보드 화살표 roving은 기존대로). CSS
scroll-snap은 JS 스프링과 충돌(재스냅 끊김)해 제거. 시각 스크롤바 숨김(scrollbar-width:none+::-webkit-scrollbar) — 스크롤 신호는 “끝단 칩 잘림(bleed)” 어포던스. 드래그 중data-grabbinggrabbing 커서. 공개 props·radiogroup 시맨틱 불변.
- 신규
-
01b285c: Add ReorderList with keyboard-first reorder, pointer drag handles, aria-live announcements, and FLIP spring settling.
-
47cb1ad: Table 반응형 카드 스택 추가 —
responsive="cards". 좁은 컨테이너에서 각 행을 카드로 스택해(라벨↔값 2단) 세로 스크롤만으로 읽히는 레코드 리스트로 전환한다. CSS Container Query 기반이라 뷰포트가 아닌 컨테이너 폭에 반응(사이드바·split·모달 안에서도 올바르게 전환)하고 zero-JS·SSR 안전하다. 기본값은scroll(현행 가로 스크롤)이라 기존 표는 무변경(하위호환).primaryColumn으로 한 컬럼을 카드 제목으로 승격하고, 나머지 셀은header를 라벨로 재사용한다(복합 헤더는TableColumn.cardLabel로 텍스트 라벨 지정). 전환 임계값은 컨테이너 폭 600px 고정. 신규 export 타입TableResponsive(‘scroll’ | ‘cards’). 가변 임계값·컬럼 우선순위·고정(비교형) 전략과 Flutter 패리티는 후속 단계. -
55ef19d: Table 비교형 반응형 추가 —
responsive="columns". 폭이 부족하면TableColumn.priority가 낮은 컬럼부터 숨기고(첫 컬럼=식별자는 항상 유지), 숨긴 값은 행 펼치기(+/−)로 상세(라벨↔값)에 노출한다. 컬럼 간 비교를 보존해야 하는 표의 모바일 대응으로, 카드화(cards)가 비교를 깨는 경우의 대안이다. ResizeObserver로 컨테이너 폭을 측정하는 클라이언트 컴포넌트(ColumnsResponsiveTable)로 격리해 Table의 RSC 호환은 유지(셀을 서버에서 미리 렌더해 ReactNode로 전달, 렌더 함수가 경계를 넘지 않음). 가시성 계산은 순수 함수(computeColumnLayout)로 분리해 단위 테스트. 첫 컬럼은 가로 스크롤 시 sticky 고정.priority는 높을수록 유지(기본 0)·동률이면 왼쪽 유지. 폭 측정 휴리스틱(컬럼당 140px)·Flutter 패리티는 후속. -
f1fc6c6: Refine AnimatedNumber motion with eased count-up interpolation and direction metadata for WDS KPI settlement.
Patch Changes
- 01b285c: Make BottomSheet drag release decisions projection-aware, including fast flick dismiss and expandable detent transitions.
- Harden WDS interaction motion with rubber-band release springback, BottomSheet settlement state, and generated icon layer hooks for AnimatedIcon.
- 01b285c: Pilot native Popover API attributes on
Popoveras a progressive enhancement. - 5f95894: Align ReorderList drag handle sizing with the published spacing token scale.
- 01b285c: Add opt-in rubber-band drag resistance for horizontal scrollers, enabled for ScrollRail and ChipGroup while keeping scroll positions clamped and respecting reduced motion.
- 5bc5baf: Splitter: 패널 콘텐츠가 패널을 채우도록 수정 — 패널(
.panel)을 flex 컬럼으로 두고 단일 자식을 stretch한다. 이전엔 콘텐츠가 콘텐츠-높이로 떠 있고 구분선(separator)만 풀 높이로 뻗어, 카드 등 짧은 콘텐츠에서 구분선이 콘텐츠 아래로 overhang(끝선 어긋남)했다. 이제 패널 자식의 위·아래 끝선이 구분선과 맞는다(에디터·미리보기 분할의 표준 거동). API·구조 불변(레이아웃 CSS만), 패널은 항상 단일 자식이라 분배 이슈 없음. - 01b285c: Adopt spring motion tokens for Tabs, Popover, DropdownMenu, and Tooltip CSS transitions and entry animations.
- 01b285c: Add progressive View Transition support to Tabs selection while respecting reduced motion.
0.10.0
Minor Changes
-
2885417: ColorPicker에
floatingprop 추가(opt-in, 기본 false) — 패널을document.body로 포털(position:fixed)해 overflow 스크롤 컨테이너(표·사이드바) 안에서 잘리지 않게 한다. 트리거 아래(공간 부족 시 위)에 뜨고 스크롤·리사이즈에 추종하며, 외부 클릭 감지는 포털된 패널 내부도 “안쪽”으로 인정한다. 기본값 false라 기존 인-플로우 동작·소비처 영향 없음. -
09afee1:
shield-lock아이콘 추가 — 방패+자물쇠(보안·인증 섹션 헤더 앵커용). Tabler MIT outline 기반,icons/shield-lock.svg→make icons로 웹(ShieldLockIcon)·Flutter·레지스트리 생성(아이콘 153종). -
2885417: Tooltip에
floatingprop 추가(opt-in, 기본 false) — 버블을document.body로 포털(position:fixed)해 overflow 스크롤 컨테이너(표·사이드바 등) 안에서 잘리지 않게 한다. 앵커 위/아래 중앙에 뜨고 스크롤·리사이즈에 추종. 기본값 false라 기존 인-플로우 동작·소비처 영향 없음. -
0232230: 시각 언어 고도화(doc 15) P1 —
BloomSpot에 security/auth 씬 3종 추가:shieldLock(2단계 인증),authenticator(인증 앱 OTP),passkey(생체·기기 인증)- 기존 빈 상태 8씬과 동일한 codegen 파이프라인·블루 씬 문법(그라데이션 헤일로 + 드롭섀도 카드 + accent). 라이트/다크 양 테마 토큰(
--esc-*) 동작. BloomSpotVariant에 3종 자동 합류(11종). 갤러리 쇼케이스 갱신.
-
1d6da65: 시각 언어 고도화(doc 15) P0 — 표현 컴포넌트 2종 추가(IconTile·StepBadge에 이어 P0 완성):
Callout— 추천·안내 톤의 틴트 박스.tone(info·success·warning·error) +title·icon. Alert(상태 피드백)와 구분되는 상시 안내.TintPanel— 카드 안 중첩 영역.active면 틴트 배경 + accent 보더로 강조(위저드 단계·추천 블록).
둘 다 토큰 전용(DD-4)·상태/훅 없는 RSC. 틴트는 배경에만·텍스트는 진한 토큰(DD-6).
-
752665c: 시각 언어 고도화(doc 15) P0 — 표현 컴포넌트 2종 신설(기존 토큰만, 새 의존성 0):
IconTile— 아이콘을 틴트 라운드 배경에 담는 시각 앵커.tone(accent·neutral·success·warning) ×size(sm·md·lg). 섹션·행·모달 헤더에서 맨 아이콘 대신.StepBadge— 멀티스텝 위저드의 단계 번호 원형 배지.active로 현재 단계 강조(색 +aria-current="step").
둘 다 토큰 전용(DD-4)·상태/훅 없는 RSC. 패스키/2FA 콘솔 등 인증 화면 쇼케이스 대상(P2).
Patch Changes
- 6a743fb: 데이터-shape 인터페이스 멤버에 JSDoc 추가 — 포털 Props 표 자동 도출(
<PropsTable interface="X" />)의 단일 출처이자 소비자 IDE 툴팁. 대상: TableColumn · DataGridColumn · MultiSelectOption · DropdownMenuItem · BadgeToggleOption · DateRangeValue · FileUploadItem · FileRejection · ToastOptions. 시그니처·동작 불변(주석만). - 842dd6e: PieChart 범례 색칩의
border-radius가 존재하지 않는 토큰(--wds-radius-xs)을 참조해 CSS가 조용히 드롭 → 모서리가 각진 채로 렌더되던 버그 수정. 실재 토큰--wds-radius-sm(6px)으로 교체해 의도한 둥근 칩으로 복구. 컴포넌트 API·구조 불변(스타일 토큰 참조만 교체).
0.9.0
Minor Changes
- 86cea56: Tooltip:
placementprop 추가(top기본 ·bottom·left·right). 가장자리 트리거(표 우측 끝 셀 등)가overflow컨테이너 경계에서 잘리는 문제를 해결 — 안쪽을 향해 열도록 방향을 지정한다. 인-플로우 버블이라 컨테이너 박스 안에 머물러야 잘리지 않음. 화살표도 방향에 맞춰 회전. 기본top이라 기존 사용처는 불변(하위호환).
0.8.0
Minor Changes
-
dff4b0e: feat(ai): AI 표면 무채색 “ink” 주액션 — ChatGPT 5 스타일 정합. semantic
color.ink/ink-hover/ink-active/on-ink토큰 신설(라이트=근검정gray.900/다크=흰색, 테마 반전·CSS+Flutter emit·대비 게이트 AUTO_GATED 등재 16:1+). IconButton에variant="ink"추가(채움 위 잉크는on-ink). AI 컴포저 주액션(AiChatInput 전송/중단·ComposerBar 데모 음성/전송)을solid(블루)→ink로 전환 — AI 입력은 ChatGPT식 흑백, 브랜드 블루는 일반 UI에 유지. 토큰 스케일·표면·라운드는 기존 WDS 중립 토큰으로 흡수(DD-4 무위반). -
3032814: feat(AiChatInput): composer 형태 변형
variant('pill' | 'expanded') 추가 — pill은 완전 둥근 소형 바(radius.full), expanded는 여러 줄 작성용 큰 표면(min-height 약 3줄). 미지정 시 기존 기본 박스(radius.xl)로 하위호환. 동작(Enter 전송·한글 IME 보호·자동 높이·streaming)은 세 형태 공통. FlutterWizAiChatInput에WizAiChatInputVariant패리티 동반(api-parity 페어 유지). -
dff4b0e: feat(ComposerBar): ChatGPT식 슬롯 기반 컴포저 셸 신설 — 좌측 액션(
leadingAction)·중앙 제어형 textarea·우측 액션(trailingActions) 슬롯에 IconButton을 주입하는 셸. 셸은 알약(pill기본·radius.full)·박스(boxed·radius.xl) 형태와control-height-lg고정 하한으로 지오메트리를 못 박아 흔들림을 없애고, 버튼 상태는 IconButton을 재사용한다. 동작은 Enter 전송(onSubmit)·Shift+Enter 줄바꿈·한글 IME 보호·자동 높이(약 7줄 상한). AiChatInput(단일 전송 버튼)과 보완 관계 — 여러 액션이 필요한 ChatGPT식 입력창용. 함께AudioLinesIcon(waveform, media) 코어 아이콘을 추가한다. -
6a595bf: feat(ComposerBar·DropdownMenu): ChatGPT 컴포저 정합 보강 — (1) ComposerBar 셸에 소프트 그림자(
shadow-md, 포커스 시 링과 합성)로 떠 있는 느낌 추가(Figma/ChatGPT 정합). (2) DropdownMenu 트리거 확장:triggerVariant="ghost"(무테 컴팩트 텍스트+chevron, 모델 선택용)·triggerSize('sm'|'md')·triggerShape('square'|'round') — icon 트리거를 컴포저 액션(round sm)과 정렬해+첨부/도구 메뉴를 IconButton과 같은 크기·모양으로. ComposerBar 데모에+첨부/도구 메뉴·모델/추론 수준 선택기·버튼 단축키 툴팁을 슬롯 합성으로 시연(ChatGPT 컴포저 풀 재현). (3) fix(DropdownMenu): 마우스 오픈 시 첫 항목 선하이라이트 제거 — 키보드(Enter/Space/Arrow) 오픈만 첫/마지막 항목으로 포커스하고, 마우스 클릭(event.detail≥1) 오픈은 메뉴 컨테이너로 포커스해 하이라이트가 hover에만 따라오도록 수정(표준 menu button 동작). -
58efef7: feat(DropdownMenu): 중첩 서브메뉴 + 헤더 없는 구분선 —
DropdownMenuItem에items(서브메뉴 자식: 부모 우측으로 펼침·› chevron·aria-haspopup/aria-expanded·hover/클릭/ArrowRight 진입·ArrowLeft/Escape로 부모 복귀·Up/Down 탐색)와separator(role=separator divider, label 없이 렌더·키보드 탐색 제외) 추가. ComposerBar 데모의+메뉴(최근 파일›·더 보기› 서브메뉴 + 구분선)·모델 선택기(GPT-5.5 서브메뉴)를 ChatGPT 1:1로 완성. -
af7bf13: feat: GPT-5 대화 컴포넌트 ChatMessage·MessageActions·ChatThread
GPT-5 web 대화 화면을 실제 컴포넌트 조합으로 만들기 위한 3종(category: ai):
- ChatMessage — role(user 회색버블 우측 / assistant 버블리스 전폭) + actions 슬롯, 화자 sr-only, HTML 속성 전달(스트리밍 aria-hidden).
- MessageActions — 복사(클립보드+체크 피드백)·좋아요·싫어요·읽어주기·다시 생성. 각 동작은 콜백(또는 copyText)이 주어질 때만 노출.
- ChatThread — role=log + aria-live 스크롤 로그, 내용 변화 시 자동 하단 스크롤.
웹 우선 출시(parity-waiver: planned — Flutter 포팅 예정). 08-patterns/ai-chat 패턴에서 실제 ComposerBar와 조합해 GPT-5 대화 화면을 구성한다.
-
6a595bf: feat(IconButton):
shapeprop 추가('square'기본 ·'round'완전 원형radius-full) — ChatGPT식 컴포저 액션 정합. AI 컴포저(AiChatInput 전송/중단·ComposerBar 데모 +·마이크·음성/전송)를shape="round"로 전환해 ChatGPT의 원형 버튼과 일치시킨다(이전엔 IconButton 기본radius-control둥근 사각형이라 AiChatInput 리팩터 후 전송 버튼이 원형→둥근사각으로 회귀했던 것을 복원). square 기본값은 하위호환. -
0537469: feat(Input·Select·Textarea):
sizeprop('sm' | 'md' | 'lg') 추가 — 선택 컨트롤(Checkbox·Switch·Radio)과 동일한 control-height 스케일(32/44/52px)로 폼 가족을 통일.md기본값은 기존 렌더와 byte-identical(하위호환),sm·lg만 모디파이어로 높이·패딩·폰트 스케일. FlutterWizInputSize패리티. -
9b16cfe: feat(Markdown): AI 메시지용 마크다운 안전 렌더 프리미티브 추가.
신뢰 불가 입력(LLM/AI 출력)을 안전 서브셋 파서로 AST를 만들고 React 엘리먼트로만 빌드해 XSS를 구조적으로 차단한다(
dangerouslySetInnerHTML미사용·텍스트 React 이스케이프). 링크 href는 화이트리스트(http/https/mailto/tel·상대경로) 검증으로javascript:·data:·blob:·유니코드 비가시 문자 우회를 거부한다.- 지원: 헤딩·문단·펜스 코드·순서/비순서 리스트·blockquote·hr · 인라인 strong/em/code/link/hard break.
- 스트리밍:
streamingprop이면 끝에 깜빡이는 커서 +aria-busy. 미닫힘 토큰은 리터럴로 떨어져 깨지지 않는다(점진적 content 증가가 곧 스트리밍). - 미지원(의도): 테이블·이미지·raw HTML — AI 가이드라인이 구조화 데이터를 위젯 카드로 유도한다.
parseMarkdown·parseInline·sanitizeHref도 함께 export.
-
187e0e9: feat: ScrollRail · IdeaCards · ModeComposer 추가 — GPT-5 모드 컴포저를 portal 데모에서 정식 컴포넌트로 승격해 제품이 import 가능하게.
- ScrollRail: 가로 오버플로 단일행 스크롤러 — 숨긴 스크롤바·끝단서 사라지는 라벨 화살표·마우스 드래그·자석 스냅(JS rAF 글라이드)·엣지 페이드·키보드(ArrowLeft/Right). role=group + aria-label. 범용 레일 프리미티브.
- IdeaCards: 컴포저 아래 가로 아이디어 카드 레일(ChatGPT 「아이디어 둘러보기」식). 데이터 주도(
ideas·onPick), ScrollRail 위.onUploadopt-in 점선 업로드 카드. 그라데이션/색 토큰 썸네일. - ModeComposer: ComposerBar 위 모드 시스템 컴포저 — 모드 활성 칩·placeholder 교체·빈 상태 제안 칩. 데이터 주도(
modes·제어/비제어activeMode·suggestions), 컴포저 크롬은leadingActions/trailingActions슬롯 위임, 모드별 부가 콘텐츠는renderBelowMode슬롯.
-
61e36d8: feat(ui-web): OneTimeCodeInput — 일회용 코드(OTP·PIN·복구 코드) 세그먼트 입력 컴포넌트.
length개의 한 칸 입력으로 코드를 받고, 타이핑 시 다음 칸 자동 이동·통째 붙여넣기는 여러 칸 분배·Backspace·←/→ 이동을 지원한다. 제어(value+onChange)·비제어(defaultValue) 모두 지원하고, 값은 항상 갭 없는 접두 문자열이라onComplete로 완성 시점을 받는다.charSet(numeric/alphanumeric)으로 허용 문자,name으로 폼 제출용 hidden input. 접근성: 컨테이너role="group"+aria-label, 각 칸aria-label, 첫 칸autocomplete="one-time-code", numeric일 때inputmode="numeric",invalid시aria-invalid. 어드민 계정 복구(복구 코드 입력) 흐름이 소비 예정. FlutterWizOneTimeCodeInput포팅 예정(parity-waiverplanned). -
771a28b: feat(ui-web): PasswordStrength — 비밀번호 강도 미터 컴포넌트. 0~max 충족 점수(
score)를 세그먼트 막대 + 레벨 라벨(약함/보통/양호/강함)로 표시한다. 강도 산정은 소비자(제품 비밀번호 정책) 몫이고 컴포넌트는 표시 전용(상태 없음). 접근성:role="meter"+aria-valuenow/min/max+aria-valuetext로 색 외 텍스트 채널 제공, 막대는aria-hidden. 레벨 색은 error/warning/success 시멘틱 토큰. Security Settings 패턴·어드민 비밀번호 변경이 소비. FlutterWizPasswordStrength포팅 예정(parity-waiverplanned). -
c83e90a: feat(Table): 표시용 Table에 직교 스타일 변형 4축 추가 —
divider(‘rows’ 기본·‘grid’·‘none’)·density(‘comfortable’ 기본·‘compact’)·striped(zebra)·stickyHeader(+maxHeight). 기본값은 기존 모양 그대로라 하위호환(기존 호출부 무영향).grid는 전 셀 보더(헤더 하단은border-strong로 위계 유지)·none은 보더리스(헤더 띠 유지)·striped는 홀수 surface/짝수 surface-muted 결정적 배경(캔버스 비의존·라이트 가시성 확보,grid와 동시 비권장)·stickyHeader는maxHeight세로 스크롤 영역에서 헤더 핀. 신규 export 타입TableDivider·TableDensity. FlutterWizTable패리티 동시 구현(WizTableDivider·WizTableDensity·striped·stickyHeader/maxHeight, 골든 추가).
Patch Changes
-
dff4b0e: refactor(AiChatInput): ComposerBar 위 프리셋으로 재구축 — 알약/박스 셸·자동 높이·Enter 전송·한글 IME 보호·포커스 링을 ComposerBar가 단일 소유(셸 로직 중복 제거). AiChatInput은 그 위에 단일 전송 버튼 + 스트리밍 중단 + 입력 상태 내부 관리만 엮는다. 공개 API·동작 불변(
onSend·onStop·state·variant='pill'|'expanded'·...rest그대로). 전송/중단 버튼은IconButton variant="solid"로 통일(기존 자체.action대체). 셸 지오메트리가 ComposerBar로 정렬되며 시각이 미세 변경(패딩space-3→space-1/space-2,control-height-lg최소 높이 도입). ComposerBar에minRows(resting 최소 줄 수, expanded 프리셋용) prop 추가. -
b4286f8: Card:
header·footerprops에 JSDoc 설명 추가 — IDE 툴팁 보강 + 문서 Props 표 자동 도출(소스 SSOT, 드리프트 0)의 단일 출처. -
79134f6: fix(ComposerBar): 멀티라인 GPT-5 레이아웃 + 부드러운 전환(고정 grid·고정 반경)
ChatGPT GPT-5 web 실제 DOM 대조로 정합:
- 고정 grid
[lead | text | trail]+align-items: end— 멀티라인 시 +·트레일이 하단에 “머무를 뿐”이라 액션 텔레포트가 없다(이전엔 grid-template-areas 교체로 점프). - 고정 반경
radius-xxl(28px)— 단행 높이(52px)의 절반(26px)보다 커서 단행은 stadium(알약), 멀티라인은 둥근 박스로 보인다. 반경이 안 바뀌니 전환 시 모서리 모핑 끊김이 없다(이전엔 radius-full→xl transition이 마지막에 뚝 각졌음). - 단행 textarea는
align-self: center로 컨트롤과 정렬. - 유령 스크롤바 제거 — auto-height를
min(scrollHeight, max-height)로 잡고 내용이 상한을 넘을 때만overflow-y: auto로 토글(기본 hidden). 좁은 폭에서 placeholder가 줄바꿈하면 브라우저가 그 높이를 scrollHeight에 포함해 1줄 높이를 넘겨 스크롤바가 떴던 것을 막음(effect deps에 placeholder 추가).
- 고정 grid
-
c504c89: fix(FileUpload): 제거 버튼 히트 영역을 시각 24px보다 넓은 48px(≥44px, WCAG 2.5.8 타깃 크기)로 확장 —
inset음수 오프셋을space-3으로 키워 Tag·Chip 제거 버튼과 동일 패턴으로 통일. -
708177a: 패키지 메타데이터 —
license: "UNLICENSED"명시(내부 proprietary·GitLab restricted 레지스트리 배포, publint 권고 충족). @wds/fonts는 Pretendard(SIL OFL-1.1) 재배포라 라이선스 표기가 별도 결정 사항이라 미설정 유지. -
2a901ac: 컴포넌트 prop JSDoc 완성(46개 컴포넌트, 120 props — 판별 유니온 Chip·ProviderButton·SegmentedButton 포함) — 문서에 흩어져 있던 큐레이션 설명을 소스 JSDoc(SSOT)으로 이전. IDE 툴팁 보강 + 문서 Props 표 자동 도출(
<PropsTable component="…">)의 단일 출처. 동작·시그니처 불변(주석만). -
b1a6c62: 공급망 보안 — 배포 패키지에서 소스맵(.js.map) 제외. .map은 원본 TS 소스(sourcesContent)를 그대로 임베드해 게시 tarball로 유출되고 패키지 용량도 키웠다. 포털은 src를 직접 소비(AD-4)하므로 dist 소스맵을 쓰는 소비처가 없다. 디버깅 필요 시 빌드 설정에서 일시적으로 되돌릴 수 있다.
0.7.0
Minor Changes
-
23200a1: feat(icons): 아이콘 3종 신설 — layout-sidebar-list · layout-sidebar-right · edit
layout-sidebar-list— 왼쪽 사이드바 + 항목(점). 기존layout-sidebar(점 없음)의 콘텐츠 변형.layout-sidebar-right— 오른쪽 사이드바 + 항목(왼쪽 짝).edit— 네모 + 펜(편집·새 글). 기존pencil(펜 단독)과 구분되는 액션 아이콘.
Tabler 정본 스타일(24 그리드·stroke 1.8·원호 기반·베지어 없음),
make icons로 웹(React)·Flutter·registry.ts자동 생성. 아이콘셋 148 → 151.
0.6.0
Minor Changes
-
66582f6: feat(ui-web):
AuthMethodButton·LoginMethods신설 — WDS 테마 인증 방식 버튼 + 동등 노출 그룹인증 버튼을 두 종류로 정식화했다.
ProviderButton(브랜드 사인인)은 브랜드가 색·로고·라벨을 고정하지만, 패스키·조직 SSO·비밀번호·이메일·매직링크는 WDS가 소유하는 방식이라 별도 컴포넌트로 분리한다.AuthMethodButton: 코어Button(기본variant="secondary"·fullWidth)을 감싸는 얇은 래퍼.method프리셋(passkey/sso/password/email/magic-link)이 코어 아이콘 + 한국어 기본 라벨을 공급하고,label·icon으로 오버라이드할 수 있다.onClick·disabled·loading·type등 Button API를 타입 안전하게 패스스루한다. 브랜드 사인인에는 쓰지 않는다(그건ProviderButton).LoginMethods: 인증 방식 버튼들을 풀폭 균등 스택으로 배치하는 그룹. 서드파티 인증 가이드라인의 prominence parity(한 방식을 3차로 묻지 않고 동등 노출)를 레이아웃으로 강제한다. 선택적 라벨 구분선(divider, 기본 “또는”)으로 1차 폼 영역과 방식 목록을 가른다. 컨테이너는role="group"+aria-label(기본 “로그인 방식”), 구분선은 장식(aria-hidden).
Flutter 패리티는 후속(parity-waiver
planned등재). 로그인 패턴 데모를 이 두 컴포넌트로 도그푸딩(시각 불변). -
b699d0f: feat(ui-web):
Logo에toneprop 추가 — 컬러/브랜드 표면 위 가독성기본
auto(페이지data-theme로 라이트/다크 자동 전환) 외에onLight(밝은 표면 — 브랜드 컬러 고정)·onColor(브랜드/어두운 표면 — 라이트 흰 고정)를 추가했다. 파란 그라데이션 패널처럼 페이지 테마와 무관한 컬러 표면에서 auto가 블루 로고를 깔아 묻히던 문제를 해소 —<Logo tone="onColor" />로 흰 로고를 명시한다. 로그인 패턴 데모의 브랜드 패널을 이 방식으로 정정.
Patch Changes
- dea068c: Tag 제거 버튼 히트 영역 32px → 44px 수정.
::afterinset을space-3/2(6px)에서space-3(12px)로 바로잡아, 시각 20px 버튼의 터치 타깃을 44px로 확장(WCAG 2.5.8 최소 타깃 · IconButton §5 미러). 시각·DOM 불변 — 히트 영역만 확장. 카탈로그 문서(tag.mdx)도 44px로 정합.
0.5.0
Minor Changes
- 40d8626: 코어 아이콘셋을 표준 베이스라인으로 확장(26 → 148). 웹·모바일 앱 제작에 필요한 어휘를 카테고리별로 추가 — 내비게이션·액션·사용자/보안(fingerprint 포함)·커뮤니케이션·상태·레이아웃·파일·미디어·커머스·기기/연결·시간/위치·마크/소셜·텍스트/날씨. 전부 stroke·원호 기반(ADR-011 계약)으로 웹+Flutter 글리프 동시 생성. 신규:
ICON_REGISTRY(name+컴포넌트 레지스트리 export) — 카탈로그/갤러리 자동 동기화용.
0.4.0
Minor Changes
-
387950c: feat(ui-web):
Logo컴포넌트 추가 — WIZ 브랜드 로고(Quintal Bloom 심볼)포털 내부
WizSymbol을 패키지 공개 컴포넌트로 이식했다. 소비처는import { Logo } from '@wds/ui-web'로 WIZ 로고를 쓸 수 있다(이전엔 패키지에 로고 컴포넌트·자산이 전혀 없어 직접 SVG를 복사해야 했음).- 라이트/다크 두 벌의 인라인 SVG를 담고 소비처 루트의
data-theme로 자동 전환(styles.css에 동봉, BloomSpot 선례). - props:
size(기본 28) ·label(주면 role=img+aria-label, 미지정이면 장식 aria-hidden) ·className. - 브랜드 색은 자산 원본 값(UI 토큰 아님, SEED_RECONCILE §2). 웹 전용 자산 — 패리티 waiver
logo: web-only등재.
- 라이트/다크 두 벌의 인라인 SVG를 담고 소비처 루트의
0.3.1
Patch Changes
- 917e3d3: 빌드:
@wds/tokens를 peerDependencies에서 제거(ui-web JS가 import하지 않는 CSS 런타임 동반 패키지). changesets가 토큰 bump 시 ui-web을 자동 major(1.0.0)로 올리던 캐스케이드를 해소 — ui-web은 자체 변경 수준으로만 버전이 오른다. 소비자는 계속@wds/tokens·@wds/fonts를 함께 설치(설치 가이드 정본).
0.3.0
Minor Changes
-
40c8eef: npm 설치형 배포 가능화 + AI 소비 문서 파이프라인.
@wds/tokens신설 —--wds-*CSS 변수(wds.css)와 토큰 메타(manifest.json)를 GitLab Package Registry로 배포.@wds/ui-web—private제거 +publishConfig(restricted), 토큰 CSS를@wds/tokenspeer로 소비.- 소비처:
pnpm add @wds/ui-web @wds/tokens후@wds/tokens/wds.css→@wds/ui-web/styles.css순 로드. - AI 소비 문서(
llms.txt·llms-full.txt)는 소스 실측 생성물(make ai-docs)이며make check-full드리프트 게이트로 정합 강제.
-
5f4230d: feat(charts): 차트 13종 데이터 상태 정본 패턴 — 빈/에러/로딩 일관 적용
변경 내용#
ChartDataState공유 컴포넌트를 신설하고 웹 차트 13종 전체에 적용합니다.신규#
ChartDataState(packages/ui-web/src/Chart/ChartDataState.tsx)- 단일 진입점으로 세 상태를 우선순위 순 렌더:
isLoading→errorMessage→isEmpty - 로딩:
Skeleton variant="rect" animation="pulse"(prefers-reduced-motion 자동 대응) - 에러:
Alert variant="error" role="alert"(SR 즉시 낭독) - 빈 상태:
EmptyState+BloomSpot variant="noData"/renderEmpty슬롯으로 교체 가능
- 단일 진입점으로 세 상태를 우선순위 순 렌더:
추가된 props (각 차트)#
prop 타입 기본값 isLoadingboolean?undefinederrorMessagestring?undefinedrenderEmpty() => ReactNodeundefinedrenderEmpty는 GaugeChart(value 필수라 빈 상태 없음)를 제외한 12종에 추가됩니다.적용 차트#
ChartFrame 계열 (LineChart · BarChart · AreaChart · ComboChart · ScatterChart) —
ChartFrame에서 통합 처리.독립 RSC (PieChart · HeatmapChart · FunnelChart · RadarChart · GaugeChart) — 각 차트
figure안에서 조기 반환.Sparkline — 인라인 span 래퍼로 글랜스 폭 유지.
StockChart — 내부 AreaChart에
isLoading/errorMessage전달 (AreaChart → ChartFrame 경유).기존 동작 변경#
- PieChart:
data.length === 0시 회색 링(emptyRing) 렌더 →EmptyState + BloomSpot으로 교체. - ChartFrame:
renderEmpty미지정 시 기존 기본값 텍스트 →EmptyState + BloomSpot(API 호환).
-
b82cf9a: 차트 시스템 —
@wds/ui-web공개 데이터 시각화 13종 신설(자체 SVG zero-dep, ADR-018).신규 차트 컴포넌트: 데카르트
LineChart·BarChart·AreaChart·ComboChart+ScatterChart(추세선)·Sparkline(무축 초소형)·PieChart(파이/도넛)·HeatmapChart(매트릭스)·FunnelChart(전환 사다리꼴)·GaugeChart(KPI 방사형)·RadarChart(다변량 스파이더)·StockChart(금융 시계열). 전부src/index.ts공개 배럴 export.ChartExport(웹 전용): 컨테이너 DOM(sr-only 표 + SVG)을 읽어 모든 차트에 CSV/PNG/SVG 내보내기. API 변경 없이 동작.보조 API:
DropdownMenu에triggerVariant="icon"(유틸 컨트롤 아이콘 어포던스) + 신규DownloadIcon.공통: 순수 코어를 Flutter
wiz_charts포팅 단위와 1:1 공유, 차트 토큰(색맹 안전 8색)을var()로 소비(다크 재바인딩), sr-only 데이터 표를 a11y 정본으로 둔다. 기존 컴포넌트·토큰·시각 무변경 — 순수 additive(minor). -
009fd51: R3-6 아이콘 패리티 — 웹↔Flutter 아이콘을 동일 SVG SSOT(
icons/*.svg) 코드젠으로 일치시킨다.신규 코어 아이콘 6종:
BookOpenIcon·CircleAlertIcon·FileTextIcon·GlobeIcon·ImageIcon·StopIcon(총 24종). 기존 18종 mono는 바이트 동일(무손상).웹 컴포넌트 아이콘 수렴(공유 SSOT 소비, 시각 변경 — API 불변):
Alert·Toast의error변형 아이콘이AlertTriangleIcon→CircleAlertIcon. error를 warning(삼각형)과 시맨틱 변별(원형). warning은 삼각형 유지.KnowledgeCard의 소스 타입 기본 아이콘(document/web/wiki)이 bespoke 인라인 SVG → 공유FileTextIcon/GlobeIcon/BookOpenIcon.icon슬롯·data-testid·API 불변.
Flutter 패리티:
wiz_ui가 동일 SSOT에서emit-dart(zero-dep CustomPaint, ADR-011 §5)로 아이콘을 생성(WizGlyph)해 위 웹 선택과 1:1 일치한다. Flutter 측은WizIconButton.icon타입이IconData → WizIconData로 파괴적 변경(별도wiz_ui0.6.0 — CHANGELOG 참조). 웹@wds/ui-web공개 API에는 파괴 변경이 없다(아이콘 추가 + 기존 컴포넌트의 아이콘 선택 변경 = minor).
Patch Changes
- 009fd51: Checkbox 터치 타깃 정정 — 시각 18/16px 박스의 히트 영역을
control.height-md(44px) 기준으로 역산 확장(.box::after, 비-리플로). 기존 고정 -6px(~30px)이 형제 컨트롤 (Switch/RadioGroup)·WCAG 2.5.5·Flutter(44dp)와 어긋나던 것을 해소. 시각·API 불변. - Updated dependencies [40c8eef]
- @wds/tokens@0.3.0
0.2.0
Minor Changes
-
c512aa6: types: variant 축을 명명 export type으로 승격 —
TabsVariant·TabsLevel·TooltipVariant·TableAlign신규 export(기존 인라인 prop 유니온과 타입 동일, 비파괴). R2-3 웹↔Flutter API 대조 게이트(portal/lib/api-parity.ts)가 명명 유니온만 커버하므로, 이 4개 축을 명명화해 FlutterWizTabsVariant/WizTabsLevel/WizTooltipVariant/WizTableAlign와의 멤버 드리프트를 게이트가 잡도록 했다. variant 축은 명명 export type으로 선언하는 것이 규약(COMPONENT_API §3.1). -
afb6055: BREAKING:
IconButtonSize에서lg를 제거 — 이제'sm' | 'md'. (pre-1.0이므로 minor가 파괴 변경 티어)R2-3 웹↔Flutter API 대조 게이트가 적발한
IconButtonSize드리프트(웹 sm/md/lg ↔ FlutterWizIconButtonSizesm/md)를 웹을 정본으로 좁혀 해소한다.lg는 도입 이후 어떤 실제 화면에서도 쓰이지 않았고(쇼케이스 데모·단위 테스트에만 존재), 두 플랫폼은 IconButton 사이즈를 서로 다른 축으로 모델링한다 — 웹은 control-height(Button 미러, sm 32/md 44/lg 52px), Flutter는 고정 32px 박스+아이콘 사이즈(ADR-014). 따라서lg를 Flutter에 추가하는 것은 미사용 멤버를 양쪽에 더하고 치수 불일치(웹 lg 52px ≠ Flutter)를 게이트 뒤에 숨기는 false-green이 된다. 실사용 집합{sm, md}로 수렴하는 것이 정직한 해소다.마이그레이션:
<IconButton size="lg">→size="md". 52px 아이콘 트리거가 필요하면 후속 트랙에서 양 플랫폼 동시 도입을 검토한다(현재 수요 0). -
1a369dc: feat: dist 빌드 파이프라인 + CSS 카스케이드 레이어 (R1-2 / R1-3 · ADR-015 / ADR-016)
@wds/ui-web을 raw-src 소비에서 publish-ready dist로 전환한다(외부 4개 제품군 소비 계약 — ADR-009 publish 전제 충족).private: true는 R-2 원격 연결까지 유지 — R-2가private제거 +changeset publish만으로 배포.- 빌드(R1-2): Vite 라이브러리 모드(
preserveModules+rollup-preserve-directives)로 dist를 산출 — per-module ESM + 파일별'use client'보존(혼합 RSC, 58종) + per-module.d.ts(tsc) + 단일dist/styles.css. - exports dist-first:
"."/"./breakpoints"/"./styles.css"가 dist를 가리킨다.main/module/types/files/sideEffects추가. 소비처는 진입점에서import '@wds/ui-web/styles.css'1회. - CSS 레이어(R1-3): 토큰(
@layer wds.tokens)·베이스(@layer wds.base)·컴포넌트(@layer wds.components) 3종 레이어로 출하 — 소비처 unlayered CSS가 특이도·!important없이 WDS를 오버라이드. 토큰 값·렌더 0 변경. - 포털 무손상: 포털(1번 소비자)은 tsconfig paths + next.config alias로 src를 계속 소비 — HMR·라이브 데모 불변(AD-4). dist는 외부용.
- 게이트: 디렉티브 생존·CSS @layer 추출(
check-dist-contract) +publint+attw(bundler 🟢) →make ui-web-dist(→make check-full).
- 빌드(R1-2): Vite 라이브러리 모드(
Patch Changes
-
d8ad6ba: tokens: Modal component 토큰 신설(
modal.scrim={color.overlay}·modal.surface={color.surface-raised}) — 테마 의존 색을 component 계층으로 승격(COMPONENT_API §4-3). 웹은--wds-modal-scrim/--wds-modal-surfaceCSS var로 노출(Modal이 직접 semantic 대신 이를 소비), Flutter는WizModalColors(copyWith 오버라이드)·WizThemeData.modal로 노출하며 교차타겟 게이트가 웹↔Flutter 값을 강제 일치시킨다. 렌더 결과 불변(동일 색). R3-4 스코핑상 Alert/Badge/Card/Toast는 semantic 직접 소비가 적합해 미보유(§4.1). -
575402c: a11y: 오버레이(Modal·Drawer·SideSheet·BottomSheet) 배경
inert(useInertSiblings) — 포커스 트랩에 더해 스크린리더 가상 커서·포인터까지 배경 차단(WCAG 2.4.11/4.1.2, 참조 카운트로 중첩 안전). Toast는 포커스/블러에도 자동 해제를 일시정지(키보드·SR, 2.2.1) +aria-atomic(4.1.3). 공개 API 변경 없음. -
fb882a4: fix(Spinner): reduced-motion 시 확실히 정지 — 무효였던 ‘감속’ 규칙 교체 (a11y 의도 정합)
@media (prefers-reduced-motion: reduce)의.svg { animation-duration: 1.6s }(감속 의도)는 전역tokens/wds-base.css의 모션 kill(@layer wds.base의animation-* !important)을 못 이겨 무효였다.@layer에서!important는 이른 레이어가 우선이라, 컴포넌트 레이어(wds.components)의 선언은!important를 붙여도wds.base를 못 이긴다 — 스피너는 의도와 달리 0.01ms로 강제 정지되고 있었다.이를
animation: none으로 교체해, Progress 인디터미닛·Skeleton과 동일한 시스템 정책 (“정지 + 텍스트로 진행 전달”)에 맞춘다. ‘진행 중’ 신호는 기존role="status"+aria-label('로딩 중')이 전달한다. 시각 결과(정지)는 이전과 동일하나 의도가 코드에 정직하게 반영되고 거짓 주석이 제거된다. API 변경 없음. (R1-2/R1-3 적대 리뷰 적발) -
55ee4a8: fix(Tabs): fixed variant 균등폭 — 문서(‘균등 배치’)·Flutter(Expanded)와 정합
fixed 탭이 좌측 자연폭 패킹이던 버그 수정.
.list[data-variant='fixed'] .trigger에flex: 1 1 0- 라벨 중앙 정렬을 추가해, M3 fixed tabs·Flutter
WizTabsVariant.fixed(Expanded + Alignment.center)와 동일하게 전폭을 균등 분배한다. 이전엔 규칙 부재로 좌측 패킹돼Tabs.tsx문서(‘fixed = 균등 배치’)와 실제 렌더가 불일치했다(R2-5 웹↔Flutter 컴포넌트 패리티 적대 리뷰가 적발). API 변경 없음.
- 라벨 중앙 정렬을 추가해, M3 fixed tabs·Flutter
@wds/tokens#
0.10.0
Minor Changes
-
7fc2104: 타이포그래피: 장문 리딩 leading 2티어 신설 (uplift 20 D5)
본문
line-height.normal(1.6) 위로 장문 읽기용 단계를 추가한다. WDS는container.prose(760px) 폭은 갖고 있었으나, 그 폭에서 여러 문단이 이어질 때 줄 추적을 돕는 leading 티어가 없었다.--wds-line-height-reading(1.72) — 장문 리딩. 문단이 이어지는 읽기 흐름용.--wds-line-height-document(1.82) — 문서. 최장문(가이드·약관)에서 한 단계 더 여유.- Flutter 패리티 자동:
lineHeightReading·lineHeightDocument.
순수 가산이라 기존 leading(
tight·snug·normal·label)과 15-스타일 타이포 매트릭스는 무변경. WIZON↔WDS 양방향 정합 매트릭스(docs/uplift/20) D5의 첫 확정 채택분(W→D).
0.9.0
Minor Changes
-
멀티브랜드: 풀-semantic(모노크롬/반전) 브랜드 등록 경로 + WIZON 잉크 테마 등록 (doc 221 W-1)
ADR-020 브랜드 오버레이는 지금까지 hue 키컬러 → 솔버가 accent·surface 티어만 리브랜딩하는 부분 브랜드였다. 그래서 그레이스케일 잉크 팔레트나 action-primary 흑↔백 반전처럼 hue 솔버로 표현 불가능한 테마는 등록할 수 없었다.
- 신규 능력: 브랜드 JSON에 선택적
semantic: { light, dark }(role→hex 직접 오버라이드)를 추가한다. 솔버 산출 위에 병합되며(override 우선, 미지정 role은 wiz:root상속), base 텍스트/면(text·surface·bg·border) 재정의와 action 반전(primary/on-primary)을 가능케 한다. 빌드타임 AA 게이트가 병합 후 대비를 검증한다(text↔surface 페어 추가, 부분 브랜드는 무영향). - WIZON 잉크 테마 등록:
tokens/brands/wizon.json— 등록 브랜드(data-brand="wizon"), 코어 default 아님(wiz 기본 유지). 값 출처=doc 221. 웹[data-brand='wizon']+ FlutterWizColorsWizon/WizThemeData자동 생성. - 불변: wiz 기본 테마 CSS·Dart는 byte-identical(브랜드는 append-only). 다른 브랜드에 잉크가 강요되지 않는다.
- 신규 능력: 브랜드 JSON에 선택적
0.8.1
Patch Changes
-
AI Shell contract v2 — focus-ring 역할 추가
--wds-ai-shell-focus-ring(색 역할,{color.focus-ring}semantic 위임) 신설. 셸의 포커스 가능 요소(컴포저·사이드바 항목·팝오버)가 브랜드 일관된 키보드 포커스 링(WCAG 2.4.7)을 공유하도록 foundation focus-ring을 계약 역할로 승격했다. opt-inai-shell.css에만 추가되며(공통wds.cssbyte-identical 불변 — CSS 골든 해시 유지로 격리 증명), FlutterWizAiShellTokens.focusRing게터가 codegen으로 대응한다. 제품은[data-product]에서 브랜드 링으로 override 가능.레이아웃 치수 역할은 계약 문서(§5) 정의로, easing 역할은 계약 타입 시스템 확장이 필요해 백로그로 둔다.
0.8.0
Minor Changes
-
3f00802: AI Shell contract(
--wds-ai-shell-*) opt-in 산출물 신설 — WIZON doc 130→132 합의 이행.@wds/tokens/ai-shell.cssexport 추가: AI workspace 셸 역할 토큰 10종(surface 5·action-primary 4·motion 1).wds.css와 분리된 opt-in 파일 — 미채택 앱 무영향(공통 출력 byte-identical 게이트 유지).- 신규
contract토큰 버킷(tokens/contract/*.json): 전 토큰 alias 강제(색=semantic·모션=core spring, 리터럴=빌드 실패),:root+양[data-theme]재선언(중첩 재테마), 전체@layer wds.tokens. - Flutter 패리티:
WizAiShellTokens(wiz_tokens.dart codegen) — WizColorScheme/WizSprings 위임, tree-shake로 opt-in 등가. - 계약 문서:
docs/ai/AI-SHELL-CONTRACT.md(역할·레이아웃 영역·a11y·금지 패턴·승격 기준 7).
0.7.2
Patch Changes
-
b382b97: Add the LoginSurface authentication panel recipe, passkey feature-check helpers, and Microsoft ProviderButton support for composable login surfaces.
The release also adds the missing
space-5spacing token and refines auth method spacing and provider button presentation so password, passkey, SSO, and branded provider flows can be composed with consistent prominence.
0.7.1
Patch Changes
-
708177a: 패키지 메타데이터 —
license: "UNLICENSED"명시(내부 proprietary·GitLab restricted 레지스트리 배포, publint 권고 충족). @wds/fonts는 Pretendard(SIL OFL-1.1) 재배포라 라이선스 표기가 별도 결정 사항이라 미설정 유지. -
36b6aba: 모서리 기본 round 통일 —
wds-base.css의 전역--wds-corner-shape: squircle기본을 제거.크로스플랫폼 통일성: squircle(
corner-shape)은 Chromium 139+에서만 초타원으로 렌더되고 Safari/Firefox는 원호로 폴백해 엔진 간 모서리가 달라졌다(4-way 발산). 기본 모서리를 round(원호)로 통일하고, squircle은.wds-squircle스코프 opt-in 전용(Chromium 139+·그 외 원호 폴백)으로만 제공한다. 이로써 웹 3엔진(Chrome/Safari/FF) + Flutter 모서리가 모두 원호로 일치한다(ADR-017 옵션 A).
0.7.0
Minor Changes
-
24a3908: feat(tokens): 라운딩
radius.xxl(28px) 신설 — 넉넉히 둥근 단계xl(20px)과 알약(full) 사이의 빈 구간에 “넉넉하게 둥근” 단계를 추가한다(M3 extra-large 28px 정합). 기존 스케일(6/10/14/20)이 보수적이라 솔루션이 더 둥근 룩을 낼 토큰이 없던 격차를 해소 — 부드러운 대형 카드·시트의 라운드업 옵션. 가산형이라 기존 토큰·기본값은 무변경(opt-in). 웹--wds-radius-xxl, FlutterWizRadius.xxl동시 출하(byte-identical 골든 갱신).
0.6.0
Minor Changes
-
7f2b573: feat(tokens): 타이포 시스템 모더나이즈 — 경량 헤딩 + 유동 타입 + 수치·강조·측정 유틸
헤딩 weight 경량화 — display·headline 6종(48
24px)의게터는 기존 w700 보존).font-weight를 bold(700)에서 semibold(600)로 낮춰 2025 SaaS/인증 페이지 타이포 트렌드에 정합한다. 한글(Pretendard)은 획이 많아 700이 라틴문자보다 무겁게 읽히던 문제를 해소 — 자간(-0.02/-0.01em)·행간은 그대로다. title(600)·body(400)·label(500)은 불변,bold(700) weight 토큰은 강조·버튼용으로 유지. 웹.wds-type-display-*/.wds-type-headline-*+ FlutterWizTextStyles.display*/headline*동시 반영(레거시display1·h1유동(fluid) 타입 (P0) — display·headline의 웹
font-size를clamp(모바일 min, vw 보간, 데스크톱 max)로 전환해 미디어쿼리 없이 뷰포트 연속 스케일(모바일서 표제 과대 방지·데스크톱서 임팩트 유지). 데스크톱 max는 기존 고정값과 동일이라 1440 기준 시각 변화 0. Flutter는 플랫폼 관용구상 고정 size + OS Dynamic Type(textScaler, ADR-014) 유지 — title/body/label은 양 플랫폼 고정.수치·강조·측정 유틸 (P1·P2) — 추가형 베이스 유틸(기존 무변경):
.wds-tabular-nums(표·차트·KPI 자릿수 정렬, FlutterTextStyle.tabular확장과 1:1)·.wds-text-emphasis(본문 약강조, 굵기만 medium)·.wds-measure(본문 최적 읽기 폭 ~65ch). 광학 사이징(opsz)은 Pretendard가 wght 단일축이라 N/A, text-box-trim은 브라우저 지원 한정으로 후속.
0.5.0
Minor Changes
- e458fda: base.css(.wds-root)에 한글 친화 줄바꿈 기본값을 추가했습니다 —
word-break: keep-all(한글 어절 단위 줄바꿈, 음절 분리 방지)과 그 짝인overflow-wrap: anywhere(긴 URL·영문 토큰의 오버플로 방지)를 전역 베이스로 깔고, 재사용 유틸 3종.wds-keep-all·.wds-wrap-pretty(text-wrap: pretty, 문단 고아줄 방지)·.wds-wrap-balance(text-wrap: balance, 짧은 제목 줄 균형)를 함께 추가합니다.text-wrap: pretty는 성능을 고려해 전역 강제 대신 유틸 + 문서 권고로 둡니다.
0.4.0
Minor Changes
- aa19bb0:
@wds/tokens/base.cssexport 추가 —.wds-root베이스 리셋(box-sizing · 타이포 베이스라인 · 브랜드 폰트 적용 · 포커스 링)을 소비자가 직접 import 할 수 있게 했다.@wds/fonts/pretendard.css는@font-face로 폰트를 로드만 하고, 실제font-family적용은 이base.css의.wds-root가 한다. 소비 앱은 루트 요소에class="wds-root"를 주고 이 파일을 import 하면 정본(포털) 설정과 동일해진다. 기존 export 불변(순수 additive).
0.3.0
Minor Changes
-
40c8eef: npm 설치형 배포 가능화 + AI 소비 문서 파이프라인.
@wds/tokens신설 —--wds-*CSS 변수(wds.css)와 토큰 메타(manifest.json)를 GitLab Package Registry로 배포.@wds/ui-web—private제거 +publishConfig(restricted), 토큰 CSS를@wds/tokenspeer로 소비.- 소비처:
pnpm add @wds/ui-web @wds/tokens후@wds/tokens/wds.css→@wds/ui-web/styles.css순 로드. - AI 소비 문서(
llms.txt·llms-full.txt)는 소스 실측 생성물(make ai-docs)이며make check-full드리프트 게이트로 정합 강제.
@wds/fonts#
0.2.1
Patch Changes
-
cc518b4: feat(fonts): 콤마·따옴표 ‘콩나물’ 부호 폰트 추가 — Gelasio unicode-range 서브셋
Pretendard의 가늘고 각진 콤마·따옴표를 Georgia 계열 둥근-머리(“콩나물”) 글리프로 보완한다. Gelasio(OFL 1.1)의 부호 서브셋(콤마·따옴표·말줄임 —
U+22,U+27,U+2C,U+2018-2019,U+201C-201D,U+2026, 약 1KB woff2)을 self-host하고,@font-face+unicode-range로 해당 코드포인트에만 적용한다. 본문·한글·숫자는 Pretendard를 그대로 유지(글자 단위 분기)하며, 고정폭(tabular) 숫자 정렬도 콤마가 균일폭이라 무손상이다.