@jk-core/components 1.1.16 → 1.1.17

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 (83) hide show
  1. package/README.md +73 -73
  2. package/dist/index.js +2 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.umd.cjs +1 -1
  5. package/dist/index.umd.cjs.map +1 -1
  6. package/package.json +99 -99
  7. package/src/Calendar/Calendar.module.scss +213 -213
  8. package/src/Calendar/RangeCalendar.tsx +125 -125
  9. package/src/Calendar/ScrollCalendar.module.scss +214 -214
  10. package/src/Calendar/ScrollCalendar.tsx +124 -124
  11. package/src/Calendar/SingleCalendar.tsx +121 -121
  12. package/src/Calendar/components/DateLabel/DateLabel.module.scss +89 -89
  13. package/src/Calendar/components/DateLabel/index.tsx +91 -91
  14. package/src/Calendar/components/DayTile/DayTile.module.scss +117 -117
  15. package/src/Calendar/components/DayTile/index.tsx +108 -108
  16. package/src/Calendar/components/MonthTile/MonthTile.module.scss +59 -59
  17. package/src/Calendar/components/MonthTile/index.tsx +50 -50
  18. package/src/Calendar/components/ViewSelector/ViewSelector.module.scss +48 -48
  19. package/src/Calendar/components/ViewSelector/index.tsx +49 -49
  20. package/src/Calendar/components/YearTile/YearTile.module.scss +85 -85
  21. package/src/Calendar/components/YearTile/index.tsx +65 -65
  22. package/src/Calendar/hooks/useCalendarNav.ts +83 -83
  23. package/src/Calendar/hooks/useDateSelect.ts +54 -54
  24. package/src/Calendar/index.scss +189 -189
  25. package/src/Calendar/index.tsx +66 -66
  26. package/src/Calendar/type.ts +3 -3
  27. package/src/Calendar/utils/getWeeksInMonth.ts +45 -45
  28. package/src/Calendar/utils/isInRange.ts +8 -8
  29. package/src/Calendar/utils/isSameDay.ts +21 -21
  30. package/src/assets/arrow.svg +11 -11
  31. package/src/assets/close.svg +15 -15
  32. package/src/assets/drop-arrow.svg +3 -3
  33. package/src/common/Accordion/Accordion.module.scss +53 -53
  34. package/src/common/Accordion/arrow-down.svg +3 -3
  35. package/src/common/Accordion/arrow-up.svg +3 -3
  36. package/src/common/Accordion/index.tsx +54 -54
  37. package/src/common/Breadcrumbs/Breadcrumbs.module.scss +46 -46
  38. package/src/common/Breadcrumbs/home.svg +5 -5
  39. package/src/common/Breadcrumbs/index.tsx +82 -82
  40. package/src/common/Button/Button.module.scss +127 -127
  41. package/src/common/Button/index.tsx +60 -60
  42. package/src/common/Card/Card.module.scss +28 -28
  43. package/src/common/Card/index.tsx +19 -19
  44. package/src/common/Divider/Divider.module.scss +101 -101
  45. package/src/common/Divider/index.tsx +24 -24
  46. package/src/common/DropDown/DropDown.module.scss +135 -135
  47. package/src/common/DropDown/List.tsx +156 -156
  48. package/src/common/DropDown/arrow-down.svg +3 -3
  49. package/src/common/DropDown/index.tsx +108 -108
  50. package/src/common/DropDown/search.svg +4 -4
  51. package/src/common/Pagination/Pagination.module.scss +210 -210
  52. package/src/common/Pagination/arrow-left.svg +11 -11
  53. package/src/common/Pagination/arrow-right.svg +11 -11
  54. package/src/common/Pagination/index.tsx +156 -156
  55. package/src/common/SegmentButton/SegmentButton.module.scss +45 -45
  56. package/src/common/SegmentButton/index.tsx +79 -79
  57. package/src/common/Skeleton/Skeleton.module.scss +80 -80
  58. package/src/common/Skeleton/index.tsx +47 -47
  59. package/src/common/SwitchButton/SwitchButton.module.scss +65 -65
  60. package/src/common/SwitchButton/index.tsx +57 -56
  61. package/src/common/Table/Table.module.scss +70 -70
  62. package/src/common/Table/index.tsx +128 -128
  63. package/src/index.scss +1 -1
  64. package/src/index.tsx +21 -21
  65. package/src/styles/color.scss +346 -346
  66. package/src/styles/font-face.scss +18 -18
  67. package/src/styles/font.scss +49 -49
  68. package/src/styles/mediaQuery.scss +22 -22
  69. package/src/styles/scrollbar.scss +71 -71
  70. package/src/svg.d.ts +6 -6
  71. package/src/utils/styles/mediaQuery.scss +22 -22
  72. package/src/utils/ts/allowDecimal.ts +4 -4
  73. package/src/utils/ts/autoHypen.ts +33 -33
  74. package/src/utils/ts/calculateMax.ts +24 -24
  75. package/src/utils/ts/checkIsMobilePlatform.ts +15 -15
  76. package/src/utils/ts/formatFileSize.ts +16 -16
  77. package/src/utils/ts/formatMoney.ts +16 -16
  78. package/src/utils/ts/gradientRatio.ts +61 -61
  79. package/src/utils/ts/kiloToMega.ts +30 -30
  80. package/src/utils/ts/maskingPhone.ts +8 -8
  81. package/src/utils/ts/toQueryString.ts +7 -7
  82. package/src/utils/ts/valueAsNumber.ts +15 -15
  83. package/src/vite-env.d.ts +2 -2
