sh-ui-cli 0.80.0 → 0.80.1

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,18 @@
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.80.1",
7
+ "date": "2026-05-12",
8
+ "title": "monorepo create_project P0 fix — paths.styles · sidebar 토큰 · sidebar import",
9
+ "type": "patch",
10
+ "highlights": [
11
+ "**A1/A2: `create_project --structure monorepo` ui-core 가 styles 경로 누락하던 결함 수정** — `sh-ui.config.json` 에 `paths.styles: \"src/styles\"`, `package.json` `exports` 에 `\"./styles/*\": \"./src/styles/*\"` 추가. 이전엔 직후 `add base focus-ring …` 호출이 `paths.styles 가 sh-ui.config.json에 없습니다` 로 즉시 실패.",
12
+ "**A3: 신규 프로젝트 tokens.css 에 sidebar/success/warning/info 토큰 emit** — sidebar 컴포넌트가 요구하는 `--sidebar-bg / --sidebar-fg / --sidebar-border / --sidebar-accent / --sidebar-accent-fg` 가 신규 프로젝트 tokens.css 에 빠져 sidebar 가 `@theme inline` 매핑에서 undefined 로 풀리던 결함 수정. presets(neutral · slate · rose · emerald · violet) light/dark 양쪽에 5+6 토큰 추가, `OPTIONAL_TOKEN_KEYS` 에 sidebar 키 등록. 베이스라인 3개 tokens.css 템플릿도 동기화.",
13
+ "**B1: registry/docs sidebar `.tsx` 확장자 import 제거** — `import { Popover } from \"../popover/index.tsx\"` 가 TS5097 (allowImportingTsExtensions) 로 docs typecheck 실패하던 결함 수정. 듀얼 카피본 양쪽 수정."
14
+ ],
15
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.80.1"
16
+ },
5
17
  {
6
18
  "version": "0.80.0",
7
19
  "date": "2026-05-12",
@@ -3,7 +3,7 @@
3
3
  import * as React from "react";
4
4
  import { cn } from "@SH_UI_UTILS@";
5
5
  import { ChevronRightIcon, PanelLeftIcon } from "lucide-react";
6
- import { Popover, PopoverContent, PopoverTrigger } from "../popover/index.tsx";
6
+ import { Popover, PopoverContent, PopoverTrigger } from "../popover";
7
7
  import "./styles.css";
8
8
 
9
9
  const SIDEBAR_COOKIE_NAME = "sidebar_state";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sh-ui-cli",
3
- "version": "0.80.0",
3
+ "version": "0.80.1",
4
4
  "description": "sh-ui CLI — 프로젝트 스캐폴드(create) + 컴포넌트 추가(add/list/remove) + IDE-내 AI용 MCP 서버",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -41,6 +41,7 @@ export const TEMPLATE_MANIFEST = {
41
41
  "packages/ui/ui-core/src/components/.gitkeep",
42
42
  "packages/ui/ui-core/src/hooks/.gitkeep",
43
43
  "packages/ui/ui-core/src/lib/utils.ts",
44
+ "packages/ui/ui-core/src/styles/.gitkeep",
44
45
  "packages/ui/ui-core/tsconfig.json",
45
46
  "pnpm-workspace.yaml",
46
47
  "tsconfig.json",
@@ -19,6 +19,11 @@ const OPTIONAL_TOKEN_KEYS = [
19
19
  'info', 'info-foreground',
20
20
  'danger-hover',
21
21
  'ring',
22
+ // v0.80.1+ — sidebar cascade 색. 5개 모두 light/dark 양쪽에 정의되어야 emit.
23
+ // sidebar 컴포넌트의 styles.css 가 .sh-ui-sidebar-wrapper 에 var(--background-subtle) 등으로
24
+ // fallback 을 두지만, Tailwind @theme inline 의 --color-sidebar-* 가 :root 에서 해석되도록
25
+ // tokens.css 에도 끌어올린다.
26
+ 'sidebar-bg', 'sidebar-fg', 'sidebar-border', 'sidebar-accent', 'sidebar-accent-fg',
22
27
  ];
23
28
 
24
29
  /**
@@ -24,6 +24,17 @@ const NEUTRAL_LIGHT = {
24
24
  'danger-foreground': '#FFFFFF',
25
25
  'danger-hover': '#B91C1C',
26
26
  'ring': '#A3A3A3',
27
+ 'success': '#16A34A',
28
+ 'success-foreground': '#FFFFFF',
29
+ 'warning': '#D97706',
30
+ 'warning-foreground': '#FFFFFF',
31
+ 'info': '#2563EB',
32
+ 'info-foreground': '#FFFFFF',
33
+ 'sidebar-bg': '#FAFAFA',
34
+ 'sidebar-fg': '#0A0A0A',
35
+ 'sidebar-border': '#E5E5E5',
36
+ 'sidebar-accent': '#F5F5F5',
37
+ 'sidebar-accent-fg': '#0A0A0A',
27
38
  };
28
39
 
29
40
  const NEUTRAL_DARK = {
@@ -44,6 +55,17 @@ const NEUTRAL_DARK = {
44
55
  'danger-foreground': '#FFFFFF',
45
56
  'danger-hover': '#EF4444',
46
57
  'ring': '#737373',
58
+ 'success': '#22C55E',
59
+ 'success-foreground': '#052E16',
60
+ 'warning': '#F59E0B',
61
+ 'warning-foreground': '#451A03',
62
+ 'info': '#3B82F6',
63
+ 'info-foreground': '#172554',
64
+ 'sidebar-bg': '#171717',
65
+ 'sidebar-fg': '#FAFAFA',
66
+ 'sidebar-border': '#262626',
67
+ 'sidebar-accent': '#262626',
68
+ 'sidebar-accent-fg': '#FAFAFA',
47
69
  };
48
70
 
49
71
  export const THEME_PRESETS = {
@@ -73,6 +95,17 @@ export const THEME_PRESETS = {
73
95
  'danger-foreground': '#FFFFFF',
74
96
  'danger-hover': '#B91C1C',
75
97
  'ring': '#94A3B8',
98
+ 'success': '#16A34A',
99
+ 'success-foreground': '#FFFFFF',
100
+ 'warning': '#D97706',
101
+ 'warning-foreground': '#FFFFFF',
102
+ 'info': '#2563EB',
103
+ 'info-foreground': '#FFFFFF',
104
+ 'sidebar-bg': '#F8FAFC',
105
+ 'sidebar-fg': '#0F172A',
106
+ 'sidebar-border': '#E2E8F0',
107
+ 'sidebar-accent': '#F1F5F9',
108
+ 'sidebar-accent-fg': '#0F172A',
76
109
  },
77
110
  dark: {
78
111
  'background': '#0F172A',
@@ -92,6 +125,17 @@ export const THEME_PRESETS = {
92
125
  'danger-foreground': '#450A0A',
93
126
  'danger-hover': '#FCA5A5',
94
127
  'ring': '#64748B',
128
+ 'success': '#22C55E',
129
+ 'success-foreground': '#052E16',
130
+ 'warning': '#F59E0B',
131
+ 'warning-foreground': '#451A03',
132
+ 'info': '#60A5FA',
133
+ 'info-foreground': '#172554',
134
+ 'sidebar-bg': '#1E293B',
135
+ 'sidebar-fg': '#F1F5F9',
136
+ 'sidebar-border': '#334155',
137
+ 'sidebar-accent': '#334155',
138
+ 'sidebar-accent-fg': '#F1F5F9',
95
139
  },
96
140
  radius: 0.375,
97
141
  // 정보 밀도 ↑ — 본문 14px 부터, 컨트롤 36px (대시보드/관리자 인상)
@@ -30,6 +30,7 @@
30
30
  "exports": {
31
31
  "./components/*": "./src/components/*/index.tsx",
32
32
  "./hooks/*": "./src/hooks/*.ts",
33
- "./lib/*": "./src/lib/*.ts"
33
+ "./lib/*": "./src/lib/*.ts",
34
+ "./styles/*": "./src/styles/*"
34
35
  }
35
36
  }
