@jk-core/components 1.1.4 → 1.1.6
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 +38 -5
- package/src/common/Pagination/index.tsx +28 -13
- 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.6",
|
|
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;
|
|
@@ -45,18 +61,27 @@ $size: 40px;
|
|
|
45
61
|
justify-content: center;
|
|
46
62
|
gap: 10px;
|
|
47
63
|
padding: 10px 0;
|
|
64
|
+
|
|
65
|
+
& > * {
|
|
66
|
+
user-select: none;
|
|
67
|
+
}
|
|
48
68
|
}
|
|
49
69
|
|
|
50
70
|
.arrow {
|
|
51
71
|
width: $size;
|
|
52
72
|
height: $size;
|
|
53
73
|
border-radius: 100%;
|
|
54
|
-
background-color: var(--G-
|
|
74
|
+
background-color: var(--G-10);
|
|
55
75
|
cursor: pointer;
|
|
56
76
|
user-select: none;
|
|
57
77
|
-webkit-user-drag: none;
|
|
58
78
|
pointer-events: auto;
|
|
59
79
|
transition: background-color 0.1s ease;
|
|
80
|
+
flex-shrink: 0;
|
|
81
|
+
|
|
82
|
+
@media screen and (max-width: 500px) {
|
|
83
|
+
display: none;
|
|
84
|
+
}
|
|
60
85
|
|
|
61
86
|
& > svg {
|
|
62
87
|
width: 20px;
|
|
@@ -74,7 +99,7 @@ $size: 40px;
|
|
|
74
99
|
}
|
|
75
100
|
|
|
76
101
|
&--disabled {
|
|
77
|
-
background-color: var(--G-
|
|
102
|
+
background-color: var(--G-10) !important;
|
|
78
103
|
cursor: default;
|
|
79
104
|
|
|
80
105
|
& > svg {
|
|
@@ -85,16 +110,17 @@ $size: 40px;
|
|
|
85
110
|
|
|
86
111
|
.slider {
|
|
87
112
|
position: relative;
|
|
88
|
-
width: $size * 8;
|
|
89
113
|
height: $size;
|
|
90
114
|
display: flex;
|
|
91
115
|
overflow: visible;
|
|
92
|
-
background-color: var(--G-
|
|
116
|
+
background-color: var(--G-10);
|
|
93
117
|
border-radius: 10px;
|
|
94
118
|
}
|
|
95
119
|
|
|
96
120
|
.track {
|
|
97
121
|
position: absolute;
|
|
122
|
+
left: 50%;
|
|
123
|
+
transform: translateX(-50%);
|
|
98
124
|
width: $size;
|
|
99
125
|
height: $size;
|
|
100
126
|
border-radius: 10px;
|
|
@@ -105,7 +131,6 @@ $size: 40px;
|
|
|
105
131
|
}
|
|
106
132
|
|
|
107
133
|
.pages {
|
|
108
|
-
width: $size * 5;
|
|
109
134
|
overflow: hidden visible;
|
|
110
135
|
display: flex;
|
|
111
136
|
}
|
|
@@ -158,6 +183,14 @@ $size: 40px;
|
|
|
158
183
|
animation: slideDoubleRight $delay;
|
|
159
184
|
}
|
|
160
185
|
|
|
186
|
+
.tripleLeft {
|
|
187
|
+
animation: slideTripleLeft $delay;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.tripleRight {
|
|
191
|
+
animation: slideTripleRight $delay;
|
|
192
|
+
}
|
|
193
|
+
|
|
161
194
|
.portal {
|
|
162
195
|
display: flex;
|
|
163
196
|
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,15 +88,15 @@ 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
|
-
{selectedPage > 3 && (
|
|
99
|
+
{selectedPage > (3 + weight / 2) && (
|
|
88
100
|
< >
|
|
89
101
|
<button
|
|
90
102
|
className={styles.page}
|
|
@@ -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
|
|
@@ -116,7 +131,7 @@ export default function Pagination({ totalPage, currentPage, onPageClick }: Pagi
|
|
|
116
131
|
</div>
|
|
117
132
|
</div>
|
|
118
133
|
<div className={styles.portal}>
|
|
119
|
-
{selectedPage < totalPage - 2 && (
|
|
134
|
+
{selectedPage < totalPage - (2 + weight / 2) && (
|
|
120
135
|
<>
|
|
121
136
|
<span className={styles.portal__ellipsis}>•••</span>
|
|
122
137
|
<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
|
}
|