@@ -1,12 +1,12 @@
1
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
2
-
3
- <!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
4
- <svg width="64px" height="64px" viewBox="0 0 24 24" fill="#0F0F0F" xmlns="http://www.w3.org/2000/svg">
5
-
6
- <g id="SVGRepo_bgCarrier" stroke-width="0"/>
7
-
8
- <g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/>
9
-
10
- <g id="SVGRepo_iconCarrier"> <path d="M16.1795 3.26875C15.7889 2.87823 15.1558 2.87823 14.7652 3.26875L8.12078 9.91322C6.94952 11.0845 6.94916 12.9833 8.11996 14.155L14.6903 20.7304C15.0808 21.121 15.714 21.121 16.1045 20.7304C16.495 20.3399 16.495 19.7067 16.1045 19.3162L9.53246 12.7442C9.14194 12.3536 9.14194 11.7205 9.53246 11.33L16.1795 4.68297C16.57 4.29244 16.57 3.65928 16.1795 3.26875Z"/> </g>
11
-
1
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
2
+
3
+ <!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
4
+ <svg width="64px" height="64px" viewBox="0 0 24 24" fill="#0F0F0F" xmlns="http://www.w3.org/2000/svg">
5
+
6
+ <g id="SVGRepo_bgCarrier" stroke-width="0"/>
7
+
8
+ <g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/>
9
+
10
+ <g id="SVGRepo_iconCarrier"> <path d="M16.1795 3.26875C15.7889 2.87823 15.1558 2.87823 14.7652 3.26875L8.12078 9.91322C6.94952 11.0845 6.94916 12.9833 8.11996 14.155L14.6903 20.7304C15.0808 21.121 15.714 21.121 16.1045 20.7304C16.495 20.3399 16.495 19.7067 16.1045 19.3162L9.53246 12.7442C9.14194 12.3536 9.14194 11.7205 9.53246 11.33L16.1795 4.68297C16.57 4.29244 16.57 3.65928 16.1795 3.26875Z"/> </g>
11
+
12
12
  </svg>
@@ -1,16 +1,16 @@
1
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
2
-
3
- <!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
4
- <svg width="64px" height="64px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="#000000" stroke-width="0.696">
5
-
6
- <g id="SVGRepo_bgCarrier" stroke-width="0"/>
7
-
8
- <g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/>
9
-
10
- <g id="SVGRepo_iconCarrier">
11
-
12
- <path fill-rule="evenodd" clip-rule="evenodd" d="M19.207 6.207a1 1 0 0 0-1.414-1.414L12 10.586 6.207 4.793a1 1 0 0 0-1.414 1.414L10.586 12l-5.793 5.793a1 1 0 1 0 1.414 1.414L12 13.414l5.793 5.793a1 1 0 0 0 1.414-1.414L13.414 12l5.793-5.793z" />
13
-
14
- </g>
15
-
1
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
2
+
3
+ <!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
4
+ <svg width="64px" height="64px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="#000000" fill="#000000" stroke-width="0.696">
5
+
6
+ <g id="SVGRepo_bgCarrier" stroke-width="0"/>
7
+
8
+ <g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/>
9
+
10
+ <g id="SVGRepo_iconCarrier">
11
+
12
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M19.207 6.207a1 1 0 0 0-1.414-1.414L12 10.586 6.207 4.793a1 1 0 0 0-1.414 1.414L10.586 12l-5.793 5.793a1 1 0 1 0 1.414 1.414L12 13.414l5.793 5.793a1 1 0 0 0 1.414-1.414L13.414 12l5.793-5.793z" />
13
+
14
+ </g>
15
+
16
16
  </svg>
