podo-ui 0.1.46 → 0.2.0

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.
Files changed (64) hide show
  1. package/package.json +2 -2
  2. package/react/atom/pagination.module.scss +61 -0
  3. package/react/atom/pagination.tsx +87 -0
  4. package/react.ts +2 -1
  5. package/readme.md +3 -3
  6. package/scss/color/theme.scss +92 -0
  7. package/scss/form/checkbox-radio.scss +48 -0
  8. package/scss/form/toggle.scss +16 -0
  9. package/scss/layout/bg-elevation.scss +14 -0
  10. package/scss/reset.scss +2 -0
  11. package/.prettierignore +0 -9
  12. package/.prettierrc +0 -8
  13. package/ARCHITECTURE.md +0 -727
  14. package/cli/icon-scss.js +0 -56
  15. package/eslint.config.js +0 -26
  16. package/index.html +0 -12
  17. package/next-env.d.ts +0 -5
  18. package/next.config.mjs +0 -10
  19. package/public/logo.svg +0 -57
  20. package/src/app/components/button/page.module.scss +0 -253
  21. package/src/app/components/button/page.tsx +0 -366
  22. package/src/app/components/checkbox-radio/page.module.scss +0 -95
  23. package/src/app/components/checkbox-radio/page.tsx +0 -265
  24. package/src/app/components/input/page.module.scss +0 -112
  25. package/src/app/components/input/page.tsx +0 -196
  26. package/src/app/components/select/page.module.scss +0 -90
  27. package/src/app/components/select/page.tsx +0 -225
  28. package/src/app/components/textarea/page.module.scss +0 -81
  29. package/src/app/components/textarea/page.tsx +0 -103
  30. package/src/app/foundation/colors/page.module.scss +0 -370
  31. package/src/app/foundation/colors/page.tsx +0 -200
  32. package/src/app/foundation/icons/page.module.scss +0 -229
  33. package/src/app/foundation/icons/page.tsx +0 -229
  34. package/src/app/foundation/spacing/page.module.scss +0 -258
  35. package/src/app/foundation/spacing/page.tsx +0 -289
  36. package/src/app/foundation/typography/page.module.scss +0 -148
  37. package/src/app/foundation/typography/page.tsx +0 -207
  38. package/src/app/getting-started/installation/page.module.scss +0 -157
  39. package/src/app/getting-started/installation/page.tsx +0 -154
  40. package/src/app/getting-started/usage/page.module.scss +0 -209
  41. package/src/app/getting-started/usage/page.tsx +0 -242
  42. package/src/app/home.module.scss +0 -541
  43. package/src/app/layout/grid/page.module.scss +0 -178
  44. package/src/app/layout/grid/page.tsx +0 -217
  45. package/src/app/layout/responsive/page.module.scss +0 -237
  46. package/src/app/layout/responsive/page.tsx +0 -279
  47. package/src/app/layout.module.scss +0 -14
  48. package/src/app/layout.tsx +0 -30
  49. package/src/app/page.module.scss +0 -71
  50. package/src/app/page.tsx +0 -284
  51. package/src/components/CodeBlock.module.scss +0 -29
  52. package/src/components/CodeBlock.tsx +0 -18
  53. package/src/components/Navigation.module.scss +0 -104
  54. package/src/components/Navigation.tsx +0 -96
  55. package/src/components/PageHeader.module.scss +0 -24
  56. package/src/components/PageHeader.tsx +0 -17
  57. package/src/components/ThemeToggle.module.scss +0 -34
  58. package/src/components/ThemeToggle.tsx +0 -47
  59. package/src/styles/custom.scss +0 -11
  60. package/src/styles/doc-common.scss +0 -119
  61. package/src/styles/font-family.scss +0 -80
  62. package/src/styles/icon.scss +0 -5
  63. package/src/vite-env.d.ts +0 -1
  64. package/tsconfig.json +0 -26
