@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.
@@ -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.4",
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-20);
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-20) !important;
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-20);
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 className={styles.slider}>
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 className={styles.pages}>
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
@@ -5,6 +5,7 @@
5
5
  background-color: var(--G-10);
6
6
  border-radius: 8px;
7
7
  z-index: 0;
8
+ overflow: hidden;
8
9
 
9
10
  &--selector {
10
11
  position: absolute;
@@ -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
  }