From 94c0c1c7cee39ccc46cbffa6fa8627dd156dee7e Mon Sep 17 00:00:00 2001 From: ckswnskfk Date: Mon, 22 Jan 2024 23:38:32 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=ED=85=9C=ED=94=8C=EB=A6=BF=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 0 next.config.js | 13 +- package-lock.json | 4 +- package.json | 14 +- pages/_app.tsx | 6 +- pages/_document.tsx | 0 pages/api/hello.ts | 13 - pages/folder/index.tsx | 42 + pages/index.tsx | 113 +- pages/shared/index.tsx | 36 + pages/signin/index.tsx | 22 + pages/signup/index.tsx | 22 + public/favicon.ico | Bin 25931 -> 0 bytes public/images/card-default.png | Bin 0 -> 2172 bytes public/images/check.svg | 5 + public/images/close.svg | 5 + public/images/facebook.svg | 3 + public/images/google-oauth.png | Bin 0 -> 3875 bytes public/images/instagram.svg | 3 + public/images/kakao-oauth.png | Bin 0 -> 2704 bytes public/images/kebab.svg | 7 + public/images/link.svg | 6 + public/images/linkbrary.svg | 11 + public/images/pen.svg | 7 + public/images/search.svg | 8 + public/images/share.svg | 11 + public/images/star.svg | 10 + public/images/trash.svg | 8 + public/images/twitter.svg | 3 + public/images/youtube.svg | 10 + public/next.svg | 1 - public/vercel.svg | 1 - src/auth/data-access-auth/index.ts | 3 + .../useCheckEmailDuplicate.tsx | 20 + src/auth/data-access-auth/useSignIn.tsx | 30 + src/auth/data-access-auth/useSignUp.tsx | 30 + src/auth/feature-oauth/Oauth.module.scss | 24 + src/auth/feature-oauth/Oauth.tsx | 23 + src/auth/feature-oauth/constant.ts | 12 + src/auth/feature-oauth/index.ts | 1 + .../SignInForm.module.scss | 23 + src/auth/feature-sign-in-form/SignInForm.tsx | 82 + src/auth/feature-sign-in-form/constant.ts | 12 + src/auth/feature-sign-in-form/index.ts | 1 + .../SignUpForm.module.scss | 23 + src/auth/feature-sign-up-form/SignUpForm.tsx | 111 + src/auth/feature-sign-up-form/constant.ts | 13 + src/auth/feature-sign-up-form/index.ts | 1 + src/auth/type.ts | 4 + .../ui-oauth-badge/OauthBadge.module.scss | 4 + src/auth/ui-oauth-badge/OauthBadge.tsx | 18 + src/auth/ui-oauth-badge/index.ts | 1 + .../ui-sign-header/SignHeader.module.scss | 30 + src/auth/ui-sign-header/SignHeader.tsx | 33 + src/auth/ui-sign-header/index.ts | 1 + src/auth/util-use-token-redirect/index.ts | 1 + .../useTokenRedirect.tsx | 23 + src/folder/data-access-folder/index.js | 2 + src/folder/data-access-folder/useGetFolder.ts | 13 + .../data-access-folder/useGetFolders.ts | 14 + .../FolderToolBar.module.scss | 69 + .../feature-folder-tool-bar/FolderToolBar.tsx | 121 + .../feature-folder-tool-bar/constant.js | 32 + src/folder/feature-folder-tool-bar/index.js | 1 + src/folder/type.ts | 32 + .../AddFolderButton.module.scss | 30 + .../ui-add-folder-button/AddFolderButton.tsx | 19 + src/folder/ui-add-folder-button/add.svg | 5 + src/folder/ui-add-folder-button/index.js | 1 + .../ui-folder-button/FolderButton.module.scss | 27 + src/folder/ui-folder-button/FolderButton.tsx | 19 + src/folder/ui-folder-button/index.js | 1 + .../ui-folder-info/FolderInfo.module.scss | 48 + src/folder/ui-folder-info/FolderInfo.tsx | 20 + src/folder/ui-folder-info/index.js | 1 + .../ui-folder-item/FolderItem.module.scss | 38 + src/folder/ui-folder-item/FolderItem.tsx | 27 + src/folder/ui-folder-item/index.js | 1 + .../ui-share-modal/ShareModal.module.scss | 25 + src/folder/ui-share-modal/ShareModal.tsx | 62 + src/folder/ui-share-modal/facebook.svg | 11 + src/folder/ui-share-modal/index.js | 1 + src/folder/ui-share-modal/kakao.svg | 11 + src/folder/ui-share-modal/link.svg | 12 + src/folder/util-map/constant.ts | 6 + src/folder/util-map/index.js | 1 + src/folder/util-map/mapFolderData.ts | 16 + src/folder/util-map/mapFoldersData.ts | 17 + src/global.d.ts | 5 + src/link/data-access-link/constant.js | 1 + src/link/data-access-link/index.js | 1 + src/link/data-access-link/useGetLinks.ts | 43 + src/link/feature-card-list/CardList.tsx | 88 + src/link/feature-card-list/constant.js | 4 + src/link/feature-card-list/index.js | 1 + .../feature-link-form/LinkForm.module.scss | 25 + src/link/feature-link-form/LinkForm.tsx | 67 + src/link/feature-link-form/index.js | 1 + src/link/type.ts | 30 + .../AddLinkModal.module.scss | 25 + src/link/ui-add-link-modal/AddLinkModal.tsx | 64 + src/link/ui-add-link-modal/index.js | 1 + src/link/ui-card-list/CardList.module.scss | 16 + src/link/ui-card-list/CardList.tsx | 13 + src/link/ui-card-list/index.js | 1 + .../ui-editable-card/EditableCard.module.scss | 43 + src/link/ui-editable-card/EditableCard.tsx | 92 + src/link/ui-editable-card/index.js | 1 + src/link/ui-link-form/LinkForm.module.scss | 64 + src/link/ui-link-form/LinkForm.tsx | 39 + src/link/ui-link-form/index.js | 1 + src/link/ui-no-link/NoLink.module.scss | 20 + src/link/ui-no-link/NoLink.tsx | 12 + src/link/ui-no-link/index.js | 1 + src/link/ui-read-only-card/ReadOnlyCard.tsx | 40 + src/link/ui-read-only-card/index.js | 1 + src/link/ui-search-bar/SearchBar.module.scss | 41 + src/link/ui-search-bar/SearchBar.tsx | 37 + src/link/ui-search-bar/close.svg | 5 + src/link/ui-search-bar/constant.js | 1 + src/link/ui-search-bar/index.js | 1 + src/link/util-map/index.js | 1 + src/link/util-map/mapLinksData.ts | 24 + src/link/util-search-link/index.ts | 1 + src/link/util-search-link/useSearchLink.ts | 27 + .../FolderLayout/FolderLayout.module.scss | 39 + src/page-layout/FolderLayout/FolderLayout.tsx | 32 + src/page-layout/FolderLayout/index.js | 1 + .../SharedLayout/SharedLayout.module.scss | 30 + src/page-layout/SharedLayout/SharedLayout.tsx | 23 + src/page-layout/SharedLayout/index.js | 1 + .../SignLayout/SignLayout.module.scss | 26 + src/page-layout/SignLayout/SignLayout.tsx | 23 + src/page-layout/SignLayout/index.ts | 1 + src/sharing/feature-layout/Layout.module.scss | 5 + src/sharing/feature-layout/Layout.tsx | 27 + src/sharing/feature-layout/index.js | 1 + .../ui-alert-modal/AlertModal.module.scss | 19 + src/sharing/ui-alert-modal/AlertModal.tsx | 49 + src/sharing/ui-alert-modal/index.js | 1 + .../ui-card-content/CardContent.module.scss | 33 + src/sharing/ui-card-content/CardContent.tsx | 26 + src/sharing/ui-card-content/index.js | 1 + .../ui-card-image/CardImage.module.scss | 26 + src/sharing/ui-card-image/CardImage.tsx | 23 + src/sharing/ui-card-image/constant.js | 1 + src/sharing/ui-card-image/index.js | 1 + src/sharing/ui-card/Card.module.scss | 16 + src/sharing/ui-card/Card.tsx | 19 + src/sharing/ui-card/index.js | 1 + src/sharing/ui-cta/Cta.module.scss | 12 + src/sharing/ui-cta/Cta.tsx | 13 + src/sharing/ui-cta/index.js | 1 + src/sharing/ui-footer/Footer.module.scss | 58 + src/sharing/ui-footer/Footer.tsx | 39 + src/sharing/ui-footer/constant.js | 5 + src/sharing/ui-footer/index.js | 1 + .../IconAndTextButton.module.scss | 18 + .../IconAndTextButton.tsx | 20 + src/sharing/ui-icon-and-text-button/index.js | 1 + .../ui-input-modal/InputModal.module.scss | 23 + src/sharing/ui-input-modal/InputModal.tsx | 47 + src/sharing/ui-input-modal/index.js | 1 + src/sharing/ui-input/Input.module.scss | 38 + src/sharing/ui-input/Input.tsx | 34 + src/sharing/ui-input/index.js | 1 + .../ModalContentBox.module.scss | 29 + .../ui-modal-content-box/ModalContentBox.tsx | 25 + src/sharing/ui-modal-content-box/index.js | 1 + .../ModalContentButton.module.scss | 22 + .../ModalContentButton.tsx | 23 + src/sharing/ui-modal-content-button/index.js | 1 + .../ModalContentDescription.module.scss | 7 + .../ModalContentDescription.tsx | 13 + .../ui-modal-content-description/index.js | 1 + .../ModalContentTitle.module.scss | 7 + .../ModalContentTitle.tsx | 13 + src/sharing/ui-modal-content-title/index.js | 1 + src/sharing/ui-modal/Modal.module.scss | 28 + src/sharing/ui-modal/Modal.tsx | 63 + src/sharing/ui-modal/index.js | 1 + .../NavigationBar.module.scss | 56 + .../ui-navigation-bar/NavigationBar.tsx | 38 + src/sharing/ui-navigation-bar/constant.js | 5 + src/sharing/ui-navigation-bar/index.js | 1 + .../PasswordInput.module.scss | 11 + .../ui-password-input/PasswordInput.tsx | 52 + src/sharing/ui-password-input/eye-off.svg | 4 + src/sharing/ui-password-input/eye-on.svg | 4 + src/sharing/ui-password-input/index.ts | 1 + src/sharing/ui-popover/Popover.module.scss | 6 + src/sharing/ui-popover/Popover.tsx | 63 + src/sharing/ui-popover/index.js | 1 + src/sharing/ui-portal/Portal.tsx | 17 + src/sharing/ui-portal/index.js | 1 + src/sharing/util/axiosInstance.js | 5 + src/sharing/util/constant.js | 26 + src/sharing/util/copyToClipboard.ts | 15 + src/sharing/util/getElapsedTime.ts | 37 + src/sharing/util/index.js | 10 + src/sharing/util/useAsync.ts | 35 + src/sharing/util/useBackgroundClick.ts | 12 + src/sharing/util/useEffectOnce.ts | 8 + src/sharing/util/useEnhancedEffect.ts | 3 + src/sharing/util/useIntersectionObserver.tsx | 29 + src/sharing/util/useKakaoSdk.ts | 81 + src/user/data-access-user/index.js | 1 + src/user/data-access-user/useGetUser.ts | 9 + src/user/type.ts | 6 + src/user/ui-profile/Profile.module.scss | 23 + src/user/ui-profile/Profile.tsx | 20 + src/user/ui-profile/index.js | 1 + styles/Home.module.css | 229 - styles/colors.scss | 16 + styles/global.scss | 3 + styles/globals.css | 107 - styles/mixin.scss | 24 + styles/reset.css | 40 + styles/variables.scss | 4 + tsconfig.json | 0 yarn.lock | 3875 +++++++++++++++++ 221 files changed, 7813 insertions(+), 467 deletions(-) mode change 100644 => 100755 README.md mode change 100644 => 100755 next.config.js mode change 100644 => 100755 package-lock.json mode change 100644 => 100755 package.json mode change 100644 => 100755 pages/_app.tsx mode change 100644 => 100755 pages/_document.tsx delete mode 100644 pages/api/hello.ts create mode 100755 pages/folder/index.tsx mode change 100644 => 100755 pages/index.tsx create mode 100755 pages/shared/index.tsx create mode 100755 pages/signin/index.tsx create mode 100755 pages/signup/index.tsx delete mode 100644 public/favicon.ico create mode 100755 public/images/card-default.png create mode 100755 public/images/check.svg create mode 100755 public/images/close.svg create mode 100755 public/images/facebook.svg create mode 100755 public/images/google-oauth.png create mode 100755 public/images/instagram.svg create mode 100755 public/images/kakao-oauth.png create mode 100755 public/images/kebab.svg create mode 100755 public/images/link.svg create mode 100755 public/images/linkbrary.svg create mode 100755 public/images/pen.svg create mode 100755 public/images/search.svg create mode 100755 public/images/share.svg create mode 100755 public/images/star.svg create mode 100755 public/images/trash.svg create mode 100755 public/images/twitter.svg create mode 100755 public/images/youtube.svg delete mode 100644 public/next.svg delete mode 100644 public/vercel.svg create mode 100755 src/auth/data-access-auth/index.ts create mode 100755 src/auth/data-access-auth/useCheckEmailDuplicate.tsx create mode 100755 src/auth/data-access-auth/useSignIn.tsx create mode 100755 src/auth/data-access-auth/useSignUp.tsx create mode 100755 src/auth/feature-oauth/Oauth.module.scss create mode 100755 src/auth/feature-oauth/Oauth.tsx create mode 100755 src/auth/feature-oauth/constant.ts create mode 100755 src/auth/feature-oauth/index.ts create mode 100755 src/auth/feature-sign-in-form/SignInForm.module.scss create mode 100755 src/auth/feature-sign-in-form/SignInForm.tsx create mode 100755 src/auth/feature-sign-in-form/constant.ts create mode 100755 src/auth/feature-sign-in-form/index.ts create mode 100755 src/auth/feature-sign-up-form/SignUpForm.module.scss create mode 100755 src/auth/feature-sign-up-form/SignUpForm.tsx create mode 100755 src/auth/feature-sign-up-form/constant.ts create mode 100755 src/auth/feature-sign-up-form/index.ts create mode 100755 src/auth/type.ts create mode 100755 src/auth/ui-oauth-badge/OauthBadge.module.scss create mode 100755 src/auth/ui-oauth-badge/OauthBadge.tsx create mode 100755 src/auth/ui-oauth-badge/index.ts create mode 100755 src/auth/ui-sign-header/SignHeader.module.scss create mode 100755 src/auth/ui-sign-header/SignHeader.tsx create mode 100755 src/auth/ui-sign-header/index.ts create mode 100755 src/auth/util-use-token-redirect/index.ts create mode 100755 src/auth/util-use-token-redirect/useTokenRedirect.tsx create mode 100755 src/folder/data-access-folder/index.js create mode 100755 src/folder/data-access-folder/useGetFolder.ts create mode 100755 src/folder/data-access-folder/useGetFolders.ts create mode 100755 src/folder/feature-folder-tool-bar/FolderToolBar.module.scss create mode 100755 src/folder/feature-folder-tool-bar/FolderToolBar.tsx create mode 100755 src/folder/feature-folder-tool-bar/constant.js create mode 100755 src/folder/feature-folder-tool-bar/index.js create mode 100755 src/folder/type.ts create mode 100755 src/folder/ui-add-folder-button/AddFolderButton.module.scss create mode 100755 src/folder/ui-add-folder-button/AddFolderButton.tsx create mode 100755 src/folder/ui-add-folder-button/add.svg create mode 100755 src/folder/ui-add-folder-button/index.js create mode 100755 src/folder/ui-folder-button/FolderButton.module.scss create mode 100755 src/folder/ui-folder-button/FolderButton.tsx create mode 100755 src/folder/ui-folder-button/index.js create mode 100755 src/folder/ui-folder-info/FolderInfo.module.scss create mode 100755 src/folder/ui-folder-info/FolderInfo.tsx create mode 100755 src/folder/ui-folder-info/index.js create mode 100755 src/folder/ui-folder-item/FolderItem.module.scss create mode 100755 src/folder/ui-folder-item/FolderItem.tsx create mode 100755 src/folder/ui-folder-item/index.js create mode 100755 src/folder/ui-share-modal/ShareModal.module.scss create mode 100755 src/folder/ui-share-modal/ShareModal.tsx create mode 100755 src/folder/ui-share-modal/facebook.svg create mode 100755 src/folder/ui-share-modal/index.js create mode 100755 src/folder/ui-share-modal/kakao.svg create mode 100755 src/folder/ui-share-modal/link.svg create mode 100755 src/folder/util-map/constant.ts create mode 100755 src/folder/util-map/index.js create mode 100755 src/folder/util-map/mapFolderData.ts create mode 100755 src/folder/util-map/mapFoldersData.ts create mode 100755 src/global.d.ts create mode 100755 src/link/data-access-link/constant.js create mode 100755 src/link/data-access-link/index.js create mode 100755 src/link/data-access-link/useGetLinks.ts create mode 100755 src/link/feature-card-list/CardList.tsx create mode 100755 src/link/feature-card-list/constant.js create mode 100755 src/link/feature-card-list/index.js create mode 100755 src/link/feature-link-form/LinkForm.module.scss create mode 100755 src/link/feature-link-form/LinkForm.tsx create mode 100755 src/link/feature-link-form/index.js create mode 100755 src/link/type.ts create mode 100755 src/link/ui-add-link-modal/AddLinkModal.module.scss create mode 100755 src/link/ui-add-link-modal/AddLinkModal.tsx create mode 100755 src/link/ui-add-link-modal/index.js create mode 100755 src/link/ui-card-list/CardList.module.scss create mode 100755 src/link/ui-card-list/CardList.tsx create mode 100755 src/link/ui-card-list/index.js create mode 100755 src/link/ui-editable-card/EditableCard.module.scss create mode 100755 src/link/ui-editable-card/EditableCard.tsx create mode 100755 src/link/ui-editable-card/index.js create mode 100755 src/link/ui-link-form/LinkForm.module.scss create mode 100755 src/link/ui-link-form/LinkForm.tsx create mode 100755 src/link/ui-link-form/index.js create mode 100755 src/link/ui-no-link/NoLink.module.scss create mode 100755 src/link/ui-no-link/NoLink.tsx create mode 100755 src/link/ui-no-link/index.js create mode 100755 src/link/ui-read-only-card/ReadOnlyCard.tsx create mode 100755 src/link/ui-read-only-card/index.js create mode 100755 src/link/ui-search-bar/SearchBar.module.scss create mode 100755 src/link/ui-search-bar/SearchBar.tsx create mode 100755 src/link/ui-search-bar/close.svg create mode 100755 src/link/ui-search-bar/constant.js create mode 100755 src/link/ui-search-bar/index.js create mode 100755 src/link/util-map/index.js create mode 100755 src/link/util-map/mapLinksData.ts create mode 100755 src/link/util-search-link/index.ts create mode 100755 src/link/util-search-link/useSearchLink.ts create mode 100755 src/page-layout/FolderLayout/FolderLayout.module.scss create mode 100755 src/page-layout/FolderLayout/FolderLayout.tsx create mode 100755 src/page-layout/FolderLayout/index.js create mode 100755 src/page-layout/SharedLayout/SharedLayout.module.scss create mode 100755 src/page-layout/SharedLayout/SharedLayout.tsx create mode 100755 src/page-layout/SharedLayout/index.js create mode 100755 src/page-layout/SignLayout/SignLayout.module.scss create mode 100755 src/page-layout/SignLayout/SignLayout.tsx create mode 100755 src/page-layout/SignLayout/index.ts create mode 100755 src/sharing/feature-layout/Layout.module.scss create mode 100755 src/sharing/feature-layout/Layout.tsx create mode 100755 src/sharing/feature-layout/index.js create mode 100755 src/sharing/ui-alert-modal/AlertModal.module.scss create mode 100755 src/sharing/ui-alert-modal/AlertModal.tsx create mode 100755 src/sharing/ui-alert-modal/index.js create mode 100755 src/sharing/ui-card-content/CardContent.module.scss create mode 100755 src/sharing/ui-card-content/CardContent.tsx create mode 100755 src/sharing/ui-card-content/index.js create mode 100755 src/sharing/ui-card-image/CardImage.module.scss create mode 100755 src/sharing/ui-card-image/CardImage.tsx create mode 100755 src/sharing/ui-card-image/constant.js create mode 100755 src/sharing/ui-card-image/index.js create mode 100755 src/sharing/ui-card/Card.module.scss create mode 100755 src/sharing/ui-card/Card.tsx create mode 100755 src/sharing/ui-card/index.js create mode 100755 src/sharing/ui-cta/Cta.module.scss create mode 100755 src/sharing/ui-cta/Cta.tsx create mode 100755 src/sharing/ui-cta/index.js create mode 100755 src/sharing/ui-footer/Footer.module.scss create mode 100755 src/sharing/ui-footer/Footer.tsx create mode 100755 src/sharing/ui-footer/constant.js create mode 100755 src/sharing/ui-footer/index.js create mode 100755 src/sharing/ui-icon-and-text-button/IconAndTextButton.module.scss create mode 100755 src/sharing/ui-icon-and-text-button/IconAndTextButton.tsx create mode 100755 src/sharing/ui-icon-and-text-button/index.js create mode 100755 src/sharing/ui-input-modal/InputModal.module.scss create mode 100755 src/sharing/ui-input-modal/InputModal.tsx create mode 100755 src/sharing/ui-input-modal/index.js create mode 100755 src/sharing/ui-input/Input.module.scss create mode 100755 src/sharing/ui-input/Input.tsx create mode 100755 src/sharing/ui-input/index.js create mode 100755 src/sharing/ui-modal-content-box/ModalContentBox.module.scss create mode 100755 src/sharing/ui-modal-content-box/ModalContentBox.tsx create mode 100755 src/sharing/ui-modal-content-box/index.js create mode 100755 src/sharing/ui-modal-content-button/ModalContentButton.module.scss create mode 100755 src/sharing/ui-modal-content-button/ModalContentButton.tsx create mode 100755 src/sharing/ui-modal-content-button/index.js create mode 100755 src/sharing/ui-modal-content-description/ModalContentDescription.module.scss create mode 100755 src/sharing/ui-modal-content-description/ModalContentDescription.tsx create mode 100755 src/sharing/ui-modal-content-description/index.js create mode 100755 src/sharing/ui-modal-content-title/ModalContentTitle.module.scss create mode 100755 src/sharing/ui-modal-content-title/ModalContentTitle.tsx create mode 100755 src/sharing/ui-modal-content-title/index.js create mode 100755 src/sharing/ui-modal/Modal.module.scss create mode 100755 src/sharing/ui-modal/Modal.tsx create mode 100755 src/sharing/ui-modal/index.js create mode 100755 src/sharing/ui-navigation-bar/NavigationBar.module.scss create mode 100755 src/sharing/ui-navigation-bar/NavigationBar.tsx create mode 100755 src/sharing/ui-navigation-bar/constant.js create mode 100755 src/sharing/ui-navigation-bar/index.js create mode 100755 src/sharing/ui-password-input/PasswordInput.module.scss create mode 100755 src/sharing/ui-password-input/PasswordInput.tsx create mode 100755 src/sharing/ui-password-input/eye-off.svg create mode 100755 src/sharing/ui-password-input/eye-on.svg create mode 100755 src/sharing/ui-password-input/index.ts create mode 100755 src/sharing/ui-popover/Popover.module.scss create mode 100755 src/sharing/ui-popover/Popover.tsx create mode 100755 src/sharing/ui-popover/index.js create mode 100755 src/sharing/ui-portal/Portal.tsx create mode 100755 src/sharing/ui-portal/index.js create mode 100755 src/sharing/util/axiosInstance.js create mode 100755 src/sharing/util/constant.js create mode 100755 src/sharing/util/copyToClipboard.ts create mode 100755 src/sharing/util/getElapsedTime.ts create mode 100755 src/sharing/util/index.js create mode 100755 src/sharing/util/useAsync.ts create mode 100755 src/sharing/util/useBackgroundClick.ts create mode 100755 src/sharing/util/useEffectOnce.ts create mode 100755 src/sharing/util/useEnhancedEffect.ts create mode 100755 src/sharing/util/useIntersectionObserver.tsx create mode 100755 src/sharing/util/useKakaoSdk.ts create mode 100755 src/user/data-access-user/index.js create mode 100755 src/user/data-access-user/useGetUser.ts create mode 100755 src/user/type.ts create mode 100755 src/user/ui-profile/Profile.module.scss create mode 100755 src/user/ui-profile/Profile.tsx create mode 100755 src/user/ui-profile/index.js delete mode 100644 styles/Home.module.css create mode 100755 styles/colors.scss create mode 100755 styles/global.scss delete mode 100644 styles/globals.css create mode 100755 styles/mixin.scss create mode 100755 styles/reset.css create mode 100755 styles/variables.scss mode change 100644 => 100755 tsconfig.json create mode 100755 yarn.lock diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/next.config.js b/next.config.js old mode 100644 new mode 100755 index a843cbee0..f91f0dcfb --- a/next.config.js +++ b/next.config.js @@ -1,6 +1,15 @@ /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, -} + webpack: (config) => { + config.module.rules.push({ + test: /\.svg$/i, + issuer: /\.[jt]sx?$/, + use: ["@svgr/webpack"], + }); -module.exports = nextConfig + return config; + }, +}; + +module.exports = nextConfig; diff --git a/package-lock.json b/package-lock.json old mode 100644 new mode 100755 index baa2b6655..485dbbaf3 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "fe-weekly-mission", + "name": "weekly-mission-nextjs", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "fe-weekly-mission", + "name": "weekly-mission-nextjs", "version": "0.1.0", "dependencies": { "next": "13.5.6", diff --git a/package.json b/package.json old mode 100644 new mode 100755 index 1ce24924f..8ef921f69 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "fe-weekly-mission", + "name": "weekly-mission-nextjs", "version": "0.1.0", "private": true, "scripts": { @@ -9,16 +9,22 @@ "lint": "next lint" }, "dependencies": { + "axios": "^1.6.2", + "classnames": "^2.3.2", + "date-fns": "^2.30.0", + "next": "13.5.6", "react": "^18", "react-dom": "^18", - "next": "13.5.6" + "react-hook-form": "^7.48.2" }, "devDependencies": { - "typescript": "^5", + "@svgr/webpack": "^8.1.0", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", "eslint": "^8", - "eslint-config-next": "13.5.6" + "eslint-config-next": "13.5.6", + "sass": "^1.69.5", + "typescript": "^5" } } diff --git a/pages/_app.tsx b/pages/_app.tsx old mode 100644 new mode 100755 index 021681f4d..8e301a9e8 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,6 +1,6 @@ -import '@/styles/globals.css' -import type { AppProps } from 'next/app' +import "@/styles/reset.css"; +import type { AppProps } from "next/app"; export default function App({ Component, pageProps }: AppProps) { - return + return ; } diff --git a/pages/_document.tsx b/pages/_document.tsx old mode 100644 new mode 100755 diff --git a/pages/api/hello.ts b/pages/api/hello.ts deleted file mode 100644 index f8bcc7e5c..000000000 --- a/pages/api/hello.ts +++ /dev/null @@ -1,13 +0,0 @@ -// Next.js API route support: https://nextjs.org/docs/api-routes/introduction -import type { NextApiRequest, NextApiResponse } from 'next' - -type Data = { - name: string -} - -export default function handler( - req: NextApiRequest, - res: NextApiResponse -) { - res.status(200).json({ name: 'John Doe' }) -} diff --git a/pages/folder/index.tsx b/pages/folder/index.tsx new file mode 100755 index 000000000..b50bffde0 --- /dev/null +++ b/pages/folder/index.tsx @@ -0,0 +1,42 @@ +import { useGetFolders } from "@/src/folder/data-access-folder"; +import { useGetLinks } from "@/src/link/data-access-link"; +import { Layout } from "@/src/sharing/feature-layout"; +import { FolderLayout } from "@/src/page-layout/FolderLayout"; +import { FolderToolBar } from "@/src/folder/feature-folder-tool-bar"; +import { SearchBar } from "@/src/link/ui-search-bar"; +import { useState } from "react"; +import { ALL_LINKS_ID } from "@/src/link/data-access-link/constant"; +import { LinkForm } from "@/src/link/feature-link-form"; +import { CardList } from "@/src/link/feature-card-list"; +import { SelectedFolderId } from "@/src/folder/type"; +import { useSearchLink } from "@/src/link/util-search-link"; +import { useIntersectionObserver } from "@/src/sharing/util"; + +const FolderPage = () => { + const { data: folders } = useGetFolders(); + const [selectedFolderId, setSelectedFolderId] = useState(ALL_LINKS_ID); + const { data: links, loading } = useGetLinks(selectedFolderId); + const { searchValue, handleChange, handleCloseClick, result } = useSearchLink(links); + const { ref, isIntersecting } = useIntersectionObserver(); + + return ( + + } + searchBar={ + + } + folderToolBar={ + + } + cardList={loading ? null : } + /> + + ); +}; + +export default FolderPage; diff --git a/pages/index.tsx b/pages/index.tsx old mode 100644 new mode 100755 index 02c4dee04..fade5a404 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,114 +1,17 @@ -import Head from 'next/head' -import Image from 'next/image' -import { Inter } from 'next/font/google' -import styles from '@/styles/Home.module.css' +import Head from "next/head"; +import Image from "next/image"; +import { Inter } from "next/font/google"; +import styles from "@/styles/Home.module.css"; -const inter = Inter({ subsets: ['latin'] }) +const inter = Inter({ subsets: ["latin"] }); export default function Home() { return ( <> - Create Next App - - - + Linkbrary -
-
-

- Get started by editing  - pages/index.tsx -

- -
- -
- Next.js Logo -
- - -
+
- ) + ); } diff --git a/pages/shared/index.tsx b/pages/shared/index.tsx new file mode 100755 index 000000000..f460d96fa --- /dev/null +++ b/pages/shared/index.tsx @@ -0,0 +1,36 @@ +import { useGetFolder } from "@/src/folder/data-access-folder"; +import { Layout } from "@/src/sharing/feature-layout"; +import { SharedLayout } from "@/src/page-layout/SharedLayout"; +import { CardList } from "@/src/link/ui-card-list"; +import { FolderInfo } from "@/src/folder/ui-folder-info"; +import { ReadOnlyCard } from "@/src/link/ui-read-only-card"; +import { SearchBar } from "@/src/link/ui-search-bar"; +import { useSearchLink } from "@/src/link/util-search-link/useSearchLink"; + +const SharedPage = () => { + const { data } = useGetFolder(); + const { profileImage, ownerName, folderName, links } = data || {}; + const { searchValue, handleChange, handleCloseClick, result } = useSearchLink(links); + + return ( + + + } + searchBar={ + + } + cardList={ + + {result?.map((link) => ( + + ))} + + } + /> + + ); +}; + +export default SharedPage; diff --git a/pages/signin/index.tsx b/pages/signin/index.tsx new file mode 100755 index 000000000..0ad430d3d --- /dev/null +++ b/pages/signin/index.tsx @@ -0,0 +1,22 @@ +import { SignInForm } from "@/src/auth/feature-sign-in-form"; +import { Oauth } from "@/src/auth/feature-oauth"; +import { SignHeader } from "@/src/auth/ui-sign-header"; +import { SignLayout } from "@/src/page-layout/SignLayout"; +import { ROUTE } from "@/src/sharing/util"; + +const SignInPage = () => { + return ( + + } + form={} + oauth={} + /> + ); +}; + +export default SignInPage; diff --git a/pages/signup/index.tsx b/pages/signup/index.tsx new file mode 100755 index 000000000..6351db6fb --- /dev/null +++ b/pages/signup/index.tsx @@ -0,0 +1,22 @@ +import { Oauth } from "@/src/auth/feature-oauth"; +import { SignHeader } from "@/src/auth/ui-sign-header"; +import { SignLayout } from "@/src/page-layout/SignLayout"; +import { ROUTE } from "@/src/sharing/util"; +import { SignUpForm } from "@/src/auth/feature-sign-up-form"; + +const SignUpPage = () => { + return ( + + } + form={} + oauth={} + /> + ); +}; + +export default SignUpPage; diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 718d6fea4835ec2d246af9800eddb7ffb276240c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m diff --git a/public/images/card-default.png b/public/images/card-default.png new file mode 100755 index 0000000000000000000000000000000000000000..94608439291c43927b25f4092946ebd6383819fc GIT binary patch literal 2172 zcmeH}`&$x*8pm;2$4kzvFh$MUv$>8lXq%T5l|!1B5^wY9vhecgq_E@|$EBjMY~|4- zxF?@!!V+^+5mXLf;6z|2A2A;%TA~PqXtu};kRl=ya6IQ9IQs+k!~6Zb@At>gPj6jn za=e=h$OQlZxFsgUrUL*D8GHLvrvrP*gL{YX!TE0qm#_eU>yiJC1AzR4*Iwy>O^-hZ z=$H7e>>Z9MI06m;uo_+8Du5jpi}dOC^%>r@X2< z9SRDWOXDD-Cq_xJ5w-p1g11W9ij2qS2`XoUG3pQxnGAt_XL_l%+fq2(DJtbP+Yo8r zDcCi3-A2WyQvXGWhAeE`VrG1OgMT^l>c0Q~v|ri8ut2rL`Y#KKjXB7W$?_M$kenCz zDDK3Byi_{4A(2>Xp{o@GQ!BqsjF!F`5^aBv7d{p!G=-ljAxcClZ(c56FV3m{!rw1s zvW3v)@beH({VZ4r<#XzKC)%7@)@#2m2vtGBK$b#Qe$%u~_QidE$WnRTZ^SGQN-&_+ ze}bTnWZgJg>`%psDX^*sRvtHGXizox?{4K-#(Hv!g^ED{g!rf^lAcrjE5D+z>ozPL z87Wj?5T_&}Qki9I=}x1b4kO%Tms`41+)^I2m$1fzPb{yEDleR8;BxmbuA<9vz*@WC zRDgKfMEO22FN8HmO!J|i)SyO8v)omiOQB!9k4cC9vsz?|udvygAd~Htr*}ItR~xX; z4WP{6wX$BICvv&ezFfN%^>JHh0qxyDP*-35QyFtIJ2}O(U^4@=^T4|4U-4MPF-2Lk?a4_u)Z<-)pvYLMr=WdpKhF|QvMFi1@Cw=J!N zXjoPK2yeJADS7o22$t zsdS%Jqu3$*+_cqXHnRV0j20)GebZrQ`NP0EPR)*SK%Q{dtm2OXovS@i{J~e6ZgP}9 zj#=L^4HFySLdr*@9`_Faz^q5Pt?q zsZxL>spe~h#oQ4|G8SV*#m{WaJ!||50hIl6>dTe9JQYgaX`06NDvL#w zSj?#>kOOU5ecwK?=VvzEIp*$#UNm`R;CF$prnU7_8+-V5P3HcxNbiNYfY6HQ39euq z-=gK{7#nikne+Uk4VtNsV4_&!oozQ@Mw0lG0Mxx^4AQMP$g6&S`gyN#EK9meVpQ|K zyzuZ5N8o5|?V&ZqF+}+8uhXx+xxr*e#NhaUPLSh%v~?!qOoL*@nsfETyKR4;o8;;@ zFVH#IG*u4ROl>VYHjCM8{pp%^llJK13vy4c(R<(H^!6v0QLWYbRkUBp8Tl;TNtR_w z8Z5FmLW)eMm717YETQZyj&$tD(N9$o9OgzQIgpRWmO;a%3qOepKR%kea~+tT}N1Xx{ssy%x1yY4Bkz(_V| zh?cUzJV_*14S65-R)eYZPhVDkeBCWfigpzJwrxI?v4cQIN*}!Wx^&$A&<8ZY$r_hG l@c$LyW|)cleu+WY+_P_a(osZx;oh?VNIah$+kY;v=09$Pv3dXi literal 0 HcmV?d00001 diff --git a/public/images/check.svg b/public/images/check.svg new file mode 100755 index 000000000..2ab2949b7 --- /dev/null +++ b/public/images/check.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/close.svg b/public/images/close.svg new file mode 100755 index 000000000..26085f48e --- /dev/null +++ b/public/images/close.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/facebook.svg b/public/images/facebook.svg new file mode 100755 index 000000000..b9c9d4939 --- /dev/null +++ b/public/images/facebook.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/google-oauth.png b/public/images/google-oauth.png new file mode 100755 index 0000000000000000000000000000000000000000..c59796fbc3ab1388d53c5c7cdf37d8787952e202 GIT binary patch literal 3875 zcmV+;58UvHP)$$ zD4i6B251Kg6iQq=OiKeXEtH0a#JOlrtXxjwBbE>O&`SII{*~6293PUsPqJgajAmE6 zFOv52zu)`+|GoDw@CBrSVFY34&YB{NO)ck~6)~nvW}q!E;u<{SmwI9vbNHA7pJ?j^ z<33H(b}`PXLyG2|TQZ{>BLFESm&mkQu}F}!7@U`#L*P&$hzDcU;B0d+h|0Nhi@itz zl1{E5)MK^d0S0X;=O~IkXR}$6=Cs3Rx54SK!)~{Vm#zC;G(wsNEu6mgq?6m5RD)2DCj%~58j=AbxXITBpRcw1n7Hs7@oUzW zloY=NNsvZvU!>;dWFaRv%QOp36oy6D)iw24GbfU@Wpn0CuY$=iom^d0t=bFXlNZx_ zA~ioh2icxXj3hJ(D~={v5b>g_Dr?QuWK+rAz5DQD#uyRn83~pe4~XEp`X+tfY^gAX zT(VY+4XcF*u$Aht~C>sFEh@}W1%G_LyY)_EQWjc*4$|jo0;jtv}uK-o>&51!?dY|aA&5I=@oNW-luED z5HKXmr7z>qUZj1Jfcy(`a6Tfcv*QfPU5R#d36mR5Y@X29yz$vMpD`SQ6CyWSW5)uq z2BHXVVhB~ltHE)T8|@X0C1MSnI@O5Av(2>I6jYUY@put&b!g&(EQ`id> zAe=Am)^I?6@R1`YDA3?s<4XogT@Gluq_c{`R?|L3USpkD0&y@tEQ?|!iftN59tI@W zVhODwIq-;#)@TiBWq=Y=ls^IKuid?=zjpnSyGP_>#a~8`OvpR<0Z?t^_qnk77lhU7#HLyfcxx-P_BN5z=3*REBvmXHC|TKHPA5_Y;v{EW7WuzoklI3> zTUGBieRgO@Cq_Nv%o&rAY-o)Q=&ITR^|Rdw9@>vk?TJ3yS*Ol`l3xJFItQUK1>ztA)718I;Ay*$wP}p0^wA#R~9q?~_3c!WL^ANd{oX#U_nZ!mDR_Xk$>_v*yC1DjKaS=fea|#v3F?7;IJ@*F_@949d`aSW zK%yY+1sQ5sd%F>1x%vzkn^r^nGlbR3?8vmbGw`kae!qHZ7Oc}|!1KgLunc+f7OlNO zwPlOC6G%-ITz54Z*?y>jw`W^!jh2f z$$%{A#0nV*)t!cHIKR0V8TUVgWWeA|5PFAkteaet1S2^kYbFe7tWNBiQ;?0cMK>dJ z#VRBV#F-vcFccA&bgcW{HzYyk6eItpjR_IUT$yk#ydJiaIj~MD2Fns*JhMPMbsQn# z3kN>_5M3Wtf&1HH{$DaJHX0-iG(4}^g2d(e9&#;w5z+2)$%%Rbd#cf~`SrNkl1932 zyBp5y772n~=bTrvvvsR*ET}+6+X{5Nvl;DgybOM}Q71N;78?!9Hwbct!)3V<(d2T@ z${3SpxouBA8dp2}C6^)dq18~v#W(25GBS{U%WZI6c{RGW{0-^1-i1`b?RMd0Ed><3 zjNa>-OJid!GWS4+m%!^QVW0HrpzX*~vwr?`+{8x1G9f>u#Ol96Xl`U4u}4qWh7X2{ zXq%SifDCBIehuf9wQ${Z6f9HivyG#CAu=9(7^59dr(NF)PRn(2ISZRH&E_^8oyWm_ z|I~Nw)0^PF{gBYiKui-wSY5^sRtP6?EtrTiYUKfoG=v~NBceHm{$+SHQy3s$A8B>{8|UhK&EhtR^4d6 zXJoTS90Jb6Ai%aLxEv~qzafa}}H z`Y%0vGZ9>E7_<$uPe3XV6n~>ub8dndM7gpax!p4l4%&pJO+l*A(h-78NcMdO|9Bd3 zOcjD5xrubS@Yk(qZ_}#uYQQv8v zGPQScR39DK&6+<`PG{B`=1_EFygD32C}DDCSS}nF2RS4Dvq%gsnkOR%!# zQnc{C^A{hVuEt~k6=Q6}@Oz2Q&D&M{b;rO)^0gTXax>(}Ld0@~^r=VnZ=l5!*2b zQJtOcKObXUU;fkD>W2(0FN<#x;y;dmgk@V+;msrOqBAsjA0V_1yXyDjzW08KXaBPg zgT-85oyJf$S&yEmWz0pK-#NCq|jESzjuG4EWU!-2U!EINm0AwvDarQaBoJ zg%awC5a~kiTwufP3nUC>MR4HYF_HxyRFx?twcWBnZ^U2LOPWiiN@T!gOT)&i)*wGU z4>F-Sy%jU^8Gd|&+$sJ|;X)X~FVHp^$70A02CeI9+afwO8D4{dd{-VeR;)#V zOD@4o3E}d&`|-qg)8KN*D?~+Jf>C8eQ>~T8@fdQ2Ig2ofR}rz1b*|Eo?;4MnuYD5V zo_-x>WZ@5S$JN2=Dj61BN?Do?E+k3Y<=u+=>vQA9^NWWl_z__N!7_u@alngu%mvT z?!P7itMDVsa%SNkK`6O>$%3)qM2Kxo>71!CV^)28(`3Djm7hM{2zRE-^nuI%P+ss= z{dKy%0o%^(!oN;z*Y^(!f3`0aW?X3>*=oyy9=2%7g7nM$c4DaYD!C{o-@+ge;gRGUeaDqR;FGN zG*xg~9mu!J^(+zvc?jL*S-95c^vZtkcYQq-$6Mq%oUE4HUo-j zFsLjOLfu5shiunuG=c7B@@oY*UR71r_1A7da&^C#^JTP8`Vt68NT!c65C>bx(rabFQU>)m;f0M;V80LLaQUy^cZO|kvtL~ z!a;YL7M`q3Zq{Z>RK*h<#0zO7cT|FpL)j#>xCl`syVBEA*6H=OROnO8copTY`%4=R z2Xco+(e1K5VvtP7Xu1?xvaG@xy+J8cN)a}<_>)4a0qNu#2p5CH4{7Mg_-><~4v}o8 zMU#cL2qN3tJ9`nTZ={oIAZg?pFrMDWp*;|>=I-C2KWr||4yVHbr_-SaB}6zao9!K- z7!$Rrr>C_Xon7>hITalpF%O&Lkx%yuhF=N>tsBhL)WMK+a--4nn8eVcNEsNtk({{vG4W((lLhg|>w002ovPDHLkV1m$^KKK9t literal 0 HcmV?d00001 diff --git a/public/images/instagram.svg b/public/images/instagram.svg new file mode 100755 index 000000000..0b9337b07 --- /dev/null +++ b/public/images/instagram.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/kakao-oauth.png b/public/images/kakao-oauth.png new file mode 100755 index 0000000000000000000000000000000000000000..94f7e7518649ed97feece7808b89287485bea0c8 GIT binary patch literal 2704 zcmV;B3UBp^P)PukX9!!Ae?*mEK$ZfqZ5(TJ5f+-LHP{{rL%!+h~lCU6r(!8 z7)fzysh;8nE@&n>5@S5{u3UV_lqJ>#qorLdJRh{Mfe8vBL!r=(dRe1y0v6V|pt5O4 z+CzIEplMSx6Ogb*1^wacu^X1n-fL*nt`g40T*v9vc`}3%K^?2)xd(D_kXn<}t{omW zVXd4rdH(g=Ghv?Fpw<-=z#ulBCr95SO|&fZ`B&o~NT;KH5Y2>c7f_R+PD~lfJ!m=) zZV1G$FRY!3-e^2cRZ_K}$DqITOG5Um6V>*sRSCK;<|DZnp_4(?&dRq_LNnjD%m|$v zoYwd(8S@clIUdjttn3s{`@_&K(hrpM8()LlI{RTYN}A zLCm(VorAr{*#ymD92ouvVx-Dq?6^*{W7?d z9Gfe*(X+|#$D2v2BU@X$lt^Uh>EB<__V%vx$Yw3t-pUp1*ViAWuC5UE^|d>Xq2HaN zfq@R{?{B9%Qnu-P3Yy&UxQ^0I&WNH2L3_X7QU5Rkj0&xe2I%#yQhlYl_C}^|c5jaT8wQV-s9sMNkURNS$P}W%w zA&Y^qu-K8&-av#!5#`jGhr<3+&Q|5_!j^uF%-J8Dr)=^fhBdTGbohl^ zsi_wOF_-UuOPcgx;&7WydlB6(*~>an6`GuUjk>zae|lC1{>w5QRfUm!aifOn z=spI{y-bsrUUM?9$Lrsh{mw6+{#f#UY(rHFP29^GkrGc`d7X5~5s$SovIli0kf37Z zWt})NocvJ?NfED1eMzG--@g9-o6b5cZ^_TZ$-9}IJ?)5k;le9)>5pHO2;=@v_xmB{ z!opkfx!uW@W~Tp9avb<9Y{T)?ic~SeWeoLO(xCXH6@L4q%>I5OMR~TDwLnaOFsG}# zv^MSzfBL0}z%6DTLFGtD@C{JE` z^4VFGE~6ST zfr&^39Z^F^HR0LSiL3By<4NACVbOycPC|h=vrb`MM0>)mE^g~w-w%ZlN*!!BP!zs; z)ocy4654|H?R(Q&-|H6a!tY;kLML}qM~GC57>HF>*MSyr^Y+;z-=iF;4%&huSgw_! z!NSo=SSub7Q2{YAE>tZTNp%-K;OLI(lXZ+kAq5pF(%{^FY*-6^ozD3SKPy=`aIVAY zU)944L>casa#}Y1N`3N>et(^ABTWXKG4Sd`8z&WX{TRr6+>Qg5dH>^IJI_Oo<0`bC zTek|EaJgI@4hiBbv1VuAq)U@uQ2BGwBF*zx_12CGz>gx6wGWoF8M~mr@+z)4so;~t zqyhU^iW7^EVapZHArw>9`Mxq^NnXiCwJ<@cHrui{8Q1Gd{RH6e%l-`e!IMKQWF@dF zq>%R(|Lgf474E2v3ZHRa_OIPVX=g_MK&Zv4%xb%+4xolS)c1QaHKkV=0WwMYj%AW# zbDXmqqybLCt60%0z&h_Q|Aut2Z86Vf9-ksjU>WG}TNM-53EE{bi-*aMlK~JUY-DQ3Eg3wUh~?@9julgM43WkyI`X|cV{tM7ntr}q*8HND z)=4$7#b4{o4vRT2af6yy#Kv>-xw)I*8-A<>FGBD znI8&R8!a6ytA+h*IWfN}kb?8JO#Rl@(lRUhhUx``oSgiHe7st5I9nHPTTx}91%pZ1 z1De63WZk-W@WC*K9gv zm8~Ww*=*j+Izh!bI6Ir;#%^%s4wqWhD)Wd`=h@Y0xvdok>14nEG2iXyNW#Eh(mh)S_HdSNNKCmr1_; zp$w&F=p-Zi&Ccj2b4Tswdmf_<_#d6rJLAanj(0^K4*S{H_xSM(D~yZn8-5q=29W3! zI}?6)u4<+&u5z$Be^h)c^y7<2ap{DP>Nnj~HNycP%=2FEBv@*qS}{S@Q%3LwxWS(3 z3V$xQh-`_D=5uQltW*$^^A?24||e3MzNNlmhlGAHBIYh-9#zmXtl z$GPZ;35?v-`WQH?1hT?fns_lr1XZ+J7m&9~cBk7%!0s2Lf&y5pMWMN%$ELKAHD4~v zlqRgQ;A1HunpIeMa3R=y@eQm@5tyKgW)Rl-4<<${w#7aQN=QZEf-3UD@)(8KWmcz} z0IZRR*h!(dQft6_h0000< KMNUMnLSTZ_b| + + + + + + diff --git a/public/images/link.svg b/public/images/link.svg new file mode 100755 index 000000000..1fa18744b --- /dev/null +++ b/public/images/link.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/images/linkbrary.svg b/public/images/linkbrary.svg new file mode 100755 index 000000000..97359ef33 --- /dev/null +++ b/public/images/linkbrary.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/images/pen.svg b/public/images/pen.svg new file mode 100755 index 000000000..7ab295b6b --- /dev/null +++ b/public/images/pen.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/images/search.svg b/public/images/search.svg new file mode 100755 index 000000000..0406766fd --- /dev/null +++ b/public/images/search.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/images/share.svg b/public/images/share.svg new file mode 100755 index 000000000..cc45ac0d4 --- /dev/null +++ b/public/images/share.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/images/star.svg b/public/images/star.svg new file mode 100755 index 000000000..05bf63e8d --- /dev/null +++ b/public/images/star.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/trash.svg b/public/images/trash.svg new file mode 100755 index 000000000..31009aeb0 --- /dev/null +++ b/public/images/trash.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/images/twitter.svg b/public/images/twitter.svg new file mode 100755 index 000000000..14a6069a1 --- /dev/null +++ b/public/images/twitter.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/youtube.svg b/public/images/youtube.svg new file mode 100755 index 000000000..28ed0e8ba --- /dev/null +++ b/public/images/youtube.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28c5..000000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index d2f842227..000000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/auth/data-access-auth/index.ts b/src/auth/data-access-auth/index.ts new file mode 100755 index 000000000..fb5972162 --- /dev/null +++ b/src/auth/data-access-auth/index.ts @@ -0,0 +1,3 @@ +export * from "./useSignIn"; +export * from "./useSignUp"; +export * from "./useCheckEmailDuplicate"; diff --git a/src/auth/data-access-auth/useCheckEmailDuplicate.tsx b/src/auth/data-access-auth/useCheckEmailDuplicate.tsx new file mode 100755 index 000000000..2f0d0fe7a --- /dev/null +++ b/src/auth/data-access-auth/useCheckEmailDuplicate.tsx @@ -0,0 +1,20 @@ +import { axiosInstance, useAsync } from "@/src/sharing/util"; +import { useCallback } from "react"; + +export const useCheckEmailDuplicate = (email: string) => { + const checkEmailDuplicate = useCallback( + () => + axiosInstance.post<{ data: { isUsableNickname: boolean } }>("check-email", { + email, + }), + [email] + ); + const { execute, loading, error, data } = useAsync(checkEmailDuplicate, true); + + return { + execute, + loading, + error, + data, + }; +}; diff --git a/src/auth/data-access-auth/useSignIn.tsx b/src/auth/data-access-auth/useSignIn.tsx new file mode 100755 index 000000000..b746daf61 --- /dev/null +++ b/src/auth/data-access-auth/useSignIn.tsx @@ -0,0 +1,30 @@ +import { axiosInstance, useAsync } from "@/src/sharing/util"; +import { useCallback, useEffect } from "react"; +import { Token } from "../type"; + +type UseSignInParams = { email: string; password: string }; + +export const useSignIn = ({ email, password }: UseSignInParams) => { + const signIn = useCallback( + () => + axiosInstance.post<{ data: Token }>("sign-in", { + email, + password, + }), + [email, password] + ); + const { execute, loading, error, data } = useAsync(signIn, true); + + useEffect(() => { + if (data?.data.accessToken) { + localStorage.setItem("accessToken", data.data.accessToken); + } + }, [data?.data.accessToken]); + + return { + execute, + loading, + error, + data, + }; +}; diff --git a/src/auth/data-access-auth/useSignUp.tsx b/src/auth/data-access-auth/useSignUp.tsx new file mode 100755 index 000000000..5324e99d9 --- /dev/null +++ b/src/auth/data-access-auth/useSignUp.tsx @@ -0,0 +1,30 @@ +import { axiosInstance, useAsync } from "@/src/sharing/util"; +import { useCallback, useEffect } from "react"; +import { Token } from "../type"; + +type UseSignUpParams = { email: string; password: string }; + +export const useSignUp = ({ email, password }: UseSignUpParams) => { + const signUp = useCallback( + () => + axiosInstance.post<{ data: Token }>("sign-up", { + email, + password, + }), + [email, password] + ); + const { execute, loading, error, data } = useAsync(signUp, true); + + useEffect(() => { + if (data?.data.accessToken) { + localStorage.setItem("accessToken", data.data.accessToken); + } + }, [data?.data.accessToken]); + + return { + execute, + loading, + error, + data, + }; +}; diff --git a/src/auth/feature-oauth/Oauth.module.scss b/src/auth/feature-oauth/Oauth.module.scss new file mode 100755 index 000000000..086c0538a --- /dev/null +++ b/src/auth/feature-oauth/Oauth.module.scss @@ -0,0 +1,24 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + height: 6.6rem; + margin-top: 0.2rem; + padding: 0 2.4rem; + border-radius: 0.8rem; + border: 0.1rem solid $color-gray20; + background-color: $color-gray10; +} + +.description { + font-size: 1.4rem; + color: $color-gray100; +} + +.links { + display: flex; + column-gap: 1.6rem; +} diff --git a/src/auth/feature-oauth/Oauth.tsx b/src/auth/feature-oauth/Oauth.tsx new file mode 100755 index 000000000..aa79fcad9 --- /dev/null +++ b/src/auth/feature-oauth/Oauth.tsx @@ -0,0 +1,23 @@ +import { OauthBadge } from "../ui-oauth-badge"; +import styles from "./Oauth.module.scss"; +import classNames from "classnames/bind"; +import { OAUTH_BADGES } from "./constant"; + +const cx = classNames.bind(styles); + +type OauthProps = { + description: string; +}; + +export const Oauth = ({ description }: OauthProps) => { + return ( +
+

{description}

+
+ {OAUTH_BADGES.map((badgeData) => ( + + ))} +
+
+ ); +}; diff --git a/src/auth/feature-oauth/constant.ts b/src/auth/feature-oauth/constant.ts new file mode 100755 index 000000000..6012290d3 --- /dev/null +++ b/src/auth/feature-oauth/constant.ts @@ -0,0 +1,12 @@ +export const OAUTH_BADGES = [ + { + href: "https://www.google.com", + imageSource: "images/google-oauth.png", + alt: "구글 소셜 로그인 아이콘", + }, + { + href: "https://www.kakao.com", + imageSource: "images/kakao-oauth.png", + alt: "카카오 소셜 로그인 아이콘", + }, +]; diff --git a/src/auth/feature-oauth/index.ts b/src/auth/feature-oauth/index.ts new file mode 100755 index 000000000..7308d4ce2 --- /dev/null +++ b/src/auth/feature-oauth/index.ts @@ -0,0 +1 @@ +export * from "./Oauth"; diff --git a/src/auth/feature-sign-in-form/SignInForm.module.scss b/src/auth/feature-sign-in-form/SignInForm.module.scss new file mode 100755 index 000000000..9832427d2 --- /dev/null +++ b/src/auth/feature-sign-in-form/SignInForm.module.scss @@ -0,0 +1,23 @@ +.form { + display: flex; + flex-direction: column; + row-gap: 2.4rem; + width: 100%; +} + +.label { + font-size: 1.4rem; +} + +.input-box { + display: flex; + flex-direction: column; + row-gap: 1.2rem; +} + +.button { + margin-top: 0.6rem; + height: 5.4rem; + font-size: 1.8rem; + font-weight: 600; +} diff --git a/src/auth/feature-sign-in-form/SignInForm.tsx b/src/auth/feature-sign-in-form/SignInForm.tsx new file mode 100755 index 000000000..3a70f0417 --- /dev/null +++ b/src/auth/feature-sign-in-form/SignInForm.tsx @@ -0,0 +1,82 @@ +import { Input } from "@/src/sharing/ui-input"; +import { PasswordInput } from "@/src/sharing/ui-password-input"; +import { Controller, useForm } from "react-hook-form"; +import { useSignIn } from "../data-access-auth"; +import { ERROR_MESSAGE, PLACEHOLDER } from "./constant"; +import { useEffect } from "react"; +import styles from "./SignInForm.module.scss"; +import classNames from "classnames/bind"; +import { Cta } from "@/src/sharing/ui-cta"; +import { useTokenRedirect } from "../util-use-token-redirect"; + +const cx = classNames.bind(styles); + +export const SignInForm = () => { + const { control, handleSubmit, watch, setError } = useForm({ + defaultValues: { email: "", password: "" }, + mode: "onBlur", + }); + const { execute, data, error } = useSignIn({ + email: watch("email"), + password: watch("password"), + }); + + useTokenRedirect(data?.data.accessToken); + + useEffect(() => { + if (error) { + setError("email", { type: "invalid", message: ERROR_MESSAGE.emailCheck }); + setError("password", { + type: "invalid", + message: ERROR_MESSAGE.passwordCheck, + }); + } + }, [error, setError]); + + return ( +
+
+ + ( + + )} + /> +
+
+ + ( + + )} + /> +
+ +
+ ); +}; diff --git a/src/auth/feature-sign-in-form/constant.ts b/src/auth/feature-sign-in-form/constant.ts new file mode 100755 index 000000000..c466ea381 --- /dev/null +++ b/src/auth/feature-sign-in-form/constant.ts @@ -0,0 +1,12 @@ +export const PLACEHOLDER = { + email: "이메일을 입력해 주세요.", + password: "비밀번호를 입력해 주세요.", +}; + +export const ERROR_MESSAGE = { + emailRequired: "이메일을 입력해 주세요.", + emailInvalid: "올바른 이메일 주소가 아닙니다.", + emailCheck: "이메일을 확인해 주세요.", + passwordRequired: "비밀번호를 입력해 주세요.", + passwordCheck: "비밀번호를 확인해 주세요.", +}; diff --git a/src/auth/feature-sign-in-form/index.ts b/src/auth/feature-sign-in-form/index.ts new file mode 100755 index 000000000..d73f07af3 --- /dev/null +++ b/src/auth/feature-sign-in-form/index.ts @@ -0,0 +1 @@ +export * from "./SignInForm"; diff --git a/src/auth/feature-sign-up-form/SignUpForm.module.scss b/src/auth/feature-sign-up-form/SignUpForm.module.scss new file mode 100755 index 000000000..9832427d2 --- /dev/null +++ b/src/auth/feature-sign-up-form/SignUpForm.module.scss @@ -0,0 +1,23 @@ +.form { + display: flex; + flex-direction: column; + row-gap: 2.4rem; + width: 100%; +} + +.label { + font-size: 1.4rem; +} + +.input-box { + display: flex; + flex-direction: column; + row-gap: 1.2rem; +} + +.button { + margin-top: 0.6rem; + height: 5.4rem; + font-size: 1.8rem; + font-weight: 600; +} diff --git a/src/auth/feature-sign-up-form/SignUpForm.tsx b/src/auth/feature-sign-up-form/SignUpForm.tsx new file mode 100755 index 000000000..d3ef40350 --- /dev/null +++ b/src/auth/feature-sign-up-form/SignUpForm.tsx @@ -0,0 +1,111 @@ +import { Input } from "@/src/sharing/ui-input"; +import { PasswordInput } from "@/src/sharing/ui-password-input"; +import { Controller, useForm } from "react-hook-form"; +import { useCheckEmailDuplicate, useSignUp } from "../data-access-auth"; +import { ERROR_MESSAGE, PLACEHOLDER } from "./constant"; +import styles from "./SignUpForm.module.scss"; +import classNames from "classnames/bind"; +import { Cta } from "@/src/sharing/ui-cta"; +import { useTokenRedirect } from "../util-use-token-redirect"; + +const cx = classNames.bind(styles); + +export const SignUpForm = () => { + const { control, handleSubmit, watch } = useForm({ + defaultValues: { email: "", password: "", confirmedPassword: "" }, + mode: "onBlur", + reValidateMode: "onBlur", + }); + const { execute: checkEmailDuplicate } = useCheckEmailDuplicate(watch("email")); + const { execute: signUp, data } = useSignUp({ + email: watch("email"), + password: watch("password"), + }); + + useTokenRedirect(data?.data.accessToken); + + return ( +
+
+ + { + const response = await checkEmailDuplicate(); + if (!response?.data?.data.isUsableNickname) { + return ERROR_MESSAGE.emailAlreadyExist; + } + return true; + }, + }, + }} + render={({ field, fieldState }) => ( + + )} + /> +
+
+ + ( + + )} + /> +
+
+ + { + if (value !== watch("password")) { + return ERROR_MESSAGE.confirmedPasswordNotMatch; + } + return true; + }, + }, + }} + render={({ field, fieldState }) => ( + + )} + /> +
+ +
+ ); +}; diff --git a/src/auth/feature-sign-up-form/constant.ts b/src/auth/feature-sign-up-form/constant.ts new file mode 100755 index 000000000..daa008263 --- /dev/null +++ b/src/auth/feature-sign-up-form/constant.ts @@ -0,0 +1,13 @@ +export const PLACEHOLDER = { + email: "이메일을 입력해 주세요.", + password: "영문, 숫자를 조합해 8자 이상 입력해 주세요.", + confirmedPassword: "비밀번호와 일치하는 값을 입력해 주세요.", +}; + +export const ERROR_MESSAGE = { + emailRequired: "이메일을 입력해 주세요.", + emailInvalid: "올바른 이메일 주소가 아닙니다.", + emailAlreadyExist: "이미 사용 중인 이메일입니다.", + passwordInvalid: "비밀번호는 영문, 숫자 조합 8자 이상 입력해 주세요.", + confirmedPasswordNotMatch: "비밀번호가 일치하지 않아요.", +}; diff --git a/src/auth/feature-sign-up-form/index.ts b/src/auth/feature-sign-up-form/index.ts new file mode 100755 index 000000000..2e435f0c6 --- /dev/null +++ b/src/auth/feature-sign-up-form/index.ts @@ -0,0 +1 @@ +export * from "./SignUpForm"; diff --git a/src/auth/type.ts b/src/auth/type.ts new file mode 100755 index 000000000..8f2591b4e --- /dev/null +++ b/src/auth/type.ts @@ -0,0 +1,4 @@ +export type Token = { + accessToken: string; + refreshToken: string; +}; diff --git a/src/auth/ui-oauth-badge/OauthBadge.module.scss b/src/auth/ui-oauth-badge/OauthBadge.module.scss new file mode 100755 index 000000000..d9d0b8381 --- /dev/null +++ b/src/auth/ui-oauth-badge/OauthBadge.module.scss @@ -0,0 +1,4 @@ +.badge { + width: 4.2rem; + height: 4.2rem; +} diff --git a/src/auth/ui-oauth-badge/OauthBadge.tsx b/src/auth/ui-oauth-badge/OauthBadge.tsx new file mode 100755 index 000000000..d1538c837 --- /dev/null +++ b/src/auth/ui-oauth-badge/OauthBadge.tsx @@ -0,0 +1,18 @@ +import styles from "./OauthBadge.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type OauthBadgeProps = { + href: string; + imageSource: string; + alt: string; +}; + +export const OauthBadge = ({ href, imageSource, alt }: OauthBadgeProps) => { + return ( + + {alt} + + ); +}; diff --git a/src/auth/ui-oauth-badge/index.ts b/src/auth/ui-oauth-badge/index.ts new file mode 100755 index 000000000..a936792bf --- /dev/null +++ b/src/auth/ui-oauth-badge/index.ts @@ -0,0 +1 @@ +export * from "./OauthBadge"; diff --git a/src/auth/ui-sign-header/SignHeader.module.scss b/src/auth/ui-sign-header/SignHeader.module.scss new file mode 100755 index 000000000..158b161d4 --- /dev/null +++ b/src/auth/ui-sign-header/SignHeader.module.scss @@ -0,0 +1,30 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + flex-direction: column; + align-items: center; + row-gap: 1.6rem; +} + +.logo { + width: fit-content; + height: 3.8rem; +} + +.message-box { + display: flex; + column-gap: 0.8rem; + font-size: 1.6rem; +} + +.message { + line-height: 150%; +} + +.link { + height: fit-content; + font-weight: 600; + color: $color-primary; + border-bottom: solid 0.1rem $color-primary; +} diff --git a/src/auth/ui-sign-header/SignHeader.tsx b/src/auth/ui-sign-header/SignHeader.tsx new file mode 100755 index 000000000..0d7ddf281 --- /dev/null +++ b/src/auth/ui-sign-header/SignHeader.tsx @@ -0,0 +1,33 @@ +import { ROUTE } from "@/src/sharing/util"; +import { Url } from "next/dist/shared/lib/router/router"; +import Link from "next/link"; +import styles from "./SignHeader.module.scss"; +import classNames from "classnames/bind"; +import LinkbraryIcon from "public/images/linkbrary.svg"; + +const cx = classNames.bind(styles); + +type SignHeaderProps = { + message: string; + link: { + href: Url; + text: string; + }; +}; + +export const SignHeader = ({ message, link }: SignHeaderProps) => { + const { href, text } = link; + return ( +
+ + + +

