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,29 +0,0 @@
1
- @use '../../mixin' as *;
2
-
3
- .codeBlock {
4
- background: color(default-deep-base);
5
- border-radius: r(4);
6
- overflow: hidden;
7
- margin-bottom: s(4);
8
-
9
- .codeHeader {
10
- padding: s(3) s(5);
11
- background: rgba(0, 0, 0, 0.2);
12
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
13
- @include p4-semibold;
14
- color: rgba(255, 255, 255, 0.7);
15
- }
16
-
17
- pre {
18
- margin: 0;
19
- padding: s(5);
20
- overflow-x: auto;
21
-
22
- code {
23
- @include p3;
24
- font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
25
- color: #f8f8f2;
26
- white-space: pre;
27
- }
28
- }
29
- }
@@ -1,18 +0,0 @@
1
- import styles from './CodeBlock.module.scss';
2
-
3
- interface CodeBlockProps {
4
- code: string;
5
- language?: string;
6
- title?: string;
7
- }
8
-
9
- export default function CodeBlock({ code, language = 'tsx', title }: CodeBlockProps) {
10
- return (
11
- <div className={styles.codeBlock}>
12
- {title && <div className={styles.codeHeader}>{title}</div>}
13
- <pre>
14
- <code>{code}</code>
15
- </pre>
16
- </div>
17
- );
18
- }
@@ -1,104 +0,0 @@
1
- @use '../../mixin' as *;
2
-
3
- .nav {
4
- width: 260px;
5
- height: 100vh;
6
- position: fixed;
7
- left: 0;
8
- top: 0;
9
- background: color(bg-modal);
10
- border-right: 1px solid color(default-outline);
11
- overflow-y: auto;
12
- padding: s(6);
13
- }
14
-
15
- .header {
16
- margin-bottom: s(7);
17
-
18
- .logo {
19
- display: flex;
20
- align-items: center;
21
- gap: s(3);
22
- text-decoration: none;
23
- margin-bottom: s(2);
24
-
25
- img {
26
- flex-shrink: 0;
27
- }
28
-
29
- h1 {
30
- @include display4;
31
- margin: 0;
32
- font-weight: 700;
33
- letter-spacing: -0.02em;
34
- background: linear-gradient(135deg, #8B5CF6 0%, #6366F1 50%, #3b82f6 100%);
35
- -webkit-background-clip: text;
36
- -webkit-text-fill-color: transparent;
37
- background-clip: text;
38
- }
39
- }
40
-
41
- :global(.ThemeToggle_toggle__oQ8uJ) {
42
- margin-top: s(4);
43
- }
44
- }
45
-
46
- .version {
47
- @include p4;
48
- color: color(default-deep-base);
49
- margin: 0;
50
- }
51
-
52
- .menu {
53
- display: flex;
54
- flex-direction: column;
55
- gap: s(6);
56
- }
57
-
58
- .section {
59
- display: flex;
60
- flex-direction: column;
61
- gap: s(3);
62
- }
63
-
64
- .sectionTitle {
65
- @include p3-semibold;
66
- color: color(default-deep-base);
67
- margin: 0;
68
- text-transform: uppercase;
69
- font-size: 11px;
70
- letter-spacing: 0.5px;
71
- }
72
-
73
- .list {
74
- list-style: none;
75
- margin: 0;
76
- padding: 0;
77
- display: flex;
78
- flex-direction: column;
79
- gap: s(1);
80
-
81
- a {
82
- @include p3;
83
- display: block;
84
- padding: s(2) s(3);
85
- margin: 0 s(-6);
86
- padding-left: s(6);
87
- padding-right: s(6);
88
- color: color(default-deep-base);
89
- text-decoration: none;
90
- border-radius: r(2);
91
- transition: all 0.2s;
92
-
93
- &:hover {
94
- background: color(default-hover);
95
- color: color(default-deep-pressed);
96
- }
97
-
98
- &.active {
99
- background: linear-gradient(135deg, #8B5CF6 0%, #6366F1 100%);
100
- color: white;
101
- font-weight: 600;
102
- }
103
- }
104
- }
@@ -1,96 +0,0 @@
1
- 'use client';
2
-
3
- import Link from 'next/link';
4
- import { usePathname } from 'next/navigation';
5
- import Image from 'next/image';
6
- import ThemeToggle from './ThemeToggle';
7
- import styles from './Navigation.module.scss';
8
-
9
- const menuItems = [
10
- {
11
- title: '시작하기',
12
- items: [
13
- { label: '소개', path: '/' },
14
- { label: '설치', path: '/getting-started/installation' },
15
- { label: '사용법', path: '/getting-started/usage' },
16
- ],
17
- },
18
- {
19
- title: '기초',
20
- items: [
21
- { label: '컬러', path: '/foundation/colors' },
22
- { label: '타이포그래피', path: '/foundation/typography' },
23
- { label: '아이콘', path: '/foundation/icons' },
24
- { label: '간격', path: '/foundation/spacing' },
25
- ],
26
- },
27
- {
28
- title: '레이아웃',
29
- items: [
30
- { label: '그리드', path: '/layout/grid' },
31
- { label: '반응형', path: '/layout/responsive' },
32
- ],
33
- },
34
- {
35
- title: '컴포넌트',
36
- items: [
37
- { label: '버튼', path: '/components/button' },
38
- { label: '입력', path: '/components/input' },
39
- { label: '텍스트 영역', path: '/components/textarea' },
40
- { label: '선택', path: '/components/select' },
41
- { label: '체크박스 & 라디오', path: '/components/checkbox-radio' },
42
- { label: '토글', path: '/components/toggle' },
43
- { label: '파일 업로드', path: '/components/file' },
44
- { label: '에디터', path: '/components/editor' },
45
- { label: '필드', path: '/components/field' },
46
- { label: '테이블', path: '/components/table' },
47
- { label: '탭', path: '/components/tab' },
48
- { label: '페이지네이션', path: '/components/pagination' },
49
- ],
50
- },
51
- {
52
- title: '유틸리티',
53
- items: [
54
- { label: '테두리', path: '/utilities/border' },
55
- { label: '모서리 반경', path: '/utilities/radius' },
56
- { label: '배경 & 입체감', path: '/utilities/elevation' },
57
- { label: '표시 & 가시성', path: '/utilities/display' },
58
- ],
59
- },
60
- ];
61
-
62
- export default function Navigation() {
63
- const pathname = usePathname();
64
-
65
- return (
66
- <nav className={styles.nav}>
67
- <div className={styles.header}>
68
- <Link href="/" className={styles.logo}>
69
- <Image src="/logo.svg" alt="Podo UI" width={32} height={32} />
70
- <h1>Podo UI</h1>
71
- </Link>
72
- <ThemeToggle />
73
- </div>
74
-
75
- <div className={styles.menu}>
76
- {menuItems.map((section) => (
77
- <div key={section.title} className={styles.section}>
78
- <h2 className={styles.sectionTitle}>{section.title}</h2>
79
- <ul className={styles.list}>
80
- {section.items.map((item) => (
81
- <li key={item.path}>
82
- <Link
83
- href={item.path}
84
- className={pathname === item.path ? styles.active : ''}
85
- >
86
- {item.label}
87
- </Link>
88
- </li>
89
- ))}
90
- </ul>
91
- </div>
92
- ))}
93
- </div>
94
- </nav>
95
- );
96
- }
@@ -1,24 +0,0 @@
1
- @use '../../mixin' as *;
2
-
3
- .header {
4
- display: flex;
5
- justify-content: space-between;
6
- align-items: flex-start;
7
- margin-bottom: s(7);
8
- padding-bottom: s(6);
9
- border-bottom: 1px solid color(default-outline);
10
-
11
- .content {
12
- h1 {
13
- @include display3;
14
- margin: 0 0 s(3) 0;
15
- color: color(default-deep-base);
16
- }
17
-
18
- p {
19
- @include p2;
20
- margin: 0;
21
- color: color(default-base);
22
- }
23
- }
24
- }
@@ -1,17 +0,0 @@
1
- import styles from './PageHeader.module.scss';
2
-
3
- interface PageHeaderProps {
4
- title: string;
5
- description?: string;
6
- }
7
-
8
- export default function PageHeader({ title, description }: PageHeaderProps) {
9
- return (
10
- <header className={styles.header}>
11
- <div className={styles.content}>
12
- <h1>{title}</h1>
13
- {description && <p>{description}</p>}
14
- </div>
15
- </header>
16
- );
17
- }
@@ -1,34 +0,0 @@
1
- @use '../../mixin' as *;
2
-
3
- .toggle {
4
- display: flex;
5
- }
6
-
7
- .currentMode {
8
- display: flex;
9
- align-items: center;
10
- gap: s(2);
11
- padding: s(3) s(4);
12
- background: color(bg-elevation-1);
13
- border-radius: r(2);
14
- border: 1px solid color(default-outline);
15
- cursor: pointer;
16
- transition: all 0.2s;
17
- width: 100%;
18
-
19
- &:hover {
20
- background: color(default-hover);
21
- border-color: color(primary-base);
22
- }
23
-
24
- i {
25
- font-size: 16px;
26
- color: color(primary-base);
27
- }
28
-
29
- span {
30
- @include p4;
31
- font-weight: 600;
32
- color: color(default-deep-base);
33
- }
34
- }
@@ -1,47 +0,0 @@
1
- 'use client';
2
-
3
- import { useEffect, useState } from 'react';
4
- import styles from './ThemeToggle.module.scss';
5
-
6
- export default function ThemeToggle() {
7
- const [mode, setMode] = useState<'' | 'light' | 'dark'>('');
8
-
9
- useEffect(() => {
10
- const savedMode = localStorage.getItem('color-mode') as '' | 'light' | 'dark';
11
- if (savedMode) {
12
- setMode(savedMode);
13
- document.documentElement.setAttribute('data-color-mode', savedMode);
14
- }
15
- }, []);
16
-
17
- const handleModeChange = (newMode: '' | 'light' | 'dark') => {
18
- setMode(newMode);
19
- document.documentElement.setAttribute('data-color-mode', newMode);
20
- localStorage.setItem('color-mode', newMode);
21
- };
22
-
23
- const handleToggleMode = () => {
24
- if (mode === '') {
25
- handleModeChange('light');
26
- } else if (mode === 'light') {
27
- handleModeChange('dark');
28
- } else {
29
- handleModeChange('');
30
- }
31
- };
32
-
33
- const getModeLabel = () => {
34
- if (mode === 'light') return 'Light Mode';
35
- if (mode === 'dark') return 'Dark Mode';
36
- return 'Auto Mode';
37
- };
38
-
39
- return (
40
- <div className={styles.toggle}>
41
- <button className={styles.currentMode} onClick={handleToggleMode}>
42
- <i className="icon-show"></i>
43
- <span>{getModeLabel()}</span>
44
- </button>
45
- </div>
46
- );
47
- }
@@ -1,11 +0,0 @@
1
- @use '../../mixin' as *;
2
-
3
- h1 {
4
- @include display1;
5
- }
6
- h2 {
7
- @include display2;
8
- }
9
- h3 {
10
- @include display3;
11
- }
@@ -1,119 +0,0 @@
1
- // 문서 페이지 공통 스타일
2
- @use '../../mixin' as *;
3
-
4
- .section {
5
- margin-bottom: s(10);
6
-
7
- h2 {
8
- @include display5;
9
- margin: 0 0 s(5) 0;
10
- color: color(default-deep-base);
11
- }
12
-
13
- h3 {
14
- @include p1; font-weight: 600;
15
- margin: s(7) 0 s(4) 0;
16
- color: color(default-deep-base);
17
- }
18
-
19
- h4 {
20
- @include p2; font-weight: 600;
21
- margin: s(5) 0 s(3) 0;
22
- color: color(default-deep-base);
23
- }
24
-
25
- p {
26
- @include p2;
27
- color: color(default-base);
28
- line-height: 1.8;
29
- margin: 0 0 s(5) 0;
30
- }
31
-
32
- ul {
33
- @include p2;
34
- color: color(default-base);
35
- line-height: 1.8;
36
- margin: 0 0 s(5) 0;
37
- padding-left: s(6);
38
-
39
- li {
40
- margin-bottom: s(2);
41
- }
42
- }
43
- }
44
-
45
- .demo {
46
- padding: s(6);
47
- background: color(default-fill);
48
- border: 1px solid color(default-outline);
49
- border-radius: r(4);
50
- margin-bottom: s(5);
51
- }
52
-
53
- .note,
54
- .warning,
55
- .tip {
56
- display: flex;
57
- gap: s(4);
58
- padding: s(5);
59
- border-radius: r(4);
60
- margin-bottom: s(5);
61
-
62
- > i {
63
- font-size: 20px;
64
- flex-shrink: 0;
65
- }
66
-
67
- strong {
68
- display: block;
69
- margin-bottom: s(2);
70
- }
71
- }
72
-
73
- .note {
74
- background: color(info-fill);
75
- border: 1px solid color(info-outline);
76
- color: color(info-base);
77
-
78
- > i {
79
- color: color(info-base);
80
- }
81
- }
82
-
83
- .warning {
84
- background: color(warning-fill);
85
- border: 1px solid color(warning-outline);
86
- color: color(warning-base);
87
-
88
- > i {
89
- color: color(warning-base);
90
- }
91
- }
92
-
93
- .tip {
94
- background: color(success-fill);
95
- border: 1px solid color(success-outline);
96
- color: color(success-base);
97
-
98
- > i {
99
- color: color(success-base);
100
- }
101
- }
102
-
103
- .grid {
104
- display: grid;
105
- gap: s(5);
106
- margin-bottom: s(5);
107
-
108
- &.cols2 {
109
- grid-template-columns: repeat(2, 1fr);
110
- }
111
-
112
- &.cols3 {
113
- grid-template-columns: repeat(3, 1fr);
114
- }
115
-
116
- &.cols4 {
117
- grid-template-columns: repeat(4, 1fr);
118
- }
119
- }
@@ -1,80 +0,0 @@
1
- @font-face {
2
- font-family: 'Pretendard';
3
- font-weight: 900;
4
- src:
5
- local('Pretendard Black'),
6
- url(../../scss/typo/font/Pretendard-Black.woff2) format('woff2');
7
- font-display: swap;
8
- }
9
-
10
- @font-face {
11
- font-family: 'Pretendard';
12
- font-weight: 800;
13
- src:
14
- local('Pretendard ExtraBold'),
15
- url(../../scss/typo/font/Pretendard-ExtraBold.woff2) format('woff2');
16
- font-display: swap;
17
- }
18
-
19
- @font-face {
20
- font-family: 'Pretendard';
21
- font-weight: 700;
22
- src:
23
- local('Pretendard Bold'),
24
- url(../../scss/typo/font/Pretendard-Bold.woff2) format('woff2');
25
- font-display: swap;
26
- }
27
-
28
- @font-face {
29
- font-family: 'Pretendard';
30
- font-weight: 600;
31
- src:
32
- local('Pretendard SemiBold'),
33
- url(../../scss/typo/font/Pretendard-SemiBold.woff2) format('woff2');
34
- font-display: swap;
35
- }
36
-
37
- @font-face {
38
- font-family: 'Pretendard';
39
- font-weight: 500;
40
- src:
41
- local('Pretendard Medium'),
42
- url(../../scss/typo/font/Pretendard-Medium.woff2) format('woff2');
43
- font-display: swap;
44
- }
45
-
46
- @font-face {
47
- font-family: 'Pretendard';
48
- font-weight: 400;
49
- src:
50
- local('Pretendard Regular'),
51
- url(../../scss/typo/font/Pretendard-Regular.woff2) format('woff2');
52
- font-display: swap;
53
- }
54
-
55
- @font-face {
56
- font-family: 'Pretendard';
57
- font-weight: 300;
58
- src:
59
- local('Pretendard Light'),
60
- url(../../scss/typo/font/Pretendard-Light.woff2) format('woff2');
61
- font-display: swap;
62
- }
63
-
64
- @font-face {
65
- font-family: 'Pretendard';
66
- font-weight: 200;
67
- src:
68
- local('Pretendard ExtraLight'),
69
- url(../../scss/typo/font/Pretendard-ExtraLight.woff2) format('woff2');
70
- font-display: swap;
71
- }
72
-
73
- @font-face {
74
- font-family: 'Pretendard';
75
- font-weight: 100;
76
- src:
77
- local('Pretendard Thin'),
78
- url(../../scss/typo/font/Pretendard-Thin.woff2) format('woff2');
79
- font-display: swap;
80
- }
@@ -1,5 +0,0 @@
1
- @font-face {
2
- font-family: 'podo-ui-icon';
3
- src: url(../../scss/icon/font/icon.woff) format('woff');
4
- font-display: swap;
5
- }
package/src/vite-env.d.ts DELETED
@@ -1 +0,0 @@
1
- /// <reference types="vite/client" />
package/tsconfig.json DELETED
@@ -1,26 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "lib": ["dom", "dom.iterable", "esnext"],
4
- "allowJs": true,
5
- "skipLibCheck": true,
6
- "strict": true,
7
- "noEmit": true,
8
- "esModuleInterop": true,
9
- "module": "esnext",
10
- "moduleResolution": "bundler",
11
- "resolveJsonModule": true,
12
- "isolatedModules": true,
13
- "jsx": "preserve",
14
- "incremental": true,
15
- "plugins": [
16
- {
17
- "name": "next"
18
- }
19
- ],
20
- "paths": {
21
- "@/*": ["./src/*"]
22
- }
23
- },
24
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
25
- "exclude": ["node_modules", ".next", ".vscode"]
26
- }