atomsystem 0.1.34 → 0.1.35
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/app/templates/Modal/Modal.tsx +1 -7
- package/app/templates/Theme/Theme.tsx +1 -1
- package/build/build-tokens.js +6 -1
- package/build/css/_variables.css +98 -0
- package/cli/add.js +46 -2
- package/package.json +1 -1
- /package/{css → app/templates/Badge}/badge.css +0 -0
- /package/{css → app/templates/Button}/button.css +0 -0
- /package/{css → app/templates/Card}/card.css +0 -0
- /package/{css → app/templates/Collapse}/collapse.css +0 -0
- /package/{css → app/templates/Form}/form.css +0 -0
- /package/{css → app/templates/Modal}/modal.css +0 -0
- /package/{css → app/templates/Navigation}/navigation.css +0 -0
- /package/{css → app/templates/Pagination}/pagination.css +0 -0
- /package/{css → app/templates/Tab}/tab.css +0 -0
- /package/{css → app/templates/Table}/table.css +0 -0
- /package/{css → app/templates/Toast}/toast.css +0 -0
|
@@ -21,13 +21,7 @@ export const ModalContent = ({
|
|
|
21
21
|
size = "normal",
|
|
22
22
|
}: ModalProps) => {
|
|
23
23
|
useEffect(() => {
|
|
24
|
-
|
|
25
|
-
if (!rootElement) {
|
|
26
|
-
rootElement = document.createElement("div");
|
|
27
|
-
rootElement.id = "modal-root";
|
|
28
|
-
document.body.appendChild(rootElement);
|
|
29
|
-
}
|
|
30
|
-
ReactModal.setAppElement(rootElement); // 접근성 설정
|
|
24
|
+
ReactModal.setAppElement("#modal-root"); // 접근성 설정
|
|
31
25
|
}, []);
|
|
32
26
|
|
|
33
27
|
return (
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useEffect, useState } from "react";
|
|
4
4
|
import { Radio } from "../Form/Form";
|
|
5
|
-
import { themes } from "
|
|
5
|
+
import { themes } from "@/build/typescript/theme";
|
|
6
6
|
import { Button } from "../Button/Button";
|
|
7
7
|
import { ModalContent } from "../Modal/Modal";
|
|
8
8
|
|
package/build/build-tokens.js
CHANGED
|
@@ -180,7 +180,12 @@ myStyleDictionary.registerFormat({
|
|
|
180
180
|
.join("\n");
|
|
181
181
|
|
|
182
182
|
// global(@theme)인 경우에만 수집해둔 시멘틱 변수(semanticCss)를 추가
|
|
183
|
-
|
|
183
|
+
// @theme: Tailwind 유틸리티 클래스 생성에 필요 (bg-primary, text-secondary 등)
|
|
184
|
+
// :root: 컴포넌트 CSS에서 var(--radius-common) 같이 직접 참조하는 경우 브라우저 보장
|
|
185
|
+
if (selector === "@theme") {
|
|
186
|
+
return `@theme {\n${cssVariables}\n\n${semanticCss}\n} \n\n:root {\n${cssVariables}\n} `;
|
|
187
|
+
}
|
|
188
|
+
return `${selector} {\n${cssVariables}\n} `;
|
|
184
189
|
})
|
|
185
190
|
.join("\n\n");
|
|
186
191
|
},
|
package/build/css/_variables.css
CHANGED
|
@@ -144,6 +144,104 @@
|
|
|
144
144
|
--color-border-sidenav: var(--border-sidenav);
|
|
145
145
|
}
|
|
146
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
|
+
}
|
|
244
|
+
|
|
147
245
|
.white {
|
|
148
246
|
--bg-card: var(--color-white);
|
|
149
247
|
--bg-wrapper: var(--color-gray-200);
|
package/cli/add.js
CHANGED
|
@@ -51,7 +51,7 @@ function addComponent(comp) {
|
|
|
51
51
|
|
|
52
52
|
// 컴포넌트의 CSS 파일 복제 지원
|
|
53
53
|
const cssFileName = `${comp}.css`.toLowerCase();
|
|
54
|
-
const sourceCssPath = path.join(
|
|
54
|
+
const sourceCssPath = path.join(templateDir, comp, cssFileName);
|
|
55
55
|
const targetCssPath = path.join(targetDir, cssFileName);
|
|
56
56
|
|
|
57
57
|
if (fs.existsSync(componentPath)) {
|
|
@@ -65,10 +65,54 @@ function addComponent(comp) {
|
|
|
65
65
|
copyFileSync(componentPath, targetPath);
|
|
66
66
|
console.log(`✅ ${comp} component typescript has been added to ${targetPath}`);
|
|
67
67
|
|
|
68
|
-
// 2) CSS 복사
|
|
68
|
+
// 2) CSS 복사 + globals.css에 @import 자동 추가
|
|
69
69
|
if (fs.existsSync(sourceCssPath)) {
|
|
70
70
|
copyFileSync(sourceCssPath, targetCssPath);
|
|
71
71
|
console.log(`✅ ${comp} component stylesheet has been added to ${targetCssPath}`);
|
|
72
|
+
|
|
73
|
+
// globals.css에 @import 추가
|
|
74
|
+
const globalsPath = path.join(process.cwd(), "app", "globals.css");
|
|
75
|
+
const importLine = `@import "./components/${comp}/${cssFileName}";`;
|
|
76
|
+
|
|
77
|
+
if (fs.existsSync(globalsPath)) {
|
|
78
|
+
const globalsContent = fs.readFileSync(globalsPath, "utf8");
|
|
79
|
+
|
|
80
|
+
if (!globalsContent.includes(importLine)) {
|
|
81
|
+
// "/* Component Styles */" 섹션 이후에 추가, 없으면 파일 끝에 추가
|
|
82
|
+
let updatedContent;
|
|
83
|
+
const componentSectionMarker = "/* Component Styles */";
|
|
84
|
+
|
|
85
|
+
if (globalsContent.includes(componentSectionMarker)) {
|
|
86
|
+
// 마커 이후의 마지막 @import 뒤에 추가
|
|
87
|
+
const markerIndex = globalsContent.indexOf(componentSectionMarker);
|
|
88
|
+
const afterMarker = globalsContent.slice(markerIndex);
|
|
89
|
+
const lastImportInSection = afterMarker.lastIndexOf("@import");
|
|
90
|
+
|
|
91
|
+
if (lastImportInSection !== -1) {
|
|
92
|
+
const endOfLastImport = markerIndex + lastImportInSection + afterMarker.slice(lastImportInSection).indexOf("\n") + 1;
|
|
93
|
+
updatedContent =
|
|
94
|
+
globalsContent.slice(0, endOfLastImport) +
|
|
95
|
+
importLine + "\n" +
|
|
96
|
+
globalsContent.slice(endOfLastImport);
|
|
97
|
+
} else {
|
|
98
|
+
updatedContent =
|
|
99
|
+
globalsContent.slice(0, markerIndex + componentSectionMarker.length) +
|
|
100
|
+
"\n" + importLine + "\n" +
|
|
101
|
+
globalsContent.slice(markerIndex + componentSectionMarker.length);
|
|
102
|
+
}
|
|
103
|
+
} else {
|
|
104
|
+
// 마커가 없으면 "/* Component Styles */" 섹션과 함께 파일 끝에 추가
|
|
105
|
+
updatedContent = globalsContent.trimEnd() + "\n\n/* Component Styles */\n" + importLine + "\n";
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
fs.writeFileSync(globalsPath, updatedContent, "utf8");
|
|
109
|
+
console.log(`✅ Added @import for ${comp} to globals.css`);
|
|
110
|
+
} else {
|
|
111
|
+
console.log(`ℹ️ ${comp} is already imported in globals.css`);
|
|
112
|
+
}
|
|
113
|
+
} else {
|
|
114
|
+
console.log(`⚠️ globals.css not found at ${globalsPath}. Please add manually:\n ${importLine}`);
|
|
115
|
+
}
|
|
72
116
|
}
|
|
73
117
|
// 3) 의존성 컴포넌트 자동 복사 (Recursive Copy)
|
|
74
118
|
if (dependenciesMap[comp]) {
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|