@@ -5,7 +5,8 @@
5
5
  "paths": {
6
6
  "components": "src/components",
7
7
  "hooks": "src/hooks",
8
- "utils": "src/lib/utils.ts"
8
+ "utils": "src/lib/utils.ts",
9
+ "styles": "src/styles"
9
10
  },
10
11
  "aliases": {
11
12
  "components": "@workspace/ui-core/components",
@@ -20,6 +20,17 @@
20
20
  --danger: #DC2626;
21
21
  --danger-hover: color-mix(in srgb, var(--danger) 90%, black);
22
22
  --danger-foreground: #FFFFFF;
23
+ --success: #16A34A;
24
+ --success-foreground: #FFFFFF;
25
+ --warning: #D97706;
26
+ --warning-foreground: #FFFFFF;
27
+ --info: #2563EB;
28
+ --info-foreground: #FFFFFF;
29
+ --sidebar-bg: #FAFAFA;
30
+ --sidebar-fg: #0A0A0A;
31
+ --sidebar-border: #E5E5E5;
32
+ --sidebar-accent: #F5F5F5;
33
+ --sidebar-accent-fg: #0A0A0A;
23
34
  }
24
35
  @media (prefers-color-scheme: dark) {
25
36
  :root:not(.light):not(.dark) {
@@ -37,8 +48,19 @@
37
48
  --primary-foreground: #171717;
38
49
  --primary-hover: #E5E5E5;
39
50
  --danger: #DC2626;
40
- --danger-hover: color-mix(in srgb, var(--danger) 90%, black);
51
+ --danger-hover: color-mix(in srgb, var(--danger) 90%, black);
41
52
  --danger-foreground: #FFFFFF;
53
+ --success: #22C55E;
54
+ --success-foreground: #052E16;
55
+ --warning: #F59E0B;
56
+ --warning-foreground: #451A03;
57
+ --info: #3B82F6;
58
+ --info-foreground: #172554;
59
+ --sidebar-bg: #171717;
60
+ --sidebar-fg: #FAFAFA;
61
+ --sidebar-border: #262626;
62
+ --sidebar-accent: #262626;
63
+ --sidebar-accent-fg: #FAFAFA;
42
64
  }
43
65
  }
