@jk-core/components 1.1.3 → 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.
@@ -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",
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-20);
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-20) !important;
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-20);
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 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
99
  {selectedPage > 3 && (
@@ -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
@@ -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,16 +1,19 @@
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 {
13
- width: max-content;
16
+ width: 100%;
14
17
  border-collapse: separate;
15
18
  border-spacing: 0;
16
19
  table-layout: fixed; // 이 줄을 추가하세요!
@@ -30,10 +33,16 @@
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
  }
36
41
 
42
+ tr {
43
+ min-width: 100%;
44
+ }
45
+
37
46
  tbody > tr > th {
38
47
  position: sticky;
39
48
  left: 0;
@@ -45,6 +54,8 @@
45
54
  padding: 10px;
46
55
  background-color: var(--white);
47
56
  word-break: break-all;
57
+ color: var(--G-80);
58
+ font-weight: 400;
48
59
  border-bottom: 1px solid var(--G-30);
49
60
  border-right: 1px solid var(--G-30);
50
61
  }