@jk-core/components 1.1.4 → 1.1.5
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/dist/index.js +1400 -995
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +25 -5
- package/dist/index.umd.cjs.map +1 -1
- package/dist/src/common/Pagination/index.d.ts +6 -1
- package/package.json +2 -3
- package/src/common/Pagination/Pagination.module.scss +34 -5
- package/src/common/Pagination/index.tsx +26 -11
- package/src/common/SegmentButton/SegmentButton.module.scss +1 -0
- package/src/common/Table/Table.module.scss +8 -1
|
@@ -7,10 +7,15 @@ interface PaginationProps {
|
|
|
7
7
|
* 현재 페이지
|
|
8
8
|
*/
|
|
9
9
|
currentPage: number;
|
|
10
|
+
/**
|
|
11
|
+
* 페이지 크기 (기본값: false)
|
|
12
|
+
* true로 설정하면 보여지는 페이지의 개수가 5개에서 7개로 늘어납니다.
|
|
13
|
+
*/
|
|
14
|
+
large?: boolean;
|
|
10
15
|
/**
|
|
11
16
|
* 페이지 클릭 핸들러
|
|
12
17
|
*/
|
|
13
18
|
onPageClick: (page: number) => void;
|
|
14
19
|
}
|
|
15
|
-
export default function Pagination({ totalPage, currentPage, onPageClick }: PaginationProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export default function Pagination({ totalPage, currentPage, onPageClick, large }: PaginationProps): import("react/jsx-runtime").JSX.Element;
|
|
16
21
|
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jk-core/components",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.umd.cjs",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -37,8 +37,7 @@
|
|
|
37
37
|
"calendar"
|
|
38
38
|
],
|
|
39
39
|
"peerDependencies": {
|
|
40
|
-
"react": "^19.1.0"
|
|
41
|
-
"react-dom": "^19.1.0"
|
|
40
|
+
"react": "^19.1.0"
|
|
42
41
|
},
|
|
43
42
|
"scripts": {
|
|
44
43
|
"build": "yarn clean && vite build",
|
|
@@ -36,6 +36,22 @@ $size: 40px;
|
|
|
36
36
|
transform: translateX(0);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
+
@keyframes slideTripleLeft {
|
|
40
|
+
from {
|
|
41
|
+
transform: translateX(-$size * 3);
|
|
42
|
+
}
|
|
43
|
+
to {
|
|
44
|
+
transform: translateX(0);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
@keyframes slideTripleRight {
|
|
48
|
+
from {
|
|
49
|
+
transform: translateX($size * 3);
|
|
50
|
+
}
|
|
51
|
+
to {
|
|
52
|
+
transform: translateX(0);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
39
55
|
|
|
40
56
|
.pagination {
|
|
41
57
|
position: relative;
|
|
@@ -51,12 +67,17 @@ $size: 40px;
|
|
|
51
67
|
width: $size;
|
|
52
68
|
height: $size;
|
|
53
69
|
border-radius: 100%;
|
|
54
|
-
background-color: var(--G-
|
|
70
|
+
background-color: var(--G-10);
|
|
55
71
|
cursor: pointer;
|
|
56
72
|
user-select: none;
|
|
57
73
|
-webkit-user-drag: none;
|
|
58
74
|
pointer-events: auto;
|
|
59
75
|
transition: background-color 0.1s ease;
|
|
76
|
+
flex-shrink: 0;
|
|
77
|
+
|
|
78
|
+
@media screen and (max-width: 500px) {
|
|
79
|
+
display: none;
|
|
80
|
+
}
|
|
60
81
|
|
|
61
82
|
& > svg {
|
|
62
83
|
width: 20px;
|
|
@@ -74,7 +95,7 @@ $size: 40px;
|
|
|
74
95
|
}
|
|
75
96
|
|
|
76
97
|
&--disabled {
|
|
77
|
-
background-color: var(--G-
|
|
98
|
+
background-color: var(--G-10) !important;
|
|
78
99
|
cursor: default;
|
|
79
100
|
|
|
80
101
|
& > svg {
|
|
@@ -85,16 +106,17 @@ $size: 40px;
|
|
|
85
106
|
|
|
86
107
|
.slider {
|
|
87
108
|
position: relative;
|
|
88
|
-
width: $size * 8;
|
|
89
109
|
height: $size;
|
|
90
110
|
display: flex;
|
|
91
111
|
overflow: visible;
|
|
92
|
-
background-color: var(--G-
|
|
112
|
+
background-color: var(--G-10);
|
|
93
113
|
border-radius: 10px;
|
|
94
114
|
}
|
|
95
115
|
|
|
96
116
|
.track {
|
|
97
117
|
position: absolute;
|
|
118
|
+
left: 50%;
|
|
119
|
+
transform: translateX(-50%);
|
|
98
120
|
width: $size;
|
|
99
121
|
height: $size;
|
|
100
122
|
border-radius: 10px;
|
|
@@ -105,7 +127,6 @@ $size: 40px;
|
|
|
105
127
|
}
|
|
106
128
|
|
|
107
129
|
.pages {
|
|
108
|
-
width: $size * 5;
|
|
109
130
|
overflow: hidden visible;
|
|
110
131
|
display: flex;
|
|
111
132
|
}
|
|
@@ -158,6 +179,14 @@ $size: 40px;
|
|
|
158
179
|
animation: slideDoubleRight $delay;
|
|
159
180
|
}
|
|
160
181
|
|
|
182
|
+
.tripleLeft {
|
|
183
|
+
animation: slideTripleLeft $delay;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.tripleRight {
|
|
187
|
+
animation: slideTripleRight $delay;
|
|
188
|
+
}
|
|
189
|
+
|
|
161
190
|
.portal {
|
|
162
191
|
display: flex;
|
|
163
192
|
align-items: center;
|
|
@@ -14,28 +14,34 @@ interface PaginationProps {
|
|
|
14
14
|
*/
|
|
15
15
|
currentPage: number;
|
|
16
16
|
|
|
17
|
+
/**
|
|
18
|
+
* 페이지 크기 (기본값: false)
|
|
19
|
+
* true로 설정하면 보여지는 페이지의 개수가 5개에서 7개로 늘어납니다.
|
|
20
|
+
*/
|
|
21
|
+
large?: boolean;
|
|
17
22
|
/**
|
|
18
23
|
* 페이지 클릭 핸들러
|
|
19
24
|
*/
|
|
20
25
|
onPageClick: (page: number) => void;
|
|
21
26
|
}
|
|
22
27
|
|
|
23
|
-
export default function Pagination({ totalPage, currentPage, onPageClick }: PaginationProps) {
|
|
24
|
-
const [animation, setAnimation] = useState<'left' | 'right' | 'doubleRight' | 'doubleLeft' | ''>('');
|
|
28
|
+
export default function Pagination({ totalPage, currentPage, onPageClick, large = false }: PaginationProps) {
|
|
29
|
+
const [animation, setAnimation] = useState<'left' | 'right' | 'doubleRight' | 'doubleLeft' | 'tripleRight' | 'tripleLeft' | ''>('');
|
|
25
30
|
const [selectedPage, setSelectedPage] = useState(currentPage || 1);
|
|
31
|
+
const weight = useMemo(() => (large ? 2 : 0), [large]);
|
|
26
32
|
|
|
27
33
|
const pageArray = useMemo(() => {
|
|
28
|
-
if (!totalPage) return Array.from({ length: 9 }).map((_, i) => (i === 2 ? 1 : null));
|
|
34
|
+
if (!totalPage) return Array.from({ length: 9 + weight }).map((_, i) => (i === 2 ? 1 : null));
|
|
29
35
|
|
|
30
|
-
return Array.from({ length: 9 }).map((_, i) => {
|
|
31
|
-
const pageIndex = selectedPage + i - 2;
|
|
36
|
+
return Array.from({ length: 9 + weight }).map((_, i) => {
|
|
37
|
+
const pageIndex = selectedPage + i - 2 - (weight / 2) ;
|
|
32
38
|
|
|
33
39
|
if (pageIndex < 1 || pageIndex > totalPage) {
|
|
34
40
|
return null;
|
|
35
41
|
}
|
|
36
42
|
return pageIndex;
|
|
37
43
|
});
|
|
38
|
-
}, [selectedPage, totalPage]);
|
|
44
|
+
}, [selectedPage, totalPage, weight]);
|
|
39
45
|
|
|
40
46
|
const handlePageClick = (page: number) => {
|
|
41
47
|
if (page > totalPage || page < 1) return;
|
|
@@ -56,6 +62,12 @@ export default function Pagination({ totalPage, currentPage, onPageClick }: Pagi
|
|
|
56
62
|
case -2:
|
|
57
63
|
setAnimation('doubleLeft');
|
|
58
64
|
break;
|
|
65
|
+
case 3:
|
|
66
|
+
setAnimation('tripleRight');
|
|
67
|
+
break;
|
|
68
|
+
case -3:
|
|
69
|
+
setAnimation('tripleLeft');
|
|
70
|
+
break;
|
|
59
71
|
default:
|
|
60
72
|
setAnimation('');
|
|
61
73
|
}
|
|
@@ -76,12 +88,12 @@ export default function Pagination({ totalPage, currentPage, onPageClick }: Pagi
|
|
|
76
88
|
>
|
|
77
89
|
<LeftArrowIcon />
|
|
78
90
|
</button>
|
|
79
|
-
<div
|
|
91
|
+
<div
|
|
92
|
+
className={styles.slider}
|
|
93
|
+
style={{ width: `${(8 + weight) * 40}px` }}
|
|
94
|
+
>
|
|
80
95
|
<div
|
|
81
96
|
className={styles.track}
|
|
82
|
-
style={{
|
|
83
|
-
left: '140px',
|
|
84
|
-
}}
|
|
85
97
|
/>
|
|
86
98
|
<div className={styles.portal}>
|
|
87
99
|
{selectedPage > 3 && (
|
|
@@ -96,7 +108,10 @@ export default function Pagination({ totalPage, currentPage, onPageClick }: Pagi
|
|
|
96
108
|
</>
|
|
97
109
|
)}
|
|
98
110
|
</div>
|
|
99
|
-
<div
|
|
111
|
+
<div
|
|
112
|
+
className={styles.pages}
|
|
113
|
+
style={{ width: `${(5 + weight) * 40}px` }}
|
|
114
|
+
>
|
|
100
115
|
<div className={`${styles.pageWrapper} ${animation === 'left' ? styles.left : ''} ${styles[animation]}`}>
|
|
101
116
|
{pageArray.map((page, index) => (
|
|
102
117
|
<button
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
.wrapper {
|
|
2
2
|
width: 100%;
|
|
3
3
|
max-height: 60dvh;
|
|
4
|
-
border: 1px solid var(--G-30);
|
|
5
4
|
overflow: auto;
|
|
6
5
|
|
|
7
6
|
&__rounded {
|
|
8
7
|
border-radius: 10px;
|
|
9
8
|
}
|
|
9
|
+
|
|
10
|
+
&__border {
|
|
11
|
+
border: 1px solid var(--G-30);
|
|
12
|
+
}
|
|
10
13
|
}
|
|
11
14
|
|
|
12
15
|
.table {
|
|
@@ -30,6 +33,8 @@
|
|
|
30
33
|
flex-shrink: 0;
|
|
31
34
|
background-color: var(--G-5);
|
|
32
35
|
padding: 10px;
|
|
36
|
+
font-weight: 600;
|
|
37
|
+
color: var(--G-80);
|
|
33
38
|
border-right: 1px solid var(--G-30);
|
|
34
39
|
border-bottom: 1px solid var(--G-30);
|
|
35
40
|
}
|
|
@@ -49,6 +54,8 @@
|
|
|
49
54
|
padding: 10px;
|
|
50
55
|
background-color: var(--white);
|
|
51
56
|
word-break: break-all;
|
|
57
|
+
color: var(--G-80);
|
|
58
|
+
font-weight: 400;
|
|
52
59
|
border-bottom: 1px solid var(--G-30);
|
|
53
60
|
border-right: 1px solid var(--G-30);
|
|
54
61
|
}
|