@@ -1,3 +1,3 @@
1
- <svg width="25" height="25" viewBox="0 0 20 20" fill="none" stroke="#2D2D2D" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M5 7.5L10 13L15 7.5" stroke-width="1.4" stroke-linecap="round"/>
3
- </svg>
1
+ <svg width="25" height="25" viewBox="0 0 20 20" fill="none" stroke="#2D2D2D" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M5 7.5L10 13L15 7.5" stroke-width="1.4" stroke-linecap="round"/>
3
+ </svg>
@@ -1,53 +1,53 @@
1
- .accordion {
2
- width: 500px;
3
- display: flex;
4
- flex-direction: column;
5
- overflow: hidden;
6
- border: 1px solid var(--G-20);
7
- transition: margin-bottom 0.25s;
8
- border-radius: 5px;
9
- font-size: 1em;
10
-
11
- &--visible {
12
- margin-bottom: 10px;
13
- }
14
- }
15
-
16
- .button {
17
- width: 100%;
18
- background-color: white;
19
- transition: padding 0.25s;
20
- display: flex;
21
- justify-content: space-between;
22
- align-items: center;
23
- padding: 20px 10px;
24
- font-size: 1.5em;
25
- font-weight: 500;
26
-
27
- &__arrow {
28
- width: 15px;
29
- height: 15px;
30
- stroke: var(--G-50);
31
- transition: transform 0.25s;
32
-
33
- &--up {
34
- transform: rotate(180deg);
35
- }
36
- }
37
-
38
- &--visible {
39
- padding: 30px 10px;
40
- }
41
- }
42
-
43
- .wrapper {
44
- overflow: hidden;
45
- transition: height 0.25s;
46
- background-color: white;
47
- }
48
-
49
- .content {
50
- white-space: pre-wrap;
51
- font-size: 1em;
52
- padding: 20px;
53
- }
1
+ .accordion {
2
+ width: 500px;
3
+ display: flex;
4
+ flex-direction: column;
5
+ overflow: hidden;
6
+ border: 1px solid var(--G-20);
7
+ transition: margin-bottom 0.25s;
8
+ border-radius: 5px;
9
+ font-size: 1em;
10
+
11
+ &--visible {
12
+ margin-bottom: 10px;
13
+ }
14
+ }
15
+
16
+ .button {
17
+ width: 100%;
18
+ background-color: white;
19
+ transition: padding 0.25s;
20
+ display: flex;
21
+ justify-content: space-between;
22
+ align-items: center;
23
+ padding: 20px 10px;
24
+ font-size: 1.5em;
25
+ font-weight: 500;
26
+
27
+ &__arrow {
28
+ width: 15px;
29
+ height: 15px;
30
+ stroke: var(--G-50);
31
+ transition: transform 0.25s;
32
+
33
+ &--up {
34
+ transform: rotate(180deg);
35
+ }
36
+ }
37
+
38
+ &--visible {
39
+ padding: 30px 10px;
40
+ }
41
+ }
42
+
43
+ .wrapper {
44
+ overflow: hidden;
45
+ transition: height 0.25s;
46
+ background-color: white;
47
+ }
48
+
49
+ .content {
50
+ white-space: pre-wrap;
51
+ font-size: 1em;
52
+ padding: 20px;
53
+ }
@@ -1,3 +1,3 @@
1
- <svg width="12" height="9" viewBox="0 0 12 9" stroke="black" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M1 1.5L6 7L11 1.5" stroke-width="1.4" stroke-linecap="round"/>
3
- </svg>
1
+ <svg width="12" height="9" viewBox="0 0 12 9" stroke="black" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M1 1.5L6 7L11 1.5" stroke-width="1.4" stroke-linecap="round"/>
3
+ </svg>
@@ -1,3 +1,3 @@
1
- <svg width="12" height="9" viewBox="0 0 12 9" stroke="black" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M11 7.5L6 2L1 7.5" stroke-width="1.4" stroke-linecap="round"/>
3
- </svg>
1
+ <svg width="12" height="9" viewBox="0 0 12 9" stroke="black" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M11 7.5L6 2L1 7.5" stroke-width="1.4" stroke-linecap="round"/>
3
+ </svg>
@@ -1,55 +1,55 @@
1
- import { useRef, useState } from 'react';
2
- import { cn } from '@jk-core/utils';
3
- import styles from './Accordion.module.scss';
4
- import DownIcon from './arrow-down.svg';
5
-
6
- interface AccordionProps {
7
- /**
8
- * 아코디언의 내용
9
- */
10
- children: React.ReactNode;
11
- }
12
-
13
- /**
14
- * 아코디언 컴포넌트
15
- * 클릭 시 내용이 확장되거나 축소되는 UI 컴포넌트입니다.
16
- */
17
- export default function Accordion({ children }: AccordionProps) {
18
- const contentRef = useRef<HTMLDivElement>(null);
19
- const [visible, setVisible] = useState(false);
20
-
21
- return (
22
- <div className={cn({
23
- [styles.accordion]: true,
24
- [styles['accordion--visible']]: visible,
25
- })}
26
- >
27
- <button
28
- className={cn({
29
- [styles.button]: true,
30
- [styles['button--visible']]: visible,
31
- })}
32
- type="button"
33
- onClick={() => setVisible(!visible)}
34
- >
35
- Accordion
36
- <DownIcon className={cn({
37
- [styles.button__arrow]: true,
38
- [styles['button__arrow--up']]: visible,
39
- })}
40
- />
41
- </button>
42
- <div
43
- className={cn({
44
- [styles.wrapper]: true,
45
- [styles['wrapper--visible']]: visible,
46
- })}
47
- style={{ height: visible ? ((contentRef.current?.scrollHeight ?? 0)) : '0px' }}
48
- >
49
- <div className={styles.content} ref={contentRef}>
50
- {children}
51
- </div>
52
- </div>
53
- </div>
54
- );
1
+ import { useRef, useState } from 'react';
2
+ import { cn } from '@jk-core/utils';
3
+ import styles from './Accordion.module.scss';
4
+ import DownIcon from './arrow-down.svg';
5
+
6
+ interface AccordionProps {
7
+ /**
8
+ * 아코디언의 내용
9
+ */
10
+ children: React.ReactNode;
11
+ }
12
+
13
+ /**
14
+ * 아코디언 컴포넌트
15
+ * 클릭 시 내용이 확장되거나 축소되는 UI 컴포넌트입니다.
16
+ */
17
+ export default function Accordion({ children }: AccordionProps) {
18
+ const contentRef = useRef<HTMLDivElement>(null);
19
+ const [visible, setVisible] = useState(false);
20
+
21
+ return (
22
+ <div className={cn({
23
+ [styles.accordion]: true,
24
+ [styles['accordion--visible']]: visible,
25
+ })}
26
+ >
27
+ <button
28
+ className={cn({
29
+ [styles.button]: true,
30
+ [styles['button--visible']]: visible,
31
+ })}
32
+ type="button"
33
+ onClick={() => setVisible(!visible)}
34
+ >
35
+ Accordion
36
+ <DownIcon className={cn({
37
+ [styles.button__arrow]: true,
38
+ [styles['button__arrow--up']]: visible,
39
+ })}
40
+ />
41
+ </button>
42
+ <div
43
+ className={cn({
44
+ [styles.wrapper]: true,
45
+ [styles['wrapper--visible']]: visible,
46
+ })}
47
+ style={{ height: visible ? ((contentRef.current?.scrollHeight ?? 0)) : '0px' }}
48
+ >
49
+ <div className={styles.content} ref={contentRef}>
50
+ {children}
51
+ </div>
52
+ </div>
53
+ </div>
54
+ );
55
55
  }
@@ -1,46 +1,46 @@
1
- .breadcrumbs {
2
- width: fit-content;
3
- display: flex;
4
- align-items: center;
5
- gap: 8px;
6
- color: var(--G-60);
7
- }
8
-
9
- .separator {
10
- font-size: 12px;
11
- }
12
-
13
- .item {
14
- display: flex;
15
- align-items: center;
16
- gap: 5px;
17
- color: var(--G-60);
18
- font-size: 15px;
19
- font-weight: 500;
20
-
21
- & > svg {
22
- width: 16px;
23
- height: 16px;
24
- stroke: var(--G-60);
25
- }
26
-
27
- &:hover {
28
- text-decoration: underline;
29
-
30
- &:hover > svg {
31
- stroke: var(--G-80);
32
- }
33
- }
34
-
35
- &:last-child {
36
- color: var(--G-80);
37
-
38
- & > svg {
39
- stroke: var(--G-80);
40
- }
41
-
42
- &:hover {
43
- text-decoration: none;
44
- }
45
- }
46
- }
1
+ .breadcrumbs {
2
+ width: fit-content;
3
+ display: flex;
4
+ align-items: center;
5
+ gap: 8px;
6
+ color: var(--G-60);
7
+ }
8
+
9
+ .separator {
10
+ font-size: 12px;
11
+ }
12
+
13
+ .item {
14
+ display: flex;
15
+ align-items: center;
16
+ gap: 5px;
17
+ color: var(--G-60);
18
+ font-size: 15px;
19
+ font-weight: 500;
20
+
21
+ & > svg {
22
+ width: 16px;
23
+ height: 16px;
24
+ stroke: var(--G-60);
25
+ }
26
+
27
+ &:hover {
28
+ text-decoration: underline;
29
+
30
+ &:hover > svg {
31
+ stroke: var(--G-80);
32
+ }
33
+ }
34
+
35
+ &:last-child {
36
+ color: var(--G-80);
37
+
38
+ & > svg {
39
+ stroke: var(--G-80);
40
+ }
41
+
42
+ &:hover {
43
+ text-decoration: none;
44
+ }
45
+ }
46
+ }
@@ -1,5 +1,5 @@
1
- <svg width="18" height="16" viewBox="0 0 18 16" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="black">
2
- <path d="M4 5.5V14.5H14V5.5" stroke-width="1.2"/>
3
- <path d="M6.5 12H11.5" stroke-width="1.2"/>
4
- <path d="M1 8L9 1L17 8" stroke-width="1.2"/>
5
- </svg>
1
+ <svg width="18" height="16" viewBox="0 0 18 16" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="black">
2
+ <path d="M4 5.5V14.5H14V5.5" stroke-width="1.2"/>
3
+ <path d="M6.5 12H11.5" stroke-width="1.2"/>
4
+ <path d="M1 8L9 1L17 8" stroke-width="1.2"/>
5
+ </svg>
@@ -1,83 +1,83 @@
1
- import { Fragment } from 'react/jsx-runtime';
2
- import styles from './Breadcrumbs.module.scss';
3
- import HomeIcon from './home.svg';
4
-
5
- interface BreadcumbsProps {
6
- /**
7
- * 자식 요소로 BreadcrumbsItem 컴포넌트를 받습니다.
8
- * 각 BreadcrumbsItem은 경로를 나타내며, 클릭 시 해당 경로로 이동합니다.
9
- */
10
- children: React.ReactNode;
11
- }
12
-
13
- /**
14
- * Breadcrumbs 컴포넌트
15
- * 여러 개의 ```<BreadcrumbsItem />```을 자식으로 받아 경로를 표시합니다.
16
- * 각 ```BreadcrumbsItem```은 경로를 나타내며, 클릭 시 해당 경로로 이동합니다.
17
- */
18
- export default function Breadcrumbs({ children }: BreadcumbsProps) {
19
- return (
20
- <div className={styles.breadcrumbs}>
21
- {Array.isArray(children)
22
- ? children.map((child, idx) => (
23
- (!!child &&
24
- <Fragment key={idx}>
25
- {idx > 0 && (
26
- <div className={styles.separator}>
27
- {'>'}
28
- </div>
29
- )}
30
- {child}
31
- </Fragment>)
32
- ))
33
- : children}
34
- </div>
35
- );
36
- }
37
-
38
- interface BreadcrumbsItemProps {
39
- /**
40
- * BreadcrumbsItem의 자식 요소로 표시될 텍스트입니다.
41
- * 경로를 나타내며, 클릭 시 해당 경로로 이동합니다.
42
- */
43
- children: React.ReactNode;
44
- /**
45
- * BreadcrumbsItem이 클릭되었을 때 이동할 경로입니다.
46
- * 기본값은 '/'로 설정되어 있습니다.
47
- *
48
- */
49
- path: string;
50
- /**
51
- * BreadcrumbsItem이 홈 아이콘을 표시할지 여부입니다.
52
- * 기본값은 false로 설정되어 있습니다.
53
- * true로 설정하면 홈 아이콘이 표시됩니다.
54
- */
55
- root?: boolean;
56
- }
57
-
58
- /**
59
- * BreadcrumbsItem 컴포넌트
60
- * Breadcrumbs 컴포넌트의 자식으로 사용되며, 경로를 나타냅니다.
61
- * 클릭 시 해당 경로로 이동합니다.
62
- * 기본적으로 홈 아이콘과 함께 표시됩니다.
63
- */
64
- export function BreadcrumbsItem({ children, path, root }: BreadcrumbsItemProps) {
65
- return (
66
- <button
67
- className={styles.item}
68
- type="button"
69
- onClick={() => {
70
- window.location.assign(path);
71
- }}
72
- >
73
- {root
74
- ? (
75
- <>
76
- <HomeIcon className={styles.icon} />
77
- {children}
78
- </>
79
- )
80
- : children}
81
- </button>
82
- );
1
+ import { Fragment } from 'react/jsx-runtime';
2
+ import styles from './Breadcrumbs.module.scss';
3
+ import HomeIcon from './home.svg';
4
+
5
+ interface BreadcumbsProps {
6
+ /**
7
+ * 자식 요소로 BreadcrumbsItem 컴포넌트를 받습니다.
8
+ * 각 BreadcrumbsItem은 경로를 나타내며, 클릭 시 해당 경로로 이동합니다.
9
+ */
10
+ children: React.ReactNode;
11
+ }
12
+
13
+ /**
14
+ * Breadcrumbs 컴포넌트
15
+ * 여러 개의 ```<BreadcrumbsItem />```을 자식으로 받아 경로를 표시합니다.
16
+ * 각 ```BreadcrumbsItem```은 경로를 나타내며, 클릭 시 해당 경로로 이동합니다.
17
+ */
18
+ export default function Breadcrumbs({ children }: BreadcumbsProps) {
19
+ return (
20
+ <div className={styles.breadcrumbs}>
21
+ {Array.isArray(children)
22
+ ? children.map((child, idx) => (
23
+ (!!child &&
24
+ <Fragment key={idx}>
25
+ {idx > 0 && (
26
+ <div className={styles.separator}>
27
+ {'>'}
28
+ </div>
29
+ )}
30
+ {child}
31
+ </Fragment>)
32
+ ))
33
+ : children}
34
+ </div>
35
+ );
36
+ }
37
+
38
+ interface BreadcrumbsItemProps {
39
+ /**
40
+ * BreadcrumbsItem의 자식 요소로 표시될 텍스트입니다.
41
+ * 경로를 나타내며, 클릭 시 해당 경로로 이동합니다.
42
+ */
43
+ children: React.ReactNode;
44
+ /**
45
+ * BreadcrumbsItem이 클릭되었을 때 이동할 경로입니다.
46
+ * 기본값은 '/'로 설정되어 있습니다.
47
+ *
48
+ */
49
+ path: string;
50
+ /**
51
+ * BreadcrumbsItem이 홈 아이콘을 표시할지 여부입니다.
52
+ * 기본값은 false로 설정되어 있습니다.
53
+ * true로 설정하면 홈 아이콘이 표시됩니다.
54
+ */
55
+ root?: boolean;
56
+ }
57
+
58
+ /**
59
+ * BreadcrumbsItem 컴포넌트
60
+ * Breadcrumbs 컴포넌트의 자식으로 사용되며, 경로를 나타냅니다.
61
+ * 클릭 시 해당 경로로 이동합니다.
62
+ * 기본적으로 홈 아이콘과 함께 표시됩니다.
63
+ */
64
+ export function BreadcrumbsItem({ children, path, root }: BreadcrumbsItemProps) {
65
+ return (
66
+ <button
67
+ className={styles.item}
68
+ type="button"
69
+ onClick={() => {
70
+ window.location.assign(path);
71
+ }}
72
+ >
73
+ {root
74
+ ? (
75
+ <>
76
+ <HomeIcon className={styles.icon} />
77
+ {children}
78
+ </>
79
+ )
80
+ : children}
81
+ </button>
82
+ );
83
83
  }