sh-ui-cli 0.88.0 → 0.89.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.
@@ -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.89.0",
7
+ "date": "2026-05-14",
8
+ "title": "vite-standalone fsd arch — FSD-pure entry (src/app/main.tsx)",
9
+ "type": "minor",
10
+ "highlights": [
11
+ "**fsd arch 의 entry 가 `src/app/main.tsx` 로 이동** — Feature-Sliced Design 의 app layer 가 정식 부트스트랩 위치가 되도록. v0.88.x 까지는 Vite 컨벤션 (`src/main.tsx`) 따라 루트에 두고 안에서 FSD 레이어로 분기하던 1-layer 우회 — v0.89.0 부터는 entry 자체가 app layer 안. `_arch/fsd/index.html` overlay 신설 (script src `/src/app/main.tsx`). ai-org 처럼 명시적 FSD 노선을 가진 프로젝트에 맞춤.",
12
+ "**flat arch 는 Vite 컨벤션 유지** — `src/main.tsx` + `src/App.tsx` + `src/Home.tsx` 그대로 루트. 그러나 base 에서 이 파일들이 빠지면서 `_arch/flat/` overlay 가 자체적으로 emit (`_arch/flat/index.html`, `_arch/flat/src/Home.tsx` 신설). 사용자 입장의 결과 파일은 v0.88.x 와 동일.",
13
+ "**base 가 entry 책임 안 가짐** — `index.html`, `src/App.tsx`, `src/Home.tsx`, `src/main.tsx` 가 vite-standalone base 에서 제거. 각 arch overlay 가 자체 entry 를 owner — flat 은 Vite-style, fsd 는 FSD-pure. base 는 빌드 설정 + 메타 파일만 (CLAUDE.md / README.md / package.json / vite.config.ts / tsconfig.* / eslint.config.js / vitest.config.ts / gitignore — 10개).",
14
+ "**Smoke V10 + V11 회귀 가드 + V1 갱신** — V10 은 fsd 의 `src/app/main.tsx` 존재 + 루트 entry/opinionated 폴더 부재 + index.html script 경로 단언. V11 은 flat 의 Vite-convention 보장. V1 (기존 vite fsd smoke) 도 새 entry 경로로 갱신. fsd + flat 양쪽 manual `pnpm build` 검증 그린."
15
+ ],
16
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.89.0"
17
+ },
18
+ {
19
+ "version": "0.88.1",
20
+ "date": "2026-05-14",
21
+ "title": "vite-standalone 템플릿 모바일/Tauri WebView 친화 — viewport-fit + theme-color + tap-highlight reset",
22
+ "type": "patch",
23
+ "highlights": [
24
+ "**`index.html` viewport meta 확장** — `viewport-fit=cover` 추가 (iOS safe-area inset / Android edge-to-edge / Tauri 모바일 호환). `theme-color` 메타도 light/dark prefers-color-scheme 분기로 emit — 모바일 브라우저 status bar, PWA, Tauri WebView 의 chrome 톤이 앱 톤을 따라감.",
25
+ "**globals.css 에 WebView base reset** — `-webkit-tap-highlight-color: transparent` (탭 시 회색 박스 차단), `-webkit-user-select: none` (모바일 long-press 컨텍스트 메뉴 차단), `touch-action: manipulation` (300ms 더블탭 줌 지연 제거). `input`/`textarea`/`[contenteditable]` 은 명시적으로 `user-select: text` 로 복원해 폼은 정상 동작. fsd + flat 양쪽 arch overlay 에 동일 emit.",
26
+ "**ai-org Tauri 통일 전략 대응 (참고용)** — Phase 1.5 desktop + Phase 3 mobile 통일 Tauri 2 워크플로우의 WebView 친화 디폴트. sh-ui 컴포넌트 자체의 touch-target (44pt iOS / 48dp Android) 분기는 별도 PR — `--control-md-touch` 류 토큰 신설 + 컴포넌트 디폴트 API 결정 필요.",
27
+ "**smoke V8 + V9 회귀 가드** — V8 은 viewport-fit + 양쪽 theme-color 매체 쿼리 존재, V9 는 fsd + flat globals.css 양쪽에 sentinel 블록 + 핵심 reset 라인 존재를 단언. 텍스트 입력 복원 라인도 따로 가드 (input/textarea 셀렉트 회귀 차단)."
28
+ ],
29
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.88.1"
30
+ },
5
31
  {
6
32
  "version": "0.88.0",
7
33
  "date": "2026-05-14",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sh-ui-cli",
3
- "version": "0.88.0",
3
+ "version": "0.89.0",
4
4
  "description": "sh-ui CLI — 프로젝트 스캐폴드(create) + 컴포넌트 추가(add/list/remove) + IDE-내 AI용 MCP 서버",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -384,11 +384,7 @@ export const TEMPLATE_MANIFEST = {
384
384
  "README.md",
385
385
  "eslint.config.js",
386
386
  "gitignore",
387
- "index.html",
388
387
  "package.json",
389
- "src/App.tsx",
390
- "src/Home.tsx",
391
- "src/main.tsx",
392
388
  "tsconfig.json",
393
389
  "tsconfig.node.json",
394
390
  "vite.config.ts",
@@ -397,8 +393,10 @@ export const TEMPLATE_MANIFEST = {
397
393
  ],
398
394
  "arches": {
399
395
  "flat": [
396
+ "index.html",
400
397
  "sh-ui.config.json",
401
398
  "src/App.tsx",
399
+ "src/Home.tsx",
402
400
  "src/components/layouts/RootLayout.tsx",
403
401
  "src/components/providers/GlobalProvider/index.tsx",
404
402
  "src/components/providers/index.tsx",
@@ -412,12 +410,13 @@ export const TEMPLATE_MANIFEST = {
412
410
  "tsconfig.app.json"
413
411
  ],
414
412
  "fsd": [
413
+ "index.html",
415
414
  "sh-ui.config.json",
416
- "src/App.tsx",
415
+ "src/app/App.tsx",
417
416
  "src/app/layouts/RootLayout.tsx",
417
+ "src/app/main.tsx",
418
418
  "src/app/providers/GlobalProvider/index.tsx",
419
419
  "src/app/providers/theme/ThemeProvider.tsx",
420
- "src/main.tsx",
421
420
  "src/shared/api/queryClient.ts",
422
421
  "src/shared/hooks/useTheme.ts",
423
422
  "src/shared/lib/utils.ts",
@@ -3,7 +3,11 @@
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <!-- viewport-fit=cover: iOS safe-area inset / Android edge-to-edge / Tauri mobile 호환 -->
7
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
8
+ <!-- theme-color: 모바일 브라우저 / PWA / Tauri WebView 의 status bar 톤. dark default 에 맞춰 어두운 톤. -->
9
+ <meta name="theme-color" content="#0A0A0A" media="(prefers-color-scheme: dark)" />
10
+ <meta name="theme-color" content="#FFFFFF" media="(prefers-color-scheme: light)" />
7
11
  <title>sh-ui app</title>
8
12
  <script>
9
13
  // FOUC 차단 — ThemeProvider mount 전에 첫 paint 에 dark class 박기.
@@ -33,3 +33,29 @@
33
33
  --color-info-foreground: var(--info-foreground);
34
34
  --color-sidebar-bg: var(--sidebar-bg);
35
35
  }
36
+
37
+ /* sh-ui:webview-base-start — 모바일 브라우저 / Tauri WebView / PWA 공통 기본값.
38
+ * v0.88.1+: Tauri 통합 + iOS/Android 친화. 사용자가 텍스트 셀렉트 필요한 곳은 input/textarea/
39
+ * contenteditable 에 명시적으로 user-select: text 로 복원. 토큰이 아니라 reset 성 규칙이라
40
+ * @theme inline 밖에 둠. */
41
+ @layer base {
42
+ * {
43
+ -webkit-tap-highlight-color: transparent;
44
+ }
45
+ body {
46
+ -webkit-user-select: none;
47
+ user-select: none;
48
+ -webkit-touch-callout: none;
49
+ }
50
+ input,
51
+ textarea,
52
+ [contenteditable],
53
+ [contenteditable='true'] {
54
+ -webkit-user-select: text;
55
+ user-select: text;
56
+ }
57
+ html {
58
+ touch-action: manipulation;
59
+ }
60
+ }
61
+ /* sh-ui:webview-base-end */
@@ -0,0 +1,26 @@
1
+ <!doctype html>
2
+ <html lang="ko" suppressHydrationWarning>
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <!-- viewport-fit=cover: iOS safe-area inset / Android edge-to-edge / Tauri mobile 호환 -->
7
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
8
+ <!-- theme-color: 모바일 브라우저 / PWA / Tauri WebView 의 status bar 톤. dark default 에 맞춰 어두운 톤. -->
9
+ <meta name="theme-color" content="#0A0A0A" media="(prefers-color-scheme: dark)" />
10
+ <meta name="theme-color" content="#FFFFFF" media="(prefers-color-scheme: light)" />
11
+ <title>sh-ui app</title>
12
+ <script>
13
+ // FOUC 차단 — ThemeProvider mount 전에 첫 paint 에 dark class 박기.
14
+ try {
15
+ var t = localStorage.getItem('theme');
16
+ var d = t === 'dark' || ((!t || t === 'system') && matchMedia('(prefers-color-scheme:dark)').matches);
17
+ if (d) document.documentElement.classList.add('dark');
18
+ } catch (e) {}
19
+ </script>
20
+ </head>
21
+ <body>
22
+ <div id="root"></div>
23
+ <!-- v0.89.0+ FSD-pure entry — 부트스트랩이 app layer 안에 있음. -->
24
+ <script type="module" src="/src/app/main.tsx"></script>
25
+ </body>
26
+ </html>
@@ -1,12 +1,13 @@
1
1
  import { GlobalProvider } from '@/app/providers/GlobalProvider';
2
2
  import { RootLayout } from '@/app/layouts/RootLayout';
3
- import Home from './Home';
4
3
 
5
4
  export default function App() {
6
5
  return (
7
6
  <GlobalProvider>
8
7
  <RootLayout>
9
- <Home />
8
+ <main className="flex min-h-screen flex-col items-center justify-center">
9
+ <h1 className="text-4xl font-bold">Hello World</h1>
10
+ </main>
10
11
  </RootLayout>
11
12
  </GlobalProvider>
12
13
  );
@@ -33,3 +33,29 @@
33
33
  --color-info-foreground: var(--info-foreground);
34
34
  --color-sidebar-bg: var(--sidebar-bg);
35
35
  }
36
+
37
+ /* sh-ui:webview-base-start — 모바일 브라우저 / Tauri WebView / PWA 공통 기본값.
38
+ * v0.88.1+: Tauri 통합 + iOS/Android 친화. 사용자가 텍스트 셀렉트 필요한 곳은 input/textarea/
39
+ * contenteditable 에 명시적으로 user-select: text 로 복원. 토큰이 아니라 reset 성 규칙이라
40
+ * @theme inline 밖에 둠. */
41
+ @layer base {
42
+ * {
43
+ -webkit-tap-highlight-color: transparent;
44
+ }
45
+ body {
46
+ -webkit-user-select: none;
47
+ user-select: none;
48
+ -webkit-touch-callout: none;
49
+ }
50
+ input,
51
+ textarea,
52
+ [contenteditable],
53
+ [contenteditable='true'] {
54
+ -webkit-user-select: text;
55
+ user-select: text;
56
+ }
57
+ html {
58
+ touch-action: manipulation;
59
+ }
60
+ }
61
+ /* sh-ui:webview-base-end */
@@ -1,5 +0,0 @@
1
- import Home from './Home';
2
-
3
- export default function App() {
4
- return <Home />;
5
- }
@@ -1,9 +0,0 @@
1
- import { StrictMode } from 'react';
2
- import { createRoot } from 'react-dom/client';
3
- import App from './App';
4
-
5
- createRoot(document.getElementById('root')!).render(
6
- <StrictMode>
7
- <App />
8
- </StrictMode>,
9
- );