44
66
  .dark {
@@ -58,6 +80,17 @@
58
80
  --danger: #DC2626;
59
81
  --danger-hover: color-mix(in srgb, var(--danger) 90%, black);
60
82
  --danger-foreground: #FFFFFF;
83
+ --success: #22C55E;
84
+ --success-foreground: #052E16;
85
+ --warning: #F59E0B;
86
+ --warning-foreground: #451A03;
87
+ --info: #3B82F6;
88
+ --info-foreground: #172554;
89
+ --sidebar-bg: #171717;
90
+ --sidebar-fg: #FAFAFA;
91
+ --sidebar-border: #262626;
92
+ --sidebar-accent: #262626;
93
+ --sidebar-accent-fg: #FAFAFA;
61
94
  }
62
95
  /* sh-ui:theme-colors-end */
63
96
 
@@ -20,6 +20,17 @@
20
20
  --danger: #DC2626;
21
21
  --danger-hover: color-mix(in srgb, var(--danger) 90%, black);
22
22
  --danger-foreground: #FFFFFF;
23
+ --success: #16A34A;
24
+ --success-foreground: #FFFFFF;
25
+ --warning: #D97706;
26
+ --warning-foreground: #FFFFFF;
27
+ --info: #2563EB;
28
+ --info-foreground: #FFFFFF;
29
+ --sidebar-bg: #FAFAFA;
30
+ --sidebar-fg: #0A0A0A;
31
+ --sidebar-border: #E5E5E5;
32
+ --sidebar-accent: #F5F5F5;
33
+ --sidebar-accent-fg: #0A0A0A;
23
34
  }