+ {message} + + {text} + +

+
+ ); +}; diff --git a/src/auth/ui-sign-header/index.ts b/src/auth/ui-sign-header/index.ts new file mode 100755 index 000000000..7d905d3ad --- /dev/null +++ b/src/auth/ui-sign-header/index.ts @@ -0,0 +1 @@ +export * from "./SignHeader"; diff --git a/src/auth/util-use-token-redirect/index.ts b/src/auth/util-use-token-redirect/index.ts new file mode 100755 index 000000000..8ba49a09b --- /dev/null +++ b/src/auth/util-use-token-redirect/index.ts @@ -0,0 +1 @@ +export * from "./useTokenRedirect"; diff --git a/src/auth/util-use-token-redirect/useTokenRedirect.tsx b/src/auth/util-use-token-redirect/useTokenRedirect.tsx new file mode 100755 index 000000000..5305ec568 --- /dev/null +++ b/src/auth/util-use-token-redirect/useTokenRedirect.tsx @@ -0,0 +1,23 @@ +import { ROUTE } from "@/src/sharing/util"; +import { useRouter } from "next/router"; +import { useEffect } from "react"; + +export const useTokenRedirect = (tokenResponse?: string) => { + const router = useRouter(); + + useEffect(() => { + const routeToFolderPage = () => { + router.replace(ROUTE.폴더); + }; + const accessTokenInLocalStorage = localStorage.getItem("accessToken"); + + if (tokenResponse) { + routeToFolderPage(); + return; + } + + if (accessTokenInLocalStorage) { + routeToFolderPage(); + } + }, [tokenResponse, router]); +}; diff --git a/src/folder/data-access-folder/index.js b/src/folder/data-access-folder/index.js new file mode 100755 index 000000000..1b3705b01 --- /dev/null +++ b/src/folder/data-access-folder/index.js @@ -0,0 +1,2 @@ +export * from "./useGetFolder"; +export * from "./useGetFolders"; diff --git a/src/folder/data-access-folder/useGetFolder.ts b/src/folder/data-access-folder/useGetFolder.ts new file mode 100755 index 000000000..7a7cf848a --- /dev/null +++ b/src/folder/data-access-folder/useGetFolder.ts @@ -0,0 +1,13 @@ +import { SampleFolderRawData } from "@/src/folder/type"; +import { mapFolderData } from "@/src/folder/util-map"; +import { useAsync } from "@/src/sharing/util"; +import { axiosInstance } from "@/src/sharing/util"; + +export const useGetFolder = () => { + const getFolder = () => axiosInstance.get<{ folder: SampleFolderRawData }>("sample/folder"); + const { loading, error, data } = useAsync(getFolder); + + const folderData = mapFolderData(data?.folder); + + return { loading, error, data: folderData }; +}; diff --git a/src/folder/data-access-folder/useGetFolders.ts b/src/folder/data-access-folder/useGetFolders.ts new file mode 100755 index 000000000..175d79bb1 --- /dev/null +++ b/src/folder/data-access-folder/useGetFolders.ts @@ -0,0 +1,14 @@ +import { FolderRawData } from "@/src/folder/type"; +import { mapFoldersData } from "@/src/folder/util-map/mapFoldersData"; +import { axiosInstance } from "@/src/sharing/util"; +import { useAsync } from "@/src/sharing/util"; + +export const useGetFolders = () => { + const getFolders = () => axiosInstance.get<{ data: FolderRawData[] }>("users/1/folders"); + const { loading, error, data } = useAsync(getFolders); + + const folders = mapFoldersData(data?.data); + const sortedFolders = folders.sort((a, b) => a?.id - b?.id); + + return { loading, error, data: sortedFolders }; +}; diff --git a/src/folder/feature-folder-tool-bar/FolderToolBar.module.scss b/src/folder/feature-folder-tool-bar/FolderToolBar.module.scss new file mode 100755 index 000000000..b2e3d2053 --- /dev/null +++ b/src/folder/feature-folder-tool-bar/FolderToolBar.module.scss @@ -0,0 +1,69 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + flex-direction: column; + align-items: flex-start; + row-gap: 1.2rem; + + @include tablet { + display: grid; + grid-template-areas: + "folders folders add-button" + "folder-name buttons buttons"; + justify-content: space-between; + align-items: center; + row-gap: 2.4rem; + column-gap: 1.2rem; + } +} + +.folders { + grid-area: folders; + display: flex; + flex-wrap: wrap; + column-gap: 0.8rem; + row-gap: 1.2rem; + flex-grow: 1; +} + +.add-button { + grid-area: add-button; + + position: fixed; + bottom: 10.1rem; + left: 50%; + transform: translateX(-50%); + z-index: $z-index-fab; + + @include tablet { + justify-self: flex-end; + + position: static; + transform: none; + } +} + +.folder-name { + grid-area: folder-name; + margin-top: 1.6rem; + font-size: 2rem; + font-weight: 600; + letter-spacing: -0.02rem; + + @include tablet { + margin-top: 0; + font-size: 2.4rem; + } +} + +.buttons { + justify-self: flex-start; + grid-area: buttons; + display: flex; + column-gap: 1.2rem; + + @include tablet { + justify-self: flex-end; + } +} diff --git a/src/folder/feature-folder-tool-bar/FolderToolBar.tsx b/src/folder/feature-folder-tool-bar/FolderToolBar.tsx new file mode 100755 index 000000000..edee60a28 --- /dev/null +++ b/src/folder/feature-folder-tool-bar/FolderToolBar.tsx @@ -0,0 +1,121 @@ +import styles from "./FolderToolBar.module.scss"; +import classNames from "classnames/bind"; +import { AddFolderButton } from "@/src/folder/ui-add-folder-button"; +import { FolderButton } from "@/src/folder/ui-folder-button"; +import { IconAndTextButton } from "@/src/sharing/ui-icon-and-text-button"; +import { ALL_LINKS_TEXT, BUTTONS, KAKAO_SHARE_DATA, MODALS_ID } from "./constant"; +import { ALL_LINKS_ID } from "@/src/link/data-access-link/constant"; +import { KeyboardEvent, useState } from "react"; +import { ShareModal } from "@/src/folder/ui-share-modal"; +import { InputModal } from "@/src/sharing/ui-input-modal"; +import { AlertModal } from "@/src/sharing/ui-alert-modal"; +import { Folder, SelectedFolderId } from "@/src/folder/type"; +import { copyToClipboard, useKakaoSdk } from "@/src/sharing/util"; + +const cx = classNames.bind(styles); + +type FolderToolBarProps = { + folders: Folder[]; + selectedFolderId: SelectedFolderId; + onFolderClick: (folderId: SelectedFolderId) => void; +}; + +export const FolderToolBar = ({ folders, selectedFolderId, onFolderClick }: FolderToolBarProps) => { + const { shareKakao } = useKakaoSdk(); + const [currentModal, setCurrentModal] = useState(null); + const [inputValue, setInputValue] = useState(""); + + const folderName = + ALL_LINKS_ID === selectedFolderId + ? ALL_LINKS_TEXT + : folders?.find(({ id }) => id === selectedFolderId)?.name ?? ""; + + const getShareLink = () => `${window.location.origin}/shared?user=1&folder=${selectedFolderId}`; + const closeModal = () => setCurrentModal(null); + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === "Escape") { + closeModal(); + } + }; + const handleKakaoClick = () => { + shareKakao({ url: getShareLink(), ...KAKAO_SHARE_DATA }); + }; + const handleFacebookClick = () => + window?.open(`http://www.facebook.com/sharer.php?u=${getShareLink()}`); + const handleLinkCopyClick = () => copyToClipboard(getShareLink()); + + return ( +
+
+ onFolderClick(ALL_LINKS_ID)} + isSelected={ALL_LINKS_ID === selectedFolderId} + /> + {folders?.map(({ id, name }) => ( + onFolderClick(id)} + isSelected={id === selectedFolderId} + /> + ))} +
+
+ setCurrentModal(MODALS_ID.addFolder)} /> + setInputValue(event.target.value)} + /> +
+

