atomsystem 0.1.38 → 0.1.40

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,139 @@
1
+ "use client"
2
+
3
+ import Link from "next/link";
4
+ import { usePathname } from "next/navigation";
5
+ import gsap from 'gsap';
6
+ import { useGSAP } from '@gsap/react';
7
+ import { createContext, useContext, useRef, useState } from "react";
8
+
9
+ // Icons
10
+ import MenuIcon from '@mui/icons-material/Menu';
11
+
12
+ gsap.registerPlugin(useGSAP); // register the hook to avoid React version discrepancies
13
+
14
+ // Navigation을 베이스 interface로 정의
15
+ export interface Sidebar {
16
+ children: React.ReactNode;
17
+ minWidth?: number
18
+ }
19
+
20
+ export interface NavLink {
21
+ children: React.ReactNode;
22
+ href: string;
23
+ }
24
+
25
+ interface SideContext {
26
+ isOpen: boolean;
27
+ setToggle: (open: boolean) => void;
28
+ }
29
+
30
+ const SideContext = createContext<SideContext | undefined>(undefined);
31
+
32
+ const useSideContext = () => {
33
+ const context = useContext(SideContext);
34
+ if (!context) {
35
+ return { isOpen: false, setToggle: () => {} };
36
+ }
37
+ return context;
38
+ }
39
+
40
+ const SidebarProvider = ({ children }: { children: React.ReactNode }) => {
41
+ const [isOpen, setIsOpen] = useState(true);
42
+ const setToggle = (open: boolean) => setIsOpen(open);
43
+
44
+ return (
45
+ <SideContext.Provider value={{ isOpen, setToggle }}>
46
+ {children}
47
+ </SideContext.Provider>
48
+ );
49
+ };
50
+
51
+ const SidebarToggle = () => {
52
+ const { isOpen, setToggle } = useSideContext();
53
+ return (
54
+ <button className="cursor-pointer" onClick={() => setToggle(!isOpen)}><MenuIcon className="text-text-sub" sx={{fontSize: "20px"}}/></button>
55
+ )
56
+ }
57
+
58
+ const Sidebar = ({ children, minWidth }: Sidebar) => {
59
+ const { isOpen } = useSideContext();
60
+ const sidebarRef = useRef<HTMLDivElement>(null);
61
+
62
+ useGSAP(() => {
63
+ if (sidebarRef.current) {
64
+ if (isOpen) {
65
+ // 열릴 때: 나타나면서 제자리로
66
+ gsap.to(sidebarRef.current, {
67
+ display: "flex",
68
+ opacity: 1,
69
+ x: 0,
70
+ width: minWidth,
71
+ minWidth: minWidth,
72
+ duration: 0.3,
73
+ ease: "power2.out"
74
+ });
75
+ } else {
76
+ // 닫힐 때: 사라지면서 왼쪽으로, 너비도 0으로
77
+ gsap.to(sidebarRef.current, {
78
+ opacity: 0,
79
+ x: -20,
80
+ width: 0,
81
+ minWidth: 0,
82
+ duration: 0.3,
83
+ ease: "power2.in",
84
+ onComplete: () => {
85
+ gsap.set(sidebarRef.current, { display: "none" });
86
+ }
87
+ });
88
+ }
89
+ }
90
+ }, [isOpen]);
91
+
92
+
93
+ return (
94
+ <aside ref={sidebarRef} className={`nav-side flex-col overflow-hidden h-full`} style={{ width: isOpen ? minWidth : 0, minWidth: isOpen ? minWidth : 0 }}>
95
+ {children}
96
+ </aside>
97
+ )
98
+ }
99
+
100
+
101
+ const SideNavBrand = ({children, href}: NavLink) => {
102
+ return (
103
+ <Link href={href} className="flex items-center">{children}</Link>
104
+ )
105
+ }
106
+
107
+ const SideNavList = ({children}: Sidebar) => {
108
+ return (
109
+ <ul className="nav-list flex flex-col">{children}</ul>
110
+ )
111
+ }
112
+
113
+
114
+ const SideNavItem = ({children}: Sidebar) => {
115
+ return (
116
+ <li>{children}</li>
117
+ )
118
+ }
119
+
120
+ const SideNavLink = ({children, href}: NavLink) => {
121
+
122
+ const pathname = usePathname();
123
+ const active = pathname === href;
124
+
125
+ return (
126
+ <Link href={href} className={`nav-link text-nowrap ${active ? "active" : ""}`}>{children}</Link>
127
+ )
128
+ }
129
+
130
+
131
+ export {
132
+ Sidebar,
133
+ SidebarProvider,
134
+ SidebarToggle,
135
+ SideNavBrand,
136
+ SideNavList,
137
+ SideNavItem,
138
+ SideNavLink
139
+ }
@@ -0,0 +1,4 @@
1
+ .nav-side{
2
+ background-color: var(--bg-card);
3
+ border-right: 1px solid var(--border-standard);
4
+ }
@@ -97,9 +97,13 @@
97
97
 
