@jameskyeong/uix 0.1.6

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.
@@ -0,0 +1,396 @@
1
+ @import "tailwindcss";
2
+
3
+ /* ===== @jameskyeong/uix Font System ===== */
4
+ /* Outfit (영문) + Pretendard (한글) */
5
+ @font-face {
6
+ font-family: 'Outfit';
7
+ src: url('/fonts/Outfit/Outfit-Regular.ttf') format('truetype');
8
+ font-weight: 400;
9
+ font-style: normal;
10
+ font-display: swap;
11
+ }
12
+
13
+ @font-face {
14
+ font-family: 'Outfit';
15
+ src: url('/fonts/Outfit/Outfit-Medium.ttf') format('truetype');
16
+ font-weight: 500;
17
+ font-style: normal;
18
+ font-display: swap;
19
+ }
20
+
21
+ @font-face {
22
+ font-family: 'Outfit';
23
+ src: url('/fonts/Outfit/Outfit-SemiBold.ttf') format('truetype');
24
+ font-weight: 600;
25
+ font-style: normal;
26
+ font-display: swap;
27
+ }
28
+
29
+ @font-face {
30
+ font-family: 'Outfit';
31
+ src: url('/fonts/Outfit/Outfit-Bold.ttf') format('truetype');
32
+ font-weight: 700;
33
+ font-style: normal;
34
+ font-display: swap;
35
+ }
36
+
37
+ @font-face {
38
+ font-family: 'Pretendard';
39
+ src: url('/fonts/Pretendard/Pretendard-Regular.woff2') format('woff2');
40
+ font-weight: 400;
41
+ font-style: normal;
42
+ font-display: swap;
43
+ }
44
+
45
+ @font-face {
46
+ font-family: 'Pretendard';
47
+ src: url('/fonts/Pretendard/Pretendard-Medium.woff2') format('woff2');
48
+ font-weight: 500;
49
+ font-style: normal;
50
+ font-display: swap;
51
+ }
52
+
53
+ @font-face {
54
+ font-family: 'Pretendard';
55
+ src: url('/fonts/Pretendard/Pretendard-SemiBold.woff2') format('woff2');
56
+ font-weight: 600;
57
+ font-style: normal;
58
+ font-display: swap;
59
+ }
60
+
61
+ @font-face {
62
+ font-family: 'Pretendard';
63
+ src: url('/fonts/Pretendard/Pretendard-Bold.woff2') format('woff2');
64
+ font-weight: 700;
65
+ font-style: normal;
66
+ font-display: swap;
67
+ }
68
+
69
+ /* ===== @jameskyeong/uix Color Palette ===== */
70
+ /* 100: lightest, 300: default, 500: darkest */
71
+
72
+ :root {
73
+ /* Black (웜 블랙) */
74
+ --uix-black-100: #4a4644;
75
+ --uix-black-200: #393634;
76
+ --uix-black-300: #282524;
77
+ --uix-black-400: #1a1817;
78
+ --uix-black-500: #0d0c0b;
79
+
80
+ /* Gray (웜 그레이) */
81
+ --uix-gray-100: #a8a196;
82
+ --uix-gray-200: #8a8278;
83
+ --uix-gray-300: #6d6459;
84
+ --uix-gray-400: #534c43;
85
+ --uix-gray-500: #3a352e;
86
+
87
+ /* White (웜 화이트) */
88
+ --uix-white-100: #ffffff;
89
+ --uix-white-200: #faf9f7;
90
+ --uix-white-300: #f5f4f1;
91
+ --uix-white-400: #e8e6e1;
92
+ --uix-white-500: #d4d1ca;
93
+
94
+ /* Prime - 라벤더 블루 (메인 포인트) */
95
+ --uix-prime-100: #c4c4eb;
96
+ --uix-prime-200: #a3a3e0;
97
+ --uix-prime-300: #8383d6;
98
+ --uix-prime-400: #6363cb;
99
+ --uix-prime-500: #4a4ab0;
100
+
101
+ /* Sub1 - 코랄 (서브 포인트 1) */
102
+ --uix-sub1-100: #f5c4b8;
103
+ --uix-sub1-200: #f0a08b;
104
+ --uix-sub1-300: #e87c5d;
105
+ --uix-sub1-400: #d9593a;
106
+ --uix-sub1-500: #b84526;
107
+
108
+ /* Sub2 - 베이지 (서브 포인트 2) */
109
+ --uix-sub2-100: #f5ebe0;
110
+ --uix-sub2-200: #e6d5c3;
111
+ --uix-sub2-300: #d4bc9a;
112
+ --uix-sub2-400: #c4a67a;
113
+ --uix-sub2-500: #a8895e;
114
+
115
+ /* ===== Surface layers - Light Mode (backgrounds) ===== */
116
+ /* 100: 카드/컴포넌트 배경, 200: 구분선/보더, 300: 섹션 교차, 400: 메인 배경, 500: 강조 배경 */
117
+ --uix-surface-100: var(--uix-white-100);
118
+ --uix-surface-200: var(--uix-white-200);
119
+ --uix-surface-300: var(--uix-white-300);
120
+ --uix-surface-400: var(--uix-white-400);
121
+ --uix-surface-500: var(--uix-white-500);
122
+
123
+ /* ===== Border colors - Light Mode (subtle) ===== */
124
+ --uix-border-100: var(--uix-white-300);
125
+ --uix-border-200: var(--uix-white-400);
126
+ --uix-border-300: var(--uix-white-500);
127
+
128
+ /* ===== Text colors - Light Mode ===== */
129
+ --uix-text-100: var(--uix-black-300);
130
+ --uix-text-200: var(--uix-black-200);
131
+ --uix-text-300: var(--uix-gray-300);
132
+ }
133
+
134
+ .dark {
135
+ /* ===== Surface layers - Dark Mode (backgrounds) ===== */
136
+ /* 더 진한 블랙톤 사용 - 100이 가장 밝은 컴포넌트, 400이 메인 배경 */
137
+ --uix-surface-100: var(--uix-black-300);
138
+ --uix-surface-200: var(--uix-black-400);
139
+ --uix-surface-300: var(--uix-black-400);
140
+ --uix-surface-400: var(--uix-black-500);
141
+ --uix-surface-500: var(--uix-black-500);
142
+
143
+ /* ===== Border colors - Dark Mode (더 어둡게) ===== */
144
+ --uix-border-100: var(--uix-black-400);
145
+ --uix-border-200: var(--uix-black-300);
146
+ --uix-border-300: var(--uix-black-200);
147
+
148
+ /* ===== Text colors - Dark Mode ===== */
149
+ --uix-text-100: var(--uix-white-100);
150
+ --uix-text-200: var(--uix-white-300);
151
+ --uix-text-300: var(--uix-gray-200);
152
+ }
153
+
154
+ /* ===== Tailwind Theme Integration ===== */
155
+ @theme inline {
156
+ /* Surface Layers (backgrounds) */
157
+ --color-uix-surface-100: var(--uix-surface-100);
158
+ --color-uix-surface-200: var(--uix-surface-200);
159
+ --color-uix-surface-300: var(--uix-surface-300);
160
+ --color-uix-surface-400: var(--uix-surface-400);
161
+ --color-uix-surface-500: var(--uix-surface-500);
162
+
163
+ /* Text Colors (100: primary, 300: muted) */
164
+ --color-uix-text-100: var(--uix-text-100);
165
+ --color-uix-text-200: var(--uix-text-200);
166
+ --color-uix-text-300: var(--uix-text-300);
167
+
168
+ /* Border Colors */
169
+ --color-uix-border-100: var(--uix-border-100);
170
+ --color-uix-border-200: var(--uix-border-200);
171
+ --color-uix-border-300: var(--uix-border-300);
172
+
173
+ /* Black Palette */
174
+ --color-uix-black-100: var(--uix-black-100);
175
+ --color-uix-black-200: var(--uix-black-200);
176
+ --color-uix-black-300: var(--uix-black-300);
177
+ --color-uix-black-400: var(--uix-black-400);
178
+ --color-uix-black-500: var(--uix-black-500);
179
+
180
+ /* Gray Palette */
181
+ --color-uix-gray-100: var(--uix-gray-100);
182
+ --color-uix-gray-200: var(--uix-gray-200);
183
+ --color-uix-gray-300: var(--uix-gray-300);
184
+ --color-uix-gray-400: var(--uix-gray-400);
185
+ --color-uix-gray-500: var(--uix-gray-500);
186
+
187
+ /* White Palette */
188
+ --color-uix-white-100: var(--uix-white-100);
189
+ --color-uix-white-200: var(--uix-white-200);
190
+ --color-uix-white-300: var(--uix-white-300);
191
+ --color-uix-white-400: var(--uix-white-400);
192
+ --color-uix-white-500: var(--uix-white-500);
193
+
194
+ /* Prime Palette */
195
+ --color-uix-prime-100: var(--uix-prime-100);
196
+ --color-uix-prime-200: var(--uix-prime-200);
197
+ --color-uix-prime-300: var(--uix-prime-300);
198
+ --color-uix-prime-400: var(--uix-prime-400);
199
+ --color-uix-prime-500: var(--uix-prime-500);
200
+
201
+ /* Sub1 Palette */
202
+ --color-uix-sub1-100: var(--uix-sub1-100);
203
+ --color-uix-sub1-200: var(--uix-sub1-200);
204
+ --color-uix-sub1-300: var(--uix-sub1-300);
205
+ --color-uix-sub1-400: var(--uix-sub1-400);
206
+ --color-uix-sub1-500: var(--uix-sub1-500);
207
+
208
+ /* Sub2 Palette */
209
+ --color-uix-sub2-100: var(--uix-sub2-100);
210
+ --color-uix-sub2-200: var(--uix-sub2-200);
211
+ --color-uix-sub2-300: var(--uix-sub2-300);
212
+ --color-uix-sub2-400: var(--uix-sub2-400);
213
+ --color-uix-sub2-500: var(--uix-sub2-500);
214
+
215
+ /* Font - Outfit(영문) + Pretendard(한글) */
216
+ --font-sans: 'Outfit', 'Pretendard', -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
217
+ }
218
+
219
+ /* ===== Base Styles ===== */
220
+ html {
221
+ scroll-behavior: smooth;
222
+ }
223
+
224
+ body {
225
+ font-family: var(--font-sans);
226
+ line-height: 1.7;
227
+ -webkit-font-smoothing: antialiased;
228
+ -moz-osx-font-smoothing: grayscale;
229
+ background-color: var(--uix-surface-400);
230
+ color: var(--uix-text-100);
231
+ transition: background-color 0.2s ease, color 0.2s ease;
232
+ }
233
+
234
+ /* ===== Selection ===== */
235
+ ::selection {
236
+ background: var(--uix-prime-300);
237
+ color: var(--uix-white-100);
238
+ }
239
+
240
+ /* ===== Focus Styles ===== */
241
+ :focus-visible {
242
+ outline: 2px solid var(--uix-prime-300);
243
+ outline-offset: 2px;
244
+ }
245
+
246
+ /* ===== Glass Border ===== */
247
+ .uix-glass-border {
248
+ border: 1px solid rgba(0, 0, 0, 0.07);
249
+ }
250
+
251
+ .dark .uix-glass-border {
252
+ border: 1px solid rgba(255, 255, 255, 0.03);
253
+ }
254
+
255
+ /* ===== Common Glassmorphism Container ===== */
256
+ /* 글래스모피즘 컨테이너 공통 스타일 */
257
+ .uix-glass {
258
+ background-color: color-mix(in srgb, var(--uix-surface-200) 40%, transparent);
259
+ backdrop-filter: blur(12px) saturate(1.5);
260
+ -webkit-backdrop-filter: blur(12px) saturate(1.5);
261
+ }
262
+
263
+ /* ===== Embossed Glassmorphism Effect ===== */
264
+ /* 볼록한 엠보싱: 상단 하이라이트 + 하단 내부 그림자 + 외곽 소프트 섀도우 */
265
+
266
+ /* 레이아웃용 - 미니멀 (네비, 사이드바, 섹션) */
267
+ .uix-convex-subtle {
268
+ box-shadow:
269
+ inset 0 1px 2px 0 rgba(255, 255, 255, 0.8),
270
+ inset 0 -1px 3px 0 rgba(0, 0, 0, 0.06),
271
+ 0 2px 8px -2px rgba(0, 0, 0, 0.05);
272
+ }
273
+
274
+ .dark .uix-convex-subtle {
275
+ box-shadow:
276
+ inset 0 2px 4px 0 rgba(255, 255, 255, 0.1),
277
+ inset 0 -2px 4px 0 rgba(0, 0, 0, 0.2);
278
+ }
279
+
280
+ /* 기본 - 인터랙티브 컴포넌트용 */
281
+ .uix-convex {
282
+ box-shadow:
283
+ inset 0 1px 3px 0 rgba(255, 255, 255, 0.95),
284
+ inset 0 -1px 6px 0 rgba(0, 0, 0, 0.15),
285
+ 0 4px 16px -2px rgba(0, 0, 0, 0.08);
286
+ }
287
+
288
+ .uix-convex-sm {
289
+ box-shadow:
290
+ inset 0 1px 2px 0 rgba(255, 255, 255, 0.9),
291
+ inset 0 -1px 4px 0 rgba(0, 0, 0, 0.12),
292
+ 0 2px 8px -1px rgba(0, 0, 0, 0.06);
293
+ }
294
+
295
+ .uix-convex-lg {
296
+ box-shadow:
297
+ inset 0 1px 4px 0 rgba(255, 255, 255, 0.95),
298
+ inset 0 -2px 8px 0 rgba(0, 0, 0, 0.18),
299
+ 0 6px 24px -4px rgba(0, 0, 0, 0.1);
300
+ }
301
+
302
+ /* 다크모드 볼록 효과 */
303
+ .dark .uix-convex {
304
+ box-shadow:
305
+ inset 0 1px 4px 0 rgba(255, 255, 255, 0.18),
306
+ inset 0 -2px 10px 0 rgba(0, 0, 0, 0.4),
307
+ 0 10px 36px -2px rgba(0, 0, 0, 0.6);
308
+ }
309
+
310
+ .dark .uix-convex-sm {
311
+ box-shadow:
312
+ inset 0 1px 2px 0 rgba(255, 255, 255, 0.15),
313
+ inset 0 -1px 6px 0 rgba(0, 0, 0, 0.35),
314
+ 0 6px 24px -1px rgba(0, 0, 0, 0.5);
315
+ }
316
+
317
+ .dark .uix-convex-lg {
318
+ box-shadow:
319
+ inset 0 2px 6px 0 rgba(255, 255, 255, 0.2),
320
+ inset 0 -3px 12px 0 rgba(0, 0, 0, 0.45),
321
+ 0 14px 48px -4px rgba(0, 0, 0, 0.65);
322
+ }
323
+
324
+ /* ===== 색상 배경용 볼록 효과 ===== */
325
+ /* 색상이 있는 버튼/뱃지 등에 자동 적용 - 강한 하이라이트 + 진한 하단 그림자 */
326
+
327
+ .uix-convex-colored {
328
+ box-shadow:
329
+ inset 0 2px 6px 0 rgba(255, 255, 255, 0.4),
330
+ inset 0 -3px 8px 0 rgba(0, 0, 0, 0.35);
331
+ }
332
+
333
+ .uix-convex-colored-sm {
334
+ box-shadow:
335
+ inset 0 1px 4px 0 rgba(255, 255, 255, 0.35),
336
+ inset 0 -2px 5px 0 rgba(0, 0, 0, 0.3);
337
+ }
338
+
339
+ /* 다크모드에서도 동일하게 유지 (색상 배경은 라이트/다크 구분 없음) */
340
+ .dark .uix-convex-colored {
341
+ box-shadow:
342
+ inset 0 2px 6px 0 rgba(255, 255, 255, 0.4),
343
+ inset 0 -3px 8px 0 rgba(0, 0, 0, 0.35);
344
+ }
345
+
346
+ .dark .uix-convex-colored-sm {
347
+ box-shadow:
348
+ inset 0 1px 4px 0 rgba(255, 255, 255, 0.35),
349
+ inset 0 -2px 5px 0 rgba(0, 0, 0, 0.3);
350
+ }
351
+
352
+ /* ===== Enhanced Glassmorphism ===== */
353
+ /* 상단 하이라이트 + 노이즈 텍스처로 실제 유리 질감 표현 */
354
+ /* Note: 부모 요소가 positioned (relative, absolute, fixed 등)여야 함 */
355
+
356
+ /* 상단 하이라이트 - 빛 반사 효과 (1px 라인) */
357
+ .uix-glass-noise::before {
358
+ content: '';
359
+ position: absolute;
360
+ top: 0;
361
+ left: 10%;
362
+ right: 10%;
363
+ height: 1px;
364
+ z-index: 1;
365
+ background: linear-gradient(
366
+ to right,
367
+ transparent 0%,
368
+ rgba(255, 255, 255, 0.5) 50%,
369
+ transparent 100%
370
+ );
371
+ pointer-events: none;
372
+ }
373
+
374
+ /* 내부 상단 글로우 */
375
+ .uix-glass-noise::after {
376
+ content: '';
377
+ position: absolute;
378
+ inset: 0;
379
+ z-index: 1;
380
+ border-radius: inherit;
381
+ box-shadow: inset 0 1px 1px 0 rgba(255, 255, 255, 0.1);
382
+ pointer-events: none;
383
+ }
384
+
385
+ .dark .uix-glass-noise::before {
386
+ background: linear-gradient(
387
+ to right,
388
+ transparent 0%,
389
+ rgba(255, 255, 255, 0.25) 50%,
390
+ transparent 100%
391
+ );
392
+ }
393
+
394
+ .dark .uix-glass-noise::after {
395
+ box-shadow: inset 0 1px 1px 0 rgba(255, 255, 255, 0.05);
396
+ }
package/package.json ADDED
@@ -0,0 +1,105 @@
1
+ {
2
+ "name": "@jameskyeong/uix",
3
+ "version": "0.1.6",
4
+ "description": "React UI component library with warm, elegant design system",
5
+ "type": "module",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./styles.css": "./dist/styles.css"
16
+ },
17
+ "bin": {
18
+ "uix": "./dist/cli/index.js"
19
+ },
20
+ "files": [
21
+ "dist/index.js",
22
+ "dist/index.cjs",
23
+ "dist/index.d.ts",
24
+ "dist/styles.css",
25
+ "dist/cli"
26
+ ],
27
+ "scripts": {
28
+ "dev": "vite --port 9999 --open",
29
+ "build": "vite build --mode lib && pnpm build:css && pnpm build:cli",
30
+ "build:lib": "vite build --mode lib",
31
+ "build:css": "cp src/styles/theme.css dist/styles.css",
32
+ "build:cli": "tsc -p tsconfig.cli.json && cp -r src/cli/themes dist/cli/",
33
+ "build:showcase": "vite build",
34
+ "preview": "vite preview",
35
+ "typecheck": "tsc --noEmit",
36
+ "lint": "biome check src showcase",
37
+ "lint:fix": "biome check --write src showcase",
38
+ "format": "biome format --write src showcase",
39
+ "quality": "pnpm lint && pnpm typecheck",
40
+ "prepublishOnly": "pnpm quality && pnpm build",
41
+ "pub": "npm version patch && git push --follow-tags",
42
+ "pub:minor": "npm version minor && git push --follow-tags",
43
+ "pub:major": "npm version major && git push --follow-tags",
44
+ "prepare": "husky"
45
+ },
46
+ "peerDependencies": {
47
+ "clsx": ">=2",
48
+ "lucide-react": ">=0.5",
49
+ "motion": ">=12",
50
+ "react": ">=18",
51
+ "react-dom": ">=18",
52
+ "shiki": ">=1",
53
+ "tailwind-merge": ">=2",
54
+ "tailwindcss": ">=4"
55
+ },
56
+ "dependencies": {
57
+ "prompts": "^2.4.2"
58
+ },
59
+ "devDependencies": {
60
+ "@biomejs/biome": "^2.3.10",
61
+ "@tailwindcss/postcss": "^4",
62
+ "@types/node": "^20",
63
+ "@types/prompts": "^2.4.9",
64
+ "@types/react": "^19",
65
+ "@types/react-dom": "^19",
66
+ "@vitejs/plugin-react": "^4.5.2",
67
+ "clsx": "^2.1.1",
68
+ "husky": "^9.1.7",
69
+ "lucide-react": "^0.562.0",
70
+ "motion": "^12.23.26",
71
+ "react": "^19.2.3",
72
+ "react-dom": "^19.2.3",
73
+ "react-router-dom": "^7.11.0",
74
+ "shiki": "^3.20.0",
75
+ "tailwind-merge": "^3.4.0",
76
+ "tailwindcss": "^4",
77
+ "typescript": "^5",
78
+ "vite": "^6.3.5",
79
+ "vite-plugin-dts": "^4.5.4"
80
+ },
81
+ "homepage": "https://github.com/jameskyeong/uix",
82
+ "repository": {
83
+ "type": "git",
84
+ "url": "git+https://github.com/jameskyeong/uix.git"
85
+ },
86
+ "bugs": {
87
+ "url": "https://github.com/jameskyeong/uix/issues"
88
+ },
89
+ "keywords": [
90
+ "react",
91
+ "ui",
92
+ "components",
93
+ "design-system",
94
+ "tailwindcss"
95
+ ],
96
+ "author": "jameskyeong",
97
+ "license": "MIT",
98
+ "publishConfig": {
99
+ "access": "public",
100
+ "registry": "https://registry.npmjs.org"
101
+ },
102
+ "sideEffects": [
103
+ "*.css"
104
+ ]
105
+ }