{folderName}

+ {selectedFolderId !== ALL_LINKS_ID && ( +
+ {BUTTONS.map(({ text, iconSource, modalId }) => ( + setCurrentModal(modalId)} + /> + ))} + + setInputValue(event.target.value)} + /> + {}} + /> +
+ )} +
+ ); +}; diff --git a/src/folder/feature-folder-tool-bar/constant.js b/src/folder/feature-folder-tool-bar/constant.js new file mode 100755 index 000000000..13bb91178 --- /dev/null +++ b/src/folder/feature-folder-tool-bar/constant.js @@ -0,0 +1,32 @@ +export const MODALS_ID = { + addFolder: "addFolder", + share: "share", + rename: "rename", + delete: "delete", +}; + +export const BUTTONS = [ + { + iconSource: "images/share.svg", + text: "공유", + modalId: MODALS_ID.share, + }, + { + iconSource: "images/pen.svg", + text: "이름 변경", + modalId: MODALS_ID.rename, + }, + { + iconSource: "images/trash.svg", + text: "삭제", + modalId: MODALS_ID.delete, + }, +]; + +export const ALL_LINKS_TEXT = "전체"; + +export const KAKAO_SHARE_DATA = { + title: "Linkbrary", + description: "링크를 저장하고 공유하는 가장 쉬운 방법", + imageUrl: "https://codeit-frontend.codeit.com/static/images/brand/og_tag.png", +}; diff --git a/src/folder/feature-folder-tool-bar/index.js b/src/folder/feature-folder-tool-bar/index.js new file mode 100755 index 000000000..4f6c19526 --- /dev/null +++ b/src/folder/feature-folder-tool-bar/index.js @@ -0,0 +1 @@ +export * from "./FolderToolBar"; diff --git a/src/folder/type.ts b/src/folder/type.ts new file mode 100755 index 000000000..147d77711 --- /dev/null +++ b/src/folder/type.ts @@ -0,0 +1,32 @@ +import { SampleLinkRawData } from "@/src/link/type"; + +export type SampleFolderRawData = { + id: number; + name: string; + owner: { + id: number; + name: string; + profileImageSource: string; + }; + links: SampleLinkRawData[]; +}; + +export type FolderRawData = { + id: number; + created_at: string; + name: string; + user_id: number; + link: { + count: number; + }; +}; + +export type Folder = { + id: number; + createdAt: string; + name: string; + userId: number; + linkCount: number; +}; + +export type SelectedFolderId = number | "all"; diff --git a/src/folder/ui-add-folder-button/AddFolderButton.module.scss b/src/folder/ui-add-folder-button/AddFolderButton.module.scss new file mode 100755 index 000000000..adc80d355 --- /dev/null +++ b/src/folder/ui-add-folder-button/AddFolderButton.module.scss @@ -0,0 +1,30 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + align-items: center; + column-gap: 0.4rem; + font-size: 1.6rem; + font-weight: 500; + + height: 3.5rem; + padding: 0 2.4rem; + border-radius: 2rem; + border: 0.1rem solid $color-white; + background-color: $color-primary; + color: $color-gray10; + + @include tablet { + padding: 0; + background-color: transparent; + color: $color-primary; + } +} + +.icon { + fill: $color-gray10; + + @include tablet { + fill: $color-primary; + } +} diff --git a/src/folder/ui-add-folder-button/AddFolderButton.tsx b/src/folder/ui-add-folder-button/AddFolderButton.tsx new file mode 100755 index 000000000..7b09315dc --- /dev/null +++ b/src/folder/ui-add-folder-button/AddFolderButton.tsx @@ -0,0 +1,19 @@ +import styles from "./AddFolderButton.module.scss"; +import classNames from "classnames/bind"; +import AddIcon from "./add.svg"; +import { MouseEventHandler } from "react"; + +const cx = classNames.bind(styles); + +type AddFolderButtonProps = { + onClick: MouseEventHandler; +}; + +export const AddFolderButton = ({ onClick }: AddFolderButtonProps) => { + return ( + + ); +}; diff --git a/src/folder/ui-add-folder-button/add.svg b/src/folder/ui-add-folder-button/add.svg new file mode 100755 index 000000000..852d71def --- /dev/null +++ b/src/folder/ui-add-folder-button/add.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/folder/ui-add-folder-button/index.js b/src/folder/ui-add-folder-button/index.js new file mode 100755 index 000000000..43d7db7eb --- /dev/null +++ b/src/folder/ui-add-folder-button/index.js @@ -0,0 +1 @@ +export * from "./AddFolderButton"; diff --git a/src/folder/ui-folder-button/FolderButton.module.scss b/src/folder/ui-folder-button/FolderButton.module.scss new file mode 100755 index 000000000..b7a91a167 --- /dev/null +++ b/src/folder/ui-folder-button/FolderButton.module.scss @@ -0,0 +1,27 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + align-items: center; + height: 3.1rem; + padding: 0 1rem; + border-radius: 0.5rem; + border: 0.1rem solid $color-primary; + font-size: 1.4rem; + transition: all 0.3s ease-in-out; + + @include tablet { + height: 3.7rem; + padding: 0 1.2rem; + font-size: 1.6rem; + } + + &:hover { + background-color: $color-gray10; + } + + &.selected { + background-color: $color-primary; + color: $color-white; + } +} diff --git a/src/folder/ui-folder-button/FolderButton.tsx b/src/folder/ui-folder-button/FolderButton.tsx new file mode 100755 index 000000000..b9d9057f0 --- /dev/null +++ b/src/folder/ui-folder-button/FolderButton.tsx @@ -0,0 +1,19 @@ +import { MouseEventHandler } from "react"; +import styles from "./FolderButton.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type FolderButtonProps = { + text: string; + onClick: MouseEventHandler; + isSelected?: boolean; +}; + +export const FolderButton = ({ text, onClick, isSelected = false }: FolderButtonProps) => { + return ( + + ); +}; diff --git a/src/folder/ui-folder-button/index.js b/src/folder/ui-folder-button/index.js new file mode 100755 index 000000000..2517e107e --- /dev/null +++ b/src/folder/ui-folder-button/index.js @@ -0,0 +1 @@ +export * from "./FolderButton"; diff --git a/src/folder/ui-folder-info/FolderInfo.module.scss b/src/folder/ui-folder-info/FolderInfo.module.scss new file mode 100755 index 000000000..8de3bb4b9 --- /dev/null +++ b/src/folder/ui-folder-info/FolderInfo.module.scss @@ -0,0 +1,48 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + padding: 1rem 0 4rem; + box-sizing: border-box; + background-color: $color-light-blue; + + @include tablet { + padding: 2rem 0 6rem; + } +} + +.profile { + width: 4rem; + height: 4rem; + border-radius: 50%; + + @include tablet { + width: 6rem; + height: 6rem; + } +} + +.owner { + margin-top: 0.6rem; + font-size: 1.4rem; + + @include tablet { + margin-top: 1.2rem; + font-size: 1.6rem; + line-height: 150%; + } +} + +.folder { + margin-top: 1rem; + font-size: 3.2rem; + font-weight: 600; + + @include tablet { + margin-top: 2rem; + font-size: 4rem; + } +} diff --git a/src/folder/ui-folder-info/FolderInfo.tsx b/src/folder/ui-folder-info/FolderInfo.tsx new file mode 100755 index 000000000..c6c0f7e08 --- /dev/null +++ b/src/folder/ui-folder-info/FolderInfo.tsx @@ -0,0 +1,20 @@ +import styles from "./FolderInfo.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type FolderInfoProps = { + profileImage: string; + ownerName: string; + folderName: string; +}; + +export const FolderInfo = ({ profileImage, ownerName, folderName }: FolderInfoProps) => { + return ( +
+ 폴더 소유자 프로필 이미지 + {ownerName} +

{folderName}

+
+ ); +}; diff --git a/src/folder/ui-folder-info/index.js b/src/folder/ui-folder-info/index.js new file mode 100755 index 000000000..8e64f815d --- /dev/null +++ b/src/folder/ui-folder-info/index.js @@ -0,0 +1 @@ +export * from "./FolderInfo"; diff --git a/src/folder/ui-folder-item/FolderItem.module.scss b/src/folder/ui-folder-item/FolderItem.module.scss new file mode 100755 index 000000000..bfe4afcc3 --- /dev/null +++ b/src/folder/ui-folder-item/FolderItem.module.scss @@ -0,0 +1,38 @@ +@import "@/styles/global.scss"; + +.button { + flex: 0 0 4rem; + display: flex; + align-items: center; + column-gap: 0.8rem; + width: 100%; + height: 4rem; + padding: 0.8rem; + border-radius: 0.8rem; + + &:hover { + background-color: $color-light-blue; + } + + &.selected { + background-color: $color-light-blue; + } +} + +.name { + font-size: 1.6rem; + color: $color-gray100; + + &.selected { + color: $color-primary; + } +} + +.count { + font-size: 1.4rem; + color: $color-gray60; +} + +.check { + margin-left: auto; +} diff --git a/src/folder/ui-folder-item/FolderItem.tsx b/src/folder/ui-folder-item/FolderItem.tsx new file mode 100755 index 000000000..502ecdd09 --- /dev/null +++ b/src/folder/ui-folder-item/FolderItem.tsx @@ -0,0 +1,27 @@ +import { MouseEventHandler } from "react"; +import styles from "./FolderItem.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type FolderItemProps = { + folderName: string; + linkCount: number; + isSelected?: boolean; + onClick: MouseEventHandler; +}; + +export const FolderItem = ({ + folderName, + linkCount, + isSelected = false, + onClick, +}: FolderItemProps) => { + return ( + + ); +}; diff --git a/src/folder/ui-folder-item/index.js b/src/folder/ui-folder-item/index.js new file mode 100755 index 000000000..ec96321fb --- /dev/null +++ b/src/folder/ui-folder-item/index.js @@ -0,0 +1 @@ +export * from "./FolderItem"; diff --git a/src/folder/ui-share-modal/ShareModal.module.scss b/src/folder/ui-share-modal/ShareModal.module.scss new file mode 100755 index 000000000..3c1910bad --- /dev/null +++ b/src/folder/ui-share-modal/ShareModal.module.scss @@ -0,0 +1,25 @@ +@import "@/styles/global.scss"; + +.modal-header { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + row-gap: 0.8rem; +} + +.modal-content { + display: flex; + justify-content: center; + align-items: center; + column-gap: 3.2rem; +} + +.button { + display: flex; + flex-direction: column; + align-items: center; + row-gap: 1rem; + font-size: 1.3rem; + line-height: 1.5rem; +} diff --git a/src/folder/ui-share-modal/ShareModal.tsx b/src/folder/ui-share-modal/ShareModal.tsx new file mode 100755 index 000000000..8fdc35a48 --- /dev/null +++ b/src/folder/ui-share-modal/ShareModal.tsx @@ -0,0 +1,62 @@ +import styles from "./ShareModal.module.scss"; +import classNames from "classnames/bind"; +import { Modal } from "@/src/sharing/ui-modal"; +import { ModalContentBox } from "@/src/sharing/ui-modal-content-box"; +import { ModalContentDescription } from "@/src/sharing/ui-modal-content-description"; +import { ModalContentTitle } from "@/src/sharing/ui-modal-content-title"; +import KakaoIcon from "./kakao.svg"; +import FacebookIcon from "./facebook.svg"; +import LinkIcon from "./link.svg"; +import { KeyboardEventHandler, MouseEventHandler } from "react"; + +const cx = classNames.bind(styles); + +type ShareModalProps = { + isOpen: boolean; + folderName: string; + onKakaoClick: MouseEventHandler; + onFacebookClick: MouseEventHandler; + onLinkCopyClick: MouseEventHandler; + onCloseClick: MouseEventHandler; + onKeyDown: KeyboardEventHandler; +}; + +export const ShareModal = ({ + isOpen, + folderName, + onKakaoClick, + onFacebookClick, + onLinkCopyClick, + onCloseClick, + onKeyDown, +}: ShareModalProps) => { + return ( + + + 폴더 공유 + {folderName} + + } + content={ +
+ + + +
+ } + onCloseClick={onCloseClick} + /> +
+ ); +}; diff --git a/src/folder/ui-share-modal/facebook.svg b/src/folder/ui-share-modal/facebook.svg new file mode 100755 index 000000000..3dbbb7c1a --- /dev/null +++ b/src/folder/ui-share-modal/facebook.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/folder/ui-share-modal/index.js b/src/folder/ui-share-modal/index.js new file mode 100755 index 000000000..f1b2d1b28 --- /dev/null +++ b/src/folder/ui-share-modal/index.js @@ -0,0 +1 @@ +export * from "./ShareModal"; diff --git a/src/folder/ui-share-modal/kakao.svg b/src/folder/ui-share-modal/kakao.svg new file mode 100755 index 000000000..4cb7093bc --- /dev/null +++ b/src/folder/ui-share-modal/kakao.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/folder/ui-share-modal/link.svg b/src/folder/ui-share-modal/link.svg new file mode 100755 index 000000000..e7f3e229b --- /dev/null +++ b/src/folder/ui-share-modal/link.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/folder/util-map/constant.ts b/src/folder/util-map/constant.ts new file mode 100755 index 000000000..4164acb04 --- /dev/null +++ b/src/folder/util-map/constant.ts @@ -0,0 +1,6 @@ +export const DEFAULT_FOLDER_DATA = { + profileImage: "", + ownerName: "", + folderName: "", + links: [], +}; diff --git a/src/folder/util-map/index.js b/src/folder/util-map/index.js new file mode 100755 index 000000000..9e06ce372 --- /dev/null +++ b/src/folder/util-map/index.js @@ -0,0 +1 @@ +export * from "./mapFolderData"; diff --git a/src/folder/util-map/mapFolderData.ts b/src/folder/util-map/mapFolderData.ts new file mode 100755 index 000000000..34c65c4ce --- /dev/null +++ b/src/folder/util-map/mapFolderData.ts @@ -0,0 +1,16 @@ +import { mapLinksData } from "@/src/link/util-map"; +import { DEFAULT_FOLDER_DATA } from "./constant"; +import { SampleFolderRawData } from "@/src/folder/type"; + +export const mapFolderData = (folder?: SampleFolderRawData) => { + if (!folder) return DEFAULT_FOLDER_DATA; + + const { name, owner, links } = folder; + + return { + profileImage: owner?.profileImageSource ?? "", + ownerName: owner?.name ?? "", + folderName: name ?? "", + links: links?.map(mapLinksData) ?? [], + }; +}; diff --git a/src/folder/util-map/mapFoldersData.ts b/src/folder/util-map/mapFoldersData.ts new file mode 100755 index 000000000..b827cd21a --- /dev/null +++ b/src/folder/util-map/mapFoldersData.ts @@ -0,0 +1,17 @@ +import { Folder, FolderRawData } from "@/src/folder/type"; + +export const mapFoldersData = (folders?: FolderRawData[]): Folder[] => { + if (!folders) return []; + + return folders.map((folder) => { + const { id, created_at, name, user_id, link } = folder; + + return { + id, + createdAt: created_at, + name, + userId: user_id, + linkCount: link.count, + }; + }); +}; diff --git a/src/global.d.ts b/src/global.d.ts new file mode 100755 index 000000000..75fa9ebba --- /dev/null +++ b/src/global.d.ts @@ -0,0 +1,5 @@ +declare module "*.scss"; + +declare module "*.svg" { + export const ReactComponent: ReactElement; +} diff --git a/src/link/data-access-link/constant.js b/src/link/data-access-link/constant.js new file mode 100755 index 000000000..e1c7337e5 --- /dev/null +++ b/src/link/data-access-link/constant.js @@ -0,0 +1 @@ +export const ALL_LINKS_ID = "all"; diff --git a/src/link/data-access-link/index.js b/src/link/data-access-link/index.js new file mode 100755 index 000000000..4f31e4e81 --- /dev/null +++ b/src/link/data-access-link/index.js @@ -0,0 +1 @@ +export * from "./useGetLinks"; diff --git a/src/link/data-access-link/useGetLinks.ts b/src/link/data-access-link/useGetLinks.ts new file mode 100755 index 000000000..95ed74459 --- /dev/null +++ b/src/link/data-access-link/useGetLinks.ts @@ -0,0 +1,43 @@ +import { useCallback, useEffect } from "react"; +import { axiosInstance } from "@/src/sharing/util"; +import { mapLinksData } from "@/src/link/util-map/mapLinksData"; +import { useAsync } from "@/src/sharing/util"; +import { ALL_LINKS_ID } from "./constant"; +import { SelectedFolderId } from "@/src/folder/type"; +import { LinkRawData } from "@/src/link/type"; + +export const useGetLinks = (folderId: SelectedFolderId = ALL_LINKS_ID) => { + const queryString = folderId === ALL_LINKS_ID ? "" : `?folderId=${folderId}`; + const getLinks = useCallback( + () => axiosInstance.get<{ data: LinkRawData[] }>(`users/1/links${queryString}`), + [queryString] + ); + const { execute, loading, error, data } = useAsync(getLinks); + + useEffect(() => { + execute(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [folderId]); + + const mapDataFormat = ({ + id, + created_at, + updated_at, + url, + image_source, + title, + description, + }: LinkRawData) => ({ + id, + createdAt: created_at, + updatedAt: updated_at, + imageSource: image_source, + url, + title, + description, + }); + + const linksData = data?.data.map(mapDataFormat).map(mapLinksData) ?? []; + + return { execute, loading, error, data: linksData }; +}; diff --git a/src/link/feature-card-list/CardList.tsx b/src/link/feature-card-list/CardList.tsx new file mode 100755 index 000000000..af350ce2c --- /dev/null +++ b/src/link/feature-card-list/CardList.tsx @@ -0,0 +1,88 @@ +import { useGetFolders } from "@/src/folder/data-access-folder"; +import { AddLinkModal } from "@/src/link/ui-add-link-modal"; +import { EditableCard } from "@/src/link/ui-editable-card"; +import { NoLink } from "@/src/link/ui-no-link"; +import { KeyboardEventHandler, useCallback, useRef, useState } from "react"; +import { CardList as UiCardList } from "@/src/link/ui-card-list"; +import { AlertModal } from "@/src/sharing/ui-alert-modal"; +import { MODALS_ID } from "./constant"; +import { Link } from "@/src/link/type"; + +type CardListProps = { + links: Link[]; +}; + +export const CardList = ({ links }: CardListProps) => { + const { data: folders } = useGetFolders(); + const cardListRef = useRef(null); + const [selectedFolderId, setSelectedFolderId] = useState(null); + const [currentModal, setCurrentModal] = useState(null); + const [selectedLinkUrl, setSelectedLinkUrl] = useState(""); + + const closeModal = () => setCurrentModal(null); + const handleKeyDown: KeyboardEventHandler = (event) => { + if (event.key === "Escape") { + closeModal(); + } + }; + + const getPopoverPosition = useCallback( + (cardIndex: number) => { + const count = + cardListRef?.current !== null + ? window + .getComputedStyle(cardListRef?.current) + .getPropertyValue("grid-template-columns") + .split(" ").length + : 1; + if ((cardIndex + 1) % count === 0) { + return { right: 0 }; + } + return { left: 0 }; + }, + [cardListRef] + ); + + if (links.length === 0) return ; + return ( + + {links.map((link, index) => ( + { + setSelectedLinkUrl(link?.url ?? ""); + setCurrentModal(MODALS_ID.deleteLink); + }} + onAddToFolderClick={() => { + setSelectedLinkUrl(link?.url ?? ""); + setCurrentModal(MODALS_ID.addToFolder); + }} + /> + ))} + {}} + onCloseClick={closeModal} + onKeyDown={handleKeyDown} + /> + {}} + onCloseClick={() => { + setSelectedFolderId(null); + closeModal(); + }} + onKeyDown={handleKeyDown} + /> + + ); +}; diff --git a/src/link/feature-card-list/constant.js b/src/link/feature-card-list/constant.js new file mode 100755 index 000000000..309aaf947 --- /dev/null +++ b/src/link/feature-card-list/constant.js @@ -0,0 +1,4 @@ +export const MODALS_ID = { + deleteLink: "deleteLink", + addToFolder: "addToFolder", +}; diff --git a/src/link/feature-card-list/index.js b/src/link/feature-card-list/index.js new file mode 100755 index 000000000..01f98599d --- /dev/null +++ b/src/link/feature-card-list/index.js @@ -0,0 +1 @@ +export * from "./CardList"; diff --git a/src/link/feature-link-form/LinkForm.module.scss b/src/link/feature-link-form/LinkForm.module.scss new file mode 100755 index 000000000..874eb4dc8 --- /dev/null +++ b/src/link/feature-link-form/LinkForm.module.scss @@ -0,0 +1,25 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + justify-content: center; + width: 100%; + padding: 2.4rem 3.2rem 4rem; + background-color: $color-light-blue; + + @include tablet { + padding: 6rem 3.2rem 9rem; + } + + .fixed { + position: fixed; + padding: 1.6rem 3.2rem; + bottom: 0; + left: 0; + z-index: $z-index-fab; + + @include tablet { + padding: 2.4rem 3.2rem; + } + } +} diff --git a/src/link/feature-link-form/LinkForm.tsx b/src/link/feature-link-form/LinkForm.tsx new file mode 100755 index 000000000..59449a7c7 --- /dev/null +++ b/src/link/feature-link-form/LinkForm.tsx @@ -0,0 +1,67 @@ +import styles from "./LinkForm.module.scss"; +import classNames from "classnames/bind"; +import { useGetFolders } from "@/src/folder/data-access-folder"; +import { AddLinkModal } from "@/src/link/ui-add-link-modal"; +import { LinkForm as UiLinkForm } from "@/src/link/ui-link-form"; +import { ChangeEvent, KeyboardEventHandler, useState } from "react"; +import { useIntersectionObserver } from "@/src/sharing/util/useIntersectionObserver"; + +const cx = classNames.bind(styles); + +type LinkFormProps = { + hideFixedLinkForm?: boolean; +}; + +export const LinkForm = ({ hideFixedLinkForm = false }: LinkFormProps) => { + const [isModalOpen, setIsModalOpen] = useState(false); + const { data: folders } = useGetFolders(); + const [selectedFolderId, setSelectedFolderId] = useState(null); + const [linkUrl, setLinkUrl] = useState(""); + const { ref, isIntersecting } = useIntersectionObserver(); + const showFixedLinkForm = !hideFixedLinkForm && !isIntersecting; + + const handleChange = (event: ChangeEvent) => { + setLinkUrl(event.target.value); + }; + + const closeModal = () => { + setSelectedFolderId(null); + setIsModalOpen(false); + }; + const handleKeyDown: KeyboardEventHandler = (event) => { + if (event.key === "Escape") { + closeModal(); + } + }; + + return ( +
+ setIsModalOpen(true)} + value={linkUrl} + onChange={handleChange} + /> + {}} + onCloseClick={closeModal} + onKeyDown={handleKeyDown} + /> + + {showFixedLinkForm && ( +
+ setIsModalOpen(true)} + value={linkUrl} + onChange={handleChange} + /> +
+ )} +
+ ); +}; diff --git a/src/link/feature-link-form/index.js b/src/link/feature-link-form/index.js new file mode 100755 index 000000000..edcc920c2 --- /dev/null +++ b/src/link/feature-link-form/index.js @@ -0,0 +1 @@ +export * from "./LinkForm"; diff --git a/src/link/type.ts b/src/link/type.ts new file mode 100755 index 000000000..63a578e82 --- /dev/null +++ b/src/link/type.ts @@ -0,0 +1,30 @@ +export type SampleLinkRawData = { + id: number; + createdAt: string; + url: string; + title: string; + description: string; + imageSource: string; +}; + +export type LinkRawData = { + id: number; + created_at: string; + updated_at: string; + url: string; + image_source: string; + title: string; + description: string; + folder_id: number; +}; + +export type Link = { + id: number; + title: string; + url: string; + imageSource: string; + alt: string; + description: string; + elapsedTime: string; + createdAt: string; +}; diff --git a/src/link/ui-add-link-modal/AddLinkModal.module.scss b/src/link/ui-add-link-modal/AddLinkModal.module.scss new file mode 100755 index 000000000..20ff68975 --- /dev/null +++ b/src/link/ui-add-link-modal/AddLinkModal.module.scss @@ -0,0 +1,25 @@ +.modal-header { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + row-gap: 0.8rem; +} + +.modal-content { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + row-gap: 2.4rem; +} + +.folder-list { + display: flex; + flex-direction: column; + width: 100%; + min-height: 0; + max-height: 17.2rem; + overflow-y: auto; + row-gap: 0.4rem; +} diff --git a/src/link/ui-add-link-modal/AddLinkModal.tsx b/src/link/ui-add-link-modal/AddLinkModal.tsx new file mode 100755 index 000000000..5e74b55dd --- /dev/null +++ b/src/link/ui-add-link-modal/AddLinkModal.tsx @@ -0,0 +1,64 @@ +import styles from "./AddLinkModal.module.scss"; +import classNames from "classnames/bind"; +import { Folder } from "@/src/folder/type"; +import { FolderItem } from "@/src/folder/ui-folder-item"; +import { Dispatch, KeyboardEventHandler, SetStateAction } from "react"; +import { Modal } from "@/src/sharing/ui-modal"; +import { ModalContentBox } from "@/src/sharing/ui-modal-content-box"; +import { ModalContentButton } from "@/src/sharing/ui-modal-content-button"; +import { ModalContentDescription } from "@/src/sharing/ui-modal-content-description"; +import { ModalContentTitle } from "@/src/sharing/ui-modal-content-title"; + +const cx = classNames.bind(styles); + +type AddLinkModalProps = { + isOpen: boolean; + folders: Folder[]; + description: string; + selectedFolderId: number | null; + setSelectedFolderId: Dispatch>; + onAddClick: () => void; + onCloseClick: () => void; + onKeyDown: KeyboardEventHandler; +}; + +export const AddLinkModal = ({ + isOpen, + folders, + description, + selectedFolderId, + setSelectedFolderId, + onAddClick, + onCloseClick, + onKeyDown, +}: AddLinkModalProps) => { + return ( + + + 폴더에 추가 + {description} + + } + content={ +
+
+ {folders?.map(({ id, name, linkCount }) => ( + setSelectedFolderId(id)} + /> + ))} +
+ 추가하기 +
+ } + onCloseClick={onCloseClick} + /> +
+ ); +}; diff --git a/src/link/ui-add-link-modal/index.js b/src/link/ui-add-link-modal/index.js new file mode 100755 index 000000000..2970eccba --- /dev/null +++ b/src/link/ui-add-link-modal/index.js @@ -0,0 +1 @@ +export * from "./AddLinkModal"; diff --git a/src/link/ui-card-list/CardList.module.scss b/src/link/ui-card-list/CardList.module.scss new file mode 100755 index 000000000..8a4160dc2 --- /dev/null +++ b/src/link/ui-card-list/CardList.module.scss @@ -0,0 +1,16 @@ +@import "@/styles/global.scss"; + +.container { + display: grid; + grid-template-columns: repeat(32.5rem); + justify-content: center; + width: 100%; + max-width: 106rem; + row-gap: 2rem; + + @include tablet { + grid-template-columns: repeat(auto-fill, 34rem); + row-gap: 2.5rem; + column-gap: 2rem; + } +} diff --git a/src/link/ui-card-list/CardList.tsx b/src/link/ui-card-list/CardList.tsx new file mode 100755 index 000000000..c94321f3d --- /dev/null +++ b/src/link/ui-card-list/CardList.tsx @@ -0,0 +1,13 @@ +import { ReactNode, forwardRef } from "react"; +import styles from "./CardList.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +export const CardList = forwardRef(({ children }, ref) => { + return ( +
+ {children} +
+ ); +}); diff --git a/src/link/ui-card-list/index.js b/src/link/ui-card-list/index.js new file mode 100755 index 000000000..5b3ad7020 --- /dev/null +++ b/src/link/ui-card-list/index.js @@ -0,0 +1 @@ +export * from "./CardList.tsx"; diff --git a/src/link/ui-editable-card/EditableCard.module.scss b/src/link/ui-editable-card/EditableCard.module.scss new file mode 100755 index 000000000..24c029bcb --- /dev/null +++ b/src/link/ui-editable-card/EditableCard.module.scss @@ -0,0 +1,43 @@ +@import "@/styles/global.scss"; + +.star { + position: absolute; + top: 1.5rem; + right: 1.5rem; + width: 3.4rem; + height: 3.4rem; +} + +.kebab { + position: absolute; + top: 20.7rem; + right: 2rem; + + @include tablet { + top: 21.5rem; + } +} + +.popover-list { + display: flex; + flex-direction: column; + row-gap: 0.2rem; + width: 10rem; + padding: 0; + box-shadow: 0 0.2rem 0.8rem 0 rgba(51, 50, 54, 0.1); + background: $color-white; + + & > li { + display: flex; + justify-content: center; + align-items: center; + list-style-type: none; + height: 3.1rem; + font-size: 1.4rem; + + &:hover { + background: $color-gray10; + color: $color-primary; + } + } +} diff --git a/src/link/ui-editable-card/EditableCard.tsx b/src/link/ui-editable-card/EditableCard.tsx new file mode 100755 index 000000000..c6f8f7cb6 --- /dev/null +++ b/src/link/ui-editable-card/EditableCard.tsx @@ -0,0 +1,92 @@ +import styles from "./EditableCard.module.scss"; +import classNames from "classnames/bind"; +import { CSSProperties, MouseEventHandler, useCallback, useRef, useState } from "react"; +import { Card } from "@/src/sharing/ui-card"; +import { CardContent } from "@/src/sharing/ui-card-content"; +import { CardImage } from "@/src/sharing/ui-card-image"; +import { Popover } from "@/src/sharing/ui-popover"; + +const cx = classNames.bind(styles); + +type EditableCardProps = { + url: string; + imageSource: string; + alt: string; + elapsedTime: string; + description: string; + createdAt: string; + popoverPosition: { + top?: CSSProperties["top"]; + right?: CSSProperties["right"]; + bottom?: CSSProperties["bottom"]; + left?: CSSProperties["left"]; + }; + onDeleteClick: () => void; + onAddToFolderClick: () => void; +}; + +export const EditableCard = ({ + url, + imageSource, + alt, + elapsedTime, + description, + createdAt, + popoverPosition, + onDeleteClick, + onAddToFolderClick, +}: EditableCardProps) => { + const [isHovered, setIsHovered] = useState(false); + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + const kebabButtonRef = useRef(null); + const handleMouseOver = () => setIsHovered(true); + const handleMouseLeave = () => setIsHovered(false); + const handleKebabClick: MouseEventHandler = (event) => { + event.preventDefault(); + setIsPopoverOpen(true); + }; + const handleBackgroundClick = useCallback(() => { + setIsPopoverOpen(false); + }, []); + const handleDeleteClick: MouseEventHandler = (event) => { + event.preventDefault(); + onDeleteClick(); + setIsPopoverOpen(false); + }; + const handleAddToFolderClick: MouseEventHandler = (event) => { + event.preventDefault(); + onAddToFolderClick(); + setIsPopoverOpen(false); + }; + + return ( + + + + + + + +
    +
  • 삭제하기
  • +
  • 폴더에 추가
  • +
+
+
+
+ ); +}; diff --git a/src/link/ui-editable-card/index.js b/src/link/ui-editable-card/index.js new file mode 100755 index 000000000..5191f7b20 --- /dev/null +++ b/src/link/ui-editable-card/index.js @@ -0,0 +1 @@ +export * from "./EditableCard"; diff --git a/src/link/ui-link-form/LinkForm.module.scss b/src/link/ui-link-form/LinkForm.module.scss new file mode 100755 index 000000000..aab0c272a --- /dev/null +++ b/src/link/ui-link-form/LinkForm.module.scss @@ -0,0 +1,64 @@ +@import "@/styles/global.scss"; + +.form { + display: flex; + align-items: center; + width: 100%; + max-width: 80rem; + height: 5.3rem; + column-gap: 1rem; + padding: 0 1rem; + border: 0.1rem solid $color-primary; + border-radius: 1.5rem; + background-color: $color-white; + + @include tablet { + height: 6.9rem; + column-gap: 2rem; + padding: 0 2rem; + } +} + +.input-box { + display: flex; + align-items: center; + width: 100%; + column-gap: 0.8rem; + + @include tablet { + column-gap: 1.2rem; + } +} + +.icon { + width: 1.6rem; + height: 1.6rem; + + @include tablet { + width: 2rem; + height: 2rem; + } +} + +.input { + width: 100%; + height: 5.1rem; + font-size: 1.4rem; + line-height: 150%; + + @include tablet { + height: 6.7rem; + font-size: 1.6rem; + } + + &::placeholder { + color: $color-gray60; + } +} + +.button { + width: 8rem; + height: 3.7rem; + font-size: 1.4rem; + color: inherit; +} diff --git a/src/link/ui-link-form/LinkForm.tsx b/src/link/ui-link-form/LinkForm.tsx new file mode 100755 index 000000000..54ea8e9c6 --- /dev/null +++ b/src/link/ui-link-form/LinkForm.tsx @@ -0,0 +1,39 @@ +import { Cta } from "@/src/sharing/ui-cta"; +import styles from "./LinkForm.module.scss"; +import classNames from "classnames/bind"; +import { ChangeEventHandler, FormEvent, FormEventHandler, forwardRef } from "react"; + +const cx = classNames.bind(styles); + +type LinkFormProps = { + value: string; + onChange: ChangeEventHandler; + onSubmit: FormEventHandler; +}; + +export const LinkForm = forwardRef( + ({ value, onChange, onSubmit }, ref) => { + const handleSubmit = (event: FormEvent) => { + event.preventDefault(); + onSubmit(event); + }; + + return ( +
+
+ 링크 아이콘 + +
+ +
+ ); + } +); diff --git a/src/link/ui-link-form/index.js b/src/link/ui-link-form/index.js new file mode 100755 index 000000000..edcc920c2 --- /dev/null +++ b/src/link/ui-link-form/index.js @@ -0,0 +1 @@ +export * from "./LinkForm"; diff --git a/src/link/ui-no-link/NoLink.module.scss b/src/link/ui-no-link/NoLink.module.scss new file mode 100755 index 000000000..9716e63cf --- /dev/null +++ b/src/link/ui-no-link/NoLink.module.scss @@ -0,0 +1,20 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + justify-content: center; + padding-top: 3.4rem; + + @include tablet { + padding-top: 4.1rem; + } +} + +.message { + font-size: 1.4rem; + line-height: 150%; + + @include tablet { + font-size: 1.6rem; + } +} diff --git a/src/link/ui-no-link/NoLink.tsx b/src/link/ui-no-link/NoLink.tsx new file mode 100755 index 000000000..e324913db --- /dev/null +++ b/src/link/ui-no-link/NoLink.tsx @@ -0,0 +1,12 @@ +import styles from "./NoLink.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +export const NoLink = () => { + return ( +
+ 저장된 링크가 없습니다 +
+ ); +}; diff --git a/src/link/ui-no-link/index.js b/src/link/ui-no-link/index.js new file mode 100755 index 000000000..d6eb95eb6 --- /dev/null +++ b/src/link/ui-no-link/index.js @@ -0,0 +1 @@ +export * from "./NoLink"; diff --git a/src/link/ui-read-only-card/ReadOnlyCard.tsx b/src/link/ui-read-only-card/ReadOnlyCard.tsx new file mode 100755 index 000000000..b500927cd --- /dev/null +++ b/src/link/ui-read-only-card/ReadOnlyCard.tsx @@ -0,0 +1,40 @@ +import { useState } from "react"; +import { Card } from "@/src/sharing/ui-card"; +import { CardContent } from "@/src/sharing/ui-card-content"; +import { CardImage } from "@/src/sharing/ui-card-image"; + +type ReadOnlyCardProps = { + url: string; + imageSource: string; + alt: string; + elapsedTime: string; + description: string; + createdAt: string; +}; + +export const ReadOnlyCard = ({ + url, + imageSource, + alt, + elapsedTime, + description, + createdAt, +}: ReadOnlyCardProps) => { + const [isHovered, setIsHovered] = useState(false); + const handleMouseOver = () => setIsHovered(true); + const handleMouseLeave = () => setIsHovered(false); + + return ( + + + + + + + ); +}; diff --git a/src/link/ui-read-only-card/index.js b/src/link/ui-read-only-card/index.js new file mode 100755 index 000000000..760fc7e33 --- /dev/null +++ b/src/link/ui-read-only-card/index.js @@ -0,0 +1 @@ +export * from "./ReadOnlyCard"; diff --git a/src/link/ui-search-bar/SearchBar.module.scss b/src/link/ui-search-bar/SearchBar.module.scss new file mode 100755 index 000000000..49b2e3fd3 --- /dev/null +++ b/src/link/ui-search-bar/SearchBar.module.scss @@ -0,0 +1,41 @@ +@import "@/styles/global.scss"; + +.container { + position: relative; + width: 100%; +} + +.input { + width: 100%; + max-width: 106rem; + height: 4.3rem; + padding-left: 3.8rem; + padding-right: 1.6rem; + border-radius: 1rem; + background-color: $color-gray-light; + font-size: 1.4rem; + + @include tablet { + height: 5.4rem; + padding-left: 4.2rem; + font-size: 1.6rem; + line-height: 150%; + } +} +.input::placeholder { + color: $color-text-content-gray; +} + +.search-icon { + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 1.6rem; +} + +.close { + position: absolute; + top: 50%; + transform: translateY(-50%); + right: 1.6rem; +} diff --git a/src/link/ui-search-bar/SearchBar.tsx b/src/link/ui-search-bar/SearchBar.tsx new file mode 100755 index 000000000..1b78f2519 --- /dev/null +++ b/src/link/ui-search-bar/SearchBar.tsx @@ -0,0 +1,37 @@ +import styles from "./SearchBar.module.scss"; +import classNames from "classnames/bind"; +import { SEARCH_IMAGE } from "./constant"; +import { ChangeEventHandler, MouseEventHandler } from "react"; +import CloseIcon from "./close.svg"; + +const cx = classNames.bind(styles); + +type SearchBarProps = { + value: string; + onChange: ChangeEventHandler; + onCloseClick: MouseEventHandler; +}; + +export const SearchBar = ({ value, onChange, onCloseClick }: SearchBarProps) => { + return ( +
+ + 검색창인 것을 알려주는 돋보기 아이콘 + {value && ( + + )} +
+ ); +}; diff --git a/src/link/ui-search-bar/close.svg b/src/link/ui-search-bar/close.svg new file mode 100755 index 000000000..10e7873e3 --- /dev/null +++ b/src/link/ui-search-bar/close.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/link/ui-search-bar/constant.js b/src/link/ui-search-bar/constant.js new file mode 100755 index 000000000..4014785b8 --- /dev/null +++ b/src/link/ui-search-bar/constant.js @@ -0,0 +1 @@ +export const SEARCH_IMAGE = "images/search.svg"; diff --git a/src/link/ui-search-bar/index.js b/src/link/ui-search-bar/index.js new file mode 100755 index 000000000..f9dfce51d --- /dev/null +++ b/src/link/ui-search-bar/index.js @@ -0,0 +1 @@ +export * from "./SearchBar"; diff --git a/src/link/util-map/index.js b/src/link/util-map/index.js new file mode 100755 index 000000000..f057e469d --- /dev/null +++ b/src/link/util-map/index.js @@ -0,0 +1 @@ +export * from "./mapLinksData"; diff --git a/src/link/util-map/mapLinksData.ts b/src/link/util-map/mapLinksData.ts new file mode 100755 index 000000000..894b8482a --- /dev/null +++ b/src/link/util-map/mapLinksData.ts @@ -0,0 +1,24 @@ +import format from "date-fns/format"; +import { getElapsedTime } from "@/src/sharing/util"; + +export const mapLinksData = (link: { + id: number; + createdAt: string; + imageSource: string; + url: string; + title: string; + description: string; +}) => { + const { id, createdAt, url, imageSource, title, description } = link; + + return { + id, + title, + url, + imageSource, + alt: `${title ?? url}의 대표 이미지`, + elapsedTime: getElapsedTime(createdAt), + description, + createdAt: format(new Date(createdAt), "yyyy. MM. dd"), + }; +}; diff --git a/src/link/util-search-link/index.ts b/src/link/util-search-link/index.ts new file mode 100755 index 000000000..ec9a428e8 --- /dev/null +++ b/src/link/util-search-link/index.ts @@ -0,0 +1 @@ +export * from "./useSearchLink"; diff --git a/src/link/util-search-link/useSearchLink.ts b/src/link/util-search-link/useSearchLink.ts new file mode 100755 index 000000000..b6cbc2f08 --- /dev/null +++ b/src/link/util-search-link/useSearchLink.ts @@ -0,0 +1,27 @@ +import { Link } from "@/src/link/type"; +import { ChangeEventHandler, MouseEventHandler, useState } from "react"; + +export const useSearchLink = (links: Link[]) => { + const [searchValue, setSearchValue] = useState(""); + const handleChange: ChangeEventHandler = (event) => { + setSearchValue(event.target.value); + }; + const handleCloseClick: MouseEventHandler = () => { + setSearchValue(""); + }; + + const result = links.filter((link) => { + const searchValueLowerCase = searchValue?.toLowerCase(); + const titleLowerCase = link?.title?.toLowerCase(); + const descriptionLowerCase = link?.description?.toLowerCase(); + const urlLowerCase = link?.url?.toLowerCase(); + + return ( + titleLowerCase?.includes(searchValueLowerCase) || + descriptionLowerCase?.includes(searchValueLowerCase) || + urlLowerCase?.includes(searchValueLowerCase) + ); + }); + + return { searchValue, handleChange, handleCloseClick, result }; +}; diff --git a/src/page-layout/FolderLayout/FolderLayout.module.scss b/src/page-layout/FolderLayout/FolderLayout.module.scss new file mode 100755 index 000000000..29f2ae5db --- /dev/null +++ b/src/page-layout/FolderLayout/FolderLayout.module.scss @@ -0,0 +1,39 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + height: 100%; + row-gap: 2rem; + padding-bottom: 2rem; + + @include tablet { + row-gap: 4rem; + padding-bottom: 4rem; + } +} + +.items { + display: flex; + flex-direction: column; + row-gap: 3.2rem; + width: 100%; + max-width: 112.4rem; + padding: 0 3.2rem; + + @include tablet { + row-gap: 4rem; + } +} + +.folder-box { + display: flex; + flex-direction: column; + row-gap: 2rem; + + @include tablet { + row-gap: 2.4rem; + } +} diff --git a/src/page-layout/FolderLayout/FolderLayout.tsx b/src/page-layout/FolderLayout/FolderLayout.tsx new file mode 100755 index 000000000..774ac55f9 --- /dev/null +++ b/src/page-layout/FolderLayout/FolderLayout.tsx @@ -0,0 +1,32 @@ +import { ReactNode } from "react"; +import styles from "./FolderLayout.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type FolderLayoutProps = { + linkForm: ReactNode; + searchBar: ReactNode; + folderToolBar: ReactNode; + cardList: ReactNode; +}; + +export const FolderLayout = ({ + linkForm, + searchBar, + folderToolBar, + cardList, +}: FolderLayoutProps) => { + return ( +
+ {linkForm} +
+ {searchBar} +
+ {folderToolBar} + {cardList} +
+
+
+ ); +}; diff --git a/src/page-layout/FolderLayout/index.js b/src/page-layout/FolderLayout/index.js new file mode 100755 index 000000000..b50c992f3 --- /dev/null +++ b/src/page-layout/FolderLayout/index.js @@ -0,0 +1 @@ +export * from "./FolderLayout"; diff --git a/src/page-layout/SharedLayout/SharedLayout.module.scss b/src/page-layout/SharedLayout/SharedLayout.module.scss new file mode 100755 index 000000000..c1b7f89a5 --- /dev/null +++ b/src/page-layout/SharedLayout/SharedLayout.module.scss @@ -0,0 +1,30 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + flex-direction: column; + align-items: center; + height: 100%; + width: 100%; + row-gap: 2rem; + padding-bottom: 2rem; + + @include tablet { + row-gap: 4rem; + padding-bottom: 6rem; + } +} + +.items { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + max-width: 112.4rem; + row-gap: 3.2rem; + padding: 0 3.2rem; + + @include tablet { + row-gap: 4rem; + } +} diff --git a/src/page-layout/SharedLayout/SharedLayout.tsx b/src/page-layout/SharedLayout/SharedLayout.tsx new file mode 100755 index 000000000..5816c5b09 --- /dev/null +++ b/src/page-layout/SharedLayout/SharedLayout.tsx @@ -0,0 +1,23 @@ +import { ReactNode } from "react"; +import styles from "./SharedLayout.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type SharedLayoutProps = { + folderInfo: ReactNode; + searchBar: ReactNode; + cardList: ReactNode; +}; + +export const SharedLayout = ({ folderInfo, searchBar, cardList }: SharedLayoutProps) => { + return ( +
+ {folderInfo} +
+ {searchBar} + {cardList} +
+
+ ); +}; diff --git a/src/page-layout/SharedLayout/index.js b/src/page-layout/SharedLayout/index.js new file mode 100755 index 000000000..04d04fdf2 --- /dev/null +++ b/src/page-layout/SharedLayout/index.js @@ -0,0 +1 @@ +export * from "./SharedLayout"; diff --git a/src/page-layout/SignLayout/SignLayout.module.scss b/src/page-layout/SignLayout/SignLayout.module.scss new file mode 100755 index 000000000..babd61725 --- /dev/null +++ b/src/page-layout/SignLayout/SignLayout.module.scss @@ -0,0 +1,26 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + justify-content: center; + min-height: 100vh; + padding: calc(120 / 844 * 100vh) 3.2rem 5rem; + background-color: $color-light-blue; + + @include tablet { + padding-top: calc(200 / 982 * 100vh); + } + + @include desktop { + padding-top: calc(238 / 982 * 100vh); + } +} + +.items { + display: flex; + flex-direction: column; + align-items: center; + row-gap: 3rem; + width: 100%; + max-width: 40rem; +} diff --git a/src/page-layout/SignLayout/SignLayout.tsx b/src/page-layout/SignLayout/SignLayout.tsx new file mode 100755 index 000000000..a55a3c8c3 --- /dev/null +++ b/src/page-layout/SignLayout/SignLayout.tsx @@ -0,0 +1,23 @@ +import { ReactNode } from "react"; +import styles from "./SignLayout.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type SignInLayoutProps = { + header: ReactNode; + form: ReactNode; + oauth: ReactNode; +}; + +export const SignLayout = ({ header, form, oauth }: SignInLayoutProps) => { + return ( +
+
+ {header} + {form} + {oauth} +
+
+ ); +}; diff --git a/src/page-layout/SignLayout/index.ts b/src/page-layout/SignLayout/index.ts new file mode 100755 index 000000000..9c4184c76 --- /dev/null +++ b/src/page-layout/SignLayout/index.ts @@ -0,0 +1 @@ +export * from "./SignLayout"; diff --git a/src/sharing/feature-layout/Layout.module.scss b/src/sharing/feature-layout/Layout.module.scss new file mode 100755 index 000000000..5f7bc62fa --- /dev/null +++ b/src/sharing/feature-layout/Layout.module.scss @@ -0,0 +1,5 @@ +$footer-height: 16rem; + +.main { + min-height: calc(100vh - $footer-height); +} diff --git a/src/sharing/feature-layout/Layout.tsx b/src/sharing/feature-layout/Layout.tsx new file mode 100755 index 000000000..480cc2d05 --- /dev/null +++ b/src/sharing/feature-layout/Layout.tsx @@ -0,0 +1,27 @@ +import styles from "./Layout.module.scss"; +import classNames from "classnames/bind"; +import { useGetUser } from "@/src/user/data-access-user"; +import { Footer } from "@/src/sharing/ui-footer"; +import { NavigationBar } from "@/src/sharing/ui-navigation-bar"; +import { ReactNode, RefObject } from "react"; + +const cx = classNames.bind(styles); + +type LayoutProps = { + children: ReactNode; + isSticky?: boolean; + footerRef?: RefObject; +}; + +export const Layout = ({ children, isSticky = true, footerRef }: LayoutProps) => { + const { data } = useGetUser(); + const profile = data ? { email: data.email, imageSource: data.profileImageSource } : null; + + return ( +
+ +
{children}
+
+
+ ); +}; diff --git a/src/sharing/feature-layout/index.js b/src/sharing/feature-layout/index.js new file mode 100755 index 000000000..f7ad54817 --- /dev/null +++ b/src/sharing/feature-layout/index.js @@ -0,0 +1 @@ +export * from "./Layout"; diff --git a/src/sharing/ui-alert-modal/AlertModal.module.scss b/src/sharing/ui-alert-modal/AlertModal.module.scss new file mode 100755 index 000000000..1cd6c1209 --- /dev/null +++ b/src/sharing/ui-alert-modal/AlertModal.module.scss @@ -0,0 +1,19 @@ +@import "@/styles/global.scss"; + +.modal-header { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + row-gap: 0.8rem; +} + +.button { + width: 100%; + height: 5.1rem; + background-color: $color-red; + border-radius: 0.8rem; + font-size: 1.6rem; + font-weight: 600; + color: $color-gray-light; +} diff --git a/src/sharing/ui-alert-modal/AlertModal.tsx b/src/sharing/ui-alert-modal/AlertModal.tsx new file mode 100755 index 000000000..6aabb341d --- /dev/null +++ b/src/sharing/ui-alert-modal/AlertModal.tsx @@ -0,0 +1,49 @@ +import styles from "./AlertModal.module.scss"; +import classNames from "classnames/bind"; +import { KeyboardEventHandler, MouseEventHandler } from "react"; +import { Modal } from "@/src/sharing/ui-modal"; +import { ModalContentBox } from "@/src/sharing/ui-modal-content-box"; +import { ModalContentButton } from "@/src/sharing/ui-modal-content-button"; +import { ModalContentDescription } from "@/src/sharing/ui-modal-content-description"; +import { ModalContentTitle } from "@/src/sharing/ui-modal-content-title"; + +const cx = classNames.bind(styles); + +type AlertModalProps = { + isOpen: boolean; + title: string; + description: string; + buttonText: string; + onClick: MouseEventHandler; + onCloseClick: MouseEventHandler; + onKeyDown: KeyboardEventHandler; +}; + +export const AlertModal = ({ + isOpen, + title, + description, + buttonText, + onClick, + onCloseClick, + onKeyDown, +}: AlertModalProps) => { + return ( + + + {title} + {description} + + } + content={ + + {buttonText} + + } + onCloseClick={onCloseClick} + /> + + ); +}; diff --git a/src/sharing/ui-alert-modal/index.js b/src/sharing/ui-alert-modal/index.js new file mode 100755 index 000000000..c6b394ddc --- /dev/null +++ b/src/sharing/ui-alert-modal/index.js @@ -0,0 +1 @@ +export * from "./AlertModal"; diff --git a/src/sharing/ui-card-content/CardContent.module.scss b/src/sharing/ui-card-content/CardContent.module.scss new file mode 100755 index 000000000..71f5f6b13 --- /dev/null +++ b/src/sharing/ui-card-content/CardContent.module.scss @@ -0,0 +1,33 @@ +@import "@/styles/global.scss"; + +.container { + height: 100%; + padding: 1.5rem 2rem; + display: flex; + flex-direction: column; + justify-content: space-between; + gap: 1rem; + transition: background-color 0.3s ease-in-out; + + &.hovered { + background-color: $color-light-blue; + } +} + +.elapsed-time { + font-size: 1.3rem; + color: $color-text-content-gray; +} + +.description { + height: 4.9rem; + @include ellipsis(2); + word-break: break-word; + font-size: 1.6rem; + line-height: 150%; +} + +.created-at { + font-size: 1.4rem; + color: $color-text-content-black; +} diff --git a/src/sharing/ui-card-content/CardContent.tsx b/src/sharing/ui-card-content/CardContent.tsx new file mode 100755 index 000000000..e61b076bc --- /dev/null +++ b/src/sharing/ui-card-content/CardContent.tsx @@ -0,0 +1,26 @@ +import styles from "./CardContent.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type CardContentProps = { + elapsedTime: string; + description: string; + createdAt: string; + isHovered: boolean; +}; + +export const CardContent = ({ + elapsedTime, + description, + createdAt, + isHovered, +}: CardContentProps) => { + return ( +
+ {elapsedTime} +

