diff --git a/package.json b/package.json
index 7282b85..71a5373 100644
--- a/package.json
+++ b/package.json
@@ -24,6 +24,8 @@
"@fortawesome/free-solid-svg-icons": "^6.7.1",
"@fortawesome/react-fontawesome": "^0.2.2",
"@hookform/resolvers": "^3.9.1",
+ "@nivo/core": "^0.88.0",
+ "@nivo/pie": "^0.88.0",
"@tanstack/react-query": "^5.60.6",
"@tanstack/react-query-devtools": "^5.60.6",
"@types/react-datepicker": "^7.0.0",
diff --git a/src/app/appRouter.tsx b/src/app/appRouter.tsx
index 0ad4c90..7ae26bb 100644
--- a/src/app/appRouter.tsx
+++ b/src/app/appRouter.tsx
@@ -7,6 +7,7 @@ import {
WriteGatheringPage,
PortfolioListPage,
WriteArchivePage,
+ UserPage,
RegisterPage,
SearchPage,
} from '@/pages';
@@ -51,7 +52,7 @@ const AppRouter = () => {
},
{
path: '/user',
- element: <>{/** userPage */}>,
+ element: ,
},
{
path: '/register',
diff --git a/src/features/user/index.ts b/src/features/user/index.ts
new file mode 100644
index 0000000..5ecdd1f
--- /dev/null
+++ b/src/features/user/index.ts
@@ -0,0 +1 @@
+export * from './ui';
diff --git a/src/features/user/ui/UserProfileInfo.module.scss b/src/features/user/ui/UserProfileInfo.module.scss
new file mode 100644
index 0000000..96b30e9
--- /dev/null
+++ b/src/features/user/ui/UserProfileInfo.module.scss
@@ -0,0 +1,92 @@
+.userProfileWrapper {
+ display: flex;
+ flex-direction: column;
+ row-gap: 1rem;
+ align-items: center;
+ width: 100%;
+ padding: 0 2rem;
+ color: $primary-color;
+ border-radius: 1rem;
+
+ & .profileImage {
+ width: 16rem;
+ height: 16rem;
+ overflow: hidden;
+ border-radius: 1rem;
+ box-shadow: 0 0 4px 1px rgba(54, 54, 54, 10%);
+
+ & > img {
+ width: 100%;
+ height: 100%;
+ }
+ }
+
+ & .userInfo {
+ display: flex;
+ flex-direction: column;
+ row-gap: 0.25rem;
+ width: 100%;
+
+ & .infoHeader {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ width: 100%;
+
+ & > strong {
+ font-size: 1.5rem;
+ font-weight: 600;
+ }
+ }
+
+ & .portfolioLink {
+ color: $third-color;
+ text-decoration: underline;
+ word-break: break-all;
+
+ &:hover {
+ color: $active-color;
+ cursor: pointer;
+ }
+ }
+
+ & .jobInfos {
+ display: flex;
+ column-gap: 0.5rem;
+ font-weight: 500;
+
+ & > span:last-of-type {
+ font-weight: 600;
+ }
+ }
+
+ & .introInfoWrapper {
+ padding-top: 1rem;
+
+ & > .infoTitle {
+ font-weight: 600;
+ }
+ }
+
+ & .userLinks {
+ display: flex;
+ column-gap: 0.5rem;
+ align-items: center;
+ width: 100%;
+ padding-top: 1rem;
+
+ & .userLink {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 2rem;
+ height: 2rem;
+ font-size: 0.875rem;
+ color: $secondary-color;
+ cursor: pointer;
+ background-color: $primary-color;
+ border-radius: 0.5rem;
+ }
+ }
+ }
+}
diff --git a/src/features/user/ui/UserProfileInfo.tsx b/src/features/user/ui/UserProfileInfo.tsx
new file mode 100644
index 0000000..742b2ea
--- /dev/null
+++ b/src/features/user/ui/UserProfileInfo.tsx
@@ -0,0 +1,45 @@
+import { faGear, faLink } from '@fortawesome/free-solid-svg-icons';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+
+import styles from './UserProfileInfo.module.scss';
+
+export const UserProfileInfo = () => {
+ return (
+
+
+
+
+
+
+ );
+};
diff --git a/src/features/user/ui/index.ts b/src/features/user/ui/index.ts
new file mode 100644
index 0000000..f2aadf6
--- /dev/null
+++ b/src/features/user/ui/index.ts
@@ -0,0 +1 @@
+export * from './UserProfileInfo';
diff --git a/src/pages/UserPage/UserPage.module.scss b/src/pages/UserPage/UserPage.module.scss
new file mode 100644
index 0000000..6c8bdad
--- /dev/null
+++ b/src/pages/UserPage/UserPage.module.scss
@@ -0,0 +1,44 @@
+$colors: (
+ 'red': $red,
+ 'yellow': $yellow,
+ 'green': $green,
+ 'blue': $blue,
+ 'purple': $purple,
+ 'default': $third-color,
+);
+
+@each $name, $value in $colors {
+ .#{$name} {
+ background-color: $value;
+ }
+}
+
+.container {
+ width: 100%;
+}
+
+.userBanner {
+ width: 100%;
+ height: 20rem;
+}
+
+.userProfileContainer {
+ position: relative;
+ width: 20rem;
+ min-width: 20rem;
+
+ & > div {
+ position: absolute;
+ top: 0;
+ transform: translateY(-8rem);
+ }
+}
+
+.userSectionWrapper {
+ display: flex;
+ column-gap: 4rem;
+ width: 100%;
+ padding: 0 4rem;
+
+ // border: 1px solid blue;
+}
diff --git a/src/pages/UserPage/UserPage.tsx b/src/pages/UserPage/UserPage.tsx
new file mode 100644
index 0000000..080803f
--- /dev/null
+++ b/src/pages/UserPage/UserPage.tsx
@@ -0,0 +1,21 @@
+import cn from 'classnames';
+
+import styles from './UserPage.module.scss';
+
+import { UserProfileInfo } from '@/features/user';
+import { UserContents } from '@/widgets';
+
+export const UserPage = () => {
+ return (
+
+ {/** 배너 컴포넌트 분리 예정 */}
+
+
+
+ );
+};
diff --git a/src/pages/index.ts b/src/pages/index.ts
index 8ca00d6..15c3260 100644
--- a/src/pages/index.ts
+++ b/src/pages/index.ts
@@ -6,4 +6,4 @@ export { RegisterPage } from './RegisterPage/RegisterPage';
export { SearchPage } from './SearchPage/SearchPage';
export { WriteArchivePage } from './WriteArchivePage/WriteArchivePage';
export { WriteGatheringPage } from './WriteGatheringPage/WriteGatheringPage';
-
+export { UserPage } from './UserPage/UserPage';
diff --git a/src/shared/ui/Chart/PieChart.tsx b/src/shared/ui/Chart/PieChart.tsx
new file mode 100644
index 0000000..c4ade9a
--- /dev/null
+++ b/src/shared/ui/Chart/PieChart.tsx
@@ -0,0 +1,57 @@
+import { ResponsivePie } from '@nivo/pie';
+
+interface dataType {
+ id: string;
+ label: string;
+ value: number;
+ color: string;
+}
+
+interface Props {
+ data: dataType[];
+}
+
+export const PieChart = ({ data /* see data tab */ }: Props) => (
+
+ data.color as string}
+ cornerRadius={3}
+ data={data}
+ enableArcLinkLabels={false}
+ innerRadius={0.5}
+ legends={[
+ {
+ anchor: 'bottom',
+ direction: 'row',
+ justify: false,
+ translateX: 0,
+ translateY: 56,
+ itemsSpacing: 0,
+ itemWidth: 100,
+ itemHeight: 18,
+ itemTextColor: '#333533',
+ itemDirection: 'left-to-right',
+ itemOpacity: 1,
+ symbolSize: 18,
+ symbolShape: 'circle',
+ },
+ ]}
+ margin={{ top: 40, right: 80, bottom: 80, left: 80 }}
+ padAngle={0.7}
+ theme={{
+ tooltip: {
+ container: {
+ color: '#333533',
+ },
+ },
+ }}
+ />
+
+);
diff --git a/src/shared/ui/TripleDot/TripleDot.module.scss b/src/shared/ui/TripleDot/TripleDot.module.scss
index ccb8028..cec4491 100644
--- a/src/shared/ui/TripleDot/TripleDot.module.scss
+++ b/src/shared/ui/TripleDot/TripleDot.module.scss
@@ -1,11 +1,21 @@
+.dot {
+ width: 0.325rem;
+ height: 0.325rem;
+ background-color: $primary-color;
+ border: 1px solid $primary-color;
+ border-radius: 50%;
+}
+
@keyframes shake {
0%,
100% {
transform: translateX(0);
}
+
25% {
transform: translateX(-2px);
}
+
75% {
transform: translateX(2px);
}
@@ -13,10 +23,10 @@
.container {
display: flex;
+ gap: 0.94rem;
align-items: center;
justify-content: center;
margin: auto;
- gap: 0.94rem;
&:hover {
.dot {
@@ -26,20 +36,14 @@
&:nth-child(1) {
animation-delay: 0s;
}
+
&:nth-child(2) {
animation-delay: 0.1s;
}
+
&:nth-child(3) {
animation-delay: 0.2s;
}
}
}
}
-
-.dot {
- width: 0.325rem;
- height: 0.325rem;
- border: 1px solid $primary-color;
- border-radius: 50%;
- background-color: $primary-color;
-}
diff --git a/src/widgets/Layout/Layout.module.scss b/src/widgets/Layout/Layout.module.scss
new file mode 100644
index 0000000..e77482b
--- /dev/null
+++ b/src/widgets/Layout/Layout.module.scss
@@ -0,0 +1,3 @@
+.noPadding {
+ padding: 0 0 $header-height;
+}
diff --git a/src/widgets/Layout/constants.ts b/src/widgets/Layout/constants.ts
index 8c63077..fa0cff5 100644
--- a/src/widgets/Layout/constants.ts
+++ b/src/widgets/Layout/constants.ts
@@ -12,3 +12,5 @@ export const NAV_LINKS = [
title: '게더링',
},
];
+
+export const NO_PAD_ROUTES: readonly string[] = ['/user'];
diff --git a/src/widgets/Layout/index.tsx b/src/widgets/Layout/index.tsx
index 983396b..d36780f 100644
--- a/src/widgets/Layout/index.tsx
+++ b/src/widgets/Layout/index.tsx
@@ -1,5 +1,11 @@
-import { Outlet } from 'react-router-dom';
+import cn from 'classnames';
+import { Outlet, useLocation } from 'react-router-dom';
+//constant
+import { NO_PAD_ROUTES } from './constants';
+//style
+import styles from './Layout.module.scss';
+//component
import { Footer } from './ui/Footer/Footer';
import { Header } from './ui/Header/Header';
@@ -7,6 +13,8 @@ import { useArchiveStore } from '@/features';
import { usePageLifecycle } from '@/shared/hook';
export const Layout = () => {
+ const { pathname } = useLocation();
+ const isNoPadHeader = NO_PAD_ROUTES.includes(pathname);
const { resetArchiveData, clearStorage } = useArchiveStore();
usePageLifecycle({
@@ -19,7 +27,7 @@ export const Layout = () => {
return (
<>
-
+
diff --git a/src/widgets/UserContents/ContentsTab.module.scss b/src/widgets/UserContents/ContentsTab.module.scss
new file mode 100644
index 0000000..7af9b7f
--- /dev/null
+++ b/src/widgets/UserContents/ContentsTab.module.scss
@@ -0,0 +1,16 @@
+.contentsTab {
+ display: flex;
+ column-gap: 5rem;
+ padding: 2rem 0;
+ font-size: 1.125rem;
+ color: $primary-color;
+
+ & button.activeTab {
+ font-weight: 600;
+ }
+
+ & button {
+ padding: 0;
+ margin-bottom: 0.375rem;
+ }
+}
diff --git a/src/widgets/UserContents/ContentsTab.tsx b/src/widgets/UserContents/ContentsTab.tsx
new file mode 100644
index 0000000..d9bd8b6
--- /dev/null
+++ b/src/widgets/UserContents/ContentsTab.tsx
@@ -0,0 +1,32 @@
+import cn from 'classnames';
+
+import styles from './ContentsTab.module.scss';
+import type { tabType } from './model/tab.type';
+import { TAB_LIST } from './model/tab.type';
+
+import { TripleDot } from '@/shared/ui';
+
+interface ContentsTabProps {
+ setActiveTab: (tab: tabType) => void;
+ isActive: (value: tabType) => boolean;
+}
+
+export const ContentsTab = ({ setActiveTab, isActive }: ContentsTabProps) => {
+ return (
+
+ {TAB_LIST.map(tab => (
+
+
+ {isActive(tab.value) && }
+
+ ))}
+
+ );
+};
diff --git a/src/widgets/UserContents/UserContents.module.scss b/src/widgets/UserContents/UserContents.module.scss
new file mode 100644
index 0000000..7f9e680
--- /dev/null
+++ b/src/widgets/UserContents/UserContents.module.scss
@@ -0,0 +1,36 @@
+.sectionContents {
+ width: 100%;
+}
+
+.colorTrendWrapper {
+ display: flex;
+ flex-direction: column;
+ row-gap: 2rem;
+ align-items: center;
+ justify-content: center;
+ padding: 2rem 0;
+}
+
+.colorTrendContainer {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 100%;
+ padding: 2rem;
+ color: $primary-color;
+ border-radius: 1rem;
+ box-shadow: 0 0 2px 1px rgba(0, 0, 0, 15%);
+
+ & > h2 {
+ font-size: 1.5rem;
+ font-weight: 600;
+ }
+
+ & > div {
+ width: 50%;
+ }
+}
+
+.userContentSection {
+ flex: 1;
+}
diff --git a/src/widgets/UserContents/UserContents.tsx b/src/widgets/UserContents/UserContents.tsx
new file mode 100644
index 0000000..0b78fe8
--- /dev/null
+++ b/src/widgets/UserContents/UserContents.tsx
@@ -0,0 +1,90 @@
+import styles from './UserContents.module.scss';
+import { ArchiveGrid } from '../ArchiveGrid';
+import { GatheringGrid } from '../GatheringGrid';
+import { ContentsTab } from './ContentsTab';
+import { useUserTab } from './hook/useUserTab';
+
+import type { ArchiveCardDTO, Color } from '@/features';
+import { PieChart } from '@/shared/ui/Chart/PieChart';
+
+//더미 데이터
+const ARCHIVE_COLOR_DATA = [
+ {
+ id: 'red',
+ value: 23,
+ color: '#ff5e5e',
+ label: 'red',
+ },
+ {
+ id: 'yellow',
+ value: 12,
+ color: '#ffe66b',
+ label: 'yellow',
+ },
+ {
+ id: 'green',
+ value: 32,
+ color: '#b5d681',
+ label: 'green',
+ },
+ {
+ id: 'blue',
+ value: 21,
+ color: '#8ad0e2',
+ label: 'blue',
+ },
+ {
+ id: 'purple',
+ value: 32,
+ color: '#aa8abd',
+ label: 'purple',
+ },
+];
+
+//더미 데이터
+const dummyArchives: ArchiveCardDTO[] = Array.from({ length: 9 }, (_, i) => ({
+ archiveId: i,
+ title: `Sample Archive`,
+ introduction: `Description for sample archive`,
+ type: ['red', 'blue', 'green', 'yellow', 'purple'][Math.floor(Math.random() * 4)] as Color,
+ username: '홍길동',
+ likeCount: Math.floor(Math.random() * 100),
+ isLiked: Math.random() > 0.5,
+ thumbnail: 'https://picsum.photos/300/200',
+ createDate: new Date(),
+}));
+
+const ArchiveContent = () => (
+
+);
+
+const GatheringContent = () => ;
+
+const ContentComponents = {
+ gathering: GatheringContent,
+ archive: ArchiveContent,
+};
+
+export const UserContents = () => {
+ const { activeTab, isActive, setActiveTab } = useUserTab();
+
+ const ContentComponent = ContentComponents[activeTab];
+
+ return (
+
+ );
+};
diff --git a/src/widgets/UserContents/hook/useUserTab.ts b/src/widgets/UserContents/hook/useUserTab.ts
new file mode 100644
index 0000000..10652b2
--- /dev/null
+++ b/src/widgets/UserContents/hook/useUserTab.ts
@@ -0,0 +1,22 @@
+import { useSearchParams } from 'react-router-dom';
+
+import type { tabType } from '../model/tab.type';
+import { TAB_LIST } from '../model/tab.type';
+
+export const useUserTab = () => {
+ const [searchParams, setSearchParams] = useSearchParams();
+ const tabParam = searchParams.get('tab');
+
+ const isValidTab = (tabParam: string | null): tabParam is tabType =>
+ TAB_LIST.map(tab => tab.value).includes(tabParam as tabType);
+
+ const activeTab = isValidTab(tabParam) ? tabParam : 'gathering';
+
+ const isActive = (value: tabType) => value === activeTab;
+
+ const setActiveTab = (tab: tabType) => {
+ setSearchParams({ tab });
+ };
+
+ return { activeTab, isActive, setActiveTab };
+};
diff --git a/src/widgets/UserContents/model/tab.type.ts b/src/widgets/UserContents/model/tab.type.ts
new file mode 100644
index 0000000..d91ac76
--- /dev/null
+++ b/src/widgets/UserContents/model/tab.type.ts
@@ -0,0 +1,6 @@
+export const TAB_LIST = [
+ { name: '게더링', value: 'gathering' },
+ { name: '아카이브', value: 'archive' },
+] as const;
+
+export type tabType = 'gathering' | 'archive';
diff --git a/src/widgets/index.ts b/src/widgets/index.ts
index fdae5d7..b5f96b3 100644
--- a/src/widgets/index.ts
+++ b/src/widgets/index.ts
@@ -9,4 +9,4 @@ export * from './SearchTap/SearchTap';
export * from './WriteArchive';
export * from './WriteGathering/WriteGatheringDetail';
export * from './WriteGathering/WriteGatheringOpts';
-
+export * from './UserContents/UserContents';
diff --git a/yarn.lock b/yarn.lock
index a282f13..a59d294 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2208,6 +2208,82 @@
outvariant "^1.4.3"
strict-event-emitter "^0.5.1"
+"@nivo/arcs@0.88.0":
+ version "0.88.0"
+ resolved "https://registry.yarnpkg.com/@nivo/arcs/-/arcs-0.88.0.tgz#0004aa612fd12eee5fd415ed257812b722bf5a10"
+ integrity sha512-q7MHxT71s/KKlDDtSJS4L9+/JIa5HPZZrDr3ZFECLnvp0TC1qzyFMtVevN2CsXopSTj8poN4uFXPWxYVXOq8vg==
+ dependencies:
+ "@nivo/colors" "0.88.0"
+ "@nivo/core" "0.88.0"
+ "@react-spring/web" "9.4.5 || ^9.7.2"
+ "@types/d3-shape" "^3.1.6"
+ d3-shape "^3.2.0"
+
+"@nivo/colors@0.88.0":
+ version "0.88.0"
+ resolved "https://registry.yarnpkg.com/@nivo/colors/-/colors-0.88.0.tgz#2790ac0607381800270f2902e4d957e65e2cad70"
+ integrity sha512-IZ+leYIqAlo7dyLHmsQwujanfRgXyoQ5H7PU3RWLEn1PP0zxDKLgEjFEDADpDauuslh2Tx0L81GNkWR6QSP0Mw==
+ dependencies:
+ "@nivo/core" "0.88.0"
+ "@types/d3-color" "^3.0.0"
+ "@types/d3-scale" "^4.0.8"
+ "@types/d3-scale-chromatic" "^3.0.0"
+ "@types/prop-types" "^15.7.2"
+ d3-color "^3.1.0"
+ d3-scale "^4.0.2"
+ d3-scale-chromatic "^3.0.0"
+ lodash "^4.17.21"
+ prop-types "^15.7.2"
+
+"@nivo/core@0.88.0", "@nivo/core@^0.88.0":
+ version "0.88.0"
+ resolved "https://registry.yarnpkg.com/@nivo/core/-/core-0.88.0.tgz#ec79c7d63311473f15a463fd78274d9971a52848"
+ integrity sha512-XjUkA5MmwjLP38bdrJwn36Gj7T5SYMKD55LYQp/1nIJPdxqJ38dUfE4XyBDfIEgfP6yrHOihw3C63cUdnUBoiw==
+ dependencies:
+ "@nivo/tooltip" "0.88.0"
+ "@react-spring/web" "9.4.5 || ^9.7.2"
+ "@types/d3-shape" "^3.1.6"
+ d3-color "^3.1.0"
+ d3-format "^1.4.4"
+ d3-interpolate "^3.0.1"
+ d3-scale "^4.0.2"
+ d3-scale-chromatic "^3.0.0"
+ d3-shape "^3.2.0"
+ d3-time-format "^3.0.0"
+ lodash "^4.17.21"
+ prop-types "^15.7.2"
+
+"@nivo/legends@0.88.0":
+ version "0.88.0"
+ resolved "https://registry.yarnpkg.com/@nivo/legends/-/legends-0.88.0.tgz#a6007492048358a14bd061472a117ed34e7b0c81"
+ integrity sha512-d4DF9pHbD8LmGJlp/Gp1cF4e8y2wfQTcw3jVhbZj9zkb7ZWB7JfeF60VHRfbXNux9bjQ9U78/SssQqueVDPEmg==
+ dependencies:
+ "@nivo/colors" "0.88.0"
+ "@nivo/core" "0.88.0"
+ "@types/d3-scale" "^4.0.8"
+ d3-scale "^4.0.2"
+
+"@nivo/pie@^0.88.0":
+ version "0.88.0"
+ resolved "https://registry.yarnpkg.com/@nivo/pie/-/pie-0.88.0.tgz#628a608d077d9cfe850ffef1b16181482479e7c7"
+ integrity sha512-BE6dFWlGne1SnaEkFHNbg0sZBiwtcIqBFwmMRJ0F11SiKOzVeJyq3KiyY1I2ySSCx5VR1V8/MNBXzXFu3vJMAQ==
+ dependencies:
+ "@nivo/arcs" "0.88.0"
+ "@nivo/colors" "0.88.0"
+ "@nivo/core" "0.88.0"
+ "@nivo/legends" "0.88.0"
+ "@nivo/tooltip" "0.88.0"
+ "@types/d3-shape" "^3.1.6"
+ d3-shape "^3.2.0"
+
+"@nivo/tooltip@0.88.0":
+ version "0.88.0"
+ resolved "https://registry.yarnpkg.com/@nivo/tooltip/-/tooltip-0.88.0.tgz#b98348c0d617fea09c1bbddccc443c12ca697620"
+ integrity sha512-iEjVfQA8gumAzg/yUinjTwswygCkE5Iwuo8opwnrbpNIqMrleBV+EAKIgB0PrzepIoW8CFG/SJhoiRfbU8jhOw==
+ dependencies:
+ "@nivo/core" "0.88.0"
+ "@react-spring/web" "9.4.5 || ^9.7.2"
+
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -2379,6 +2455,51 @@
unbzip2-stream "^1.4.3"
yargs "^17.7.2"
+"@react-spring/animated@~9.7.5":
+ version "9.7.5"
+ resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.7.5.tgz#eb0373aaf99b879736b380c2829312dae3b05f28"
+ integrity sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==
+ dependencies:
+ "@react-spring/shared" "~9.7.5"
+ "@react-spring/types" "~9.7.5"
+
+"@react-spring/core@~9.7.5":
+ version "9.7.5"
+ resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.7.5.tgz#72159079f52c1c12813d78b52d4f17c0bf6411f7"
+ integrity sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==
+ dependencies:
+ "@react-spring/animated" "~9.7.5"
+ "@react-spring/shared" "~9.7.5"
+ "@react-spring/types" "~9.7.5"
+
+"@react-spring/rafz@~9.7.5":
+ version "9.7.5"
+ resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.7.5.tgz#ee7959676e7b5d6a3813e8c17d5e50df98b95df9"
+ integrity sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==
+
+"@react-spring/shared@~9.7.5":
+ version "9.7.5"
+ resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.7.5.tgz#6d513622df6ad750bbbd4dedb4ca0a653ec92073"
+ integrity sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==
+ dependencies:
+ "@react-spring/rafz" "~9.7.5"
+ "@react-spring/types" "~9.7.5"
+
+"@react-spring/types@~9.7.5":
+ version "9.7.5"
+ resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.7.5.tgz#e5dd180f3ed985b44fd2cd2f32aa9203752ef3e8"
+ integrity sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==
+
+"@react-spring/web@9.4.5 || ^9.7.2":
+ version "9.7.5"
+ resolved "https://registry.yarnpkg.com/@react-spring/web/-/web-9.7.5.tgz#7d7782560b3a6fb9066b52824690da738605de80"
+ integrity sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==
+ dependencies:
+ "@react-spring/animated" "~9.7.5"
+ "@react-spring/core" "~9.7.5"
+ "@react-spring/shared" "~9.7.5"
+ "@react-spring/types" "~9.7.5"
+
"@remix-run/router@1.21.0":
version "1.21.0"
resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.21.0.tgz#c65ae4262bdcfe415dbd4f64ec87676e4a56e2b5"
@@ -3053,6 +3174,40 @@
resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5"
integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==
+"@types/d3-color@^3.0.0":
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2"
+ integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==
+
+"@types/d3-path@*":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.0.tgz#2b907adce762a78e98828f0b438eaca339ae410a"
+ integrity sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==
+
+"@types/d3-scale-chromatic@^3.0.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#dc6d4f9a98376f18ea50bad6c39537f1b5463c39"
+ integrity sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==
+
+"@types/d3-scale@^4.0.8":
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb"
+ integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==
+ dependencies:
+ "@types/d3-time" "*"
+
+"@types/d3-shape@^3.1.6":
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.6.tgz#65d40d5a548f0a023821773e39012805e6e31a72"
+ integrity sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==
+ dependencies:
+ "@types/d3-path" "*"
+
+"@types/d3-time@*":
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.4.tgz#8472feecd639691450dd8000eb33edd444e1323f"
+ integrity sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==
+
"@types/doctrine@^0.0.9":
version "0.0.9"
resolved "https://registry.yarnpkg.com/@types/doctrine/-/doctrine-0.0.9.tgz#d86a5f452a15e3e3113b99e39616a9baa0f9863f"
@@ -3158,7 +3313,7 @@
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239"
integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==
-"@types/prop-types@*":
+"@types/prop-types@*", "@types/prop-types@^15.7.2":
version "15.7.13"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451"
integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==
@@ -4479,6 +4634,101 @@ csstype@^3.0.2:
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+d3-array@2:
+ version "2.12.1"
+ resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81"
+ integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==
+ dependencies:
+ internmap "^1.0.0"
+
+"d3-array@2 - 3", "d3-array@2.10.0 - 3":
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5"
+ integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
+ dependencies:
+ internmap "1 - 2"
+
+"d3-color@1 - 3", d3-color@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2"
+ integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==
+
+"d3-format@1 - 3":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641"
+ integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==
+
+d3-format@^1.4.4:
+ version "1.4.5"
+ resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4"
+ integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==
+
+"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d"
+ integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
+ dependencies:
+ d3-color "1 - 3"
+
+d3-path@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526"
+ integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==
+
+d3-scale-chromatic@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#34c39da298b23c20e02f1a4b239bd0f22e7f1314"
+ integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==
+ dependencies:
+ d3-color "1 - 3"
+ d3-interpolate "1 - 3"
+
+d3-scale@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396"
+ integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==
+ dependencies:
+ d3-array "2.10.0 - 3"
+ d3-format "1 - 3"
+ d3-interpolate "1.2.0 - 3"
+ d3-time "2.1.1 - 3"
+ d3-time-format "2 - 4"
+
+d3-shape@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5"
+ integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==
+ dependencies:
+ d3-path "^3.1.0"
+
+"d3-time-format@2 - 4":
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a"
+ integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==
+ dependencies:
+ d3-time "1 - 3"
+
+d3-time-format@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-3.0.0.tgz#df8056c83659e01f20ac5da5fdeae7c08d5f1bb6"
+ integrity sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==
+ dependencies:
+ d3-time "1 - 2"
+
+"d3-time@1 - 2":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.1.1.tgz#e9d8a8a88691f4548e68ca085e5ff956724a6682"
+ integrity sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==
+ dependencies:
+ d3-array "2"
+
+"d3-time@1 - 3", "d3-time@2.1.1 - 3":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7"
+ integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==
+ dependencies:
+ d3-array "2 - 3"
+
damerau-levenshtein@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7"
@@ -6082,6 +6332,16 @@ internal-slot@^1.0.7:
hasown "^2.0.0"
side-channel "^1.0.4"
+"internmap@1 - 2":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009"
+ integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
+
+internmap@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95"
+ integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==
+
intl-messageformat@^10.5.3:
version "10.7.7"
resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.7.7.tgz#42085e1664729d02240a03346e31a2540b1112a0"
@@ -7992,7 +8252,7 @@ prompts@^2.0.1:
kleur "^3.0.3"
sisteransi "^1.0.5"
-prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.8.1:
+prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==