@jk-core/components 1.1.17 → 1.1.19

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 (91) hide show
  1. package/README.md +73 -73
  2. package/dist/index.js +1299 -997
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.umd.cjs +8 -8
  5. package/dist/index.umd.cjs.map +1 -1
  6. package/dist/src/common/Carousel/index.d.ts +15 -0
  7. package/dist/src/common/RollingBanner/index.d.ts +11 -0
  8. package/dist/src/index.d.ts +3 -1
  9. package/dist/src/utils/ts/formatMoney.d.ts +1 -1
  10. package/package.json +99 -99
  11. package/src/Calendar/Calendar.module.scss +213 -213
  12. package/src/Calendar/RangeCalendar.tsx +125 -125
  13. package/src/Calendar/ScrollCalendar.module.scss +214 -214
  14. package/src/Calendar/ScrollCalendar.tsx +124 -124
  15. package/src/Calendar/SingleCalendar.tsx +121 -121
  16. package/src/Calendar/components/DateLabel/DateLabel.module.scss +89 -89
  17. package/src/Calendar/components/DateLabel/index.tsx +91 -91
  18. package/src/Calendar/components/DayTile/DayTile.module.scss +117 -117
  19. package/src/Calendar/components/DayTile/index.tsx +108 -108
  20. package/src/Calendar/components/MonthTile/MonthTile.module.scss +59 -59
  21. package/src/Calendar/components/MonthTile/index.tsx +50 -50
  22. package/src/Calendar/components/ViewSelector/ViewSelector.module.scss +48 -48
  23. package/src/Calendar/components/ViewSelector/index.tsx +49 -49
  24. package/src/Calendar/components/YearTile/YearTile.module.scss +85 -85
  25. package/src/Calendar/components/YearTile/index.tsx +65 -65
  26. package/src/Calendar/hooks/useCalendarNav.ts +83 -83
  27. package/src/Calendar/hooks/useDateSelect.ts +54 -54
  28. package/src/Calendar/index.scss +189 -189
  29. package/src/Calendar/index.tsx +66 -66
  30. package/src/Calendar/type.ts +3 -3
  31. package/src/Calendar/utils/getWeeksInMonth.ts +45 -45
  32. package/src/Calendar/utils/isInRange.ts +8 -8
  33. package/src/Calendar/utils/isSameDay.ts +21 -21
  34. package/src/assets/arrow.svg +11 -11
  35. package/src/assets/close.svg +15 -15
  36. package/src/assets/drop-arrow.svg +3 -3
  37. package/src/common/Accordion/Accordion.module.scss +53 -53
  38. package/src/common/Accordion/arrow-down.svg +3 -3
  39. package/src/common/Accordion/arrow-up.svg +3 -3
  40. package/src/common/Accordion/index.tsx +54 -54
  41. package/src/common/Breadcrumbs/Breadcrumbs.module.scss +46 -46
  42. package/src/common/Breadcrumbs/home.svg +5 -5
  43. package/src/common/Breadcrumbs/index.tsx +82 -82
  44. package/src/common/Button/Button.module.scss +127 -127
  45. package/src/common/Button/index.tsx +60 -60
  46. package/src/common/Card/Card.module.scss +28 -28
  47. package/src/common/Card/index.tsx +19 -19
  48. package/src/common/Carousel/Carousel.module.scss +222 -0
  49. package/src/common/Carousel/index.tsx +411 -0
  50. package/src/common/Divider/Divider.module.scss +101 -101
  51. package/src/common/Divider/index.tsx +24 -24
  52. package/src/common/DropDown/DropDown.module.scss +135 -135
  53. package/src/common/DropDown/List.tsx +156 -156
  54. package/src/common/DropDown/arrow-down.svg +3 -3
  55. package/src/common/DropDown/index.tsx +108 -108
  56. package/src/common/DropDown/search.svg +4 -4
  57. package/src/common/Pagination/Pagination.module.scss +210 -210
  58. package/src/common/Pagination/arrow-left.svg +11 -11
  59. package/src/common/Pagination/arrow-right.svg +11 -11
  60. package/src/common/Pagination/index.tsx +156 -156
  61. package/src/common/RollingBanner/RollingBanner.module.scss +126 -0
  62. package/src/common/RollingBanner/index.tsx +140 -0
  63. package/src/common/SegmentButton/SegmentButton.module.scss +46 -45
  64. package/src/common/SegmentButton/index.tsx +79 -79
  65. package/src/common/Skeleton/Skeleton.module.scss +80 -80
  66. package/src/common/Skeleton/index.tsx +47 -47
  67. package/src/common/SwitchButton/SwitchButton.module.scss +65 -65
  68. package/src/common/SwitchButton/index.tsx +57 -57
  69. package/src/common/Table/Table.module.scss +70 -70
  70. package/src/common/Table/index.tsx +128 -128
  71. package/src/index.scss +1 -1
  72. package/src/index.tsx +24 -22
  73. package/src/styles/color.scss +346 -346
  74. package/src/styles/font-face.scss +18 -18
  75. package/src/styles/font.scss +49 -49
  76. package/src/styles/mediaQuery.scss +22 -22
  77. package/src/styles/scrollbar.scss +71 -71
  78. package/src/svg.d.ts +6 -6
  79. package/src/utils/styles/mediaQuery.scss +22 -22
  80. package/src/utils/ts/allowDecimal.ts +4 -4
  81. package/src/utils/ts/autoHypen.ts +33 -33
  82. package/src/utils/ts/calculateMax.ts +24 -24
  83. package/src/utils/ts/checkIsMobilePlatform.ts +15 -15
  84. package/src/utils/ts/formatFileSize.ts +16 -16
  85. package/src/utils/ts/formatMoney.ts +16 -16
  86. package/src/utils/ts/gradientRatio.ts +61 -61
  87. package/src/utils/ts/kiloToMega.ts +30 -30
  88. package/src/utils/ts/maskingPhone.ts +8 -8
  89. package/src/utils/ts/toQueryString.ts +7 -7
  90. package/src/utils/ts/valueAsNumber.ts +15 -15
  91. 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
  }