sh-ui-cli 0.98.1 → 0.109.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.
- package/data/changelog/versions.json +157 -0
- package/data/registry/react/components/scroll-area/index.module.tsx +71 -0
- package/data/registry/react/components/scroll-area/index.tailwind.tsx +54 -0
- package/data/registry/react/components/scroll-area/index.tsx +67 -0
- package/data/registry/react/components/scroll-area/styles.css +64 -0
- package/data/registry/react/components/scroll-area/styles.module.css +64 -0
- package/data/registry/react/components/sheet/index.module.tsx +93 -0
- package/data/registry/react/components/sheet/index.tailwind.tsx +120 -0
- package/data/registry/react/components/sheet/index.tsx +121 -0
- package/data/registry/react/components/sheet/styles.css +183 -0
- package/data/registry/react/components/sheet/styles.module.css +171 -0
- package/data/registry/react/registry.json +94 -0
- package/data/registry/react/tokens-used.json +86 -1
- package/data/summaries/react.json +3 -1
- package/data/tokens/src/primitives.json +8 -0
- package/data/tokens/src/semantic.json +36 -10
- package/package.json +1 -1
- package/src/create/cli-args.js +18 -5
- package/src/create/generator.js +116 -4
- package/src/create/index.mjs +3 -0
- package/src/create/plugins/nextIntl.js +3 -0
- package/src/create/theme/decode.js +3 -0
- package/src/create/theme/presets.js +45 -8
- package/src/mcp.mjs +47 -3
- package/src/theme-extract.mjs +1 -0
- package/templates/nextjs-standalone/_arch/flat/app/globals.css +16 -4
- package/templates/nextjs-standalone/_arch/flat/lib/styles/tokens.css +35 -4
- package/templates/nextjs-standalone/_arch/fsd/src/shared/styles/tokens.css +35 -4
- package/templates/nextjs-standalone/_arch/mes/app/globals.css +16 -4
- package/templates/nextjs-standalone/_arch/mes/src/lib/styles/tokens.css +33 -2
- package/templates/nextjs-standalone/app/globals.css +16 -4
- package/templates/ui-app-template/src/styles/globals.css +16 -4
- package/templates/ui-app-template/src/styles/tokens.css +35 -4
- package/templates/vite-standalone/_arch/flat/src/lib/styles/globals.css +16 -0
- package/templates/vite-standalone/_arch/flat/src/lib/styles/tokens.css +35 -4
- package/templates/vite-standalone/_arch/fsd/src/shared/styles/globals.css +16 -0
- package/templates/vite-standalone/_arch/fsd/src/shared/styles/tokens.css +35 -4
package/src/mcp.mjs
CHANGED
|
@@ -93,6 +93,34 @@ const INIT_DESCRIPTIONS = {
|
|
|
93
93
|
tailwind: "Tailwind v4 utility class — class-variance-authority 기반",
|
|
94
94
|
"css-modules": "CSS Modules — .module.css + styles.X 참조, 빌드 타임 hash 격리",
|
|
95
95
|
},
|
|
96
|
+
// theme 프리셋 — sh_ui_create_project 의 theme 인자에 그대로 전달 가능.
|
|
97
|
+
// 사용자가 "다크 모던" / "따뜻한 종이" 같이 자연어로 의도를 표현하면 아래 keywordHints 로 매핑.
|
|
98
|
+
theme: {
|
|
99
|
+
neutral: "뉴트럴 — 흑백 강조 (sh-ui 기본). 어떤 브랜드에도 무난.",
|
|
100
|
+
slate: "슬레이트 — 차분한 슬레이트 + 인디고 (정보 밀도). 대시보드/관리자 인상.",
|
|
101
|
+
rose: "로즈 — 핑크 강조 + 둥근 모서리 (친근·여유). 소비자 앱·캐주얼.",
|
|
102
|
+
emerald: "에메랄드 — 그린 강조. 자연·금융·헬스 인상.",
|
|
103
|
+
violet: "바이올렛 — 퍼플 강조 + 살짝 라운드 (모던·또렷). 크리에이티브/디자인 도구.",
|
|
104
|
+
},
|
|
105
|
+
// 자연어 의도 → enum/preset 매핑 힌트 (한국어 표현 위주).
|
|
106
|
+
// 사용자가 "다크 모던" / "따뜻한 종이" / "한국 핀테크 스타일" 같이 의도만 던지면 AI 가
|
|
107
|
+
// 이 사전을 보고 platform/base/radius/mode/theme 조합으로 매핑한다.
|
|
108
|
+
keywordHints: {
|
|
109
|
+
"다크 모던 / dark modern / 검정 모던": "base=zinc · mode=dark · radius=sm · theme=neutral",
|
|
110
|
+
"라이트 모던 / 밝은 모던 / clean": "base=zinc · mode=light · radius=sm · theme=neutral",
|
|
111
|
+
"따뜻한 / 따뜻한 종이 / warm paper / 종이": "theme=rose 또는 neutral · radius=md · mode=light-dark",
|
|
112
|
+
"친근한 / 캐주얼 / 부드러운 / 동글동글 / soft": "theme=rose · radius=lg · mode=light-dark",
|
|
113
|
+
"한국 핀테크 / 핀테크 / fintech / 금융": "theme=slate (indigo) 또는 violet · radius=sm · mode=light-dark",
|
|
114
|
+
"기업 관리자 / 관리자 / 어드민 / admin / MES / ERP / 백오피스": "theme=slate · arch=mes · radius=sm",
|
|
115
|
+
"차분한 / 프로페셔널 / 푸른빛 / 정보 밀도": "base=slate 또는 theme=slate · radius=sm",
|
|
116
|
+
"그린 강조 / 자연 / 헬스 / 환경": "theme=emerald · radius=md",
|
|
117
|
+
"퍼플 강조 / 크리에이티브 / 디자인 도구": "theme=violet · radius=lg · borders=두꺼움",
|
|
118
|
+
"쇼핑몰 / 커머스 / 소비자 앱": "theme=rose 또는 emerald · radius=lg · mode=light-dark",
|
|
119
|
+
"데이터 대시보드 / 차트 / 분석 도구": "theme=slate · base=slate · radius=sm · 정보 밀도 ↑",
|
|
120
|
+
"AI / 챗봇 / 생성형": "theme=violet 또는 neutral · radius=md · mode=light-dark",
|
|
121
|
+
"스타트업 / 모던 / 트렌디": "theme=violet 또는 rose · radius=md",
|
|
122
|
+
"교육 / 학습 / 친근": "theme=rose 또는 emerald · radius=lg",
|
|
123
|
+
},
|
|
96
124
|
};
|
|
97
125
|
|
|
98
126
|
/** stdout 으로 출력되는 console.* 호출을 버퍼에 캡처해 텍스트로 반환. */
|
|
@@ -419,8 +447,10 @@ export async function startMcpServer() {
|
|
|
419
447
|
"sh_ui_describe_init",
|
|
420
448
|
{
|
|
421
449
|
description:
|
|
422
|
-
"sh-ui init 의
|
|
423
|
-
"
|
|
450
|
+
"sh-ui init 의 선택지 사전 — platform/base/radius/mode/cssFramework/theme 의 enum + 한글 설명, " +
|
|
451
|
+
"그리고 사용자 자연어 의도 (\"다크 모던\" / \"따뜻한 종이\" / \"한국 핀테크 스타일\" 등) 를 " +
|
|
452
|
+
"enum/preset 조합으로 매핑하는 keywordHints 사전을 함께 반환. " +
|
|
453
|
+
"사용자가 톤을 자연어로 던지면 이 툴을 먼저 호출해 매핑 후 sh_ui_create_project 의 theme/base/radius 인자에 반영. v0.106.0+ 에서 theme + keywordHints 키 추가.",
|
|
424
454
|
inputSchema: {},
|
|
425
455
|
},
|
|
426
456
|
async () => jsonResult(INIT_DESCRIPTIONS),
|
|
@@ -478,6 +508,17 @@ export async function startMcpServer() {
|
|
|
478
508
|
),
|
|
479
509
|
port: z.string().optional()
|
|
480
510
|
.describe("monorepo 첫 앱의 dev 포트. 기본 '3000'. structure=monorepo 일 때만 의미."),
|
|
511
|
+
gitInit: z.boolean().optional()
|
|
512
|
+
.describe(
|
|
513
|
+
"git init 실행 여부. 기본 auto — parent 가 이미 git tree 안이면 자동 스킵 (nested .git 충돌 방지), 밖이면 init. " +
|
|
514
|
+
"true 로 nested 강제, false 로 명시 스킵. v0.102.0+ 신규.",
|
|
515
|
+
),
|
|
516
|
+
locale: z.enum(["default", "ko"]).optional()
|
|
517
|
+
.describe(
|
|
518
|
+
"사용자 지역 디폴트 가정. 'ko' 선택 시 globals.css 에 Pretendard 폰트가 자동 적용 (CDN @import + body font-family). " +
|
|
519
|
+
"한국어 사용자가 init 직후 거의 100% 첫 작업이라 한 옵션으로 자동화. " +
|
|
520
|
+
"locales (복수) 와 다름 — locales 는 i18n 활성화 시 생성할 locale 코드 목록. v0.103.0+ 신규.",
|
|
521
|
+
),
|
|
481
522
|
},
|
|
482
523
|
},
|
|
483
524
|
async (input) => {
|
|
@@ -537,6 +578,8 @@ export async function startMcpServer() {
|
|
|
537
578
|
locales: input.locales,
|
|
538
579
|
appName: input.appName,
|
|
539
580
|
port: input.port,
|
|
581
|
+
gitInit: input.gitInit,
|
|
582
|
+
locale: input.locale,
|
|
540
583
|
yes: true, // 사전 검사를 마쳤으니 generator 의 confirm 프롬프트 우회
|
|
541
584
|
}),
|
|
542
585
|
);
|
|
@@ -802,8 +845,9 @@ export async function startMcpServer() {
|
|
|
802
845
|
success: HEX.optional(), "success-foreground": HEX.optional(),
|
|
803
846
|
warning: HEX.optional(), "warning-foreground": HEX.optional(),
|
|
804
847
|
info: HEX.optional(), "info-foreground": HEX.optional(),
|
|
848
|
+
accent: HEX.optional(), "accent-foreground": HEX.optional(), "accent-hover": HEX.optional(),
|
|
805
849
|
})
|
|
806
|
-
.describe("15개 필수 색 토큰 + 옵셔널
|
|
850
|
+
.describe("15개 필수 색 토큰 + 옵셔널 9개(success/warning/info × -foreground + accent/accent-foreground/accent-hover). 각 값은 #RRGGBB hex");
|
|
807
851
|
|
|
808
852
|
server.registerTool(
|
|
809
853
|
"sh_ui_encode_theme",
|
package/src/theme-extract.mjs
CHANGED
|
@@ -31,6 +31,9 @@
|
|
|
31
31
|
--color-primary: var(--primary);
|
|
32
32
|
--color-primary-foreground: var(--primary-foreground);
|
|
33
33
|
--color-primary-hover: var(--primary-hover);
|
|
34
|
+
--color-accent: var(--accent);
|
|
35
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
36
|
+
--color-accent-hover: var(--accent-hover);
|
|
34
37
|
--color-ring: var(--ring);
|
|
35
38
|
--color-danger: var(--danger);
|
|
36
39
|
--color-danger-hover: var(--danger-hover);
|
|
@@ -46,10 +49,19 @@
|
|
|
46
49
|
--color-sidebar-border: var(--sidebar-border);
|
|
47
50
|
--color-sidebar-accent: var(--sidebar-accent);
|
|
48
51
|
--color-sidebar-accent-fg: var(--sidebar-accent-fg);
|
|
49
|
-
--
|
|
50
|
-
--
|
|
51
|
-
--
|
|
52
|
-
--
|
|
52
|
+
--shadow-popover: var(--shadow-popover);
|
|
53
|
+
--shadow-modal: var(--shadow-modal);
|
|
54
|
+
--shadow-toast: var(--shadow-toast);
|
|
55
|
+
--tracking-tighter: var(--tracking-tighter);
|
|
56
|
+
--tracking-tight: var(--tracking-tight);
|
|
57
|
+
--tracking-normal: var(--tracking-normal);
|
|
58
|
+
--tracking-wide: var(--tracking-wide);
|
|
59
|
+
--tracking-wider: var(--tracking-wider);
|
|
60
|
+
--radius-sm: 0.25rem;
|
|
61
|
+
--radius-md: 0.5rem;
|
|
62
|
+
--radius-lg: 0.75rem;
|
|
63
|
+
--radius-xl: 1rem;
|
|
64
|
+
--radius-full: 9999px;
|
|
53
65
|
}
|
|
54
66
|
|
|
55
67
|
@layer base {
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/* Generated by @sh-ui/tokens — do not edit directly */
|
|
2
|
+
/* Input: sh-ui.config.json (theme block) */
|
|
3
|
+
/* Regenerate: npx sh-ui-cli tokens upgrade --replace */
|
|
2
4
|
/* base=neutral radius=md mode=light-dark */
|
|
3
5
|
|
|
4
6
|
/* sh-ui:theme-colors-start */
|
|
5
7
|
:root {
|
|
6
8
|
--background: #FFFFFF;
|
|
7
|
-
--background-subtle: #
|
|
8
|
-
--background-muted: #
|
|
9
|
+
--background-subtle: #F5F5F5;
|
|
10
|
+
--background-muted: #E5E5E5;
|
|
9
11
|
--background-inverse: #0A0A0A;
|
|
10
12
|
--foreground: #0A0A0A;
|
|
11
13
|
--foreground-muted: #525252;
|
|
@@ -16,6 +18,9 @@
|
|
|
16
18
|
--primary: #171717;
|
|
17
19
|
--primary-foreground: #FAFAFA;
|
|
18
20
|
--primary-hover: #262626;
|
|
21
|
+
--accent: #171717;
|
|
22
|
+
--accent-foreground: #FAFAFA;
|
|
23
|
+
--accent-hover: #262626;
|
|
19
24
|
--ring: color-mix(in srgb, var(--primary) 50%, transparent);
|
|
20
25
|
--danger: #DC2626;
|
|
21
26
|
--danger-hover: color-mix(in srgb, var(--danger) 90%, black);
|
|
@@ -26,10 +31,10 @@
|
|
|
26
31
|
--warning-foreground: #FFFFFF;
|
|
27
32
|
--info: #2563EB;
|
|
28
33
|
--info-foreground: #FFFFFF;
|
|
29
|
-
--sidebar-bg: #
|
|
34
|
+
--sidebar-bg: #F5F5F5;
|
|
30
35
|
--sidebar-fg: #0A0A0A;
|
|
31
36
|
--sidebar-border: #E5E5E5;
|
|
32
|
-
--sidebar-accent: #
|
|
37
|
+
--sidebar-accent: #E5E5E5;
|
|
33
38
|
--sidebar-accent-fg: #0A0A0A;
|
|
34
39
|
}
|
|
35
40
|
@media (prefers-color-scheme: dark) {
|
|
@@ -47,6 +52,9 @@
|
|
|
47
52
|
--primary: #FAFAFA;
|
|
48
53
|
--primary-foreground: #171717;
|
|
49
54
|
--primary-hover: #E5E5E5;
|
|
55
|
+
--accent: #FAFAFA;
|
|
56
|
+
--accent-foreground: #171717;
|
|
57
|
+
--accent-hover: #E5E5E5;
|
|
50
58
|
--danger: #DC2626;
|
|
51
59
|
--danger-hover: color-mix(in srgb, var(--danger) 90%, black);
|
|
52
60
|
--danger-foreground: #FFFFFF;
|
|
@@ -77,6 +85,9 @@
|
|
|
77
85
|
--primary: #FAFAFA;
|
|
78
86
|
--primary-foreground: #171717;
|
|
79
87
|
--primary-hover: #E5E5E5;
|
|
88
|
+
--accent: #FAFAFA;
|
|
89
|
+
--accent-foreground: #171717;
|
|
90
|
+
--accent-hover: #E5E5E5;
|
|
80
91
|
--danger: #DC2626;
|
|
81
92
|
--danger-hover: color-mix(in srgb, var(--danger) 90%, black);
|
|
82
93
|
--danger-foreground: #FFFFFF;
|
|
@@ -97,6 +108,16 @@
|
|
|
97
108
|
:root {
|
|
98
109
|
/* sh-ui:theme-radius-start */
|
|
99
110
|
--radius: 0.5rem;
|
|
111
|
+
/* sh-ui:theme-radius-scale-start — Tailwind utility rounded-sm/md/lg/xl/full 의 값과 일치.
|
|
112
|
+
* v0.106.0+ — 사용자 base radius (--radius) 와 별개의 절대값 scale.
|
|
113
|
+
* --radius 변경은 컴포넌트 default (input/button 등) 만 영향,
|
|
114
|
+
* rounded-* utility 는 아래 scale 값을 그대로 따른다. */
|
|
115
|
+
--radius-sm: 0.25rem;
|
|
116
|
+
--radius-md: 0.5rem;
|
|
117
|
+
--radius-lg: 0.75rem;
|
|
118
|
+
--radius-xl: 1rem;
|
|
119
|
+
--radius-full: 9999px;
|
|
120
|
+
/* sh-ui:theme-radius-scale-end */
|
|
100
121
|
/* sh-ui:theme-radius-end */
|
|
101
122
|
/* sh-ui:theme-space-start */
|
|
102
123
|
--space-0: 0;
|
|
@@ -133,6 +154,9 @@
|
|
|
133
154
|
--shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.15);
|
|
134
155
|
--shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.18);
|
|
135
156
|
--shadow-menu: 0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.05);
|
|
157
|
+
--shadow-popover: 0 8px 24px rgba(0, 0, 0, 0.15);
|
|
158
|
+
--shadow-modal: 0 16px 48px rgba(0, 0, 0, 0.18);
|
|
159
|
+
--shadow-toast: 0 4px 12px rgba(0, 0, 0, 0.12);
|
|
136
160
|
/* sh-ui:theme-shadow-end */
|
|
137
161
|
/* sh-ui:theme-duration-start */
|
|
138
162
|
--duration-fast: 120ms;
|
|
@@ -142,6 +166,13 @@
|
|
|
142
166
|
/* sh-ui:theme-ease-start */
|
|
143
167
|
--ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
|
|
144
168
|
--ease-emphasized: cubic-bezier(0.2, 0, 0, 1);
|
|
169
|
+
/* sh-ui:theme-tracking-start */
|
|
170
|
+
--tracking-tighter: -0.04em;
|
|
171
|
+
--tracking-tight: -0.02em;
|
|
172
|
+
--tracking-normal: 0;
|
|
173
|
+
--tracking-wide: 0.02em;
|
|
174
|
+
--tracking-wider: 0.04em;
|
|
175
|
+
/* sh-ui:theme-tracking-end */
|
|
145
176
|
/* sh-ui:theme-ease-end */
|
|
146
177
|
/* sh-ui:theme-control-start */
|
|
147
178
|
--control-sm: 2rem;
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/* Generated by @sh-ui/tokens — do not edit directly */
|
|
2
|
+
/* Input: sh-ui.config.json (theme block) */
|
|
3
|
+
/* Regenerate: npx sh-ui-cli tokens upgrade --replace */
|
|
2
4
|
/* base=neutral radius=md mode=light-dark */
|
|
3
5
|
|
|
4
6
|
/* sh-ui:theme-colors-start */
|
|
5
7
|
:root {
|
|
6
8
|
--background: #FFFFFF;
|
|
7
|
-
--background-subtle: #
|
|
8
|
-
--background-muted: #
|
|
9
|
+
--background-subtle: #F5F5F5;
|
|
10
|
+
--background-muted: #E5E5E5;
|
|
9
11
|
--background-inverse: #0A0A0A;
|
|
10
12
|
--foreground: #0A0A0A;
|
|
11
13
|
--foreground-muted: #525252;
|
|
@@ -16,6 +18,9 @@
|
|
|
16
18
|
--primary: #171717;
|
|
17
19
|
--primary-foreground: #FAFAFA;
|
|
18
20
|
--primary-hover: #262626;
|
|
21
|
+
--accent: #171717;
|
|
22
|
+
--accent-foreground: #FAFAFA;
|
|
23
|
+
--accent-hover: #262626;
|
|
19
24
|
--ring: color-mix(in srgb, var(--primary) 50%, transparent);
|
|
20
25
|
--danger: #DC2626;
|
|
21
26
|
--danger-hover: color-mix(in srgb, var(--danger) 90%, black);
|
|
@@ -26,10 +31,10 @@
|
|
|
26
31
|
--warning-foreground: #FFFFFF;
|
|
27
32
|
--info: #2563EB;
|
|
28
33
|
--info-foreground: #FFFFFF;
|
|
29
|
-
--sidebar-bg: #
|
|
34
|
+
--sidebar-bg: #F5F5F5;
|
|
30
35
|
--sidebar-fg: #0A0A0A;
|
|
31
36
|
--sidebar-border: #E5E5E5;
|
|
32
|
-
--sidebar-accent: #
|
|
37
|
+
--sidebar-accent: #E5E5E5;
|
|
33
38
|
--sidebar-accent-fg: #0A0A0A;
|
|
34
39
|
}
|
|
35
40
|
@media (prefers-color-scheme: dark) {
|
|
@@ -47,6 +52,9 @@
|
|
|
47
52
|
--primary: #FAFAFA;
|
|
48
53
|
--primary-foreground: #171717;
|
|
49
54
|
--primary-hover: #E5E5E5;
|
|
55
|
+
--accent: #FAFAFA;
|
|
56
|
+
--accent-foreground: #171717;
|
|
57
|
+
--accent-hover: #E5E5E5;
|
|
50
58
|
--danger: #DC2626;
|
|
51
59
|
--danger-hover: color-mix(in srgb, var(--danger) 90%, black);
|
|
52
60
|
--danger-foreground: #FFFFFF;
|
|
@@ -77,6 +85,9 @@
|
|
|
77
85
|
--primary: #FAFAFA;
|
|
78
86
|
--primary-foreground: #171717;
|
|
79
87
|
--primary-hover: #E5E5E5;
|
|
88
|
+
--accent: #FAFAFA;
|
|
89
|
+
--accent-foreground: #171717;
|
|
90
|
+
--accent-hover: #E5E5E5;
|
|
80
91
|
--danger: #DC2626;
|
|
81
92
|
--danger-hover: color-mix(in srgb, var(--danger) 90%, black);
|
|
82
93
|
--danger-foreground: #FFFFFF;
|
|
@@ -97,6 +108,16 @@
|
|
|
97
108
|
:root {
|
|
98
109
|
/* sh-ui:theme-radius-start */
|
|
99
110
|
--radius: 0.5rem;
|
|
111
|
+
/* sh-ui:theme-radius-scale-start — Tailwind utility rounded-sm/md/lg/xl/full 의 값과 일치.
|
|
112
|
+
* v0.106.0+ — 사용자 base radius (--radius) 와 별개의 절대값 scale.
|
|
113
|
+
* --radius 변경은 컴포넌트 default (input/button 등) 만 영향,
|
|
114
|
+
* rounded-* utility 는 아래 scale 값을 그대로 따른다. */
|
|
115
|
+
--radius-sm: 0.25rem;
|
|
116
|
+
--radius-md: 0.5rem;
|
|
117
|
+
--radius-lg: 0.75rem;
|
|
118
|
+
--radius-xl: 1rem;
|
|
119
|
+
--radius-full: 9999px;
|
|
120
|
+
/* sh-ui:theme-radius-scale-end */
|
|
100
121
|
/* sh-ui:theme-radius-end */
|
|
101
122
|
/* sh-ui:theme-space-start */
|
|
102
123
|
--space-0: 0;
|
|
@@ -133,6 +154,9 @@
|
|
|
133
154
|
--shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.15);
|
|
134
155
|
--shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.18);
|
|
135
156
|
--shadow-menu: 0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.05);
|
|
157
|
+
--shadow-popover: 0 8px 24px rgba(0, 0, 0, 0.15);
|
|
158
|
+
--shadow-modal: 0 16px 48px rgba(0, 0, 0, 0.18);
|
|
159
|
+
--shadow-toast: 0 4px 12px rgba(0, 0, 0, 0.12);
|
|
136
160
|
/* sh-ui:theme-shadow-end */
|
|
137
161
|
/* sh-ui:theme-duration-start */
|
|
138
162
|
--duration-fast: 120ms;
|
|
@@ -142,6 +166,13 @@
|
|
|
142
166
|
/* sh-ui:theme-ease-start */
|
|
143
167
|
--ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
|
|
144
168
|
--ease-emphasized: cubic-bezier(0.2, 0, 0, 1);
|
|
169
|
+
/* sh-ui:theme-tracking-start */
|
|
170
|
+
--tracking-tighter: -0.04em;
|
|
171
|
+
--tracking-tight: -0.02em;
|
|
172
|
+
--tracking-normal: 0;
|
|
173
|
+
--tracking-wide: 0.02em;
|
|
174
|
+
--tracking-wider: 0.04em;
|
|
175
|
+
/* sh-ui:theme-tracking-end */
|
|
145
176
|
/* sh-ui:theme-ease-end */
|
|
146
177
|
/* sh-ui:theme-control-start */
|
|
147
178
|
--control-sm: 2rem;
|
|
@@ -31,6 +31,9 @@
|
|
|
31
31
|
--color-primary: var(--primary);
|
|
32
32
|
--color-primary-foreground: var(--primary-foreground);
|
|
33
33
|
--color-primary-hover: var(--primary-hover);
|
|
34
|
+
--color-accent: var(--accent);
|
|
35
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
36
|
+
--color-accent-hover: var(--accent-hover);
|
|
34
37
|
--color-ring: var(--ring);
|
|
35
38
|
--color-danger: var(--danger);
|
|
36
39
|
--color-danger-hover: var(--danger-hover);
|
|
@@ -46,10 +49,19 @@
|
|
|
46
49
|
--color-sidebar-border: var(--sidebar-border);
|
|
47
50
|
--color-sidebar-accent: var(--sidebar-accent);
|
|
48
51
|
--color-sidebar-accent-fg: var(--sidebar-accent-fg);
|
|
49
|
-
--
|
|
50
|
-
--
|
|
51
|
-
--
|
|
52
|
-
--
|
|
52
|
+
--shadow-popover: var(--shadow-popover);
|
|
53
|
+
--shadow-modal: var(--shadow-modal);
|
|
54
|
+
--shadow-toast: var(--shadow-toast);
|
|
55
|
+
--tracking-tighter: var(--tracking-tighter);
|
|
56
|
+
--tracking-tight: var(--tracking-tight);
|
|
57
|
+
--tracking-normal: var(--tracking-normal);
|
|
58
|
+
--tracking-wide: var(--tracking-wide);
|
|
59
|
+
--tracking-wider: var(--tracking-wider);
|
|
60
|
+
--radius-sm: 0.25rem;
|
|
61
|
+
--radius-md: 0.5rem;
|
|
62
|
+
--radius-lg: 0.75rem;
|
|
63
|
+
--radius-xl: 1rem;
|
|
64
|
+
--radius-full: 9999px;
|
|
53
65
|
}
|
|
54
66
|
|
|
55
67
|
@layer base {
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/* Generated by @sh-ui/tokens — do not edit directly */
|
|
2
|
+
/* Input: sh-ui.config.json (theme block) */
|
|
3
|
+
/* Regenerate: npx sh-ui-cli tokens upgrade --replace */
|
|
2
4
|
/* base=neutral radius=md mode=light-dark */
|
|
3
5
|
|
|
4
6
|
/* sh-ui:theme-colors-start */
|
|
5
7
|
:root {
|
|
6
8
|
--background: #FFFFFF;
|
|
7
|
-
--background-subtle: #
|
|
8
|
-
--background-muted: #
|
|
9
|
+
--background-subtle: #F5F5F5;
|
|
10
|
+
--background-muted: #E5E5E5;
|
|
9
11
|
--background-inverse: #0A0A0A;
|
|
10
12
|
--foreground: #0A0A0A;
|
|
11
13
|
--foreground-muted: #525252;
|
|
@@ -16,6 +18,9 @@
|
|
|
16
18
|
--primary: #171717;
|
|
17
19
|
--primary-foreground: #FAFAFA;
|
|
18
20
|
--primary-hover: #262626;
|
|
21
|
+
--accent: #171717;
|
|
22
|
+
--accent-foreground: #FAFAFA;
|
|
23
|
+
--accent-hover: #262626;
|
|
19
24
|
--ring: color-mix(in srgb, var(--primary) 50%, transparent);
|
|
20
25
|
--danger: #DC2626;
|
|
21
26
|
--danger-hover: color-mix(in srgb, var(--danger) 90%, black);
|
|
@@ -36,6 +41,9 @@
|
|
|
36
41
|
--primary: #FAFAFA;
|
|
37
42
|
--primary-foreground: #171717;
|
|
38
43
|
--primary-hover: #E5E5E5;
|
|
44
|
+
--accent: #FAFAFA;
|
|
45
|
+
--accent-foreground: #171717;
|
|
46
|
+
--accent-hover: #E5E5E5;
|
|
39
47
|
--danger: #DC2626;
|
|
40
48
|
--danger-hover: color-mix(in srgb, var(--danger) 90%, black);
|
|
41
49
|
--danger-foreground: #FFFFFF;
|
|
@@ -55,6 +63,9 @@
|
|
|
55
63
|
--primary: #FAFAFA;
|
|
56
64
|
--primary-foreground: #171717;
|
|
57
65
|
--primary-hover: #E5E5E5;
|
|
66
|
+
--accent: #FAFAFA;
|
|
67
|
+
--accent-foreground: #171717;
|
|
68
|
+
--accent-hover: #E5E5E5;
|
|
58
69
|
--danger: #DC2626;
|
|
59
70
|
--danger-hover: color-mix(in srgb, var(--danger) 90%, black);
|
|
60
71
|
--danger-foreground: #FFFFFF;
|
|
@@ -64,6 +75,16 @@
|
|
|
64
75
|
:root {
|
|
65
76
|
/* sh-ui:theme-radius-start */
|
|
66
77
|
--radius: 0.5rem;
|
|
78
|
+
/* sh-ui:theme-radius-scale-start — Tailwind utility rounded-sm/md/lg/xl/full 의 값과 일치.
|
|
79
|
+
* v0.106.0+ — 사용자 base radius (--radius) 와 별개의 절대값 scale.
|
|
80
|
+
* --radius 변경은 컴포넌트 default (input/button 등) 만 영향,
|
|
81
|
+
* rounded-* utility 는 아래 scale 값을 그대로 따른다. */
|
|
82
|
+
--radius-sm: 0.25rem;
|
|
83
|
+
--radius-md: 0.5rem;
|
|
84
|
+
--radius-lg: 0.75rem;
|
|
85
|
+
--radius-xl: 1rem;
|
|
86
|
+
--radius-full: 9999px;
|
|
87
|
+
/* sh-ui:theme-radius-scale-end */
|
|
67
88
|
/* sh-ui:theme-radius-end */
|
|
68
89
|
/* sh-ui:theme-space-start */
|
|
69
90
|
--space-0: 0;
|
|
@@ -100,6 +121,9 @@
|
|
|
100
121
|
--shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.15);
|
|
101
122
|
--shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.18);
|
|
102
123
|
--shadow-menu: 0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.05);
|
|
124
|
+
--shadow-popover: 0 8px 24px rgba(0, 0, 0, 0.15);
|
|
125
|
+
--shadow-modal: 0 16px 48px rgba(0, 0, 0, 0.18);
|
|
126
|
+
--shadow-toast: 0 4px 12px rgba(0, 0, 0, 0.12);
|
|
103
127
|
/* sh-ui:theme-shadow-end */
|
|
104
128
|
/* sh-ui:theme-duration-start */
|
|
105
129
|
--duration-fast: 120ms;
|
|
@@ -109,6 +133,13 @@
|
|
|
109
133
|
/* sh-ui:theme-ease-start */
|
|
110
134
|
--ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
|
|
111
135
|
--ease-emphasized: cubic-bezier(0.2, 0, 0, 1);
|
|
136
|
+
/* sh-ui:theme-tracking-start */
|
|
137
|
+
--tracking-tighter: -0.04em;
|
|
138
|
+
--tracking-tight: -0.02em;
|
|
139
|
+
--tracking-normal: 0;
|
|
140
|
+
--tracking-wide: 0.02em;
|
|
141
|
+
--tracking-wider: 0.04em;
|
|
142
|
+
/* sh-ui:theme-tracking-end */
|
|
112
143
|
/* sh-ui:theme-ease-end */
|
|
113
144
|
/* sh-ui:theme-control-start */
|
|
114
145
|
--control-sm: 2rem;
|
|
@@ -27,6 +27,9 @@
|
|
|
27
27
|
--color-primary: var(--primary);
|
|
28
28
|
--color-primary-foreground: var(--primary-foreground);
|
|
29
29
|
--color-primary-hover: var(--primary-hover);
|
|
30
|
+
--color-accent: var(--accent);
|
|
31
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
32
|
+
--color-accent-hover: var(--accent-hover);
|
|
30
33
|
--color-ring: var(--ring);
|
|
31
34
|
--color-danger: var(--danger);
|
|
32
35
|
--color-danger-hover: var(--danger-hover);
|
|
@@ -42,10 +45,19 @@
|
|
|
42
45
|
--color-sidebar-border: var(--sidebar-border);
|
|
43
46
|
--color-sidebar-accent: var(--sidebar-accent);
|
|
44
47
|
--color-sidebar-accent-fg: var(--sidebar-accent-fg);
|
|
45
|
-
--
|
|
46
|
-
--
|
|
47
|
-
--
|
|
48
|
-
--
|
|
48
|
+
--shadow-popover: var(--shadow-popover);
|
|
49
|
+
--shadow-modal: var(--shadow-modal);
|
|
50
|
+
--shadow-toast: var(--shadow-toast);
|
|
51
|
+
--tracking-tighter: var(--tracking-tighter);
|
|
52
|
+
--tracking-tight: var(--tracking-tight);
|
|
53
|
+
--tracking-normal: var(--tracking-normal);
|
|
54
|
+
--tracking-wide: var(--tracking-wide);
|
|
55
|
+
--tracking-wider: var(--tracking-wider);
|
|
56
|
+
--radius-sm: 0.25rem;
|
|
57
|
+
--radius-md: 0.5rem;
|
|
58
|
+
--radius-lg: 0.75rem;
|
|
59
|
+
--radius-xl: 1rem;
|
|
60
|
+
--radius-full: 9999px;
|
|
49
61
|
}
|
|
50
62
|
|
|
51
63
|
@layer base {
|
|
@@ -42,6 +42,9 @@
|
|
|
42
42
|
--color-primary: var(--primary);
|
|
43
43
|
--color-primary-foreground: var(--primary-foreground);
|
|
44
44
|
--color-primary-hover: var(--primary-hover);
|
|
45
|
+
--color-accent: var(--accent);
|
|
46
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
47
|
+
--color-accent-hover: var(--accent-hover);
|
|
45
48
|
--color-ring: var(--ring);
|
|
46
49
|
--color-danger: var(--danger);
|
|
47
50
|
--color-danger-hover: var(--danger-hover);
|
|
@@ -57,10 +60,19 @@
|
|
|
57
60
|
--color-sidebar-border: var(--sidebar-border);
|
|
58
61
|
--color-sidebar-accent: var(--sidebar-accent);
|
|
59
62
|
--color-sidebar-accent-fg: var(--sidebar-accent-fg);
|
|
60
|
-
--
|
|
61
|
-
--
|
|
62
|
-
--
|
|
63
|
-
--
|
|
63
|
+
--shadow-popover: var(--shadow-popover);
|
|
64
|
+
--shadow-modal: var(--shadow-modal);
|
|
65
|
+
--shadow-toast: var(--shadow-toast);
|
|
66
|
+
--tracking-tighter: var(--tracking-tighter);
|
|
67
|
+
--tracking-tight: var(--tracking-tight);
|
|
68
|
+
--tracking-normal: var(--tracking-normal);
|
|
69
|
+
--tracking-wide: var(--tracking-wide);
|
|
70
|
+
--tracking-wider: var(--tracking-wider);
|
|
71
|
+
--radius-sm: 0.25rem;
|
|
72
|
+
--radius-md: 0.5rem;
|
|
73
|
+
--radius-lg: 0.75rem;
|
|
74
|
+
--radius-xl: 1rem;
|
|
75
|
+
--radius-full: 9999px;
|
|
64
76
|
}
|
|
65
77
|
|
|
66
78
|
@layer base {
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/* Generated by @sh-ui/tokens — do not edit directly */
|
|
2
|
+
/* Input: sh-ui.config.json (theme block) */
|
|
3
|
+
/* Regenerate: npx sh-ui-cli tokens upgrade --replace */
|
|
2
4
|
/* base=neutral radius=md mode=light-dark */
|
|
3
5
|
|
|
4
6
|
/* sh-ui:theme-colors-start */
|
|
5
7
|
:root {
|
|
6
8
|
--background: #FFFFFF;
|
|
7
|
-
--background-subtle: #
|
|
8
|
-
--background-muted: #
|
|
9
|
+
--background-subtle: #F5F5F5;
|
|
10
|
+
--background-muted: #E5E5E5;
|
|
9
11
|
--background-inverse: #0A0A0A;
|
|
10
12
|
--foreground: #0A0A0A;
|
|
11
13
|
--foreground-muted: #525252;
|
|
@@ -16,6 +18,9 @@
|
|
|
16
18
|
--primary: #171717;
|
|
17
19
|
--primary-foreground: #FAFAFA;
|
|
18
20
|
--primary-hover: #262626;
|
|
21
|
+
--accent: #171717;
|
|
22
|
+
--accent-foreground: #FAFAFA;
|
|
23
|
+
--accent-hover: #262626;
|
|
19
24
|
--ring: color-mix(in srgb, var(--primary) 50%, transparent);
|
|
20
25
|
--danger: #DC2626;
|
|
21
26
|
--danger-hover: color-mix(in srgb, var(--danger) 90%, black);
|
|
@@ -26,10 +31,10 @@
|
|
|
26
31
|
--warning-foreground: #FFFFFF;
|
|
27
32
|
--info: #2563EB;
|
|
28
33
|
--info-foreground: #FFFFFF;
|
|
29
|
-
--sidebar-bg: #
|
|
34
|
+
--sidebar-bg: #F5F5F5;
|
|
30
35
|
--sidebar-fg: #0A0A0A;
|
|
31
36
|
--sidebar-border: #E5E5E5;
|
|
32
|
-
--sidebar-accent: #
|
|
37
|
+
--sidebar-accent: #E5E5E5;
|
|
33
38
|
--sidebar-accent-fg: #0A0A0A;
|
|
34
39
|
}
|
|
35
40
|
@media (prefers-color-scheme: dark) {
|
|
@@ -47,6 +52,9 @@
|
|
|
47
52
|
--primary: #FAFAFA;
|
|
48
53
|
--primary-foreground: #171717;
|
|
49
54
|
--primary-hover: #E5E5E5;
|
|
55
|
+
--accent: #FAFAFA;
|
|
56
|
+
--accent-foreground: #171717;
|
|
57
|
+
--accent-hover: #E5E5E5;
|
|
50
58
|
--danger: #DC2626;
|
|
51
59
|
--danger-hover: color-mix(in srgb, var(--danger) 90%, black);
|
|
52
60
|
--danger-foreground: #FFFFFF;
|
|
@@ -77,6 +85,9 @@
|
|
|
77
85
|
--primary: #FAFAFA;
|
|
78
86
|
--primary-foreground: #171717;
|
|
79
87
|
--primary-hover: #E5E5E5;
|
|
88
|
+
--accent: #FAFAFA;
|
|
89
|
+
--accent-foreground: #171717;
|
|
90
|
+
--accent-hover: #E5E5E5;
|
|
80
91
|
--danger: #DC2626;
|
|
81
92
|
--danger-hover: color-mix(in srgb, var(--danger) 90%, black);
|
|
82
93
|
--danger-foreground: #FFFFFF;
|
|
@@ -97,6 +108,16 @@
|
|
|
97
108
|
:root {
|
|
98
109
|
/* sh-ui:theme-radius-start */
|
|
99
110
|
--radius: 0.5rem;
|
|
111
|
+
/* sh-ui:theme-radius-scale-start — Tailwind utility rounded-sm/md/lg/xl/full 의 값과 일치.
|
|
112
|
+
* v0.106.0+ — 사용자 base radius (--radius) 와 별개의 절대값 scale.
|
|
113
|
+
* --radius 변경은 컴포넌트 default (input/button 등) 만 영향,
|
|
114
|
+
* rounded-* utility 는 아래 scale 값을 그대로 따른다. */
|
|
115
|
+
--radius-sm: 0.25rem;
|
|
116
|
+
--radius-md: 0.5rem;
|
|
117
|
+
--radius-lg: 0.75rem;
|
|
118
|
+
--radius-xl: 1rem;
|
|
119
|
+
--radius-full: 9999px;
|
|
120
|
+
/* sh-ui:theme-radius-scale-end */
|
|
100
121
|
/* sh-ui:theme-radius-end */
|
|
101
122
|
/* sh-ui:theme-space-start */
|
|
102
123
|
--space-0: 0;
|
|
@@ -133,6 +154,9 @@
|
|
|
133
154
|
--shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.15);
|
|
134
155
|
--shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.18);
|
|
135
156
|
--shadow-menu: 0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.05);
|
|
157
|
+
--shadow-popover: 0 8px 24px rgba(0, 0, 0, 0.15);
|
|
158
|
+
--shadow-modal: 0 16px 48px rgba(0, 0, 0, 0.18);
|
|
159
|
+
--shadow-toast: 0 4px 12px rgba(0, 0, 0, 0.12);
|
|
136
160
|
/* sh-ui:theme-shadow-end */
|
|
137
161
|
/* sh-ui:theme-duration-start */
|
|
138
162
|
--duration-fast: 120ms;
|
|
@@ -142,6 +166,13 @@
|
|
|
142
166
|
/* sh-ui:theme-ease-start */
|
|
143
167
|
--ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
|
|
144
168
|
--ease-emphasized: cubic-bezier(0.2, 0, 0, 1);
|
|
169
|
+
/* sh-ui:theme-tracking-start */
|
|
170
|
+
--tracking-tighter: -0.04em;
|
|
171
|
+
--tracking-tight: -0.02em;
|
|
172
|
+
--tracking-normal: 0;
|
|
173
|
+
--tracking-wide: 0.02em;
|
|
174
|
+
--tracking-wider: 0.04em;
|
|
175
|
+
/* sh-ui:theme-tracking-end */
|
|
145
176
|
/* sh-ui:theme-ease-end */
|
|
146
177
|
/* sh-ui:theme-control-start */
|
|
147
178
|
--control-sm: 2rem;
|
|
@@ -21,6 +21,9 @@
|
|
|
21
21
|
--color-primary: var(--primary);
|
|
22
22
|
--color-primary-foreground: var(--primary-foreground);
|
|
23
23
|
--color-primary-hover: var(--primary-hover);
|
|
24
|
+
--color-accent: var(--accent);
|
|
25
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
26
|
+
--color-accent-hover: var(--accent-hover);
|
|
24
27
|
--color-ring: var(--ring);
|
|
25
28
|
--color-danger: var(--danger);
|
|
26
29
|
--color-danger-hover: var(--danger-hover);
|
|
@@ -32,6 +35,19 @@
|
|
|
32
35
|
--color-info: var(--info);
|
|
33
36
|
--color-info-foreground: var(--info-foreground);
|
|
34
37
|
--color-sidebar-bg: var(--sidebar-bg);
|
|
38
|
+
--shadow-popover: var(--shadow-popover);
|
|
39
|
+
--shadow-modal: var(--shadow-modal);
|
|
40
|
+
--shadow-toast: var(--shadow-toast);
|
|
41
|
+
--tracking-tighter: var(--tracking-tighter);
|
|
42
|
+
--tracking-tight: var(--tracking-tight);
|
|
43
|
+
--tracking-normal: var(--tracking-normal);
|
|
44
|
+
--tracking-wide: var(--tracking-wide);
|
|
45
|
+
--tracking-wider: var(--tracking-wider);
|
|
46
|
+
--radius-sm: 0.25rem;
|
|
47
|
+
--radius-md: 0.5rem;
|
|
48
|
+
--radius-lg: 0.75rem;
|
|
49
|
+
--radius-xl: 1rem;
|
|
50
|
+
--radius-full: 9999px;
|
|
35
51
|
}
|
|
36
52
|
|
|
37
53
|
/* sh-ui:webview-base-start — 모바일 브라우저 / PWA 공통 기본값.
|