@@ -1,370 +0,0 @@
1
- @use '../../../../mixin' as *;
2
-
3
- .section {
4
- margin-bottom: s(10);
5
-
6
- h2 {
7
- @include display5;
8
- margin: 0 0 s(5) 0;
9
- color: color(default-deep);
10
- }
11
-
12
- h3 {
13
- @include p1; font-weight: 600;
14
- margin: s(7) 0 s(4) 0;
15
- color: color(default-deep);
16
- }
17
-
18
- p {
19
- @include p2;
20
- color: color(default);
21
- line-height: 1.8;
22
- margin: 0 0 s(5) 0;
23
- }
24
- }
25
-
26
- .codeBlock {
27
- background: color(bg-modal);
28
- border: 1px solid color(default-outline);
29
- border-radius: r(3);
30
- overflow: hidden;
31
- margin-bottom: s(4);
32
-
33
- .codeHeader {
34
- padding: s(3) s(5);
35
- background: color(bg-elevation-1);
36
- border-bottom: 1px solid color(default-outline);
37
- @include p4;
38
- font-weight: 600;
39
- color: color(default-deep);
40
- }
41
-
42
- pre {
43
- margin: 0;
44
- padding: s(5);
45
- overflow-x: auto;
46
- background: color(bg-elevation);
47
-
48
- code {
49
- @include p3;
50
- font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
51
- color: color(default-deep);
52
- white-space: pre;
53
- }
54
- }
55
- }
56
-
57
- .note {
58
- display: flex;
59
- gap: s(4);
60
- padding: s(5);
61
- border-radius: r(4);
62
- margin-bottom: s(5);
63
- background: color(info-fill);
64
- border: 1px solid color(info-outline);
65
- color: color(info);
66
-
67
- > i {
68
- font-size: 20px;
69
- flex-shrink: 0;
70
- color: color(info);
71
- }
72
-
73
- strong {
74
- display: block;
75
- margin-bottom: s(2);
76
- }
77
- }
78
-
79
- // Color Grid
80
- .colorGrid {
81
- display: grid;
82
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
83
- gap: s(5);
84
- margin-top: s(6);
85
- }
86
-
87
- .colorCard {
88
- border: 1px solid color(default-outline);
89
- border-radius: r(4);
90
- overflow: hidden;
91
- transition: all 0.3s;
92
-
93
- &:hover {
94
- border-color: color(primary);
95
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
96
- }
97
- }
98
-
99
- .colorPreview {
100
- height: 120px;
101
-
102
- &[data-color='primary'] {
103
- background: color(primary);
104
- }
105
- &[data-color='default'] {
106
- background: color(default);
107
- }
108
- &[data-color='default-deep'] {
109
- background: color(default-deep);
110
- }
111
- &[data-color='info'] {
112
- background: color(info);
113
- }
114
- &[data-color='link'] {
115
- background: color(link);
116
- }
117
- &[data-color='success'] {
118
- background: color(success);
119
- }
120
- &[data-color='warning'] {
121
- background: color(warning);
122
- }
123
- &[data-color='danger'] {
124
- background: color(danger);
125
- }
126
- }
127
-
128
- .colorInfo {
129
- padding: s(5);
130
-
131
- h3 {
132
- @include p2; font-weight: 600;
133
- margin: 0 0 s(2) 0;
134
- color: color(default-deep);
135
- }
136
- }
137
-
138
- .colorName {
139
- @include p4;
140
- font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
141
- color: color(default);
142
- margin: 0 0 s(2) 0;
143
- }
144
-
145
- .colorDesc {
146
- @include p4;
147
- color: color(default);
148
- margin: 0;
149
- }
150
-
151
- // Variants Grid
152
- .variantsGrid {
153
- display: grid;
154
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
155
- gap: s(4);
156
- margin-top: s(5);
157
- }
158
-
159
- .variantCard {
160
- border: 1px solid color(default-outline);
161
- border-radius: r(3);
162
- overflow: hidden;
163
- transition: all 0.3s;
164
-
165
- &:hover {
166
- border-color: color(primary);
167
- }
168
- }
169
-
170
- .variantSwatch {
171
- height: 80px;
172
-
173
- &[data-variant='base'] {
174
- background: color(primary);
175
- }
176
- &[data-variant='hover'] {
177
- background: color(primary-hover);
178
- }
179
- &[data-variant='pressed'] {
180
- background: color(primary-pressed);
181
- }
182
- &[data-variant='focus'] {
183
- background: color(primary-focus);
184
- }
185
- &[data-variant='fill'] {
186
- background: color(primary-fill);
187
- border: 1px solid color(primary-outline);
188
- }
189
- &[data-variant='reverse'] {
190
- background: color(primary-reverse);
191
- border: 1px solid color(default-outline);
192
- }
193
- &[data-variant='outline'] {
194
- background: color(primary-outline);
195
- }
196
- }
197
-
198
- .variantInfo {
199
- padding: s(4);
200
-
201
- h4 {
202
- @include p3-semibold;
203
- margin: 0 0 s(1) 0;
204
- color: color(default-deep);
205
- }
206
-
207
- p {
208
- @include p5;
209
- margin: 0 0 s(2) 0;
210
- color: color(default);
211
- }
212
-
213
- code {
214
- @include p5;
215
- font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
216
- color: color(primary);
217
- background: color(primary-fill);
218
- padding: 2px 6px;
219
- border-radius: r(1);
220
- }
221
- }
222
-
223
- // Demo
224
- .demo {
225
- margin-top: s(5);
226
- padding: s(5);
227
- background: color(default-fill);
228
- border: 1px solid color(default-outline);
229
- border-radius: r(4);
230
- }
231
-
232
- .demoTitle {
233
- @include p3-semibold;
234
- margin-bottom: s(4);
235
- color: color(default-deep);
236
- }
237
-
238
- .demoGrid {
239
- display: flex;
240
- flex-wrap: wrap;
241
- gap: s(4);
242
-
243
- > div {
244
- @include p3-semibold;
245
- padding: s(3) s(5);
246
- border-radius: r(2);
247
- }
248
- }
249
-
250
- // Swatch Section
251
- .swatchSection {
252
- margin-bottom: s(8);
253
-
254
- h3 {
255
- @include p2; font-weight: 600;
256
- margin: 0 0 s(5) 0;
257
- color: color(default-deep);
258
- }
259
- }
260
-
261
- .swatchGrid {
262
- display: grid;
263
- grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
264
- gap: s(4);
265
- }
266
-
267
- .swatchItem {
268
- border: 1px solid color(default-outline);
269
- border-radius: r(3);
270
- overflow: hidden;
271
- transition: all 0.3s;
272
-
273
- &:hover {
274
- transform: translateY(-2px);
275
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
276
- }
277
- }
278
-
279
- .swatchColor {
280
- height: 60px;
281
-
282
- // Primary
283
- &[data-color='primary'][data-variant='base'] { background: color(primary); }
284
- &[data-color='primary'][data-variant='hover'] { background: color(primary-hover); }
285
- &[data-color='primary'][data-variant='pressed'] { background: color(primary-pressed); }
286
- &[data-color='primary'][data-variant='focus'] { background: color(primary-focus); }
287
- &[data-color='primary'][data-variant='fill'] { background: color(primary-fill); border: 1px solid color(primary-outline); }
288
- &[data-color='primary'][data-variant='reverse'] { background: color(primary-reverse); border: 1px solid color(default-outline); }
289
- &[data-color='primary'][data-variant='outline'] { background: color(primary-outline); }
290
-
291
- // Default
292
- &[data-color='default'][data-variant='base'] { background: color(default); }
293
- &[data-color='default'][data-variant='hover'] { background: color(default-hover); }
294
- &[data-color='default'][data-variant='pressed'] { background: color(default-pressed); }
295
- &[data-color='default'][data-variant='focus'] { background: color(default-focus); }
296
- &[data-color='default'][data-variant='fill'] { background: color(default-fill); border: 1px solid color(default-outline); }
297
- &[data-color='default'][data-variant='reverse'] { background: color(default-reverse); border: 1px solid color(default-outline); }
298
- &[data-color='default'][data-variant='outline'] { background: color(default-outline); }
299
-
300
- // Default Deep
301
- &[data-color='default-deep'][data-variant='base'] { background: color(default-deep); }
302
- &[data-color='default-deep'][data-variant='hover'] { background: color(default-deep-hover); }
303
- &[data-color='default-deep'][data-variant='pressed'] { background: color(default-deep-pressed); }
304
- &[data-color='default-deep'][data-variant='focus'] { background: color(default-deep-focus); }
305
- &[data-color='default-deep'][data-variant='fill'] { background: color(default-deep-fill); border: 1px solid color(default-deep-outline); }
306
- &[data-color='default-deep'][data-variant='reverse'] { background: color(default-deep-reverse); border: 1px solid color(default-outline); }
307
- &[data-color='default-deep'][data-variant='outline'] { background: color(default-deep-outline); }
308
-
309
- // Info
310
- &[data-color='info'][data-variant='base'] { background: color(info); }
311
- &[data-color='info'][data-variant='hover'] { background: color(info-hover); }
312
- &[data-color='info'][data-variant='pressed'] { background: color(info-pressed); }
313
- &[data-color='info'][data-variant='focus'] { background: color(info-focus); }
314
- &[data-color='info'][data-variant='fill'] { background: color(info-fill); border: 1px solid color(info-outline); }
315
- &[data-color='info'][data-variant='reverse'] { background: color(info-reverse); border: 1px solid color(default-outline); }
316
- &[data-color='info'][data-variant='outline'] { background: color(info-outline); }
317
-
318
- // Link
319
- &[data-color='link'][data-variant='base'] { background: color(link); }
320
- &[data-color='link'][data-variant='hover'] { background: color(link-hover); }
321
- &[data-color='link'][data-variant='pressed'] { background: color(link-pressed); }
322
- &[data-color='link'][data-variant='focus'] { background: color(link-focus); }
323
- &[data-color='link'][data-variant='fill'] { background: color(link-fill); border: 1px solid color(link-outline); }
324
- &[data-color='link'][data-variant='reverse'] { background: color(link-reverse); border: 1px solid color(default-outline); }
325
- &[data-color='link'][data-variant='outline'] { background: color(link-outline); }
326
-
327
- // Success
328
- &[data-color='success'][data-variant='base'] { background: color(success); }
329
- &[data-color='success'][data-variant='hover'] { background: color(success-hover); }
330
- &[data-color='success'][data-variant='pressed'] { background: color(success-pressed); }
331
- &[data-color='success'][data-variant='focus'] { background: color(success-focus); }
332
- &[data-color='success'][data-variant='fill'] { background: color(success-fill); border: 1px solid color(success-outline); }
333
- &[data-color='success'][data-variant='reverse'] { background: color(success-reverse); border: 1px solid color(default-outline); }
334
- &[data-color='success'][data-variant='outline'] { background: color(success-outline); }
335
-
336
- // Warning
337
- &[data-color='warning'][data-variant='base'] { background: color(warning); }
338
- &[data-color='warning'][data-variant='hover'] { background: color(warning-hover); }
339
- &[data-color='warning'][data-variant='pressed'] { background: color(warning-pressed); }
340
- &[data-color='warning'][data-variant='focus'] { background: color(warning-focus); }
341
- &[data-color='warning'][data-variant='fill'] { background: color(warning-fill); border: 1px solid color(warning-outline); }
342
- &[data-color='warning'][data-variant='reverse'] { background: color(warning-reverse); border: 1px solid color(default-outline); }
343
- &[data-color='warning'][data-variant='outline'] { background: color(warning-outline); }
344
-
345
- // Danger
346
- &[data-color='danger'][data-variant='base'] { background: color(danger); }
347
- &[data-color='danger'][data-variant='hover'] { background: color(danger-hover); }
348
- &[data-color='danger'][data-variant='pressed'] { background: color(danger-pressed); }
349
- &[data-color='danger'][data-variant='focus'] { background: color(danger-focus); }
350
- &[data-color='danger'][data-variant='fill'] { background: color(danger-fill); border: 1px solid color(danger-outline); }
351
- &[data-color='danger'][data-variant='reverse'] { background: color(danger-reverse); border: 1px solid color(default-outline); }
352
- &[data-color='danger'][data-variant='outline'] { background: color(danger-outline); }
353
- }
354
-
355
- .swatchLabel {
356
- padding: s(3);
357
-
358
- div {
359
- @include p5-semibold;
360
- margin-bottom: s(1);
361
- color: color(default-deep);
362
- }
363
-
364
- code {
365
- @include p5;
366
- font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
367
- color: color(default);
368
- display: block;
369
- }
370
- }
@@ -1,200 +0,0 @@
1
- import PageHeader from '@/components/PageHeader';
2
- import styles from './page.module.scss';
3
-
4
- export default function Colors() {
5
- const colors = [
6
- { name: 'primary', label: 'Primary', description: '주요 액션 및 브랜드 색상' },
7
- { name: 'default', label: 'Default', description: '기본 UI 요소' },
8
- { name: 'default-deep', label: 'Default Deep', description: '강조된 기본 색상' },
9
- { name: 'info', label: 'Info', description: '정보성 메시지' },
10
- { name: 'link', label: 'Link', description: '링크 및 네비게이션' },
11
- { name: 'success', label: 'Success', description: '성공 상태 표시' },
12
- { name: 'warning', label: 'Warning', description: '경고 메시지' },
13
- { name: 'danger', label: 'Danger', description: '위험/오류 상태' },
14
- ];
15
-
16
- const variants = [
17
- { name: 'base', label: 'Base', description: '기본 색상' },
18
- { name: 'hover', label: 'Hover', description: '호버 상태' },
19
- { name: 'pressed', label: 'Pressed', description: '눌림 상태' },
20
- { name: 'focus', label: 'Focus', description: '포커스 상태' },
21
- { name: 'fill', label: 'Fill', description: '배경 색상' },
22
- { name: 'reverse', label: 'Reverse', description: '반전 색상 (텍스트)' },
23
- { name: 'outline', label: 'Outline', description: '아웃라인 색상' },
24
- ];
25
-
26
- return (
27
- <>
28
- <PageHeader
29
- title="컬러"
30
- description="Podo UI의 시맨틱 컬러 시스템과 테마 사용법을 안내합니다"
31
- />
32
-
33
- <section className={styles.section}>
34
- <h2>색상 시스템</h2>
35
- <p>
36
- Podo UI는 8가지 시맨틱 컬러를 제공하며, 각 컬러는 7가지 변형(base, hover, pressed, focus, fill, reverse, outline)을 가집니다.
37
- CSS 변수 기반으로 구축되어 있어 라이트/다크 모드를 쉽게 전환할 수 있습니다.
38
- </p>
39
- </section>
40
-
41
- <section className={styles.section}>
42
- <h2>컬러 팔레트</h2>
43
- <div className={styles.colorGrid}>
44
- {colors.map((color) => (
45
- <div key={color.name} className={styles.colorCard}>
46
- <div className={styles.colorPreview} data-color={color.name}></div>
47
- <div className={styles.colorInfo}>
48
- <h3>{color.label}</h3>
49
- <p className={styles.colorName}>{color.name}</p>
50
- <p className={styles.colorDesc}>{color.description}</p>
51
- </div>
52
- </div>
53
- ))}
54
- </div>
55
- </section>
56
-
57
- <section className={styles.section}>
58
- <h2>컬러 변형</h2>
59
- <p>각 컬러는 다양한 상태에 대응하는 7가지 변형을 제공합니다:</p>
60
-
61
- <div className={styles.variantsGrid}>
62
- {variants.map((variant) => (
63
- <div key={variant.name} className={styles.variantCard}>
64
- <div className={styles.variantSwatch} data-variant={variant.name}></div>
65
- <div className={styles.variantInfo}>
66
- <h4>{variant.label}</h4>
67
- <p>{variant.description}</p>
68
- <code>primary-{variant.name}</code>
69
- </div>
70
- </div>
71
- ))}
72
- </div>
73
- </section>
74
-
75
- <section className={styles.section}>
76
- <h2>SCSS에서 사용하기</h2>
77
- <p>SCSS 모듈에서 color() 함수를 사용하여 컬러를 적용할 수 있습니다:</p>
78
-
79
- <div className={styles.codeBlock}>
80
- <div className={styles.codeHeader}>component.module.scss</div>
81
- <pre><code>{`@use 'podo-ui/mixin' as *;
82
-
83
- .button {
84
- // 기본 색상
85
- background: color(primary);
86
- color: color(primary-reverse);
87
- border: 1px solid color(primary);
88
-
89
- // 호버 상태
90
- &:hover {
91
- background: color(primary-hover);
92
- border-color: color(primary-hover);
93
- }
94
-
95
- // 눌림 상태
96
- &:active {
97
- background: color(primary-pressed);
98
- }
99
-
100
- // 포커스 상태
101
- &:focus {
102
- outline: 2px solid color(primary-outline);
103
- }
104
- }
105
-
106
- // Fill 스타일 버튼
107
- .buttonFill {
108
- background: color(primary-fill);
109
- color: color(primary);
110
- border: 1px solid color(primary-outline);
111
- }`}</code></pre>
112
- </div>
113
- </section>
114
-
115
- <section className={styles.section}>
116
- <h2>CSS 클래스로 사용하기</h2>
117
- <p>HTML 요소에 직접 컬러 클래스를 적용할 수 있습니다:</p>
118
-
119
- <div className={styles.codeBlock}>
120
- <div className={styles.codeHeader}>HTML</div>
121
- <pre><code>{`<!-- 텍스트 색상 -->
122
- <div class="primary">Primary 색상 텍스트</div>
123
- <div class="danger">Danger 색상 텍스트</div>
124
-
125
- <!-- 배경 색상 -->
126
- <div class="bg-primary">Primary 배경</div>
127
- <div class="bg-success-fill">Success Fill 배경</div>
128
-
129
- <!-- 테두리 색상 -->
130
- <div class="border-primary">Primary 테두리</div>
131
- <div class="border-warning">Warning 테두리</div>`}</code></pre>
132
- </div>
133
-
134
- <div className={styles.demo}>
135
- <div className={styles.demoTitle}>실제 예제:</div>
136
- <div className={styles.demoGrid}>
137
- <div className="primary">Primary Text</div>
138
- <div className="info">Info Text</div>
139
- <div className="success">Success Text</div>
140
- <div className="warning">Warning Text</div>
141
- <div className="danger">Danger Text</div>
142
- </div>
143
- </div>
144
- </section>
145
-
146
- <section className={styles.section}>
147
- <h2>다크 모드</h2>
148
- <p>
149
- Podo UI는 자동으로 다크 모드를 지원합니다.
150
- 오른쪽 상단의 테마 토글 버튼을 클릭하여 라이트/다크 모드를 전환해보세요.
151
- </p>
152
-
153
- <div className={styles.codeBlock}>
154
- <div className={styles.codeHeader}>JavaScript</div>
155
- <pre><code>{`// Light 모드
156
- document.documentElement.setAttribute('data-color-mode', 'light');
157
-
158
- // Dark 모드
159
- document.documentElement.setAttribute('data-color-mode', 'dark');
160
-
161
- // 자동 (브라우저 설정 따름)
162
- document.documentElement.setAttribute('data-color-mode', '');`}</code></pre>
163
- </div>
164
-
165
- <div className={styles.note}>
166
- <i className="icon-info"></i>
167
- <div>
168
- <strong>팁:</strong> CSS 변수 기반으로 구축되어 있어 페이지 새로고침 없이 즉시 테마가 전환됩니다.
169
- </div>
170
- </div>
171
- </section>
172
-
173
- <section className={styles.section}>
174
- <h2>전체 컬러 스와치</h2>
175
- <p>모든 컬러와 변형을 한눈에 확인하세요:</p>
176
-
177
- {colors.map((color) => (
178
- <div key={color.name} className={styles.swatchSection}>
179
- <h3>{color.label} ({color.name})</h3>
180
- <div className={styles.swatchGrid}>
181
- {variants.map((variant) => (
182
- <div key={variant.name} className={styles.swatchItem}>
183
- <div
184
- className={styles.swatchColor}
185
- data-color={color.name}
186
- data-variant={variant.name}
187
- ></div>
188
- <div className={styles.swatchLabel}>
189
- <div>{variant.label}</div>
190
- <code>{color.name}-{variant.name}</code>
191
- </div>
192
- </div>
193
- ))}
194
- </div>
195
- </div>
196
- ))}
197
- </section>
198
- </>
199
- );
200
- }