sh-ui-cli 0.82.1 → 0.82.3

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.
@@ -2,6 +2,27 @@
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.82.3",
7
+ "date": "2026-05-13",
8
+ "title": "스캐폴드 dependencies 에서 미사용 zustand 제거",
9
+ "type": "patch",
10
+ "highlights": [
11
+ "**`nextjs-app` / `nextjs-standalone` 템플릿의 `dependencies` 에서 `zustand@^5.0.11` 제거** — 두 템플릿에 박혀 있었지만 어디서도 import / store 정의 없이 dep 만 설치되던 노이즈. 필요할 때 사용자가 `pnpm add zustand` 한 줄로 추가. 번들 영향은 처음부터 없었지만 (tree-shaken) `pnpm install` 시간 / lockfile / dep 표면적이 줄어듦."
12
+ ],
13
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.82.3"
14
+ },
15
+ {
16
+ "version": "0.82.2",
17
+ "date": "2026-05-13",
18
+ "title": "RootLayout themeInitScript 가 'system' 케이스 누락하던 FOUC 결함 수정",
19
+ "type": "patch",
20
+ "highlights": [
21
+ "**RootLayout 의 FOUC 차단 inline script 가 `theme === 'system'` 케이스를 처리 안 해 새로고침 시 light → dark 깜빡임이 남던 결함 수정** — 기존 스크립트는 `t === 'dark'` 또는 `!t && system pref dark` 만 처리, `t === 'system'` 일 땐 next-themes 가 resolve 한 후에야 `.dark` 가 박혀 한 frame 흰 깜빡임. next-themes 의 `setTheme('system')` 호출 직후 localStorage 에 `'system'` 문자열이 들어가는데 이 케이스가 누락. matrix 정정: `'dark'` → `.dark`, `'light'` → none, `'system'`/unset → system pref 따라감. 6개 RootLayout 템플릿 (nextjs-app · nextjs-standalone × flat/mes/fsd) 일괄 수정.",
22
+ "**알려진 이슈 (이번 릴리즈 미반영)** — `@base-ui/react` 1.4.1 의 id 생성기가 Dialog/DropdownMenu/Popover Trigger 에서 server/client id 불일치로 hydration mismatch console error 발생. upstream 이슈 — 1.4.1 이 npm 최신이라 dep bump 로 해결 불가. 기능 영향은 없고 console error 만 뜸. 향후 Base UI 픽스 버전 나오면 peerDep 갱신."
23
+ ],
24
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.82.2"
25
+ },
5
26
  {
6
27
  "version": "0.82.1",
7
28
  "date": "2026-05-13",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sh-ui-cli",
3
- "version": "0.82.1",
3
+ "version": "0.82.3",
4
4
  "description": "sh-ui CLI — 프로젝트 스캐폴드(create) + 컴포넌트 추가(add/list/remove) + IDE-내 AI용 MCP 서버",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1,7 +1,8 @@
1
1
  import { GlobalProvider } from '@/components/providers';
2
2
 
3
- /** FOUC 차단 — next-themes mount 전에 첫 paint 에 dark/light class 박기. */
4
- const themeInitScript = `try{var t=localStorage.getItem('theme');var c=document.documentElement.classList;if(t==='dark'||(!t&&matchMedia('(prefers-color-scheme:dark)').matches)){c.add('dark');}else if(t==='light'){c.add('light');}}catch(e){}`;
3
+ /** FOUC 차단 — next-themes mount 전에 첫 paint 에 dark class 박기.
4
+ * matrix: 'dark' .dark, 'light'(none), 'system'/unset → system pref. */
5
+ const themeInitScript = `try{var t=localStorage.getItem('theme');var d=t==='dark'||((!t||t==='system')&&matchMedia('(prefers-color-scheme:dark)').matches);if(d){document.documentElement.classList.add('dark');}}catch(e){}`;
5
6
 
6
7
  export function RootLayout({ children }: { children: React.ReactNode }) {
7
8
  // `lang` 은 앱의 주 언어. 영어 등 다른 언어 우선이면 'en' 으로 바꾸거나
@@ -5,8 +5,13 @@ import { GlobalProvider } from '@/src/app/providers';
5
5
  * FOUC 차단 inline script. next-themes 의 ThemeProvider 가 client mount 후
6
6
  * 동일 작업을 하지만, mount 전 한 frame 동안 light/dark 깜빡임이 생긴다.
7
7
  * 이걸 막으려고 SSR 응답 head 안쪽에 동기 실행 script 박음.
8
+ *
9
+ * next-themes 의 theme 값 매트릭스:
10
+ * - 'dark' → .dark
11
+ * - 'light' → (no class — Tailwind 디폴트가 light)
12
+ * - 'system' 또는 unset → system pref 따라감
8
13
  */
9
- const themeInitScript = `try{var t=localStorage.getItem('theme');var c=document.documentElement.classList;if(t==='dark'||(!t&&matchMedia('(prefers-color-scheme:dark)').matches)){c.add('dark');}else if(t==='light'){c.add('light');}}catch(e){}`;
14
+ const themeInitScript = `try{var t=localStorage.getItem('theme');var d=t==='dark'||((!t||t==='system')&&matchMedia('(prefers-color-scheme:dark)').matches);if(d){document.documentElement.classList.add('dark');}}catch(e){}`;
10
15
 
11
16
  export function RootLayout({ children }: { children: React.ReactNode }) {
12
17
  // `lang` 은 앱의 주 언어. 영어 등 다른 언어 우선이면 'en' 으로 바꾸거나
@@ -1,7 +1,8 @@
1
1
  import { GlobalProvider } from '@/components/providers';
2
2
 
3
- /** FOUC 차단 — next-themes mount 전에 첫 paint 에 dark/light class 박기. */
4
- const themeInitScript = `try{var t=localStorage.getItem('theme');var c=document.documentElement.classList;if(t==='dark'||(!t&&matchMedia('(prefers-color-scheme:dark)').matches)){c.add('dark');}else if(t==='light'){c.add('light');}}catch(e){}`;
3
+ /** FOUC 차단 — next-themes mount 전에 첫 paint 에 dark class 박기.
4
+ * matrix: 'dark' .dark, 'light'(none), 'system'/unset → system pref. */
5
+ const themeInitScript = `try{var t=localStorage.getItem('theme');var d=t==='dark'||((!t||t==='system')&&matchMedia('(prefers-color-scheme:dark)').matches);if(d){document.documentElement.classList.add('dark');}}catch(e){}`;
5
6
 
6
7
  export function RootLayout({ children }: { children: React.ReactNode }) {
7
8
  // `lang` 은 앱의 주 언어. 영어 등 다른 언어 우선이면 'en' 으로 바꾸거나
@@ -24,8 +24,7 @@
24
24
  "react-dom": "^19.2.4",
25
25
  "server-only": "^0.0.1",
26
26
  "sonner": "^2.0.7",
27
- "zod": "^4.3.6",
28
- "zustand": "^5.0.11"
27
+ "zod": "^4.3.6"
29
28
  },
30
29
  "devDependencies": {
31
30
  "@tailwindcss/postcss": "^4.1.18",
@@ -1,7 +1,8 @@
1
1
  import { GlobalProvider } from '@/components/providers';
2
2
 
3
- /** FOUC 차단 — next-themes mount 전에 첫 paint 에 dark/light class 박기. */
4
- const themeInitScript = `try{var t=localStorage.getItem('theme');var c=document.documentElement.classList;if(t==='dark'||(!t&&matchMedia('(prefers-color-scheme:dark)').matches)){c.add('dark');}else if(t==='light'){c.add('light');}}catch(e){}`;
3
+ /** FOUC 차단 — next-themes mount 전에 첫 paint 에 dark class 박기.
4
+ * matrix: 'dark' .dark, 'light'(none), 'system'/unset → system pref. */
5
+ const themeInitScript = `try{var t=localStorage.getItem('theme');var d=t==='dark'||((!t||t==='system')&&matchMedia('(prefers-color-scheme:dark)').matches);if(d){document.documentElement.classList.add('dark');}}catch(e){}`;
5
6
 
6
7
  export function RootLayout({ children }: { children: React.ReactNode }) {
7
8
  // `lang` 은 앱의 주 언어. 영어 등 다른 언어 우선이면 'en' 으로 바꾸거나
@@ -1,7 +1,8 @@
1
1
  import { GlobalProvider } from '@/src/app/providers';
2
2
 
3
- /** FOUC 차단 — next-themes mount 전에 첫 paint 에 dark/light class 박기. */
4
- const themeInitScript = `try{var t=localStorage.getItem('theme');var c=document.documentElement.classList;if(t==='dark'||(!t&&matchMedia('(prefers-color-scheme:dark)').matches)){c.add('dark');}else if(t==='light'){c.add('light');}}catch(e){}`;
3
+ /** FOUC 차단 — next-themes mount 전에 첫 paint 에 dark class 박기.
4
+ * matrix: 'dark' .dark, 'light'(none), 'system'/unset → system pref. */
5
+ const themeInitScript = `try{var t=localStorage.getItem('theme');var d=t==='dark'||((!t||t==='system')&&matchMedia('(prefers-color-scheme:dark)').matches);if(d){document.documentElement.classList.add('dark');}}catch(e){}`;
5
6
 
6
7
  export function RootLayout({ children }: { children: React.ReactNode }) {
7
8
  // `lang` 은 앱의 주 언어. 영어 등 다른 언어 우선이면 'en' 으로 바꾸거나
@@ -1,7 +1,8 @@
1
1
  import { GlobalProvider } from '@/components/providers';
2
2
 
3
- /** FOUC 차단 — next-themes mount 전에 첫 paint 에 dark/light class 박기. */
4
- const themeInitScript = `try{var t=localStorage.getItem('theme');var c=document.documentElement.classList;if(t==='dark'||(!t&&matchMedia('(prefers-color-scheme:dark)').matches)){c.add('dark');}else if(t==='light'){c.add('light');}}catch(e){}`;
3
+ /** FOUC 차단 — next-themes mount 전에 첫 paint 에 dark class 박기.
4
+ * matrix: 'dark' .dark, 'light'(none), 'system'/unset → system pref. */
5
+ const themeInitScript = `try{var t=localStorage.getItem('theme');var d=t==='dark'||((!t||t==='system')&&matchMedia('(prefers-color-scheme:dark)').matches);if(d){document.documentElement.classList.add('dark');}}catch(e){}`;
5
6
 
6
7
  export function RootLayout({ children }: { children: React.ReactNode }) {
7
8
  // `lang` 은 앱의 주 언어. 영어 등 다른 언어 우선이면 'en' 으로 바꾸거나
@@ -26,8 +26,7 @@
26
26
  "react-dom": "^19.2.4",
27
27
  "sonner": "^2.0.7",
28
28
  "tailwind-merge": "^3.5.0",
29
- "zod": "^4.3.6",
30
- "zustand": "^5.0.11"
29
+ "zod": "^4.3.6"
31
30
  },
32
31
  "devDependencies": {
33
32
  "@eslint/js": "^9.39.2",