98
98
  --color-bg-card: var(--bg-card);
99
99
  --color-bg-wrapper: var(--bg-wrapper);
100
+ --color-bg-hover: var(--bg-hover);
100
101
  --color-bg-input-standard: var(--bg-input-standard);
101
102
  --color-bg-input-hover: var(--bg-input-hover);
102
103
  --color-bg-input-disabled: var(--bg-input-disabled);
104
+ --color-text-title: var(--text-title);
105
+ --color-text-body: var(--text-body);
106
+ --color-text-sub: var(--text-sub);
103
107
  --color-text-standard: var(--text-standard);
104
108
  --color-text-active: var(--text-active);
105
109
  --color-text-placeholder: var(--text-placeholder);
@@ -132,122 +136,26 @@
132
136
  --color-table-body-text: var(--table-body-text);
133
137
  --color-table-body-border: var(--table-body-border);
134
138
  --color-pagination-bg-hover: var(--pagination-bg-hover);
135
- --color-bg-topnav: var(--bg-topnav);
136
- --color-text-topnav-standard: var(--text-topnav-standard);
137
- --color-text-topnav-active: var(--text-topnav-active);
138
- --color-text-topnav-sub: var(--text-topnav-sub);
139
- --color-border-topnav: var(--border-topnav);
140
- --color-bg-sidenav: var(--bg-sidenav);
141
- --color-text-sidenav-standard: var(--text-sidenav-standard);
142
- --color-text-sidenav-active: var(--text-sidenav-active);
143
- --color-text-sidenav-sub: var(--text-sidenav-sub);
144
- --color-border-sidenav: var(--border-sidenav);
145
- }
146
-
147
- :root {
148
- --color-gray-100: #f5f5f5;
149
- --color-gray-200: #e6e6e6;
150
- --color-gray-300: #dbdbdb;
151
- --color-gray-400: #d4d4d4;
152
- --color-gray-500: #cccccc;
153
- --color-gray-600: #bfbfbf;
154
- --color-gray-700: #b3b3b3;
155
- --color-gray-800: #a6a6a6;
156
- --color-gray-900: #999999;
157
- --color-gray-950: #707070;
158
- --color-dark-100: #111111;
159
- --color-dark-200: #222222;
160
- --color-dark-300: #333333;
161
- --color-dark-400: #444444;
162
- --color-dark-500: #555555;
163
- --color-dark-600: #666666;
164
- --color-dark-700: #777777;
165
- --color-dark-800: #888888;
166
- --color-dark-900: #999999;
167
- --color-dark-950: #b2b2b2;
168
- --color-blue-100: #e3f2fd;
169
- --color-blue-200: #bbdefb;
170
- --color-blue-300: #90caf9;
171
- --color-blue-400: #64b5f6;
172
- --color-blue-500: #2196f3;
173
- --color-blue-600: #1e88e5;
174
- --color-blue-700: #1976d2;
175
- --color-blue-800: #1565c0;
176
- --color-blue-900: #0d47a1;
177
- --color-blue-950: #0a2f6b;
178
- --color-indigo-100: #e8eaf6;
179
- --color-indigo-200: #c5cae9;
180
- --color-indigo-300: #7986cb;
181
- --color-indigo-400: #3f51b5;
182
- --color-indigo-500: #162c4e;
183
- --color-indigo-600: #122542;
184
- --color-indigo-700: #0e1d35;
185
- --color-indigo-800: #0a1628;
186
- --color-indigo-900: #070f1b;
187
- --color-indigo-950: #04080e;
188
- --color-red-100: #ffebee;
189
- --color-red-200: #ffcdd2;
190
- --color-red-300: #ef9a9a;
191
- --color-red-400: #e57373;
192
- --color-red-500: #f44336;
193
- --color-red-600: #e53935;
194
- --color-red-700: #d32f2f;
195
- --color-red-800: #c62828;
196
- --color-red-900: #b71c1c;
197
- --color-red-950: #7f1212;
198
- --color-yellow-100: #fff8e1;
199
- --color-yellow-200: #ffecb3;
200
- --color-yellow-300: #ffe082;
201
- --color-yellow-400: #ffd54f;
202
- --color-yellow-500: #ffb300;
203
- --color-yellow-600: #ffa000;
204
- --color-yellow-700: #ff8f00;
205
- --color-yellow-800: #ff6f00;
206
- --color-yellow-900: #e65100;
207
- --color-yellow-950: #9e3600;
208
- --color-green-100: #e8f5e9;
209
- --color-green-200: #c8e6c9;
210
- --color-green-300: #a5d6a7;
211
- --color-green-400: #81c784;
212
- --color-green-500: #4caf50;
213
- --color-green-600: #43a047;
214
- --color-green-700: #388e3c;
215
- --color-green-800: #2e7d32;
216
- --color-green-900: #1b5e20;
217
- --color-green-950: #104015;
218
- --color-black: #111111;
219
- --color-white: #fafafa;
220
- --color-primary: var(--color-blue-500);
221
- --color-secondary: var(--color-indigo-500);
222
- --color-danger: var(--color-red-500);
223
- --color-warning: var(--color-yellow-500);
224
- --color-info: var(--color-gray-900);
225
- --color-success: var(--color-green-500);
226
- --text-h1: 40px;
227
- --text-h2: 36px;
228
- --text-h3: 28px;
229
- --text-h4: 24px;
230
- --text-h5: 20px;
231
- --text-h6: 16px;
232
- --text-body: 16px;
233
- --text-sm: 12px;
234
- --font-weight-header: 700;
235
- --radius-common: 4px;
236
- --radius-circle: 10000000px;
237
- --font-spoqaNeo: Spoqa Han Sans Neo;
238
- --spacing-common-y: 12px;
239
- --spacing-common-x: 16px;
240
- --spacing-gap-small: 4px;
241
- --spacing-sm-y: 8px;
242
- --spacing-small: 20px;
243
- }
139
+ --color-callout-note-bg: var(--callout-note-bg);
140
+ --color-callout-note-text: var(--callout-note-text);
141
+ --color-callout-tip-bg: var(--callout-tip-bg);
142
+ --color-callout-tip-text: var(--callout-tip-text);
143
+ --color-callout-danger-bg: var(--callout-danger-bg);
144
+ --color-callout-danger-text: var(--callout-danger-text);
145
+ --color-callout-warning-bg: var(--callout-warning-bg);
146
+ --color-callout-warning-text: var(--callout-warning-text);
147
+ }
244
148
 
