sh-ui-cli 0.67.2 → 0.68.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/sh-ui.mjs CHANGED
@@ -15,6 +15,7 @@ const usage = `사용법:
15
15
  필요한 외부 패키지를 자동 설치
16
16
  특수값: tokens → 설정 기반 토큰 파일 생성
17
17
  sh-ui list 현재 설치된 컴포넌트 목록 표시
18
+ sh-ui doctor 프로젝트 정합성 점검 (config / tokens / 설치된 컴포넌트)
18
19
  sh-ui remove <component...> 설치된 컴포넌트 파일 삭제
19
20
  sh-ui rename-app <old> <new> monorepo 의 앱 이름 일괄 변경
20
21
  (apps/<old>/, packages/ui/ui-apps/ui-<old>/
@@ -99,6 +100,11 @@ try {
99
100
  await list({ cwd: process.cwd(), all });
100
101
  break;
101
102
  }
103
+ case "doctor": {
104
+ const { doctor } = await import("../src/doctor.mjs");
105
+ await doctor({ cwd: process.cwd() });
106
+ break;
107
+ }
102
108
  case "mcp": {
103
109
  // `sh-ui mcp init ...` → 설정 파일에 엔트리 추가
104
110
  // `sh-ui mcp` → MCP 서버 시작
@@ -2,6 +2,32 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$description": "sh-ui 릴리즈 노트 단일 소스. docs(React)와 showcase(Flutter)가 함께 읽는다. 새 릴리즈마다 맨 앞에 추가.",
4
4
  "versions": [
5
+ {
6
+ "version": "0.68.0",
7
+ "date": "2026-05-09",
8
+ "title": "토큰 의존 검증 + sh-ui doctor — silent breakage 가시화 (Phase A)",
9
+ "type": "minor",
10
+ "highlights": [
11
+ "**`sh-ui doctor` 추가** — 프로젝트 정합성 점검. config/tokens.css/cssEntry/설치된 컴포넌트의 토큰 의존성을 한 번에 검사하고 ✓⚠✗ 로 리포트. CI 통합 가능 (실패 시 exit 1).",
12
+ "**컴포넌트 토큰 의존 메타** — `packages/registry/react/tokens-used.json` 자동 생성 (`scripts/build-registry-tokens.mjs`). 컴포넌트 CSS 의 `var(--*)` 참조를 framework 별로 추출하고 fallback 있는 var 와 컴포넌트 자체 정의 변수는 외부 의존에서 제외. `pnpm lint:tokens-used` 가 drift 검출.",
13
+ "**add-time 토큰 검증** — `sh-ui add <component>` 가 destination tokens.css 의 변수 정의를 비교해 누락이면 한 번에 친절한 경고 (silent breakage 사전 차단). 실패가 아닌 안내 — 실제 실행은 그대로.",
14
+ "**`paths.cssEntry` 옵션 신설** — `sh-ui.config.json` 의 paths 에 `cssEntry` (globals.css 위치) 추가. doctor 가 tokens.css import 정합성을 검증. init/create 가 자동 채움 (Next.js fsd/flat → `app/globals.css`, monorepo ui-app → `src/styles/globals.css`). 기존 config 는 미설정 시 검사 스킵."
15
+ ],
16
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.68.0"
17
+ },
18
+ {
19
+ "version": "0.67.3",
20
+ "date": "2026-05-09",
21
+ "title": "fix(sidebar) — Collapsible 하위 메뉴 펼침/접힘 애니메이션",
22
+ "type": "patch",
23
+ "highlights": [
24
+ "**Sidebar Collapsible 애니메이션 회귀 fix** — chevron 회전은 부드러운데 본문은 `display:none` 토글이라 즉시 사라지던 어색함. `grid-template-rows: 0fr ↔ 1fr` 트릭으로 height 를 모르는 채로 200ms ease 트랜지션. inner wrapper + `overflow:hidden`/`min-height:0` 으로 grid track 에 맞춰 잘림.",
25
+ "**a11y 보존** — `hidden={!open}` 대신 `inert` + `aria-hidden` 사용. 닫힌 상태에서도 DOM 은 살아 있어 트랜지션이 가능하면서, 포커스/스크린리더 접근은 정상적으로 차단.",
26
+ "**reduced-motion 가드** — `prefers-reduced-motion: reduce` 일 때 `__collapsible-content` 트랜지션 비활성. 모션 민감 사용자는 즉시 토글 (기존 동작) 유지.",
27
+ "**collapsed=icon flyout 모드 영향 없음** — icon 모드에서는 inline content 가 아닌 Popover 로 전환되므로 기존 flyout UX 그대로."
28
+ ],
29
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.67.3"
30
+ },
5
31
  {
6
32
  "version": "0.67.2",
7
33
  "date": "2026-05-09",
@@ -918,8 +918,13 @@ export function SidebarCollapsibleContent({ children }: { children: React.ReactN
918
918
  }
919
919
 
920
920
  return (
921
- <div className="sh-ui-sidebar__collapsible-content" data-state={open ? "open" : "closed"} hidden={!open}>
922
- {children}
921
+ <div
922
+ className="sh-ui-sidebar__collapsible-content"
923
+ data-state={open ? "open" : "closed"}
924
+ inert={!open}
925
+ aria-hidden={!open || undefined}
926
+ >
927
+ <div className="sh-ui-sidebar__collapsible-content-inner">{children}</div>
923
928
  </div>
924
929
  );
925
930
  }
@@ -462,8 +462,19 @@
462
462
  transform: rotate(90deg);
463
463
  }
464
464
 
465
+ /* grid-template-rows 0fr→1fr 트릭 — height 를 모르는 채로 부드럽게 펼침/접힘.
466
+ * inner 는 overflow:hidden + min-height:0 으로 grid track 에 맞춰 잘려나간다. */
467
+ .sh-ui-sidebar__collapsible-content {
468
+ display: grid;
469
+ grid-template-rows: 1fr;
470
+ transition: grid-template-rows 200ms ease;
471
+ }
465
472
  .sh-ui-sidebar__collapsible-content[data-state="closed"] {
466
- display: none;
473
+ grid-template-rows: 0fr;
474
+ }
475
+ .sh-ui-sidebar__collapsible-content-inner {
476
+ min-height: 0;
477
+ overflow: hidden;
467
478
  }
468
479
 
469
480
  /* ───── Flyout (collapsed=icon 상태의 서브메뉴) ─────
@@ -493,7 +504,8 @@
493
504
  .sh-ui-sidebar__menu-button,
494
505
  .sh-ui-sidebar__menu-sub-button,
495
506
  .sh-ui-sidebar__panel-close,
496
- .sh-ui-sidebar__chevron {
507
+ .sh-ui-sidebar__chevron,
508
+ .sh-ui-sidebar__collapsible-content {
497
509
  transition: none;
498
510
  }
499
511
  .sh-ui-sidebar__panel {