{description}

+ {createdAt} +
+ ); +}; diff --git a/src/sharing/ui-card-content/index.js b/src/sharing/ui-card-content/index.js new file mode 100755 index 000000000..7d7c87ea2 --- /dev/null +++ b/src/sharing/ui-card-content/index.js @@ -0,0 +1 @@ +export * from "./CardContent"; diff --git a/src/sharing/ui-card-image/CardImage.module.scss b/src/sharing/ui-card-image/CardImage.module.scss new file mode 100755 index 000000000..9dd40bc8b --- /dev/null +++ b/src/sharing/ui-card-image/CardImage.module.scss @@ -0,0 +1,26 @@ +@import "@/styles/global.scss"; + +.container { + width: 100%; + min-height: 19.2rem; + height: 19.2rem; + border-radius: 1.5rem 1.5rem 0 0; + overflow: hidden; + + @media (min-width: 768px) { + min-height: 20rem; + height: 20rem; + } +} + +.image { + width: 100%; + height: 100%; + border-radius: 1.5rem 1.5rem 0 0; + object-fit: cover; + transition: transform 0.3s ease-in-out; + + &.zoomin { + transform: scale(1.3); + } +} diff --git a/src/sharing/ui-card-image/CardImage.tsx b/src/sharing/ui-card-image/CardImage.tsx new file mode 100755 index 000000000..d5d18bce1 --- /dev/null +++ b/src/sharing/ui-card-image/CardImage.tsx @@ -0,0 +1,23 @@ +import styles from "./CardImage.module.scss"; +import classNames from "classnames/bind"; +import { DEFAULT_IMAGE } from "./constant"; + +const cx = classNames.bind(styles); + +type CardImageProps = { + imageSource: string; + isZoomedIn: boolean; + alt: string; +}; + +export const CardImage = ({ imageSource, isZoomedIn, alt }: CardImageProps) => { + return ( +
+ {alt} +
+ ); +}; diff --git a/src/sharing/ui-card-image/constant.js b/src/sharing/ui-card-image/constant.js new file mode 100755 index 000000000..fb79ca7b8 --- /dev/null +++ b/src/sharing/ui-card-image/constant.js @@ -0,0 +1 @@ +export const DEFAULT_IMAGE = "images/card-default.png"; diff --git a/src/sharing/ui-card-image/index.js b/src/sharing/ui-card-image/index.js new file mode 100755 index 000000000..12ad9d0bf --- /dev/null +++ b/src/sharing/ui-card-image/index.js @@ -0,0 +1 @@ +export * from "./CardImage"; diff --git a/src/sharing/ui-card/Card.module.scss b/src/sharing/ui-card/Card.module.scss new file mode 100755 index 000000000..8650a9a9d --- /dev/null +++ b/src/sharing/ui-card/Card.module.scss @@ -0,0 +1,16 @@ +@import "@/styles/global.scss"; + +.container { + position: relative; + display: flex; + flex-direction: column; + width: 32.5rem; + height: 32.7rem; + box-shadow: 0 0.5rem 2.5rem 0 rgba(0, 0, 0, 0.08); + border-radius: 1.5rem; + + @include tablet { + width: 34rem; + height: 33.4rem; + } +} diff --git a/src/sharing/ui-card/Card.tsx b/src/sharing/ui-card/Card.tsx new file mode 100755 index 000000000..b7e348f85 --- /dev/null +++ b/src/sharing/ui-card/Card.tsx @@ -0,0 +1,19 @@ +import { MouseEventHandler, ReactNode } from "react"; +import styles from "./Card.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type CardProps = { + children: ReactNode; + onMouseOver: MouseEventHandler; + onMouseLeave: MouseEventHandler; +}; + +export const Card = ({ children, onMouseOver, onMouseLeave }: CardProps) => { + return ( +
+ {children} +
+ ); +}; diff --git a/src/sharing/ui-card/index.js b/src/sharing/ui-card/index.js new file mode 100755 index 000000000..24d321246 --- /dev/null +++ b/src/sharing/ui-card/index.js @@ -0,0 +1 @@ +export * from "./Card"; diff --git a/src/sharing/ui-cta/Cta.module.scss b/src/sharing/ui-cta/Cta.module.scss new file mode 100755 index 000000000..bcfc24656 --- /dev/null +++ b/src/sharing/ui-cta/Cta.module.scss @@ -0,0 +1,12 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + border-radius: 0.8rem; + background: linear-gradient(91deg, $color-primary 0.12%, #6ae3fe 101.84%); + color: $color-gray-light; +} diff --git a/src/sharing/ui-cta/Cta.tsx b/src/sharing/ui-cta/Cta.tsx new file mode 100755 index 000000000..1a5310279 --- /dev/null +++ b/src/sharing/ui-cta/Cta.tsx @@ -0,0 +1,13 @@ +import { ReactNode } from "react"; +import styles from "./Cta.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type CtaProps = { + children: ReactNode; +}; + +export const Cta = ({ children }: CtaProps) => { + return
{children}
; +}; diff --git a/src/sharing/ui-cta/index.js b/src/sharing/ui-cta/index.js new file mode 100755 index 000000000..196423796 --- /dev/null +++ b/src/sharing/ui-cta/index.js @@ -0,0 +1 @@ +export * from "./Cta"; diff --git a/src/sharing/ui-footer/Footer.module.scss b/src/sharing/ui-footer/Footer.module.scss new file mode 100755 index 000000000..6ad71835c --- /dev/null +++ b/src/sharing/ui-footer/Footer.module.scss @@ -0,0 +1,58 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + justify-content: center; + width: 100%; + height: 16rem; + margin-top: 4rem; + background-color: $color-black; + + @include tablet { + margin-top: 6rem; + } +} + +.items { + display: grid; + justify-content: space-between; + grid-template: + "footer-links sns" + ". ." 1fr + "copyright ."; + width: 100%; + padding: 3.2rem; + color: $color-text-gray; + font-size: 1.6rem; + font-family: Arial; + + @include tablet { + grid-template: "copyright footer-links sns"; + height: fit-content; + max-width: 192rem; + padding: 3.2rem 10.4rem 0; + } +} + +.copyright { + grid-area: copyright; + color: #676767; + font-family: Arial; + font-size: 1.6rem; +} + +.links { + grid-area: footer-links; + display: flex; + column-gap: 3rem; + padding-right: 1.8rem; + color: #cfcfcf; + font-family: Arial; + font-size: 1.6rem; +} + +.sns { + grid-area: sns; + display: flex; + column-gap: 1.2rem; +} diff --git a/src/sharing/ui-footer/Footer.tsx b/src/sharing/ui-footer/Footer.tsx new file mode 100755 index 000000000..fbc2a2765 --- /dev/null +++ b/src/sharing/ui-footer/Footer.tsx @@ -0,0 +1,39 @@ +import styles from "./Footer.module.scss"; +import classNames from "classnames/bind"; +import { ROUTE } from "@/src/sharing/util"; +import { TEXT } from "./constant"; +import { forwardRef } from "react"; + +const cx = classNames.bind(styles); + +export const Footer = forwardRef((_, ref) => { + return ( + + ); +}); diff --git a/src/sharing/ui-footer/constant.js b/src/sharing/ui-footer/constant.js new file mode 100755 index 000000000..8c6edeff9 --- /dev/null +++ b/src/sharing/ui-footer/constant.js @@ -0,0 +1,5 @@ +export const TEXT = { + codeit: "©codeit - 2023", + privacyPolicy: "Privacy Policy", + faq: "FAQ", +}; diff --git a/src/sharing/ui-footer/index.js b/src/sharing/ui-footer/index.js new file mode 100755 index 000000000..5fca53f7d --- /dev/null +++ b/src/sharing/ui-footer/index.js @@ -0,0 +1 @@ +export * from "./Footer"; diff --git a/src/sharing/ui-icon-and-text-button/IconAndTextButton.module.scss b/src/sharing/ui-icon-and-text-button/IconAndTextButton.module.scss new file mode 100755 index 000000000..b5d4b0ae8 --- /dev/null +++ b/src/sharing/ui-icon-and-text-button/IconAndTextButton.module.scss @@ -0,0 +1,18 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + align-items: center; + column-gap: 0.4rem; +} + +.icon { + width: 1.8rem; + height: 1.8rem; +} + +.text { + font-size: 1.4rem; + font-weight: 600; + color: $color-gray60; +} diff --git a/src/sharing/ui-icon-and-text-button/IconAndTextButton.tsx b/src/sharing/ui-icon-and-text-button/IconAndTextButton.tsx new file mode 100755 index 000000000..9d691825a --- /dev/null +++ b/src/sharing/ui-icon-and-text-button/IconAndTextButton.tsx @@ -0,0 +1,20 @@ +import { MouseEventHandler } from "react"; +import styles from "./IconAndTextButton.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type IconAndTextButtonProps = { + iconSource: string; + text: string; + onClick: MouseEventHandler; +}; + +export const IconAndTextButton = ({ iconSource, text, onClick }: IconAndTextButtonProps) => { + return ( + + ); +}; diff --git a/src/sharing/ui-icon-and-text-button/index.js b/src/sharing/ui-icon-and-text-button/index.js new file mode 100755 index 000000000..8d58183f8 --- /dev/null +++ b/src/sharing/ui-icon-and-text-button/index.js @@ -0,0 +1 @@ +export * from "./IconAndTextButton"; diff --git a/src/sharing/ui-input-modal/InputModal.module.scss b/src/sharing/ui-input-modal/InputModal.module.scss new file mode 100755 index 000000000..3a3e6e5eb --- /dev/null +++ b/src/sharing/ui-input-modal/InputModal.module.scss @@ -0,0 +1,23 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; +} + +.modal-content { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + row-gap: 1.5rem; +} + +.button { + width: 28rem; + height: 5.1rem; + font-size: 1.6rem; + color: $color-gray-light; +} diff --git a/src/sharing/ui-input-modal/InputModal.tsx b/src/sharing/ui-input-modal/InputModal.tsx new file mode 100755 index 000000000..46cb82b9b --- /dev/null +++ b/src/sharing/ui-input-modal/InputModal.tsx @@ -0,0 +1,47 @@ +import styles from "./InputModal.module.scss"; +import classNames from "classnames/bind"; +import { ChangeEventHandler, KeyboardEventHandler, MouseEventHandler } from "react"; +import { Input } from "@/src/sharing/ui-input"; +import { Modal } from "@/src/sharing/ui-modal"; +import { ModalContentBox } from "@/src/sharing/ui-modal-content-box"; +import { ModalContentButton } from "@/src/sharing/ui-modal-content-button"; +import { ModalContentTitle } from "@/src/sharing/ui-modal-content-title"; + +const cx = classNames.bind(styles); + +type InputModalProps = { + isOpen: boolean; + title: string; + placeholder: string; + buttonText: string; + onCloseClick: MouseEventHandler; + onKeyDown: KeyboardEventHandler; + value: string; + onChange: ChangeEventHandler; +}; + +export const InputModal = ({ + isOpen, + title, + placeholder, + buttonText, + onCloseClick, + onKeyDown, + value, + onChange, +}: InputModalProps) => { + return ( + + {title}} + content={ +
+ + {}}>{buttonText} +
+ } + onCloseClick={onCloseClick} + /> +
+ ); +}; diff --git a/src/sharing/ui-input-modal/index.js b/src/sharing/ui-input-modal/index.js new file mode 100755 index 000000000..aa3124071 --- /dev/null +++ b/src/sharing/ui-input-modal/index.js @@ -0,0 +1 @@ +export * from "./InputModal"; diff --git a/src/sharing/ui-input/Input.module.scss b/src/sharing/ui-input/Input.module.scss new file mode 100755 index 000000000..e97f2b823 --- /dev/null +++ b/src/sharing/ui-input/Input.module.scss @@ -0,0 +1,38 @@ +@import "@/styles/global.scss"; + +.container { + width: 100%; + display: flex; + flex-direction: column; + row-gap: 0.6rem; +} + +.input { + width: 100%; + border: 0.1rem solid $color-gray20; + border-radius: 0.8rem; + font-size: 1.6rem; + color: $color-gray100; + padding: 1.8rem 1.5rem; + transition: border-color 0.2s ease-in-out; + + &::placeholder { + color: $color-gray60; + } + + &:focus { + border-color: $color-primary; + } + + &.error { + border-color: $color-red; + } +} + +.helper-text { + font-size: 1.4rem; + + &.error { + color: $color-red; + } +} diff --git a/src/sharing/ui-input/Input.tsx b/src/sharing/ui-input/Input.tsx new file mode 100755 index 000000000..64063cae0 --- /dev/null +++ b/src/sharing/ui-input/Input.tsx @@ -0,0 +1,34 @@ +import { ChangeEventHandler, FocusEventHandler, HTMLInputTypeAttribute, forwardRef } from "react"; +import styles from "./Input.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +export type InputProps = { + value: string | number; + placeholder?: string; + type?: HTMLInputTypeAttribute; + hasError?: boolean; + helperText?: string; + onChange: ChangeEventHandler; + onBlur?: FocusEventHandler; +}; + +export const Input = forwardRef( + ({ value, placeholder, type = "text", hasError = false, helperText, onChange, onBlur }, ref) => { + return ( +
+ + {helperText &&

{helperText}

} +
+ ); + } +); diff --git a/src/sharing/ui-input/index.js b/src/sharing/ui-input/index.js new file mode 100755 index 000000000..be66d7661 --- /dev/null +++ b/src/sharing/ui-input/index.js @@ -0,0 +1 @@ +export * from "./Input"; diff --git a/src/sharing/ui-modal-content-box/ModalContentBox.module.scss b/src/sharing/ui-modal-content-box/ModalContentBox.module.scss new file mode 100755 index 000000000..c3867ce4d --- /dev/null +++ b/src/sharing/ui-modal-content-box/ModalContentBox.module.scss @@ -0,0 +1,29 @@ +@import "@/styles/global.scss"; + +.container { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + display: flex; + position: relative; + width: 36rem; + height: fit-content; + padding: 3.2rem 4rem; + border-radius: 1.5rem; + background-color: $color-white; +} + +.close { + position: absolute; + top: 1.6rem; + right: 1.6rem; +} + +.items { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + row-gap: 2.4rem; +} diff --git a/src/sharing/ui-modal-content-box/ModalContentBox.tsx b/src/sharing/ui-modal-content-box/ModalContentBox.tsx new file mode 100755 index 000000000..afd8d7b06 --- /dev/null +++ b/src/sharing/ui-modal-content-box/ModalContentBox.tsx @@ -0,0 +1,25 @@ +import { MouseEventHandler, ReactNode } from "react"; +import styles from "./ModalContentBox.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type ModalContentBoxProps = { + header: ReactNode; + content: ReactNode; + onCloseClick: MouseEventHandler; +}; + +export const ModalContentBox = ({ header, content, onCloseClick }: ModalContentBoxProps) => { + return ( +
+ +
+ {header} + {content} +
+
+ ); +}; diff --git a/src/sharing/ui-modal-content-box/index.js b/src/sharing/ui-modal-content-box/index.js new file mode 100755 index 000000000..bb7b974c1 --- /dev/null +++ b/src/sharing/ui-modal-content-box/index.js @@ -0,0 +1 @@ +export * from "./ModalContentBox"; diff --git a/src/sharing/ui-modal-content-button/ModalContentButton.module.scss b/src/sharing/ui-modal-content-button/ModalContentButton.module.scss new file mode 100755 index 000000000..06fd1a97e --- /dev/null +++ b/src/sharing/ui-modal-content-button/ModalContentButton.module.scss @@ -0,0 +1,22 @@ +@import "@/styles/global.scss"; + +.button { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 5.1rem; + background-color: $color-red; + border-radius: 0.8rem; + font-size: 1.6rem; + font-weight: 600; + color: $color-gray-light; + + &.red { + background-color: $color-red; + } + + &.blue { + background: linear-gradient(91deg, $color-primary 0.12%, #6ae3fe 101.84%); + } +} diff --git a/src/sharing/ui-modal-content-button/ModalContentButton.tsx b/src/sharing/ui-modal-content-button/ModalContentButton.tsx new file mode 100755 index 000000000..2f577a3a9 --- /dev/null +++ b/src/sharing/ui-modal-content-button/ModalContentButton.tsx @@ -0,0 +1,23 @@ +import { MouseEventHandler, ReactNode } from "react"; +import styles from "./ModalContentButton.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type ModalContentButtonProps = { + children: ReactNode; + onClick: MouseEventHandler; + themeColor?: "blue" | "red"; +}; + +export const ModalContentButton = ({ + children, + onClick, + themeColor = "blue", +}: ModalContentButtonProps) => { + return ( + + ); +}; diff --git a/src/sharing/ui-modal-content-button/index.js b/src/sharing/ui-modal-content-button/index.js new file mode 100755 index 000000000..afef8d680 --- /dev/null +++ b/src/sharing/ui-modal-content-button/index.js @@ -0,0 +1 @@ +export * from "./ModalContentButton"; diff --git a/src/sharing/ui-modal-content-description/ModalContentDescription.module.scss b/src/sharing/ui-modal-content-description/ModalContentDescription.module.scss new file mode 100755 index 000000000..bd382eb35 --- /dev/null +++ b/src/sharing/ui-modal-content-description/ModalContentDescription.module.scss @@ -0,0 +1,7 @@ +@import "@/styles/global.scss"; + +.description { + color: $color-gray60; + font-size: 1.4rem; + line-height: 2.2rem; +} diff --git a/src/sharing/ui-modal-content-description/ModalContentDescription.tsx b/src/sharing/ui-modal-content-description/ModalContentDescription.tsx new file mode 100755 index 000000000..87c4cf110 --- /dev/null +++ b/src/sharing/ui-modal-content-description/ModalContentDescription.tsx @@ -0,0 +1,13 @@ +import { ReactNode } from "react"; +import styles from "./ModalContentDescription.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type ModalContentDescriptionProps = { + children: ReactNode; +}; + +export const ModalContentDescription = ({ children }: ModalContentDescriptionProps) => { + return

{children}

; +}; diff --git a/src/sharing/ui-modal-content-description/index.js b/src/sharing/ui-modal-content-description/index.js new file mode 100755 index 000000000..21a9e5cc6 --- /dev/null +++ b/src/sharing/ui-modal-content-description/index.js @@ -0,0 +1 @@ +export * from "./ModalContentDescription"; diff --git a/src/sharing/ui-modal-content-title/ModalContentTitle.module.scss b/src/sharing/ui-modal-content-title/ModalContentTitle.module.scss new file mode 100755 index 000000000..b3e8a2706 --- /dev/null +++ b/src/sharing/ui-modal-content-title/ModalContentTitle.module.scss @@ -0,0 +1,7 @@ +@import "@/styles/global.scss"; + +.title { + color: $color-gray100; + font-size: 2rem; + font-weight: 700; +} diff --git a/src/sharing/ui-modal-content-title/ModalContentTitle.tsx b/src/sharing/ui-modal-content-title/ModalContentTitle.tsx new file mode 100755 index 000000000..741a37ee0 --- /dev/null +++ b/src/sharing/ui-modal-content-title/ModalContentTitle.tsx @@ -0,0 +1,13 @@ +import { ReactNode } from "react"; +import styles from "./ModalContentTitle.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type ModalContentTitleProps = { + children: ReactNode; +}; + +export const ModalContentTitle = ({ children }: ModalContentTitleProps) => { + return

{children}

; +}; diff --git a/src/sharing/ui-modal-content-title/index.js b/src/sharing/ui-modal-content-title/index.js new file mode 100755 index 000000000..18fe6af95 --- /dev/null +++ b/src/sharing/ui-modal-content-title/index.js @@ -0,0 +1 @@ +export * from "./ModalContentTitle"; diff --git a/src/sharing/ui-modal/Modal.module.scss b/src/sharing/ui-modal/Modal.module.scss new file mode 100755 index 000000000..7f80be096 --- /dev/null +++ b/src/sharing/ui-modal/Modal.module.scss @@ -0,0 +1,28 @@ +@import "@/styles/global.scss"; + +.container { + position: fixed; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: hidden; + outline: none; + z-index: $z-index-modal; + animation: fadeIn 0.2s; + + &.backdrop { + background-color: rgba(0, 0, 0, 0.4); + } +} + +@keyframes fadeIn { + from { + visibility: hidden; + opacity: 0; + } + to { + visibility: visible; + opacity: 1; + } +} diff --git a/src/sharing/ui-modal/Modal.tsx b/src/sharing/ui-modal/Modal.tsx new file mode 100755 index 000000000..077f0a32b --- /dev/null +++ b/src/sharing/ui-modal/Modal.tsx @@ -0,0 +1,63 @@ +import styles from "./Modal.module.scss"; +import classNames from "classnames/bind"; +import { + KeyboardEvent, + KeyboardEventHandler, + MouseEvent, + MouseEventHandler, + ReactNode, +} from "react"; +import { Portal } from "@/src/sharing/ui-portal"; + +const cx = classNames.bind(styles); + +type ModalProps = { + children: ReactNode; + isOpen?: boolean; + disableScrollLock?: boolean; + hideBackdrop?: boolean; + onBackdropClick?: MouseEventHandler; + onKeyDown?: KeyboardEventHandler; +}; + +export const Modal = ({ + children, + isOpen = false, + disableScrollLock = false, + hideBackdrop = false, + onBackdropClick, + onKeyDown, +}: ModalProps) => { + const handleBackdropClick = (event: MouseEvent) => { + if (event.target !== event.currentTarget) { + return; + } + + if (onBackdropClick) { + onBackdropClick(event); + } + }; + + const handleKeyDown = (event: KeyboardEvent) => { + if (onKeyDown) { + onKeyDown(event); + } + }; + + if (!isOpen) { + return null; + } + + return ( + +
+ {children} +
+
+ ); +}; diff --git a/src/sharing/ui-modal/index.js b/src/sharing/ui-modal/index.js new file mode 100755 index 000000000..1ecfeed22 --- /dev/null +++ b/src/sharing/ui-modal/index.js @@ -0,0 +1 @@ +export * from "./Modal"; diff --git a/src/sharing/ui-navigation-bar/NavigationBar.module.scss b/src/sharing/ui-navigation-bar/NavigationBar.module.scss new file mode 100755 index 000000000..2a6342853 --- /dev/null +++ b/src/sharing/ui-navigation-bar/NavigationBar.module.scss @@ -0,0 +1,56 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + justify-content: center; + width: 100%; + background-color: $color-light-blue; + + &.sticky { + position: sticky; + top: 0; + z-index: $z-index-nav; + } +} + +.items { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + height: 6.3rem; + padding: 0 3.2rem; + + @include tablet { + height: 9.4rem; + max-width: 86.3rem; + } + + @include desktop { + max-width: 192rem; + padding: 0 20rem; + } +} + +.logo { + height: 1.6rem; + + @include tablet { + height: 2.4rem; + } +} + +.signin { + display: inline-block; + width: 8rem; + padding: 1rem 0; + font-size: 1.4rem; + font-weight: 600; + text-align: center; + + @include tablet { + width: 12.8rem; + padding: 1.6rem 0; + font-size: 1.8rem; + } +} diff --git a/src/sharing/ui-navigation-bar/NavigationBar.tsx b/src/sharing/ui-navigation-bar/NavigationBar.tsx new file mode 100755 index 000000000..eac2e6c31 --- /dev/null +++ b/src/sharing/ui-navigation-bar/NavigationBar.tsx @@ -0,0 +1,38 @@ +import styles from "./NavigationBar.module.scss"; +import classNames from "classnames/bind"; +import { ROUTE } from "@/src/sharing/util"; +import { Cta } from "@/src/sharing/ui-cta"; +import { Profile } from "@/src/user/ui-profile"; +import { LOGO_IMAGE, TEXT } from "./constant"; +import Link from "next/link"; + +const cx = classNames.bind(styles); + +type NavigationBarProps = { + profile: { + imageSource: string; + email: string; + } | null; + isSticky: boolean; +}; + +export const NavigationBar = ({ profile, isSticky }: NavigationBarProps) => { + return ( + + ); +}; diff --git a/src/sharing/ui-navigation-bar/constant.js b/src/sharing/ui-navigation-bar/constant.js new file mode 100755 index 000000000..d974b4773 --- /dev/null +++ b/src/sharing/ui-navigation-bar/constant.js @@ -0,0 +1,5 @@ +export const TEXT = { + login: "로그인", +}; + +export const LOGO_IMAGE = "images/linkbrary.svg"; diff --git a/src/sharing/ui-navigation-bar/index.js b/src/sharing/ui-navigation-bar/index.js new file mode 100755 index 000000000..82cf74191 --- /dev/null +++ b/src/sharing/ui-navigation-bar/index.js @@ -0,0 +1 @@ +export * from "./NavigationBar"; diff --git a/src/sharing/ui-password-input/PasswordInput.module.scss b/src/sharing/ui-password-input/PasswordInput.module.scss new file mode 100755 index 000000000..0c7ffaecf --- /dev/null +++ b/src/sharing/ui-password-input/PasswordInput.module.scss @@ -0,0 +1,11 @@ +.container { + position: relative; + width: 100%; + display: flex; +} + +.button { + position: absolute; + top: 2.2rem; + right: 1.5rem; +} diff --git a/src/sharing/ui-password-input/PasswordInput.tsx b/src/sharing/ui-password-input/PasswordInput.tsx new file mode 100755 index 000000000..7aa29c66e --- /dev/null +++ b/src/sharing/ui-password-input/PasswordInput.tsx @@ -0,0 +1,52 @@ +import { forwardRef, useMemo, useState } from "react"; +import styles from "./PasswordInput.module.scss"; +import classNames from "classnames/bind"; +import { Input, InputProps } from "../ui-input"; +import EyeOnIcon from "./eye-on.svg"; +import EyeOffIcon from "./eye-off.svg"; + +const cx = classNames.bind(styles); + +type PasswordInputProps = { + hasEyeIcon?: boolean; +} & Omit; + +export const PasswordInput = forwardRef( + ( + { hasEyeIcon = false, value, placeholder, hasError = false, helperText, onChange, onBlur }, + ref + ) => { + const [isPasswordVisible, setIsPasswordVisible] = useState(false); + const inputType = useMemo(() => (isPasswordVisible ? "text" : "password"), [isPasswordVisible]); + const EyeIcon = useMemo( + () => ( + + ), + [isPasswordVisible] + ); + + return ( +
+ + {hasEyeIcon && EyeIcon} +
+ ); + } +); + +PasswordInput.displayName = "PasswordInput"; diff --git a/src/sharing/ui-password-input/eye-off.svg b/src/sharing/ui-password-input/eye-off.svg new file mode 100755 index 000000000..802730c56 --- /dev/null +++ b/src/sharing/ui-password-input/eye-off.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/sharing/ui-password-input/eye-on.svg b/src/sharing/ui-password-input/eye-on.svg new file mode 100755 index 000000000..61350f131 --- /dev/null +++ b/src/sharing/ui-password-input/eye-on.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/sharing/ui-password-input/index.ts b/src/sharing/ui-password-input/index.ts new file mode 100755 index 000000000..9c06406b0 --- /dev/null +++ b/src/sharing/ui-password-input/index.ts @@ -0,0 +1 @@ +export * from "./PasswordInput"; diff --git a/src/sharing/ui-popover/Popover.module.scss b/src/sharing/ui-popover/Popover.module.scss new file mode 100755 index 000000000..cb71cd622 --- /dev/null +++ b/src/sharing/ui-popover/Popover.module.scss @@ -0,0 +1,6 @@ +@import "@/styles/global.scss"; + +.popover { + position: absolute; + z-index: $z-index-popover; +} diff --git a/src/sharing/ui-popover/Popover.tsx b/src/sharing/ui-popover/Popover.tsx new file mode 100755 index 000000000..5be98816a --- /dev/null +++ b/src/sharing/ui-popover/Popover.tsx @@ -0,0 +1,63 @@ +import styles from "./Popover.module.scss"; +import classNames from "classnames/bind"; +import { CSSProperties, useCallback, useMemo, useRef } from "react"; +import { Portal } from "@/src/sharing/ui-portal"; +import { useBackgroundClick } from "@/src/sharing/util"; + +const cx = classNames.bind(styles); + +type PopoverProps = { + children: React.ReactNode; + isOpen: boolean; + anchorRef?: React.MutableRefObject; + anchorPosition?: { + top?: CSSProperties["top"]; + right?: CSSProperties["right"]; + bottom?: CSSProperties["bottom"]; + left?: CSSProperties["left"]; + }; + disableCloseWithBackgroundClick?: boolean; + onBackgroundClick: () => void; +}; + +export const Popover = ({ + children, + isOpen, + anchorRef, + anchorPosition, + disableCloseWithBackgroundClick = false, + onBackgroundClick, +}: PopoverProps) => { + const popoverRef = useRef(null); + const positionStyle = useMemo(() => { + return { + top: anchorPosition?.top ?? "unset", + right: anchorPosition?.right ?? "unset", + bottom: anchorPosition?.bottom ?? "unset", + left: anchorPosition?.left ?? "unset", + }; + }, [anchorPosition]); + const handleBackgroundClick = useCallback<(event: MouseEvent) => void>( + ({ target }) => { + const isPopover = popoverRef.current?.contains(target as Node); + const isAnchor = anchorRef?.current?.contains(target as Node); + if (!isPopover && !isAnchor && !disableCloseWithBackgroundClick && isOpen) { + onBackgroundClick(); + } + }, + [popoverRef, anchorRef, disableCloseWithBackgroundClick, isOpen, onBackgroundClick] + ); + useBackgroundClick(handleBackgroundClick); + + if (!isOpen) { + return null; + } + + return ( + +
+ {children} +
+
+ ); +}; diff --git a/src/sharing/ui-popover/index.js b/src/sharing/ui-popover/index.js new file mode 100755 index 000000000..72f124f6d --- /dev/null +++ b/src/sharing/ui-popover/index.js @@ -0,0 +1 @@ +export * from "./Popover"; diff --git a/src/sharing/ui-portal/Portal.tsx b/src/sharing/ui-portal/Portal.tsx new file mode 100755 index 000000000..19854745d --- /dev/null +++ b/src/sharing/ui-portal/Portal.tsx @@ -0,0 +1,17 @@ +import { ReactNode, useLayoutEffect, useState } from "react"; +import { createPortal } from "react-dom"; + +type PortalProps = { + children: ReactNode; + container?: Element | DocumentFragment | null; +}; + +export const Portal = ({ children, container }: PortalProps) => { + const [mountNode, setMountNode] = useState(null); + + useLayoutEffect(() => { + setMountNode(container || document.body); + }, [container]); + + return mountNode ? createPortal(children, mountNode) : mountNode; +}; diff --git a/src/sharing/ui-portal/index.js b/src/sharing/ui-portal/index.js new file mode 100755 index 000000000..c13437205 --- /dev/null +++ b/src/sharing/ui-portal/index.js @@ -0,0 +1 @@ +export * from "./Portal"; diff --git a/src/sharing/util/axiosInstance.js b/src/sharing/util/axiosInstance.js new file mode 100755 index 000000000..bce6c6bb8 --- /dev/null +++ b/src/sharing/util/axiosInstance.js @@ -0,0 +1,5 @@ +import axios from "axios"; + +export const axiosInstance = axios.create({ + baseURL: "https://bootcamp-api.codeit.kr/api/", +}); diff --git a/src/sharing/util/constant.js b/src/sharing/util/constant.js new file mode 100755 index 000000000..277c8cd35 --- /dev/null +++ b/src/sharing/util/constant.js @@ -0,0 +1,26 @@ +export const ROUTE = { + 랜딩: "/", + 로그인: "/signin", + 회원가입: "/signup", + 폴더: "/folder", + 개인정보처리방침: "/privacy", + FAQ: "/faq", +}; + +const second = 1000; +const minute = second * 60; +const hour = minute * 60; +const day = hour * 24; +const month = day * 31; +const year = month * 12; + +export const TIME_IN_MILLISECONDS = { + second, + minute, + hour, + day, + month, + year, +}; + +export const ROOT_ID = "__next"; diff --git a/src/sharing/util/copyToClipboard.ts b/src/sharing/util/copyToClipboard.ts new file mode 100755 index 000000000..e2de0f91d --- /dev/null +++ b/src/sharing/util/copyToClipboard.ts @@ -0,0 +1,15 @@ +export const copyToClipboard = (text: string, callback?: () => void) => { + if (!navigator?.clipboard) { + const tempElement = document.createElement("textarea"); + tempElement.value = text; + document.body.appendChild(tempElement); + tempElement.select(); + document.execCommand("copy"); + document.body.removeChild(tempElement); + callback?.(); + return; + } + window.navigator.clipboard.writeText(text).then(() => { + callback?.(); + }); +}; diff --git a/src/sharing/util/getElapsedTime.ts b/src/sharing/util/getElapsedTime.ts new file mode 100755 index 000000000..230d1904a --- /dev/null +++ b/src/sharing/util/getElapsedTime.ts @@ -0,0 +1,37 @@ +import { TIME_IN_MILLISECONDS } from "./constant"; + +export const getElapsedTime = (createdAt: string) => { + const now = new Date(); + const createdAtDate = new Date(createdAt); + const elapsedTime = now.getTime() - createdAtDate.getTime(); + const { minute, hour, day, month, year } = TIME_IN_MILLISECONDS; + + if (year * 2 <= elapsedTime) { + return `${Math.floor(elapsedTime / year)} years ago`; + } + if (year <= elapsedTime) { + return `1 year ago`; + } + if (month * 2 <= elapsedTime) { + return `${Math.floor(elapsedTime / month)} months ago`; + } + if (month <= elapsedTime) { + return `1 month ago`; + } + if (day * 2 <= elapsedTime) { + return `${Math.floor(elapsedTime / day)} days ago`; + } + if (day <= elapsedTime) { + return `1 day ago`; + } + if (hour * 2 <= elapsedTime) { + return `${Math.floor(elapsedTime / hour)} hours ago`; + } + if (hour <= elapsedTime) { + return `1 hour ago`; + } + if (minute * 2 <= elapsedTime) { + return `${Math.floor(elapsedTime / minute)} minutes ago`; + } + return `1 minute ago`; +}; diff --git a/src/sharing/util/index.js b/src/sharing/util/index.js new file mode 100755 index 000000000..a10c94a5e --- /dev/null +++ b/src/sharing/util/index.js @@ -0,0 +1,10 @@ +export * from "./axiosInstance"; +export * from "./constant"; +export * from "./getElapsedTime"; +export * from "./useAsync"; +export * from "./useEffectOnce"; +export * from "./copyToClipboard"; +export * from "./useBackgroundClick"; +export * from "./useKakaoSdk"; +export * from "./useIntersectionObserver"; +export * from "./useEnhancedEffect"; diff --git a/src/sharing/util/useAsync.ts b/src/sharing/util/useAsync.ts new file mode 100755 index 000000000..e736d2cfd --- /dev/null +++ b/src/sharing/util/useAsync.ts @@ -0,0 +1,35 @@ +import { useEffect, useState } from "react"; +import { useEffectOnce } from "./useEffectOnce"; +import { AxiosResponse } from "axios"; + +export const useAsync = ( + asyncFunction: () => Promise>, + lazyMode: boolean = false +) => { + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState(null); + + const execute = async () => { + setLoading(true); + setError(null); + setData(null); + try { + const response = await asyncFunction(); + setData(response?.data ?? null); + return response; + } catch (error) { + setError(error); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + if (!lazyMode) { + execute(); + } + }, [lazyMode]); + + return { execute, loading, error, data }; +}; diff --git a/src/sharing/util/useBackgroundClick.ts b/src/sharing/util/useBackgroundClick.ts new file mode 100755 index 000000000..537da5a62 --- /dev/null +++ b/src/sharing/util/useBackgroundClick.ts @@ -0,0 +1,12 @@ +import { useEffect } from "react"; +import { ROOT_ID } from "./constant"; + +export const useBackgroundClick = (callback: (this: HTMLElement, ev: MouseEvent) => any) => { + useEffect(() => { + const rootElement = document.getElementById(ROOT_ID); + rootElement?.addEventListener<"click">("click", callback); + return () => { + rootElement?.removeEventListener<"click">("click", callback); + }; + }, [callback]); +}; diff --git a/src/sharing/util/useEffectOnce.ts b/src/sharing/util/useEffectOnce.ts new file mode 100755 index 000000000..af0c72f58 --- /dev/null +++ b/src/sharing/util/useEffectOnce.ts @@ -0,0 +1,8 @@ +import { EffectCallback, useEffect } from "react"; + +export const useEffectOnce = (callback: EffectCallback) => { + useEffect(() => { + callback(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); +}; diff --git a/src/sharing/util/useEnhancedEffect.ts b/src/sharing/util/useEnhancedEffect.ts new file mode 100755 index 000000000..84025c0b1 --- /dev/null +++ b/src/sharing/util/useEnhancedEffect.ts @@ -0,0 +1,3 @@ +import { useEffect, useLayoutEffect } from "react"; + +export const useEnhancedEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect; diff --git a/src/sharing/util/useIntersectionObserver.tsx b/src/sharing/util/useIntersectionObserver.tsx new file mode 100755 index 000000000..d5d9d5fd6 --- /dev/null +++ b/src/sharing/util/useIntersectionObserver.tsx @@ -0,0 +1,29 @@ +import { useRef, useState } from "react"; +import { useEnhancedEffect } from "./useEnhancedEffect"; + +export const useIntersectionObserver = ( + once: boolean = false, + options?: IntersectionObserverInit +) => { + const ref = useRef(null); + const [isIntersecting, setIsIntersecting] = useState(false); + + useEnhancedEffect(() => { + const observer = new IntersectionObserver(([entry]) => { + setIsIntersecting(entry.isIntersecting); + if (once && entry.isIntersecting) { + observer.unobserve(entry.target); + } + }, options); + + if (ref?.current) { + observer.observe(ref.current!); + } + + return () => { + observer.disconnect(); + }; + }, [options, once]); + + return { ref, isIntersecting }; +}; diff --git a/src/sharing/util/useKakaoSdk.ts b/src/sharing/util/useKakaoSdk.ts new file mode 100755 index 000000000..e7baafd70 --- /dev/null +++ b/src/sharing/util/useKakaoSdk.ts @@ -0,0 +1,81 @@ +import { useEffectOnce } from "./useEffectOnce"; + +type ShareKakaoParams = { + url: string; + title: string; + description: string; + imageUrl: string; +}; + +declare const window: Window & { + Kakao: { + init: (key?: string) => void; + isInitialized: () => boolean; + Link: { + sendDefault: (params: { + objectType: "feed"; + content: { + title: string; + description: string; + imageUrl: string; + link: { + mobileWebUrl: string; + webUrl: string; + }; + }; + buttons: { + title: string; + link: { + mobileWebUrl: string; + webUrl: string; + }; + }[]; + }) => void; + }; + }; +}; + +export const useKakaoSdk = () => { + const shareKakao = ({ url, title, description, imageUrl }: ShareKakaoParams) => { + if (window.Kakao) { + const kakao = window.Kakao; + if (!kakao.isInitialized()) { + kakao.init(process.env.REACT_APP_KAKAO_SDK_KEY); + } + + kakao.Link.sendDefault({ + objectType: "feed", + content: { + title: title, + description: description, + imageUrl: imageUrl, + link: { + mobileWebUrl: url, + webUrl: url, + }, + }, + buttons: [ + { + title: title, + link: { + mobileWebUrl: url, + webUrl: url, + }, + }, + ], + }); + } + }; + + useEffectOnce(() => { + const script = document.createElement("script"); + script.src = "https://developers.kakao.com/sdk/js/kakao.js"; + script.async = true; + document.body.appendChild(script); + return () => { + document.body.removeChild(script); + }; + }); + + return { shareKakao }; +}; diff --git a/src/user/data-access-user/index.js b/src/user/data-access-user/index.js new file mode 100755 index 000000000..6d8e88bdb --- /dev/null +++ b/src/user/data-access-user/index.js @@ -0,0 +1 @@ +export * from "./useGetUser"; diff --git a/src/user/data-access-user/useGetUser.ts b/src/user/data-access-user/useGetUser.ts new file mode 100755 index 000000000..743081b78 --- /dev/null +++ b/src/user/data-access-user/useGetUser.ts @@ -0,0 +1,9 @@ +import { useAsync } from "@/src/sharing/util"; +import { axiosInstance } from "@/src/sharing/util"; +import { UserRawData } from "@/src/user/type"; + +export const useGetUser = () => { + const getUser = () => axiosInstance.get<{ data: UserRawData }>("sample/user"); + const { loading, error, data } = useAsync(getUser); + return { loading, error, data: data?.data ?? null }; +}; diff --git a/src/user/type.ts b/src/user/type.ts new file mode 100755 index 000000000..5a4b094d9 --- /dev/null +++ b/src/user/type.ts @@ -0,0 +1,6 @@ +export type UserRawData = { + id: number; + name: string; + email: string; + profileImageSource: string; +}; diff --git a/src/user/ui-profile/Profile.module.scss b/src/user/ui-profile/Profile.module.scss new file mode 100755 index 000000000..7d6b93d7a --- /dev/null +++ b/src/user/ui-profile/Profile.module.scss @@ -0,0 +1,23 @@ +@import "@/styles/global.scss"; + +.container { + display: flex; + align-items: center; + column-gap: 0.6rem; +} + +.image { + width: 2.8rem; + height: 2.8rem; + border-radius: 50%; +} + +.email { + display: none; + font-size: 1.4rem; + color: var(--gray100); + + @include tablet { + display: inline; + } +} diff --git a/src/user/ui-profile/Profile.tsx b/src/user/ui-profile/Profile.tsx new file mode 100755 index 000000000..0df08300f --- /dev/null +++ b/src/user/ui-profile/Profile.tsx @@ -0,0 +1,20 @@ +import styles from "./Profile.module.scss"; +import classNames from "classnames/bind"; + +const cx = classNames.bind(styles); + +type ProfileProps = { + profile: { + imageSource: string; + email: string; + }; +}; + +export const Profile = ({ profile }: ProfileProps) => { + return ( +
+ 프로필 이미지 + {profile.email} +
+ ); +}; diff --git a/src/user/ui-profile/index.js b/src/user/ui-profile/index.js new file mode 100755 index 000000000..b6f21ff6f --- /dev/null +++ b/src/user/ui-profile/index.js @@ -0,0 +1 @@ +export * from "./Profile"; diff --git a/styles/Home.module.css b/styles/Home.module.css deleted file mode 100644 index 6676d2c66..000000000 --- a/styles/Home.module.css +++ /dev/null @@ -1,229 +0,0 @@ -.main { - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: center; - padding: 6rem; - min-height: 100vh; -} - -.description { - display: inherit; - justify-content: inherit; - align-items: inherit; - font-size: 0.85rem; - max-width: var(--max-width); - width: 100%; - z-index: 2; - font-family: var(--font-mono); -} - -.description a { - display: flex; - justify-content: center; - align-items: center; - gap: 0.5rem; -} - -.description p { - position: relative; - margin: 0; - padding: 1rem; - background-color: rgba(var(--callout-rgb), 0.5); - border: 1px solid rgba(var(--callout-border-rgb), 0.3); - border-radius: var(--border-radius); -} - -.code { - font-weight: 700; - font-family: var(--font-mono); -} - -.grid { - display: grid; - grid-template-columns: repeat(4, minmax(25%, auto)); - max-width: 100%; - width: var(--max-width); -} - -.card { - padding: 1rem 1.2rem; - border-radius: var(--border-radius); - background: rgba(var(--card-rgb), 0); - border: 1px solid rgba(var(--card-border-rgb), 0); - transition: background 200ms, border 200ms; -} - -.card span { - display: inline-block; - transition: transform 200ms; -} - -.card h2 { - font-weight: 600; - margin-bottom: 0.7rem; -} - -.card p { - margin: 0; - opacity: 0.6; - font-size: 0.9rem; - line-height: 1.5; - max-width: 30ch; -} - -.center { - display: flex; - justify-content: center; - align-items: center; - position: relative; - padding: 4rem 0; -} - -.center::before { - background: var(--secondary-glow); - border-radius: 50%; - width: 480px; - height: 360px; - margin-left: -400px; -} - -.center::after { - background: var(--primary-glow); - width: 240px; - height: 180px; - z-index: -1; -} - -.center::before, -.center::after { - content: ''; - left: 50%; - position: absolute; - filter: blur(45px); - transform: translateZ(0); -} - -.logo { - position: relative; -} -/* Enable hover only on non-touch devices */ -@media (hover: hover) and (pointer: fine) { - .card:hover { - background: rgba(var(--card-rgb), 0.1); - border: 1px solid rgba(var(--card-border-rgb), 0.15); - } - - .card:hover span { - transform: translateX(4px); - } -} - -@media (prefers-reduced-motion) { - .card:hover span { - transform: none; - } -} - -/* Mobile */ -@media (max-width: 700px) { - .content { - padding: 4rem; - } - - .grid { - grid-template-columns: 1fr; - margin-bottom: 120px; - max-width: 320px; - text-align: center; - } - - .card { - padding: 1rem 2.5rem; - } - - .card h2 { - margin-bottom: 0.5rem; - } - - .center { - padding: 8rem 0 6rem; - } - - .center::before { - transform: none; - height: 300px; - } - - .description { - font-size: 0.8rem; - } - - .description a { - padding: 1rem; - } - - .description p, - .description div { - display: flex; - justify-content: center; - position: fixed; - width: 100%; - } - - .description p { - align-items: center; - inset: 0 0 auto; - padding: 2rem 1rem 1.4rem; - border-radius: 0; - border: none; - border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); - background: linear-gradient( - to bottom, - rgba(var(--background-start-rgb), 1), - rgba(var(--callout-rgb), 0.5) - ); - background-clip: padding-box; - backdrop-filter: blur(24px); - } - - .description div { - align-items: flex-end; - pointer-events: none; - inset: auto 0 0; - padding: 2rem; - height: 200px; - background: linear-gradient( - to bottom, - transparent 0%, - rgb(var(--background-end-rgb)) 40% - ); - z-index: 1; - } -} - -/* Tablet and Smaller Desktop */ -@media (min-width: 701px) and (max-width: 1120px) { - .grid { - grid-template-columns: repeat(2, 50%); - } -} - -@media (prefers-color-scheme: dark) { - .vercelLogo { - filter: invert(1); - } - - .logo { - filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70); - } -} - -@keyframes rotate { - from { - transform: rotate(360deg); - } - to { - transform: rotate(0deg); - } -} diff --git a/styles/colors.scss b/styles/colors.scss new file mode 100755 index 000000000..4b6f6e63b --- /dev/null +++ b/styles/colors.scss @@ -0,0 +1,16 @@ +$color-primary: #6d6afe; +$color-red: #ff5b56; +$color-black: #111322; +$color-white: #ffffff; + +$color-gray100: #373740; +$color-gray60: #9fa6b2; +$color-gray20: #ccd5e3; +$color-gray10: #e7effb; +$color-gray-light: #f5f5f5; + +$color-light-blue: #f0f6ff; + +$color-text-gray: #676767; +$color-text-content-gray: #666666; +$color-text-content-black: #333333; diff --git a/styles/global.scss b/styles/global.scss new file mode 100755 index 000000000..7ea93de24 --- /dev/null +++ b/styles/global.scss @@ -0,0 +1,3 @@ +@import "./colors.scss"; +@import "./variables.scss"; +@import "./mixin.scss"; diff --git a/styles/globals.css b/styles/globals.css deleted file mode 100644 index d4f491e15..000000000 --- a/styles/globals.css +++ /dev/null @@ -1,107 +0,0 @@ -:root { - --max-width: 1100px; - --border-radius: 12px; - --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', - 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', - 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace; - - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; - - --primary-glow: conic-gradient( - from 180deg at 50% 50%, - #16abff33 0deg, - #0885ff33 55deg, - #54d6ff33 120deg, - #0071ff33 160deg, - transparent 360deg - ); - --secondary-glow: radial-gradient( - rgba(255, 255, 255, 1), - rgba(255, 255, 255, 0) - ); - - --tile-start-rgb: 239, 245, 249; - --tile-end-rgb: 228, 232, 233; - --tile-border: conic-gradient( - #00000080, - #00000040, - #00000030, - #00000020, - #00000010, - #00000010, - #00000080 - ); - - --callout-rgb: 238, 240, 241; - --callout-border-rgb: 172, 175, 176; - --card-rgb: 180, 185, 188; - --card-border-rgb: 131, 134, 135; -} - -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; - - --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); - --secondary-glow: linear-gradient( - to bottom right, - rgba(1, 65, 255, 0), - rgba(1, 65, 255, 0), - rgba(1, 65, 255, 0.3) - ); - - --tile-start-rgb: 2, 13, 46; - --tile-end-rgb: 2, 5, 19; - --tile-border: conic-gradient( - #ffffff80, - #ffffff40, - #ffffff30, - #ffffff20, - #ffffff10, - #ffffff10, - #ffffff80 - ); - - --callout-rgb: 20, 20, 20; - --callout-border-rgb: 108, 108, 108; - --card-rgb: 100, 100, 100; - --card-border-rgb: 200, 200, 200; - } -} - -* { - box-sizing: border-box; - padding: 0; - margin: 0; -} - -html, -body { - max-width: 100vw; - overflow-x: hidden; -} - -body { - color: rgb(var(--foreground-rgb)); - background: linear-gradient( - to bottom, - transparent, - rgb(var(--background-end-rgb)) - ) - rgb(var(--background-start-rgb)); -} - -a { - color: inherit; - text-decoration: none; -} - -@media (prefers-color-scheme: dark) { - html { - color-scheme: dark; - } -} diff --git a/styles/mixin.scss b/styles/mixin.scss new file mode 100755 index 000000000..721cfd6b9 --- /dev/null +++ b/styles/mixin.scss @@ -0,0 +1,24 @@ +@mixin desktop { + @media (min-width: 1200px) { + @content; + } +} + +@mixin tablet { + @media (min-width: 768px) { + @content; + } +} + +@mixin ellipsis($line: 1) { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap !important; + + @if $line > 1 { + display: -webkit-box; + -webkit-line-clamp: $line; + white-space: initial !important; + -webkit-box-orient: vertical; + } +} diff --git a/styles/reset.css b/styles/reset.css new file mode 100755 index 000000000..ba5b5b45c --- /dev/null +++ b/styles/reset.css @@ -0,0 +1,40 @@ +/* user agent stylesheet 초기화 */ + +* { + box-sizing: border-box; + margin: 0; + font-family: "Pretendard"; + word-break: keep-all; +} + +html, +body { + font-size: 62.5%; +} + +a { + color: inherit; + text-decoration: none; + cursor: pointer; +} + +input { + border: none; + padding: none; +} +input:focus { + outline: none; +} +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-results-button, +input[type="search"]::-webkit-search-results-decoration { + display: none; +} + +button { + border: none; + padding: unset; + background-color: unset; + cursor: pointer; +} diff --git a/styles/variables.scss b/styles/variables.scss new file mode 100755 index 000000000..3308e4784 --- /dev/null +++ b/styles/variables.scss @@ -0,0 +1,4 @@ +$z-index-popover: 50; +$z-index-nav: 100; +$z-index-fab: 100; +$z-index-modal: 1000; diff --git a/tsconfig.json b/tsconfig.json old mode 100644 new mode 100755 diff --git a/yarn.lock b/yarn.lock new file mode 100755 index 000000000..47b00d0f4 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3875 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.4.tgz#03ae5af150be94392cb5c7ccd97db5a19a5da6aa" + integrity sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.3.tgz#3febd552541e62b5e883a25eb3effd7c7379db11" + integrity sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ== + +"@babel/core@^7.21.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.3.tgz#5ec09c8803b91f51cc887dedc2654a35852849c9" + integrity sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.3" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.2" + "@babel/parser" "^7.23.3" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.3" + "@babel/types" "^7.23.3" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.23.3", "@babel/generator@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.4.tgz#4a41377d8566ec18f807f42962a7f3551de83d1c" + integrity sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ== + dependencies: + "@babel/types" "^7.23.4" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" + integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== + +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" + +"@babel/helpers@^7.23.2": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.4.tgz#7d2cfb969aa43222032193accd7329851facf3c1" + integrity sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.4" + "@babel/types" "^7.23.4" + +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.22.15", "@babel/parser@^7.23.3", "@babel/parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.4.tgz#409fbe690c333bb70187e2de4021e1e47a026661" + integrity sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" + integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d" + integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.23.3" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz#20c60d4639d18f7da8602548512e9d3a4c8d7098" + integrity sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" + integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06" + integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" + integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" + integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz#93ac8e3531f347fba519b4703f9ff2a75c6ae27a" + integrity sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa" + integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + +"@babel/plugin-transform-block-scoped-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" + integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5" + integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48" + integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz#2a202c8787a8964dd11dfcedf994d36bfc844ab5" + integrity sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz#73380c632c095b03e8503c24fd38f95ad41ffacb" + integrity sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" + integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.15" + +"@babel/plugin-transform-destructuring@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" + integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50" + integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce" + integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz#c7629e7254011ac3630d47d7f34ddd40ca535143" + integrity sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18" + integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz#084c7b25e9a5c8271e987a08cf85807b80283191" + integrity sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz#afe115ff0fbce735e02868d41489093c63e15559" + integrity sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" + integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz#a871d9b6bd171976efad2e43e694c961ffa3714d" + integrity sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" + integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz#e599f82c51d55fac725f62ce55d3a0886279ecb5" + integrity sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" + integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d" + integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" + integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz#fa7e62248931cb15b9404f8052581c302dd9de81" + integrity sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/plugin-transform-modules-umd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9" + integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980" + integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz#45556aad123fc6e52189ea749e33ce090637346e" + integrity sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz#03d08e3691e405804ecdd19dd278a40cca531f29" + integrity sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz#2b9c2d26bf62710460bdc0d1730d4f1048361b83" + integrity sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g== + dependencies: + "@babel/compat-data" "^7.23.3" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.23.3" + +"@babel/plugin-transform-object-super@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" + integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + +"@babel/plugin-transform-optional-catch-binding@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz#318066de6dacce7d92fa244ae475aa8d91778017" + integrity sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz#6acf61203bdfc4de9d4e52e64490aeb3e52bd017" + integrity sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" + integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4" + integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz#3ec711d05d6608fd173d9b8de39872d8dbf68bf5" + integrity sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" + integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-constant-elements@^7.21.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz#5efc001d07ef0f7da0d73c3a86c132f73d28e43c" + integrity sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-display-name@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" + integrity sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" + integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/types" "^7.23.4" + +"@babel/plugin-transform-react-pure-annotations@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz#fabedbdb8ee40edf5da96f3ecfc6958e3783b93c" + integrity sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c" + integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8" + integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-shorthand-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" + integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" + integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04" + integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" + integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4" + integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typescript@^7.23.3": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.4.tgz#da12914d17b3c4b307f32c5fd91fbfdf17d56f86" + integrity sha512-39hCCOl+YUAyMOu6B9SmUTiHUU0t/CxJNUmY3qRdJujbqi+lrQcL11ysYUsAvFWPBdhihrv1z0oRG84Yr3dODQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.23.3" + +"@babel/plugin-transform-unicode-escapes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925" + integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad" + integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc" + integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e" + integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.20.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.3.tgz#d299e0140a7650684b95c62be2db0ef8c975143e" + integrity sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q== + dependencies: + "@babel/compat-data" "^7.23.3" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.3" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.23.3" + "@babel/plugin-syntax-import-attributes" "^7.23.3" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.23.3" + "@babel/plugin-transform-async-generator-functions" "^7.23.3" + "@babel/plugin-transform-async-to-generator" "^7.23.3" + "@babel/plugin-transform-block-scoped-functions" "^7.23.3" + "@babel/plugin-transform-block-scoping" "^7.23.3" + "@babel/plugin-transform-class-properties" "^7.23.3" + "@babel/plugin-transform-class-static-block" "^7.23.3" + "@babel/plugin-transform-classes" "^7.23.3" + "@babel/plugin-transform-computed-properties" "^7.23.3" + "@babel/plugin-transform-destructuring" "^7.23.3" + "@babel/plugin-transform-dotall-regex" "^7.23.3" + "@babel/plugin-transform-duplicate-keys" "^7.23.3" + "@babel/plugin-transform-dynamic-import" "^7.23.3" + "@babel/plugin-transform-exponentiation-operator" "^7.23.3" + "@babel/plugin-transform-export-namespace-from" "^7.23.3" + "@babel/plugin-transform-for-of" "^7.23.3" + "@babel/plugin-transform-function-name" "^7.23.3" + "@babel/plugin-transform-json-strings" "^7.23.3" + "@babel/plugin-transform-literals" "^7.23.3" + "@babel/plugin-transform-logical-assignment-operators" "^7.23.3" + "@babel/plugin-transform-member-expression-literals" "^7.23.3" + "@babel/plugin-transform-modules-amd" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-modules-systemjs" "^7.23.3" + "@babel/plugin-transform-modules-umd" "^7.23.3" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.23.3" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.3" + "@babel/plugin-transform-numeric-separator" "^7.23.3" + "@babel/plugin-transform-object-rest-spread" "^7.23.3" + "@babel/plugin-transform-object-super" "^7.23.3" + "@babel/plugin-transform-optional-catch-binding" "^7.23.3" + "@babel/plugin-transform-optional-chaining" "^7.23.3" + "@babel/plugin-transform-parameters" "^7.23.3" + "@babel/plugin-transform-private-methods" "^7.23.3" + "@babel/plugin-transform-private-property-in-object" "^7.23.3" + "@babel/plugin-transform-property-literals" "^7.23.3" + "@babel/plugin-transform-regenerator" "^7.23.3" + "@babel/plugin-transform-reserved-words" "^7.23.3" + "@babel/plugin-transform-shorthand-properties" "^7.23.3" + "@babel/plugin-transform-spread" "^7.23.3" + "@babel/plugin-transform-sticky-regex" "^7.23.3" + "@babel/plugin-transform-template-literals" "^7.23.3" + "@babel/plugin-transform-typeof-symbol" "^7.23.3" + "@babel/plugin-transform-unicode-escapes" "^7.23.3" + "@babel/plugin-transform-unicode-property-regex" "^7.23.3" + "@babel/plugin-transform-unicode-regex" "^7.23.3" + "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.6" + babel-plugin-polyfill-corejs3 "^0.8.5" + babel-plugin-polyfill-regenerator "^0.5.3" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.18.6": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.23.3.tgz#f73ca07e7590f977db07eb54dbe46538cc015709" + integrity sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-transform-react-display-name" "^7.23.3" + "@babel/plugin-transform-react-jsx" "^7.22.15" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.23.3" + +"@babel/preset-typescript@^7.21.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz#14534b34ed5b6d435aa05f1ae1c5e7adcc01d913" + integrity sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-typescript" "^7.23.3" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.21.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.8.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.4.tgz#36fa1d2b36db873d25ec631dcc4923fdc1cf2e2e" + integrity sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.23.3", "@babel/traverse@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.4.tgz#c2790f7edf106d059a0098770fe70801417f3f85" + integrity sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg== + dependencies: + "@babel/code-frame" "^7.23.4" + "@babel/generator" "^7.23.4" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.4" + "@babel/types" "^7.23.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.21.3", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.3", "@babel/types@^7.23.4", "@babel/types@^7.4.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.4.tgz#7206a1810fc512a7f7f7d4dace4cb4c1c9dbfb8e" + integrity sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.3.tgz#797470a75fe0fbd5a53350ee715e85e87baff22d" + integrity sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.54.0": + version "8.54.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.54.0.tgz#4fab9a2ff7860082c304f750e94acd644cf984cf" + integrity sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ== + +"@humanwhocodes/config-array@^0.11.13": + version "0.11.13" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" + integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== + dependencies: + "@humanwhocodes/object-schema" "^2.0.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" + integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@next/env@13.5.6": + version "13.5.6" + resolved "https://registry.yarnpkg.com/@next/env/-/env-13.5.6.tgz#c1148e2e1aa166614f05161ee8f77ded467062bc" + integrity sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw== + +"@next/eslint-plugin-next@13.5.6": + version "13.5.6" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.5.6.tgz#cf279b94ddc7de49af8e8957f0c3b7349bc489bf" + integrity sha512-ng7pU/DDsxPgT6ZPvuprxrkeew3XaRf4LAT4FabaEO/hAbvVx4P7wqnqdbTdDn1kgTvsI4tpIgT4Awn/m0bGbg== + dependencies: + glob "7.1.7" + +"@next/swc-darwin-arm64@13.5.6": + version "13.5.6" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.6.tgz#b15d139d8971360fca29be3bdd703c108c9a45fb" + integrity sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA== + +"@next/swc-darwin-x64@13.5.6": + version "13.5.6" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.6.tgz#9c72ee31cc356cb65ce6860b658d807ff39f1578" + integrity sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA== + +"@next/swc-linux-arm64-gnu@13.5.6": + version "13.5.6" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.6.tgz#59f5f66155e85380ffa26ee3d95b687a770cfeab" + integrity sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg== + +"@next/swc-linux-arm64-musl@13.5.6": + version "13.5.6" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.6.tgz#f012518228017052736a87d69bae73e587c76ce2" + integrity sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q== + +"@next/swc-linux-x64-gnu@13.5.6": + version "13.5.6" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.6.tgz#339b867a7e9e7ee727a700b496b269033d820df4" + integrity sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw== + +"@next/swc-linux-x64-musl@13.5.6": + version "13.5.6" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.6.tgz#ae0ae84d058df758675830bcf70ca1846f1028f2" + integrity sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ== + +"@next/swc-win32-arm64-msvc@13.5.6": + version "13.5.6" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.6.tgz#a5cc0c16920485a929a17495064671374fdbc661" + integrity sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg== + +"@next/swc-win32-ia32-msvc@13.5.6": + version "13.5.6" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.6.tgz#6a2409b84a2cbf34bf92fe714896455efb4191e4" + integrity sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg== + +"@next/swc-win32-x64-msvc@13.5.6": + version "13.5.6" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.6.tgz#4a3e2a206251abc729339ba85f60bc0433c2865d" + integrity sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ== + +"@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" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@rushstack/eslint-patch@^1.3.3": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.6.0.tgz#1898e7a7b943680d757417a47fb10f5fcc230b39" + integrity sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA== + +"@svgr/babel-plugin-add-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" + integrity sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g== + +"@svgr/babel-plugin-remove-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" + integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== + +"@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" + integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz#8fbb6b2e91fa26ac5d4aa25c6b6e4f20f9c0ae27" + integrity sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ== + +"@svgr/babel-plugin-svg-dynamic-title@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz#1d5ba1d281363fc0f2f29a60d6d936f9bbc657b0" + integrity sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og== + +"@svgr/babel-plugin-svg-em-dimensions@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz#35e08df300ea8b1d41cb8f62309c241b0369e501" + integrity sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g== + +"@svgr/babel-plugin-transform-react-native-svg@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz#90a8b63998b688b284f255c6a5248abd5b28d754" + integrity sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q== + +"@svgr/babel-plugin-transform-svg-component@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz#013b4bfca88779711f0ed2739f3f7efcefcf4f7e" + integrity sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw== + +"@svgr/babel-preset@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-8.1.0.tgz#0e87119aecdf1c424840b9d4565b7137cabf9ece" + integrity sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "8.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "8.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "8.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "8.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" + "@svgr/babel-plugin-transform-svg-component" "8.0.0" + +"@svgr/core@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-8.1.0.tgz#41146f9b40b1a10beaf5cc4f361a16a3c1885e88" + integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + camelcase "^6.2.0" + cosmiconfig "^8.1.3" + snake-case "^3.0.4" + +"@svgr/hast-util-to-babel-ast@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz#6952fd9ce0f470e1aded293b792a2705faf4ffd4" + integrity sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q== + dependencies: + "@babel/types" "^7.21.3" + entities "^4.4.0" + +"@svgr/plugin-jsx@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz#96969f04a24b58b174ee4cd974c60475acbd6928" + integrity sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + "@svgr/hast-util-to-babel-ast" "8.0.0" + svg-parser "^2.0.4" + +"@svgr/plugin-svgo@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz#b115b7b967b564f89ac58feae89b88c3decd0f00" + integrity sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA== + dependencies: + cosmiconfig "^8.1.3" + deepmerge "^4.3.1" + svgo "^3.0.2" + +"@svgr/webpack@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-8.1.0.tgz#16f1b5346f102f89fda6ec7338b96a701d8be0c2" + integrity sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA== + dependencies: + "@babel/core" "^7.21.3" + "@babel/plugin-transform-react-constant-elements" "^7.21.3" + "@babel/preset-env" "^7.20.2" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.21.0" + "@svgr/core" "8.1.0" + "@svgr/plugin-jsx" "8.1.0" + "@svgr/plugin-svgo" "8.1.0" + +"@swc/helpers@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" + integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== + dependencies: + tslib "^2.4.0" + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/node@^20": + version "20.10.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.0.tgz#16ddf9c0a72b832ec4fcce35b8249cf149214617" + integrity sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ== + dependencies: + undici-types "~5.26.4" + +"@types/prop-types@*": + version "15.7.11" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + +"@types/react-dom@^18": + version "18.2.17" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.17.tgz#375c55fab4ae671bd98448dcfa153268d01d6f64" + integrity sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18": + version "18.2.38" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.38.tgz#3605ca41d3daff2c434e0b98d79a2469d4c2dd52" + integrity sha512-cBBXHzuPtQK6wNthuVMV6IjHAFkdl/FOPFIlkd81/Cd1+IqkHu/A+w4g43kaQQoYHik/ruaQBDL72HyCy1vuMw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== + +"@typescript-eslint/parser@^5.4.2 || ^6.0.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.12.0.tgz#9fb21ed7d88065a4a2ee21eb80b8578debb8217c" + integrity sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg== + dependencies: + "@typescript-eslint/scope-manager" "6.12.0" + "@typescript-eslint/types" "6.12.0" + "@typescript-eslint/typescript-estree" "6.12.0" + "@typescript-eslint/visitor-keys" "6.12.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz#5833a16dbe19cfbad639d4d33bcca5e755c7044b" + integrity sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw== + dependencies: + "@typescript-eslint/types" "6.12.0" + "@typescript-eslint/visitor-keys" "6.12.0" + +"@typescript-eslint/types@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.12.0.tgz#ffc5297bcfe77003c8b7b545b51c2505748314ac" + integrity sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q== + +"@typescript-eslint/typescript-estree@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz#764ccc32598549e5b48ec99e3b85f89b1385310c" + integrity sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw== + dependencies: + "@typescript-eslint/types" "6.12.0" + "@typescript-eslint/visitor-keys" "6.12.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/visitor-keys@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz#5877950de42a0f3344261b7a1eee15417306d7e9" + integrity sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw== + dependencies: + "@typescript-eslint/types" "6.12.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlastindex@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== + +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axe-core@=4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" + integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== + +axios@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" + integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +axobject-query@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" + +babel-plugin-polyfill-corejs2@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313" + integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.3" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.8.5: + version "0.8.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz#25c2d20002da91fe328ff89095c85a391d6856cf" + integrity sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.3" + core-js-compat "^3.33.1" + +babel-plugin-polyfill-regenerator@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5" + integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.3" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.9, browserslist@^4.22.1: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== + dependencies: + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" + node-releases "^2.0.13" + update-browserslist-db "^1.0.13" + +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001541: + version "1.0.30001564" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz#eaa8bbc58c0cbccdcb7b41186df39dd2ba591889" + integrity sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +"chokidar@>=3.0.0 <4.0.0": + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +classnames@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +core-js-compat@^3.31.0, core-js-compat@^3.33.1: + version "3.33.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.3.tgz#ec678b772c5a2d8a7c60a91c3a81869aa704ae01" + integrity sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow== + dependencies: + browserslist "^4.22.1" + +cosmiconfig@^8.1.3: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-tree@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== + dependencies: + mdn-data "2.0.30" + source-map-js "^1.0.1" + +css-tree@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== + dependencies: + mdn-data "2.0.28" + source-map-js "^1.0.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +csso@5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" + integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== + dependencies: + css-tree "~2.2.0" + +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +date-fns@^2.30.0: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +electron-to-chromium@^1.4.535: + version "1.4.594" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.594.tgz#f69f207fba80735a44a988df42f3f439115d0515" + integrity sha512-xT1HVAu5xFn7bDfkjGQi9dNpMqGchUkebwf1GL7cZN32NSwwlHRPMSDJ1KN6HkS0bWUtndbSQZqvpQftKG2uFQ== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enhanced-resolve@^5.12.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.22.1: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" + call-bind "^1.0.5" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.12" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.13" + +es-iterator-helpers@^1.0.12, es-iterator-helpers@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" + integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.1" + es-abstract "^1.22.1" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + iterator.prototype "^1.1.2" + safe-array-concat "^1.0.1" + +es-set-tostringtag@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== + dependencies: + get-intrinsic "^1.2.2" + has-tostringtag "^1.0.0" + hasown "^2.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-next@13.5.6: + version "13.5.6" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.5.6.tgz#3a5a6222d5cb32256760ad68ab8e976e866a08c8" + integrity sha512-o8pQsUHTo9aHqJ2YiZDym5gQAMRf7O2HndHo/JZeY7TDD+W4hk6Ma8Vw54RHiBeb7OWWO5dPirQB+Is/aVQ7Kg== + dependencies: + "@next/eslint-plugin-next" "13.5.6" + "@rushstack/eslint-patch" "^1.3.3" + "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.28.1" + eslint-plugin-jsx-a11y "^6.7.1" + eslint-plugin-react "^7.33.2" + eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@^3.5.2: + version "3.6.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + fast-glob "^3.3.1" + get-tsconfig "^4.5.0" + is-core-module "^2.11.0" + is-glob "^4.0.3" + +eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.28.1: + version "2.29.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz#8133232e4329ee344f2f612885ac3073b0b7e155" + integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.14.2" + +eslint-plugin-jsx-a11y@^6.7.1: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" + integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + dependencies: + "@babel/runtime" "^7.23.2" + aria-query "^5.3.0" + array-includes "^3.1.7" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "=4.7.0" + axobject-query "^3.2.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + es-iterator-helpers "^1.0.15" + hasown "^2.0.0" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + +"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.33.2: + version "7.33.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.1" + string.prototype.matchall "^4.0.8" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8: + version "8.54.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.54.0.tgz#588e0dd4388af91a2e8fa37ea64924074c783537" + integrity sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.3" + "@eslint/js" "8.54.0" + "@humanwhocodes/config-array" "^0.11.13" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9, fast-glob@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + +follow-redirects@^1.15.0: + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.1, function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-tsconfig@^4.5.0: + version "4.7.2" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.2.tgz#0dcd6fb330391d46332f4c6c1bf89a6514c2ddce" + integrity sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A== + dependencies: + resolve-pkg-maps "^1.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +ignore@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + +immutable@^4.0.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" + integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== + +import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== + dependencies: + get-intrinsic "^1.2.2" + hasown "^2.0.0" + side-channel "^1.0.4" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +language-subtag-registry@^0.3.20: + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== + dependencies: + language-subtag-registry "^0.3.20" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.6: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +next@13.5.6: + version "13.5.6" + resolved "https://registry.yarnpkg.com/next/-/next-13.5.6.tgz#e964b5853272236c37ce0dd2c68302973cf010b1" + integrity sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw== + dependencies: + "@next/env" "13.5.6" + "@swc/helpers" "0.5.2" + busboy "1.6.0" + caniuse-lite "^1.0.30001406" + postcss "8.4.31" + styled-jsx "5.1.1" + watchpack "2.4.0" + optionalDependencies: + "@next/swc-darwin-arm64" "13.5.6" + "@next/swc-darwin-x64" "13.5.6" + "@next/swc-linux-arm64-gnu" "13.5.6" + "@next/swc-linux-arm64-musl" "13.5.6" + "@next/swc-linux-x64-gnu" "13.5.6" + "@next/swc-linux-x64-musl" "13.5.6" + "@next/swc-win32-arm64-msvc" "13.5.6" + "@next/swc-win32-ia32-msvc" "13.5.6" + "@next/swc-win32-x64-msvc" "13.5.6" + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1, object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6, object.entries@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.fromentries@^2.0.6, object.fromentries@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.groupby@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + +object.hasown@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + dependencies: + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.values@^1.1.6, object.values@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +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== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-dom@^18: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-hook-form@^7.48.2: + version "7.48.2" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.48.2.tgz#01150354d2be61412ff56a030b62a119283b9935" + integrity sha512-H0T2InFQb1hX7qKtDIZmvpU1Xfn/bdahWBN1fH19gSe4bBEqTfmlr7H3XWTaVtiK4/tpPaI1F3355GPMZYge+A== + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react@^18: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reflect.getprototypeof@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve@^1.14.2, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +sass@^1.69.5: + version "1.69.5" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.5.tgz#23e18d1c757a35f2e52cc81871060b9ad653dfde" + integrity sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +set-function-name@^2.0.0, set-function-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +string.prototype.matchall@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +styled-jsx@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== + dependencies: + client-only "0.0.1" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.0.4.tgz#67b40a710743e358e8d19ec288de8f1e388afbb4" + integrity sha512-T+Xul3JwuJ6VGXKo/p2ndqx1ibxNKnLTvRc1ZTWKCfyKS/GgNjRZcYsK84fxTsy/izr91g/Rwx6fGnVgaFSI5g== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^5.1.0" + css-tree "^2.2.1" + css-what "^6.1.0" + csso "5.0.5" + picocolors "^1.0.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + +tsconfig-paths@^3.14.2: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.0.3, tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typescript@^5: + version "5.3.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.2.tgz#00d1c7c1c46928c5845c1ee8d0cc2791031d4c43" + integrity sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +watchpack@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 3fdb8bcd26c904f35bffaeeb8e6b159259bc525d Mon Sep 17 00:00:00 2001 From: ckswnskfk Date: Mon, 22 Jan 2024 23:49:39 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=EB=A6=B0=ED=84=B0=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.json | 35 ++++++++++++++++- package.json | 5 +++ yarn.lock | 102 ++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 139 insertions(+), 3 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index bffb357a7..b4f57df23 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,36 @@ { - "extends": "next/core-web-vitals" + "root": true, + "env": { "browser": true, "es6": true, "node": true }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": "latest", + "sourceType": "module", + "project": "./tsconfig.json" + }, + "extends": [ + "plugin:@next/next/recommended", + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "plugin:import/recommended", + "plugin:jsx-a11y/recommended", + "plugin:prettier/recommended", + "prettier" + ], + "settings": { + "react": { + "version": "detect" + }, + "import/resolver": { + "typescript": {} + } + }, + "plugins": ["prettier", "@typescript-eslint", "import", "simple-import-sort"], + "rules": { + "simple-import-sort/imports": "error", + "simple-import-sort/exports": "error" + } } diff --git a/package.json b/package.json index 8ef921f69..a1761d4bb 100755 --- a/package.json +++ b/package.json @@ -22,8 +22,13 @@ "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", + "@typescript-eslint/parser": "^6.19.0", "eslint": "^8", "eslint-config-next": "13.5.6", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-simple-import-sort": "^10.0.0", "sass": "^1.69.5", "typescript": "^5" } diff --git a/yarn.lock b/yarn.lock index 47b00d0f4..736362cdd 100755 --- a/yarn.lock +++ b/yarn.lock @@ -1367,6 +1367,17 @@ "@typescript-eslint/visitor-keys" "6.12.0" debug "^4.3.4" +"@typescript-eslint/parser@^6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.19.0.tgz#80344086f362181890ade7e94fc35fe0480bfdf5" + integrity sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow== + dependencies: + "@typescript-eslint/scope-manager" "6.19.0" + "@typescript-eslint/types" "6.19.0" + "@typescript-eslint/typescript-estree" "6.19.0" + "@typescript-eslint/visitor-keys" "6.19.0" + debug "^4.3.4" + "@typescript-eslint/scope-manager@6.12.0": version "6.12.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz#5833a16dbe19cfbad639d4d33bcca5e755c7044b" @@ -1375,11 +1386,24 @@ "@typescript-eslint/types" "6.12.0" "@typescript-eslint/visitor-keys" "6.12.0" +"@typescript-eslint/scope-manager@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.19.0.tgz#b6d2abb825b29ab70cb542d220e40c61c1678116" + integrity sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ== + dependencies: + "@typescript-eslint/types" "6.19.0" + "@typescript-eslint/visitor-keys" "6.19.0" + "@typescript-eslint/types@6.12.0": version "6.12.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.12.0.tgz#ffc5297bcfe77003c8b7b545b51c2505748314ac" integrity sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q== +"@typescript-eslint/types@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.19.0.tgz#689b0498c436272a6a2059b09f44bcbd90de294a" + integrity sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A== + "@typescript-eslint/typescript-estree@6.12.0": version "6.12.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz#764ccc32598549e5b48ec99e3b85f89b1385310c" @@ -1393,6 +1417,20 @@ semver "^7.5.4" ts-api-utils "^1.0.1" +"@typescript-eslint/typescript-estree@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz#0813ba364a409afb4d62348aec0202600cb468fa" + integrity sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ== + dependencies: + "@typescript-eslint/types" "6.19.0" + "@typescript-eslint/visitor-keys" "6.19.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + "@typescript-eslint/visitor-keys@6.12.0": version "6.12.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz#5877950de42a0f3344261b7a1eee15417306d7e9" @@ -1401,6 +1439,14 @@ "@typescript-eslint/types" "6.12.0" eslint-visitor-keys "^3.4.1" +"@typescript-eslint/visitor-keys@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz#4565e0ecd63ca1f81b96f1dd76e49f746c6b2b49" + integrity sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ== + dependencies: + "@typescript-eslint/types" "6.19.0" + eslint-visitor-keys "^3.4.1" + "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" @@ -1634,6 +1680,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -2122,7 +2175,7 @@ eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-import-resolver-typescript@^3.5.2: +eslint-import-resolver-typescript@^3.5.2, eslint-import-resolver-typescript@^3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== @@ -2165,7 +2218,30 @@ eslint-plugin-import@^2.28.1: semver "^6.3.1" tsconfig-paths "^3.14.2" -eslint-plugin-jsx-a11y@^6.7.1: +eslint-plugin-import@^2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-jsx-a11y@^6.7.1, eslint-plugin-jsx-a11y@^6.8.0: version "6.8.0" resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== @@ -2214,6 +2290,11 @@ eslint-plugin-react@^7.33.2: semver "^6.3.1" string.prototype.matchall "^4.0.8" +eslint-plugin-simple-import-sort@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz#cc4ceaa81ba73252427062705b64321946f61351" + integrity sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw== + eslint-scope@^7.2.2: version "7.2.2" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" @@ -3009,6 +3090,13 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -3675,6 +3763,16 @@ tsconfig-paths@^3.14.2: minimist "^1.2.6" strip-bom "^3.0.0" +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + tslib@^2.0.3, tslib@^2.4.0: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" From 23cfd08a2b779aeea93828aca7a6fefc21526a60 Mon Sep 17 00:00:00 2001 From: ckswnskfk Date: Tue, 23 Jan 2024 00:05:49 +0900 Subject: [PATCH 3/5] =?UTF-8?q?Fix:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EC=B0=BE=EC=A7=80=20=EB=AA=BB=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/link/ui-search-bar/constant.js | 2 +- src/sharing/ui-card-image/constant.js | 2 +- src/sharing/ui-footer/Footer.tsx | 40 ++++++++++++++++++----- src/sharing/ui-navigation-bar/constant.js | 2 +- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/link/ui-search-bar/constant.js b/src/link/ui-search-bar/constant.js index 4014785b8..3233a2727 100755 --- a/src/link/ui-search-bar/constant.js +++ b/src/link/ui-search-bar/constant.js @@ -1 +1 @@ -export const SEARCH_IMAGE = "images/search.svg"; +export const SEARCH_IMAGE = "/images/search.svg"; diff --git a/src/sharing/ui-card-image/constant.js b/src/sharing/ui-card-image/constant.js index fb79ca7b8..b195b987b 100755 --- a/src/sharing/ui-card-image/constant.js +++ b/src/sharing/ui-card-image/constant.js @@ -1 +1 @@ -export const DEFAULT_IMAGE = "images/card-default.png"; +export const DEFAULT_IMAGE = "/images/card-default.png"; diff --git a/src/sharing/ui-footer/Footer.tsx b/src/sharing/ui-footer/Footer.tsx index fbc2a2765..88e19fe29 100755 --- a/src/sharing/ui-footer/Footer.tsx +++ b/src/sharing/ui-footer/Footer.tsx @@ -20,17 +20,41 @@ export const Footer = forwardRef((_, ref) => { diff --git a/src/sharing/ui-navigation-bar/constant.js b/src/sharing/ui-navigation-bar/constant.js index d974b4773..86b540bf4 100755 --- a/src/sharing/ui-navigation-bar/constant.js +++ b/src/sharing/ui-navigation-bar/constant.js @@ -2,4 +2,4 @@ export const TEXT = { login: "로그인", }; -export const LOGO_IMAGE = "images/linkbrary.svg"; +export const LOGO_IMAGE = "/images/linkbrary.svg"; From a09674d8306917ddbe368adc2eb68199bbec843d Mon Sep 17 00:00:00 2001 From: ckswnskfk Date: Wed, 24 Jan 2024 00:43:02 +0900 Subject: [PATCH 4/5] =?UTF-8?q?Feat:=20shared=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=99=84?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/shared/[folderId].tsx | 97 +++++++++++++++++++++++++++++++ pages/shared/index.tsx | 36 ------------ src/folder/type.ts | 5 +- src/link/util-map/mapLinksData.ts | 12 ++-- 4 files changed, 105 insertions(+), 45 deletions(-) create mode 100755 pages/shared/[folderId].tsx delete mode 100755 pages/shared/index.tsx diff --git a/pages/shared/[folderId].tsx b/pages/shared/[folderId].tsx new file mode 100755 index 000000000..78c442652 --- /dev/null +++ b/pages/shared/[folderId].tsx @@ -0,0 +1,97 @@ +import { Layout } from "@/src/sharing/feature-layout"; +import { SharedLayout } from "@/src/page-layout/SharedLayout"; +import { CardList } from "@/src/link/ui-card-list"; +import { FolderInfo } from "@/src/folder/ui-folder-info"; +import { ReadOnlyCard } from "@/src/link/ui-read-only-card"; +import { SearchBar } from "@/src/link/ui-search-bar"; +import { useSearchLink } from "@/src/link/util-search-link/useSearchLink"; +import { GetServerSideProps } from "next"; +import { axiosInstance } from "@/src/sharing/util"; +import { mapLinksData } from "@/src/link/util-map"; +import { LinkRawData } from "@/src/link/type"; +import { Folder } from "@/src/folder/type"; + +export const getServerSideProps: GetServerSideProps = async (context) => { + const folderId = context.query["folderId"]; + let userId; + let folder; + let owner; + let links; + + try { + const folderRes = await axiosInstance.get(`folders/${folderId}`); + folder = folderRes?.data?.data[0]; + userId = folder["user_id"]; + const ownerRes = await axiosInstance.get(`users/${userId}`); + owner = ownerRes?.data?.data[0]; + + const linksRes = await axiosInstance.get(`users/${userId}/links`); + links = linksRes?.data?.data; + } catch (error) { + return { + notFound: true, + }; + } + + return { + props: { + folder, + owner, + links, + }, + }; +}; + +interface Props { + folder: Folder; + links: LinkRawData[]; + owner: { + auth_id: string; + created_at: string; + email: string; + id: number; + image_source: string; + name: string; + }; +} + +const SharedPage = ({ folder, owner, links }: Props) => { + console.log("folder", folder); + console.log("owner", owner); + + const { name: folderName } = folder; + const { name: ownerName, image_source: profileImage } = owner; + const { searchValue, handleChange, handleCloseClick, result } = useSearchLink( + links?.map(mapLinksData) ?? [] + ); + + return ( + + + } + searchBar={ + + } + cardList={ + + {result?.map((link) => ( + + ))} + + } + /> + + ); +}; + +export default SharedPage; diff --git a/pages/shared/index.tsx b/pages/shared/index.tsx deleted file mode 100755 index f460d96fa..000000000 --- a/pages/shared/index.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { useGetFolder } from "@/src/folder/data-access-folder"; -import { Layout } from "@/src/sharing/feature-layout"; -import { SharedLayout } from "@/src/page-layout/SharedLayout"; -import { CardList } from "@/src/link/ui-card-list"; -import { FolderInfo } from "@/src/folder/ui-folder-info"; -import { ReadOnlyCard } from "@/src/link/ui-read-only-card"; -import { SearchBar } from "@/src/link/ui-search-bar"; -import { useSearchLink } from "@/src/link/util-search-link/useSearchLink"; - -const SharedPage = () => { - const { data } = useGetFolder(); - const { profileImage, ownerName, folderName, links } = data || {}; - const { searchValue, handleChange, handleCloseClick, result } = useSearchLink(links); - - return ( - - - } - searchBar={ - - } - cardList={ - - {result?.map((link) => ( - - ))} - - } - /> - - ); -}; - -export default SharedPage; diff --git a/src/folder/type.ts b/src/folder/type.ts index 147d77711..203dac660 100755 --- a/src/folder/type.ts +++ b/src/folder/type.ts @@ -23,10 +23,9 @@ export type FolderRawData = { export type Folder = { id: number; - createdAt: string; + created_at: string; name: string; - userId: number; - linkCount: number; + user_id: number; }; export type SelectedFolderId = number | "all"; diff --git a/src/link/util-map/mapLinksData.ts b/src/link/util-map/mapLinksData.ts index 894b8482a..9641eae27 100755 --- a/src/link/util-map/mapLinksData.ts +++ b/src/link/util-map/mapLinksData.ts @@ -3,22 +3,22 @@ import { getElapsedTime } from "@/src/sharing/util"; export const mapLinksData = (link: { id: number; - createdAt: string; - imageSource: string; + created_at: string; + image_source: string; url: string; title: string; description: string; }) => { - const { id, createdAt, url, imageSource, title, description } = link; + const { id, created_at, url, image_source, title, description } = link; return { id, title, url, - imageSource, + imageSource: image_source, alt: `${title ?? url}의 대표 이미지`, - elapsedTime: getElapsedTime(createdAt), + elapsedTime: getElapsedTime(created_at), description, - createdAt: format(new Date(createdAt), "yyyy. MM. dd"), + createdAt: format(new Date(created_at), "yyyy. MM. dd"), }; }; From 44d54b50c51a509a13588f2d2a5c478d7830bea8 Mon Sep 17 00:00:00 2001 From: ckswnskfk Date: Wed, 24 Jan 2024 13:54:55 +0900 Subject: [PATCH 5/5] =?UTF-8?q?Feat:=20folder=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EB=AF=B8=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/folder/[folderId].jsx | 40 +++++++++++++++++++ pages/shared/[folderId].tsx | 3 -- .../data-access-folder/useGetFolders.ts | 4 +- src/folder/type.ts | 10 +++++ src/folder/util-map/mapFoldersData.ts | 7 ++-- 5 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 pages/folder/[folderId].jsx diff --git a/pages/folder/[folderId].jsx b/pages/folder/[folderId].jsx new file mode 100644 index 000000000..648bcce5d --- /dev/null +++ b/pages/folder/[folderId].jsx @@ -0,0 +1,40 @@ +import { useGetFolders } from "@/src/folder/data-access-folder"; +import { useGetLinks } from "@/src/link/data-access-link"; +import { Layout } from "@/src/sharing/feature-layout"; +import { FolderLayout } from "@/src/page-layout/FolderLayout"; +import { FolderToolBar } from "@/src/folder/feature-folder-tool-bar"; +import { SearchBar } from "@/src/link/ui-search-bar"; +import { useState } from "react"; +import { ALL_LINKS_ID } from "@/src/link/data-access-link/constant"; +import { LinkForm } from "@/src/link/feature-link-form"; +import { CardList } from "@/src/link/feature-card-list"; +import { SelectedFolderId } from "@/src/folder/type"; +import { useSearchLink } from "@/src/link/util-search-link"; +import { useIntersectionObserver } from "@/src/sharing/util"; + +const FolderPage = () => { + return ( + + } + searchBar={ + + } + folderToolBar={ + + } + cardList={loading ? null : } + /> + + ); +}; + +export default FolderPage; diff --git a/pages/shared/[folderId].tsx b/pages/shared/[folderId].tsx index 78c442652..34332e048 100755 --- a/pages/shared/[folderId].tsx +++ b/pages/shared/[folderId].tsx @@ -56,9 +56,6 @@ interface Props { } const SharedPage = ({ folder, owner, links }: Props) => { - console.log("folder", folder); - console.log("owner", owner); - const { name: folderName } = folder; const { name: ownerName, image_source: profileImage } = owner; const { searchValue, handleChange, handleCloseClick, result } = useSearchLink( diff --git a/src/folder/data-access-folder/useGetFolders.ts b/src/folder/data-access-folder/useGetFolders.ts index 175d79bb1..9c5261d7a 100755 --- a/src/folder/data-access-folder/useGetFolders.ts +++ b/src/folder/data-access-folder/useGetFolders.ts @@ -1,10 +1,10 @@ -import { FolderRawData } from "@/src/folder/type"; +import { Folder } from "@/src/folder/type"; import { mapFoldersData } from "@/src/folder/util-map/mapFoldersData"; import { axiosInstance } from "@/src/sharing/util"; import { useAsync } from "@/src/sharing/util"; export const useGetFolders = () => { - const getFolders = () => axiosInstance.get<{ data: FolderRawData[] }>("users/1/folders"); + const getFolders = () => axiosInstance.get<{ data: Folder[] }>("folders"); const { loading, error, data } = useAsync(getFolders); const folders = mapFoldersData(data?.data); diff --git a/src/folder/type.ts b/src/folder/type.ts index 203dac660..267a47099 100755 --- a/src/folder/type.ts +++ b/src/folder/type.ts @@ -26,6 +26,16 @@ export type Folder = { created_at: string; name: string; user_id: number; + favorite: boolean; +}; + +export type FolderShown = { + id: number; + createdAt: string; + name: string; + userId: number; + favorite: boolean; + linkCount?: number; }; export type SelectedFolderId = number | "all"; diff --git a/src/folder/util-map/mapFoldersData.ts b/src/folder/util-map/mapFoldersData.ts index b827cd21a..ab2fb004e 100755 --- a/src/folder/util-map/mapFoldersData.ts +++ b/src/folder/util-map/mapFoldersData.ts @@ -1,16 +1,17 @@ -import { Folder, FolderRawData } from "@/src/folder/type"; +import { Folder, FolderShown } from "@/src/folder/type"; -export const mapFoldersData = (folders?: FolderRawData[]): Folder[] => { +export const mapFoldersData = (folders?: Folder[]): FolderShown[] => { if (!folders) return []; return folders.map((folder) => { - const { id, created_at, name, user_id, link } = folder; + const { id, created_at, name, user_id, favorite } = folder; return { id, createdAt: created_at, name, userId: user_id, + favorite, linkCount: link.count, }; });