245
149
  .white {
246
150
  --bg-card: var(--color-white);
247
151
  --bg-wrapper: var(--color-gray-200);
152
+ --bg-hover: var(--color-gray-200);
248
153
  --bg-input-standard: var(--color-gray-100);
249
154
  --bg-input-hover: var(--color-gray-200);
250
155
  --bg-input-disabled: var(--color-gray-500);
156
+ --text-title: var(--color-dark-100);
157
+ --text-body: var(--color-dark-400);
158
+ --text-sub: var(--color-gray-950);
251
159
  --text-standard: var(--color-dark-300);
252
160
  --text-active: var(--color-gray-100);
253
161
  --text-placeholder: var(--color-gray-950);
@@ -280,14 +188,26 @@
280
188
  --table-body-text: var(--color-dark-300);
281
189
  --table-body-border: var(--color-gray-300);
282
190
  --pagination-bg-hover: var(--color-gray-100);
191
+ --callout-note-bg: var(--color-gray-100);
192
+ --callout-note-text: var(--color-gray-900);
193
+ --callout-tip-bg: var(--color-green-100);
194
+ --callout-tip-text: var(--color-green-900);
195
+ --callout-danger-bg: var(--color-red-100);
196
+ --callout-danger-text: var(--color-red-900);
197
+ --callout-warning-bg: var(--color-yellow-100);
198
+ --callout-warning-text: var(--color-yellow-900);
283
199
  }