24
35
  @media (prefers-color-scheme: dark) {
25
36
  :root:not(.light):not(.dark) {
@@ -37,8 +48,19 @@
37
48
  --primary-foreground: #171717;
38
49
  --primary-hover: #E5E5E5;
39
50
  --danger: #DC2626;
40
- --danger-hover: color-mix(in srgb, var(--danger) 90%, black);
51
+ --danger-hover: color-mix(in srgb, var(--danger) 90%, black);
41
52
  --danger-foreground: #FFFFFF;
53
+ --success: #22C55E;
54
+ --success-foreground: #052E16;
55
+ --warning: #F59E0B;
56
+ --warning-foreground: #451A03;
57
+ --info: #3B82F6;
58
+ --info-foreground: #172554;
59
+ --sidebar-bg: #171717;
60
+ --sidebar-fg: #FAFAFA;
61
+ --sidebar-border: #262626;
62
+ --sidebar-accent: #262626;
63
+ --sidebar-accent-fg: #FAFAFA;
42
64
  }
43
65
  }
44
66
  .dark {
@@ -58,6 +80,17 @@
58
80
  --danger: #DC2626;
59
81
  --danger-hover: color-mix(in srgb, var(--danger) 90%, black);
60
82
  --danger-foreground: #FFFFFF;
83
+ --success: #22C55E;
84
+ --success-foreground: #052E16;
85
+ --warning: #F59E0B;
86
+ --warning-foreground: #451A03;
87
+ --info: #3B82F6;
88
+ --info-foreground: #172554;
89
+ --sidebar-bg: #171717;
90
+ --sidebar-fg: #FAFAFA;
91
+ --sidebar-border: #262626;
92
+ --sidebar-accent: #262626;
93
+ --sidebar-accent-fg: #FAFAFA;
61
94
  }
62
95
  /* sh-ui:theme-colors-end */
63
96
 
@@ -20,6 +20,17 @@
20
20
  --danger: #DC2626;
21
21
  --danger-hover: color-mix(in srgb, var(--danger) 90%, black);
22
22
  --danger-foreground: #FFFFFF;
23
+ --success: #16A34A;
24
+ --success-foreground: #FFFFFF;
25
+ --warning: #D97706;
26
+ --warning-foreground: #FFFFFF;
27
+ --info: #2563EB;
28
+ --info-foreground: #FFFFFF;
29
+ --sidebar-bg: #FAFAFA;
30
+ --sidebar-fg: #0A0A0A;
31
+ --sidebar-border: #E5E5E5;
32
+ --sidebar-accent: #F5F5F5;
33
+ --sidebar-accent-fg: #0A0A0A;
23
34
  }
24
35
  @media (prefers-color-scheme: dark) {
25
36
  :root:not(.light):not(.dark) {
@@ -37,8 +48,19 @@
37
48
  --primary-foreground: #171717;
38
49
  --primary-hover: #E5E5E5;
39
50
  --danger: #DC2626;
40
- --danger-hover: color-mix(in srgb, var(--danger) 90%, black);
51
+ --danger-hover: color-mix(in srgb, var(--danger) 90%, black);
41
52
  --danger-foreground: #FFFFFF;
53
+ --success: #22C55E;
54
+ --success-foreground: #052E16;
55
+ --warning: #F59E0B;
56
+ --warning-foreground: #451A03;
57
+ --info: #3B82F6;
58
+ --info-foreground: #172554;
59
+ --sidebar-bg: #171717;
60
+ --sidebar-fg: #FAFAFA;
61
+ --sidebar-border: #262626;
62
+ --sidebar-accent: #262626;
63
+ --sidebar-accent-fg: #FAFAFA;
42
64
  }
43
65
  }
44
66
  .dark {
@@ -58,6 +80,17 @@
58
80
  --danger: #DC2626;
59
81
  --danger-hover: color-mix(in srgb, var(--danger) 90%, black);
60
82
  --danger-foreground: #FFFFFF;
83
+ --success: #22C55E;
84
+ --success-foreground: #052E16;
85
+ --warning: #F59E0B;
86
+ --warning-foreground: #451A03;
87
+ --info: #3B82F6;
88
+ --info-foreground: #172554;
89
+ --sidebar-bg: #171717;
90
+ --sidebar-fg: #FAFAFA;
91
+ --sidebar-border: #262626;
92
+ --sidebar-accent: #262626;
93
+ --sidebar-accent-fg: #FAFAFA;
61
94
  }
62
95
  /* sh-ui:theme-colors-end */
63
96