284
200
 
285
201
  .dark {
286
202
  --bg-card: var(--color-dark-200);
287
203
  --bg-wrapper: var(--color-black);
204
+ --bg-hover: var(--color-dark-400);
288
205
  --bg-input-standard: var(--color-dark-300);
289
206
  --bg-input-hover: var(--color-dark-400);
290
207
  --bg-input-disabled: var(--color-dark-200);
208
+ --text-title: var(--color-white);
209
+ --text-body: var(--color-gray-200);
210
+ --text-sub: var(--color-gray-600);
291
211
  --text-standard: var(--color-white);
292
212
  --text-active: var(--color-white);
293
213
  --text-placeholder: var(--color-gray-950);
@@ -320,48 +240,12 @@
320
240
  --table-body-text: var(--color-gray-200);
321
241
  --table-body-border: var(--color-dark-400);
322
242
  --pagination-bg-hover: var(--color-dark-300);
323
- }
324
-
325
- .topnav-standard {
326
- --bg-topnav: var(--color-white);
327
- --text-topnav-standard: var(--color-dark-300);
328
- --text-topnav-active: var(--color-blue-500);
329
- --text-topnav-sub: var(--color-gray-600);
330
- --border-topnav: var(--color-gray-300);
331
- --spacing-topnav-x: var(--spacing-common-x);
332
- --spacing-topnav-y: var(--spacing-common-y);
333
- --spacing-topnav-gap: var(--spacing-common-x);
334
- }
335
-
336
- .topnav-dark {
337
- --bg-topnav: var(--color-dark-200);
338
- --text-topnav-standard: var(--color-white);
339
- --text-topnav-active: var(--color-blue-400);
340
- --text-topnav-sub: var(--color-dark-600);
341
- --border-topnav: var(--color-dark-400);
342
- --spacing-topnav-x: var(--spacing-common-x);
343
- --spacing-topnav-y: var(--spacing-common-y);
344
- --spacing-topnav-gap: var(--spacing-common-x);
345
- }
346
-
347
- .sidenav-standard {
348
- --bg-sidenav: var(--color-white);
349
- --text-sidenav-standard: var(--color-dark-300);
350
- --text-sidenav-active: var(--color-blue-500);
351
- --text-sidenav-sub: var(--color-gray-600);
352
- --border-sidenav: var(--color-gray-300);
353
- --spacing-sidenav-x: var(--spacing-common-x);
354
- --spacing-sidenav-y: var(--spacing-common-y);
355
- --spacing-sidenav-gap: var(--spacing-common-x);
356
- }
357
-
358
- .sidenav-dark {
359
- --bg-sidenav: var(--color-dark-200);
360
- --text-sidenav-standard: var(--color-white);
361
- --text-sidenav-active: var(--color-blue-400);
362
- --text-sidenav-sub: var(--color-dark-600);
363
- --border-sidenav: var(--color-dark-400);
364
- --spacing-sidenav-x: var(--spacing-common-x);
365
- --spacing-sidenav-y: var(--spacing-common-y);
366
- --spacing-sidenav-gap: var(--spacing-common-x);
243
+ --callout-note-bg: var(--color-dark-300);
244
+ --callout-note-text: var(--color-white);
245
+ --callout-tip-bg: var(--color-green-950);
246
+ --callout-tip-text: var(--color-green-200);
247
+ --callout-danger-bg: var(--color-red-950);
248
+ --callout-danger-text: var(--color-red-200);
249
+ --callout-warning-bg: var(--color-yellow-950);
250
+ --callout-warning-text: var(--color-yellow-200);
367
251
  }
@@ -2,13 +2,5 @@ export const themes: Record<string, string[]> = {
2
2
  "global": [
3
3
  "white",
4
4
  "dark"
5
- ],
6
- "topnav": [
7
- "topnav-standard",
8
- "topnav-dark"
9
- ],
10
- "sidenav": [
11
- "sidenav-standard",
12
- "sidenav-dark"
13
5
  ]
14
6
  };
package/cli/add.js CHANGED
@@ -20,6 +20,7 @@ const components = [
20
20
  "Collapse",
21
21
  "CodeBlock",
22
22
  "Navigation",
23
+ "Sidebar",
23
24
  "Input",
24
25
  "Theme",
25
26
  "Tab",
@@ -28,8 +29,10 @@ const components = [
28
29
  "Table",
29
30
  "Modal",
30
31
  "TOC",
32
+ "Dropdown",
31
33
  ]; // 여기 추가할 컴포넌트 목록
32
34
 
35
+
33
36
  // 명령어에서 컴포넌트 이름 가져오기
34
37
  const args = process.argv.slice(2); // 'npx atomsystem-add Button -> [Button]'
35
38
  const component = args[0] || "all"; // '사용자가 입력하지 않으면 기본적으로 'all''
package/css/text.css CHANGED
@@ -2,24 +2,17 @@ body{
2
2
  @apply text-text-standard
3
3
  }
4
4
 
5
- h1{
6
- @apply text-h1 font-header
7
- }
8
- h2{
9
- @apply text-h2 font-header
10
- }
11
- h3{
12
- @apply text-h3 font-header
13
- }
14
- h4{
15
- @apply text-h4 font-header
16
- }
17
- h5{
18
- @apply text-h5 font-header
19
- }
20
- h6{
21
- @apply text-h6 font-header
5
+ h1, h2, h3, h4, h5, h6 {
6
+ @apply text-text-title font-header
22
7
  }
8
+
9
+ h1{ @apply text-h1 }
10
+ h2{ @apply text-h2 }
11
+ h3{ @apply text-h3 }
12
+ h4{ @apply text-h4 }
13
+ h5{ @apply text-h5 }
14
+ h6{ @apply text-h6 }
15
+
23
16
  p{
24
- @apply text-body
17
+ @apply text-text-body text-body
25
18
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atomsystem",
3
- "version": "0.1.38",
3
+ "version": "0.1.40",
4
4
  "type": "module",
5
5
  "homepage": "https://system.atomground.com",
6
6
  "bin": {
@@ -28,9 +28,13 @@
28
28
  "style-dictionary": "^4.2.0"
29
29
  },
30
30
  "dependencies": {
31
+ "@emotion/react": "^11.14.0",
32
+ "@emotion/styled": "^11.14.1",
31
33
  "@gsap/react": "^2.1.2",
32
34
  "@mdx-js/loader": "^3.1.0",
33
35
  "@mdx-js/react": "^3.1.0",
36
+ "@mui/icons-material": "^7.3.9",
37
+ "@mui/material": "^7.3.9",
34
38
  "@next/mdx": "^15.4.6",
35
39
  "@next/third-parties": "^15.0.3",
36
40
  "@tailwindcss/postcss": "^4.0.17",
@@ -40,14 +44,17 @@
40
44
  "gsap": "^3.12.7",
41
45
  "highlight.js": "^11.11.1",
42
46
  "inquirer": "^12.4.2",
47
+ "lucide-react": "^1.7.0",
43
48
  "next": "15.2.8",
44
49
  "ora": "^9.3.0",
45
50
  "react": "^18.0.0",
46
51
  "react-dom": "^18.0.0",
47
52
  "react-modal": "^3.16.3",
48
53
  "react-responsive": "^10.0.1",
54
+ "remark-gfm": "^4.0.1",
49
55
  "sd-tailwindcss-transformer": "^2.0.0",
50
- "style-dictionary": "^4.2.0"
56
+ "style-dictionary": "^4.2.0",
57
+ "tailwind-merge": "^3.5.0"
51
58
  },
52
59
  "devDependencies": {
53
60
  "@types/node": "^20",