├── apps ├── next-app │ ├── .husky │ │ └── _ │ │ │ ├── .gitignore │ │ │ ├── husky.sh │ │ │ ├── pre-push │ │ │ └── h │ ├── src │ │ ├── styles │ │ │ ├── variables.css │ │ │ ├── constants.ts │ │ │ ├── colors.ts │ │ │ ├── font.css │ │ │ ├── global.css │ │ │ ├── mediaQuery.ts │ │ │ ├── registry.tsx │ │ │ ├── dark.css │ │ │ └── light.css │ │ ├── constants │ │ │ ├── pagination.ts │ │ │ ├── auth.ts │ │ │ ├── url.ts │ │ │ ├── dateTime.ts │ │ │ └── route.ts │ │ ├── views │ │ │ └── myFeed │ │ │ │ ├── index.ts │ │ │ │ ├── MyFeed.style.ts │ │ │ │ └── MyFeed.tsx │ │ ├── components │ │ │ ├── common │ │ │ │ ├── Input │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── Input.tsx │ │ │ │ │ └── Input.style.ts │ │ │ │ ├── Tab │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── Tab.style.ts │ │ │ │ │ └── Tab.tsx │ │ │ │ ├── Button │ │ │ │ │ ├── index.ts │ │ │ │ │ └── Button.tsx │ │ │ │ ├── Dialog │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── DialogTitle.tsx │ │ │ │ │ ├── DialogContent.tsx │ │ │ │ │ ├── DialogActions.tsx │ │ │ │ │ ├── Dialog.tsx │ │ │ │ │ └── Dialog.style.tsx │ │ │ │ ├── Layout │ │ │ │ │ ├── Nav │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── Profile.tsx │ │ │ │ │ │ └── Nav.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── Layout.style.tsx │ │ │ │ │ └── Layout.tsx │ │ │ │ ├── Loading │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── Loading.tsx │ │ │ │ │ └── Loading.style.tsx │ │ │ │ ├── Paging │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── Page.tsx │ │ │ │ │ ├── Paging.style.tsx │ │ │ │ │ └── hooks │ │ │ │ │ │ └── usePageInfo.tsx │ │ │ │ ├── Popover │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── PopoverLayout.tsx │ │ │ │ │ └── PopoverItem.tsx │ │ │ │ ├── Scripts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── Scripts.tsx │ │ │ │ ├── FeedItem │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── FeedItem.utils.ts │ │ │ │ │ ├── Post │ │ │ │ │ │ └── Post.style.tsx │ │ │ │ │ ├── Popovers │ │ │ │ │ │ ├── icons.tsx │ │ │ │ │ │ └── PublicFeedItemPopover.tsx │ │ │ │ │ ├── Channel │ │ │ │ │ │ └── Channel.style.tsx │ │ │ │ │ ├── hooks │ │ │ │ │ │ ├── useToggleLike.ts │ │ │ │ │ │ └── useReadPost.ts │ │ │ │ │ └── FeedItem.tsx │ │ │ │ ├── Modal │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── ModalLayout.tsx │ │ │ │ │ ├── ModalLayout.styles.tsx │ │ │ │ │ ├── DimmerLayout.tsx │ │ │ │ │ └── useModal.tsx │ │ │ │ ├── Skeleton │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── ChannelType.tsx │ │ │ │ │ └── PostType.tsx │ │ │ │ ├── Notification │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── Notification.tsx │ │ │ │ │ └── Notification.style.tsx │ │ │ │ ├── Anchor │ │ │ │ │ └── index.tsx │ │ │ │ ├── Portal │ │ │ │ │ └── index.tsx │ │ │ │ ├── PageContainer │ │ │ │ │ └── index.tsx │ │ │ │ ├── LogoIcon │ │ │ │ │ └── index.tsx │ │ │ │ ├── EmptyContents │ │ │ │ │ └── index.tsx │ │ │ │ ├── ToastIcon │ │ │ │ │ └── index.tsx │ │ │ │ ├── ColorModeScript │ │ │ │ │ └── index.tsx │ │ │ │ ├── Divider │ │ │ │ │ └── index.tsx │ │ │ │ ├── Toast │ │ │ │ │ ├── Toast.tsx │ │ │ │ │ └── methods.tsx │ │ │ │ ├── Providers │ │ │ │ │ └── index.tsx │ │ │ │ ├── LogoDesktop │ │ │ │ │ └── index.tsx │ │ │ │ └── Flex │ │ │ │ │ └── index.tsx │ │ │ └── views │ │ │ │ ├── Error │ │ │ │ ├── 404 │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── 404Container.style.tsx │ │ │ │ │ └── 404Container.tsx │ │ │ │ ├── 500 │ │ │ │ │ ├── index.ts │ │ │ │ │ └── 500Container.tsx │ │ │ │ ├── index.ts │ │ │ │ └── error.style.tsx │ │ │ │ ├── Feeds │ │ │ │ ├── MyFeed │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── FeedsContainer.style.tsx │ │ │ │ ├── Recommended │ │ │ │ │ ├── RecommendedPosts.tsx │ │ │ │ │ └── RecommendedChannels.tsx │ │ │ │ ├── FeedsContainer.tsx │ │ │ │ └── FeedTab │ │ │ │ │ └── styles.tsx │ │ │ │ ├── UserPage │ │ │ │ ├── List │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── PostList │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── hooks │ │ │ │ │ │ │ └── usePostListByUsername.ts │ │ │ │ │ ├── ChannelList │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── hooks │ │ │ │ │ │ │ └── useChannelListByUsername.ts │ │ │ │ │ ├── List.style.ts │ │ │ │ │ └── List.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── UserPageContainer.utils.ts │ │ │ │ └── UserPageContainer.style.ts │ │ │ │ ├── RssInput │ │ │ │ ├── index.ts │ │ │ │ ├── hooks │ │ │ │ │ ├── index.ts │ │ │ │ │ └── useControlled.ts │ │ │ │ ├── RssInputContainer.utils.ts │ │ │ │ ├── RssUrlInput.tsx │ │ │ │ └── BlogUrlInput.tsx │ │ │ │ ├── MyAccount │ │ │ │ └── index.ts │ │ │ │ └── Channel │ │ │ │ ├── ChannelDetailContainer.style.ts │ │ │ │ └── ChannalSubscription.tsx │ │ ├── shared │ │ │ ├── ui │ │ │ │ └── FeedTab │ │ │ │ │ ├── index.ts │ │ │ │ │ └── styles.tsx │ │ │ ├── utils │ │ │ │ ├── checkLoggedIn.ts │ │ │ │ └── mutex.ts │ │ │ └── libs │ │ │ │ ├── context.ts │ │ │ │ └── nextjs.ts │ │ ├── app │ │ │ ├── (hasGNB) │ │ │ │ ├── _components │ │ │ │ │ ├── Nav │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── GoToSignUpButton.tsx │ │ │ │ │ │ ├── LogoButton.tsx │ │ │ │ │ │ └── Nav.tsx │ │ │ │ │ └── Container │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── Container.tsx │ │ │ │ ├── layout.tsx │ │ │ │ └── feed │ │ │ │ │ ├── layout.tsx │ │ │ │ │ └── me │ │ │ │ │ └── page.tsx │ │ │ ├── page.tsx │ │ │ ├── signup │ │ │ │ ├── layout.tsx │ │ │ │ ├── _utils │ │ │ │ │ └── SignUp.utils.ts │ │ │ │ ├── page.tsx │ │ │ │ └── SignUp.style.tsx │ │ │ ├── introduce │ │ │ │ ├── _components │ │ │ │ │ ├── IntroduceHeaderTitle.tsx │ │ │ │ │ ├── IntroduceHeaderBanner.tsx │ │ │ │ │ ├── FeedoongSticker.tsx │ │ │ │ │ ├── StartFeedoongWithGoogle.tsx │ │ │ │ │ ├── IntroduceFeature3.tsx │ │ │ │ │ ├── IntroduceFeature2.tsx │ │ │ │ │ └── IntroduceFeature1.tsx │ │ │ │ ├── layout.tsx │ │ │ │ └── page.tsx │ │ │ └── providers.tsx │ │ ├── features │ │ │ ├── post │ │ │ │ └── ui │ │ │ │ │ └── PostFeedItem │ │ │ │ │ ├── index.ts │ │ │ │ │ └── PostFeedItem.style.tsx │ │ │ ├── auth │ │ │ │ ├── tokenRefreshMutex.ts │ │ │ │ └── logout.ts │ │ │ ├── errors │ │ │ │ ├── errors.ts │ │ │ │ └── globalQueryErrorHandler.ts │ │ │ └── user │ │ │ │ ├── useCheckIsMyProfile.ts │ │ │ │ └── userProfile.ts │ │ ├── utils │ │ │ ├── index.ts │ │ │ ├── env.ts │ │ │ ├── date.ts │ │ │ ├── hooks │ │ │ │ ├── index.ts │ │ │ │ ├── useColors.ts │ │ │ │ ├── useLockBodyScroll.ts │ │ │ │ ├── useGoogleAnalytics.ts │ │ │ │ └── useColorMode.ts │ │ │ ├── gtag.ts │ │ │ ├── common.ts │ │ │ ├── url.ts │ │ │ ├── errors.ts │ │ │ └── auth.ts │ │ ├── assets │ │ │ ├── images │ │ │ │ ├── User.png │ │ │ │ ├── introduce_1.webp │ │ │ │ ├── introduce_2.webp │ │ │ │ ├── introduce_3.webp │ │ │ │ ├── introduce_header.webp │ │ │ │ └── index.ts │ │ │ ├── channels │ │ │ │ ├── kakao.ico │ │ │ │ ├── toss.ico │ │ │ │ ├── velog.ico │ │ │ │ ├── brunch.ico │ │ │ │ ├── chrome.png │ │ │ │ ├── tistory.ico │ │ │ │ ├── vercel.png │ │ │ │ ├── vscode.ico │ │ │ │ ├── youtube.ico │ │ │ │ ├── naver_blog.ico │ │ │ │ ├── nhnToast.ico │ │ │ │ ├── hyperconnect.ico │ │ │ │ └── index.ts │ │ │ ├── icons │ │ │ │ ├── account.png │ │ │ │ ├── add.svg │ │ │ │ ├── bookmark.svg │ │ │ │ ├── bookmark-deactive.svg │ │ │ │ ├── Darkmode.svg │ │ │ │ ├── toast-basic.svg │ │ │ │ ├── toast-error.svg │ │ │ │ ├── lightning-mono.svg │ │ │ │ ├── right_arrow.svg │ │ │ │ ├── logo-desktop-no-background.svg │ │ │ │ ├── folder-mono.svg │ │ │ │ ├── logo-desktop.svg │ │ │ │ ├── star.svg │ │ │ │ ├── add-mono.svg │ │ │ │ ├── google_icon.svg │ │ │ │ ├── notification-icon.svg │ │ │ │ ├── left_arrow.svg │ │ │ │ ├── card_view.svg │ │ │ │ ├── card_view-deactive.svg │ │ │ │ ├── x-mono.svg │ │ │ │ ├── rss-circle.svg │ │ │ │ ├── dot-vertical.svg │ │ │ │ ├── menu_icon.svg │ │ │ │ ├── cancel.svg │ │ │ │ └── trashcan.svg │ │ │ └── fonts │ │ │ │ └── Satoshi-Bold.woff2 │ │ ├── pages │ │ │ ├── 404.tsx │ │ │ ├── 500.tsx │ │ │ ├── mypage │ │ │ │ └── account │ │ │ │ │ └── index.tsx │ │ │ ├── [userName].tsx │ │ │ ├── channels │ │ │ │ └── [id].tsx │ │ │ ├── feed │ │ │ │ └── recommended │ │ │ │ │ ├── channels │ │ │ │ │ └── index.tsx │ │ │ │ │ └── posts │ │ │ │ │ └── index.tsx │ │ │ └── oauth │ │ │ │ └── index.tsx │ │ ├── types │ │ │ ├── colorMode.ts │ │ │ ├── common.ts │ │ │ ├── subscriptions.ts │ │ │ └── feeds.ts │ │ ├── entities │ │ │ ├── user │ │ │ │ └── api │ │ │ │ │ └── index.ts │ │ │ └── item │ │ │ │ └── api │ │ │ │ └── index.ts │ │ ├── services │ │ │ ├── cacheKeys.ts │ │ │ ├── types │ │ │ │ └── _generated │ │ │ │ │ ├── status-controller.ts │ │ │ │ │ ├── like.ts │ │ │ │ │ └── subscription.ts │ │ │ └── auth │ │ │ │ └── index.ts │ │ ├── middleware.ts │ │ ├── envs │ │ │ └── index.ts │ │ └── core │ │ │ └── getQueryClient.ts │ ├── .gitignore │ ├── .dockerignore │ ├── public │ │ ├── og_image.png │ │ └── logo-desktop.svg │ ├── Dockerfile │ ├── orval.config.js │ ├── scripts │ │ ├── syncCodeGenSpec.mjs │ │ └── codeGen.mjs │ ├── tsconfig.json │ └── next.config.js └── extension │ ├── favicon.png │ ├── index.js │ ├── index.html │ └── manifest.json ├── .yarnrc.yml ├── appspec.yml ├── .prettierrc ├── .yarn └── sdks │ ├── integrations.yml │ ├── prettier │ ├── package.json │ ├── index.cjs │ └── bin │ │ └── prettier.cjs │ ├── typescript │ ├── package.json │ ├── lib │ │ ├── typescript.js │ │ └── tsc.js │ └── bin │ │ ├── tsc │ │ └── tsserver │ └── eslint │ ├── package.json │ ├── lib │ ├── api.js │ └── unsupported-api.js │ └── bin │ └── eslint.js ├── .gitattributes ├── .vscode ├── extensions.json └── settings.json ├── .github ├── pull_request_template.md ├── workflows │ └── auto_assign.yml └── auto_assign_config.yml ├── .editorconfig ├── README.md ├── deploy.sh ├── package.json ├── tsconfig.json └── .gitignore /apps/next-app/.husky/_/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/next-app/.husky/_/husky.sh: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/next-app/src/styles/variables.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | yarnPath: .yarn/releases/yarn-4.3.1.cjs 2 | -------------------------------------------------------------------------------- /apps/next-app/src/constants/pagination.ts: -------------------------------------------------------------------------------- 1 | export const ITEMS_PER_PAGE = 10 2 | -------------------------------------------------------------------------------- /apps/next-app/src/views/myFeed/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './MyFeed' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Input/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './Input' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Tab/index.tsx: -------------------------------------------------------------------------------- 1 | export { default } from './Tab' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/shared/ui/FeedTab/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './FeedTab' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/app/(hasGNB)/_components/Nav/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './Nav' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Button/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './Button' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Dialog/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './Dialog' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Layout/Nav/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './Nav' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Layout/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './Layout' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Loading/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './Loading' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Paging/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './Paging' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Popover/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './Popover' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Scripts/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './Scripts' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/features/post/ui/PostFeedItem/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PostFeedItem' 2 | -------------------------------------------------------------------------------- /apps/next-app/.gitignore: -------------------------------------------------------------------------------- 1 | .yarn/install-state.gz 2 | 3 | .env 4 | # Sentry 5 | .sentryclirc 6 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/FeedItem/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './FeedItem' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/views/Error/404/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './404Container' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/views/Error/500/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './500Container' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/views/Feeds/MyFeed/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './MyFeed' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/views/Feeds/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './FeedsContainer' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/views/UserPage/List/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './List' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/app/(hasGNB)/_components/Container/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './Container' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/views/RssInput/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './RssInputContainer' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/views/UserPage/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './UserPageContainer' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/views/MyAccount/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './MyAccountContainer' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/components/views/UserPage/List/PostList/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './PostList' 2 | -------------------------------------------------------------------------------- /appspec.yml: -------------------------------------------------------------------------------- 1 | version: 0.0 2 | os: linux 3 | hooks: 4 | ApplicationStart: 5 | - location: deploy.sh 6 | -------------------------------------------------------------------------------- /apps/next-app/src/components/views/UserPage/List/ChannelList/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './ChannelList' 2 | -------------------------------------------------------------------------------- /apps/next-app/src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './url' 2 | export * from './date' 3 | export * from './env' 4 | -------------------------------------------------------------------------------- /apps/extension/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/extension/favicon.png -------------------------------------------------------------------------------- /apps/next-app/src/app/page.tsx: -------------------------------------------------------------------------------- 1 | const HomePage = () => { 2 | return <> 3 | } 4 | 5 | export default HomePage 6 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 2, 4 | "semi": false, 5 | "singleQuote": true 6 | } 7 | -------------------------------------------------------------------------------- /apps/next-app/.dockerignore: -------------------------------------------------------------------------------- 1 | Dockerfile 2 | .dockerignore 3 | node_modules 4 | npm-debug.log 5 | README.md 6 | .next 7 | .git 8 | -------------------------------------------------------------------------------- /apps/next-app/public/og_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/public/og_image.png -------------------------------------------------------------------------------- /apps/next-app/src/constants/auth.ts: -------------------------------------------------------------------------------- 1 | export const AccessToken = 'accessToken' 2 | export const RefreshToken = 'refreshToken' 3 | -------------------------------------------------------------------------------- /apps/next-app/.husky/_/pre-push: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "${0%/*}/husky.sh" 3 | 4 | cd apps/next-app 5 | yarn lint 6 | yarn tsc 7 | -------------------------------------------------------------------------------- /apps/next-app/src/assets/images/User.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/images/User.png -------------------------------------------------------------------------------- /apps/next-app/src/assets/channels/kakao.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/channels/kakao.ico -------------------------------------------------------------------------------- /apps/next-app/src/assets/channels/toss.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/channels/toss.ico -------------------------------------------------------------------------------- /apps/next-app/src/assets/channels/velog.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/channels/velog.ico -------------------------------------------------------------------------------- /apps/next-app/src/assets/icons/account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/icons/account.png -------------------------------------------------------------------------------- /apps/next-app/src/assets/channels/brunch.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/channels/brunch.ico -------------------------------------------------------------------------------- /apps/next-app/src/assets/channels/chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/channels/chrome.png -------------------------------------------------------------------------------- /apps/next-app/src/assets/channels/tistory.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/channels/tistory.ico -------------------------------------------------------------------------------- /apps/next-app/src/assets/channels/vercel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/channels/vercel.png -------------------------------------------------------------------------------- /apps/next-app/src/assets/channels/vscode.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/channels/vscode.ico -------------------------------------------------------------------------------- /apps/next-app/src/assets/channels/youtube.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/channels/youtube.ico -------------------------------------------------------------------------------- /apps/next-app/src/assets/channels/naver_blog.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/channels/naver_blog.ico -------------------------------------------------------------------------------- /apps/next-app/src/assets/channels/nhnToast.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/channels/nhnToast.ico -------------------------------------------------------------------------------- /apps/next-app/src/assets/images/introduce_1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/images/introduce_1.webp -------------------------------------------------------------------------------- /apps/next-app/src/assets/images/introduce_2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/images/introduce_2.webp -------------------------------------------------------------------------------- /apps/next-app/src/assets/images/introduce_3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/images/introduce_3.webp -------------------------------------------------------------------------------- /apps/next-app/src/styles/constants.ts: -------------------------------------------------------------------------------- 1 | export const Z_INDEX = { 2 | popOver: 10, 3 | navBar: 1_000, 4 | modal: 10_000, 5 | toast: 20_000, 6 | } 7 | -------------------------------------------------------------------------------- /.yarn/sdks/integrations.yml: -------------------------------------------------------------------------------- 1 | # This file is automatically generated by @yarnpkg/sdks. 2 | # Manual changes might be lost! 3 | 4 | integrations: 5 | - vscode 6 | -------------------------------------------------------------------------------- /apps/next-app/src/assets/channels/hyperconnect.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/channels/hyperconnect.ico -------------------------------------------------------------------------------- /apps/next-app/src/assets/fonts/Satoshi-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/fonts/Satoshi-Bold.woff2 -------------------------------------------------------------------------------- /apps/next-app/src/assets/images/introduce_header.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feedoong/feedoong-frontend/HEAD/apps/next-app/src/assets/images/introduce_header.webp -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | /.yarn/** linguist-vendored 2 | /.yarn/releases/* binary 3 | /.yarn/plugins/**/* binary 4 | /.pnp.* binary linguist-generated 5 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "arcanis.vscode-zipfs", 4 | "dbaeumer.vscode-eslint", 5 | "esbenp.prettier-vscode" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /apps/extension/index.js: -------------------------------------------------------------------------------- 1 | chrome.tabs.getCurrent(function (tab) { 2 | chrome.tabs.update(tab.id, { 3 | url: "https://feedoong.io", 4 | highlighted: true, 5 | }); 6 | }); 7 | -------------------------------------------------------------------------------- /apps/next-app/src/components/views/UserPage/List/List.style.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | 3 | export const ListContainer = styled.div` 4 | width: 100%; 5 | ` 6 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Motivation 🤔 2 | 3 | - 4 | 5 |
6 | 7 | ## Key Changes 🔑 8 | 9 | - 10 | 11 |
12 | 13 | ## To Reviews 🙏🏻 14 | 15 | - 16 | -------------------------------------------------------------------------------- /apps/next-app/src/constants/url.ts: -------------------------------------------------------------------------------- 1 | export const FEEDOONG_EXTENSION_URL = 2 | 'https://chrome.google.com/webstore/detail/feedoong-rss-feed-reader/djocleehibgjoijlphimcjilcflimjdn/' 3 | -------------------------------------------------------------------------------- /.yarn/sdks/prettier/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "prettier", 3 | "version": "3.2.5-sdk", 4 | "main": "./index.cjs", 5 | "type": "commonjs", 6 | "bin": "./bin/prettier.cjs" 7 | } 8 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Modal/index.ts: -------------------------------------------------------------------------------- 1 | export { useModal } from './useModal' 2 | export { DimmerLayout } from './DimmerLayout' 3 | export { ModalLayout } from './ModalLayout' 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | 7 | [*.{js,json,yml}] 8 | charset = utf-8 9 | indent_style = space 10 | indent_size = 2 11 | -------------------------------------------------------------------------------- /apps/next-app/src/components/views/Error/index.ts: -------------------------------------------------------------------------------- 1 | import Custom404 from './404' 2 | import Custom500 from './500' 3 | 4 | export { Custom404 as Custom404Container, Custom500 as Custom500Container } 5 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Skeleton/index.ts: -------------------------------------------------------------------------------- 1 | import SkeletonPostType from './PostType' 2 | import SkeletonChannelType from './ChannelType' 3 | 4 | export { SkeletonPostType, SkeletonChannelType } 5 | -------------------------------------------------------------------------------- /apps/next-app/src/utils/env.ts: -------------------------------------------------------------------------------- 1 | export const isServer = () => { 2 | return typeof window === 'undefined' 3 | } 4 | 5 | export const isProduction = () => { 6 | return process.env.NEXT_PUBLIC_APP_ENV === 'production' 7 | } 8 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Notification/index.ts: -------------------------------------------------------------------------------- 1 | import { clear, show, config } from './methods' 2 | 3 | const Notification = { 4 | show, 5 | clear, 6 | config, 7 | } 8 | 9 | export default Notification 10 | -------------------------------------------------------------------------------- /apps/next-app/src/constants/dateTime.ts: -------------------------------------------------------------------------------- 1 | export const SECOND = 1000 2 | export const MINUTE = SECOND * 60 3 | export const HOUR = MINUTE * 60 4 | export const DAY = HOUR * 24 5 | export const WEEK = DAY * 7 6 | export const MONTH = DAY * 30 7 | -------------------------------------------------------------------------------- /apps/next-app/src/views/myFeed/MyFeed.style.ts: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import styled from 'styled-components' 4 | 5 | export const CardContainer = styled.ul` 6 | display: flex; 7 | gap: 20px; 8 | flex-direction: column; 9 | ` 10 | -------------------------------------------------------------------------------- /apps/next-app/src/pages/404.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { Custom404Container } from 'components/views/Error' 4 | 5 | const Custom404 = () => { 6 | return 7 | } 8 | 9 | export default Custom404 10 | -------------------------------------------------------------------------------- /apps/next-app/src/pages/500.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { Custom500Container } from 'components/views/Error' 4 | 5 | const Custom500 = () => { 6 | return 7 | } 8 | 9 | export default Custom500 10 | -------------------------------------------------------------------------------- /apps/next-app/src/utils/date.ts: -------------------------------------------------------------------------------- 1 | import dayjs from 'dayjs' 2 | 3 | export const getFormatDate = ( 4 | date: Parameters[0], 5 | format: Parameters['format']>[0] 6 | ) => { 7 | return dayjs(date).format(format) 8 | } 9 | -------------------------------------------------------------------------------- /.yarn/sdks/typescript/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typescript", 3 | "version": "5.5.2-sdk", 4 | "main": "./lib/typescript.js", 5 | "type": "commonjs", 6 | "bin": { 7 | "tsc": "./bin/tsc", 8 | "tsserver": "./bin/tsserver" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /apps/next-app/src/pages/mypage/account/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import MyAccountContainer from 'components/views/MyAccount' 4 | 5 | const MyAccount = () => { 6 | return 7 | } 8 | 9 | export default MyAccount 10 | -------------------------------------------------------------------------------- /apps/next-app/src/utils/hooks/index.ts: -------------------------------------------------------------------------------- 1 | import { useGoogleAnalytics } from './useGoogleAnalytics' 2 | import { useLockBodyScroll } from './useLockBodyScroll' 3 | import { useColorMode } from './useColorMode' 4 | 5 | export { useGoogleAnalytics, useLockBodyScroll, useColorMode } 6 | -------------------------------------------------------------------------------- /apps/next-app/src/components/views/RssInput/hooks/index.ts: -------------------------------------------------------------------------------- 1 | import useControlled from './useControlled' 2 | import useRssInput from './useRssInput' 3 | import useRssDirectInputModal from './useRssDirectInputModal' 4 | 5 | export { useControlled, useRssInput, useRssDirectInputModal } 6 | -------------------------------------------------------------------------------- /apps/next-app/src/app/(hasGNB)/_components/Container/Container.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | import styled from 'styled-components' 3 | 4 | const Container = styled.main` 5 | min-height: calc(100dvh - 75px); 6 | padding-top: 75px; // Nav 높이 만큼 7 | ` 8 | 9 | export default Container 10 | -------------------------------------------------------------------------------- /apps/next-app/src/assets/icons/add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/next-app/src/shared/utils/checkLoggedIn.ts: -------------------------------------------------------------------------------- 1 | import type { ReadonlyRequestCookies } from 'next/dist/server/web/spec-extension/adapters/request-cookies' 2 | 3 | export const checkLoggedIn = (cookies: ReadonlyRequestCookies) => { 4 | return Boolean(cookies.get('accessToken')?.value) 5 | } 6 | -------------------------------------------------------------------------------- /apps/next-app/src/utils/gtag.ts: -------------------------------------------------------------------------------- 1 | // https://developers.google.com/analytics/devguides/collection/gtagjs/pages 2 | export const pageview = (url: string) => { 3 | ;(window as any).gtag( 4 | 'config', 5 | process.env.NEXT_PUBLIC_GA_TRACKING_ID as string, 6 | { page_path: url } 7 | ) 8 | } 9 | -------------------------------------------------------------------------------- /apps/next-app/src/shared/libs/context.ts: -------------------------------------------------------------------------------- 1 | import type { IncomingMessage } from 'http' 2 | 3 | export let asyncLocalStorage: any 4 | const isServer = typeof window === 'undefined' 5 | 6 | if (isServer) { 7 | asyncLocalStorage = new AsyncLocalStorage<{ 8 | req: IncomingMessage 9 | }>() 10 | } 11 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Dialog/DialogTitle.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import * as S from './Dialog.style' 4 | 5 | interface Props { 6 | children: React.ReactNode 7 | } 8 | 9 | export const DialogTitle = ({ children }: Props) => { 10 | return {children} 11 | } 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### FEEDOONG-Frontend 2 | 3 | > **인사이트가 피둥피둥** 4 | > 5 | > 여기저기 둥둥 떠다니는 나의 인사이트 컨텐츠들을 피둥에서 모아보세요! 6 | 7 | ## 👨‍💻 만든 사람들 8 | 9 | - 신은선 [:octocat:](https://github.com/eunsonny) [📚](https://eunsonny.github.io/) 10 | - 오종택 [:octocat:](https://github.com/saengmotmi) [📚](https://saengmotmi.netlify.app/) 11 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Dialog/DialogContent.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import * as S from './Dialog.style' 4 | 5 | interface Props { 6 | children: React.ReactNode 7 | } 8 | 9 | export const DialogContent = ({ children }: Props) => { 10 | return {children} 11 | } 12 | -------------------------------------------------------------------------------- /apps/next-app/src/types/colorMode.ts: -------------------------------------------------------------------------------- 1 | import type useColors from 'utils/hooks/useColors' 2 | 3 | export type ColorModeType = 'dark' | 'light' 4 | 5 | export type ColorModeColorKey = keyof ReturnType['colorSet'] 6 | export type ColorModeColorValue = ReturnType< 7 | typeof useColors 8 | >['colorSet'][ColorModeColorKey] 9 | -------------------------------------------------------------------------------- /apps/next-app/src/app/signup/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactNode } from 'react' 2 | 3 | import * as S from './SignUp.style' 4 | 5 | interface Props { 6 | children: ReactNode 7 | } 8 | 9 | const SignUpLayout = ({ children }: Props) => { 10 | return {children} 11 | } 12 | 13 | export default SignUpLayout 14 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Dialog/DialogActions.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import * as S from './Dialog.style' 4 | 5 | interface Props { 6 | children: React.ReactNode 7 | } 8 | 9 | export const DialogActions = ({ children }: Props) => { 10 | return {children} 11 | } 12 | -------------------------------------------------------------------------------- /apps/next-app/src/features/auth/tokenRefreshMutex.ts: -------------------------------------------------------------------------------- 1 | import Mutex from 'shared/utils/mutex' 2 | 3 | // 클라이언트에서만 `Mutex` 인스턴스를 생성하고, 서버에서는 `null`을 export 4 | let tokenRefreshMutex: Mutex | null = null 5 | 6 | if (typeof window !== 'undefined') { 7 | tokenRefreshMutex = new Mutex() 8 | } 9 | 10 | export default tokenRefreshMutex 11 | -------------------------------------------------------------------------------- /apps/next-app/src/features/errors/errors.ts: -------------------------------------------------------------------------------- 1 | import httpStatus from 'http-status-codes' 2 | 3 | export const isErrorPage = (pathname: string) => { 4 | return [ 5 | `/${httpStatus.NOT_FOUND}`, // 400 6 | `/${httpStatus.INTERNAL_SERVER_ERROR}`, // 500 7 | ].some((path) => { 8 | return pathname === path 9 | }) 10 | } 11 | -------------------------------------------------------------------------------- /apps/next-app/src/components/views/Error/404/404Container.style.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | 3 | import { getTypographyStyles } from 'styles/fonts' 4 | 5 | export const SubDescription = styled.div` 6 | ${getTypographyStyles('Headline3_M')} 7 | color: var(--color-font-secondary); 8 | text-align: center; 9 | ` 10 | -------------------------------------------------------------------------------- /apps/next-app/src/components/views/UserPage/UserPageContainer.utils.ts: -------------------------------------------------------------------------------- 1 | import { getDomainName } from 'envs' 2 | import type { PublicUserInfoResponse } from 'services/types/_generated/apiDocumentation.schemas' 3 | 4 | export const getFeedoongUrl = (userProfile?: PublicUserInfoResponse) => { 5 | return `${getDomainName()}/${userProfile?.username}` 6 | } 7 | -------------------------------------------------------------------------------- /apps/next-app/src/features/user/useCheckIsMyProfile.ts: -------------------------------------------------------------------------------- 1 | import { useRouter } from 'next/router' 2 | 3 | import { useGetUserProfile } from './userProfile' 4 | 5 | export const useCheckIsMyProfile = () => { 6 | const router = useRouter() 7 | const { data: me } = useGetUserProfile() 8 | 9 | return router.query.userName === me?.username 10 | } 11 | -------------------------------------------------------------------------------- /apps/next-app/src/utils/common.ts: -------------------------------------------------------------------------------- 1 | export const mergeObjectsByMutate = (target: any, source: any) => { 2 | for (const key of Object.keys(source)) { 3 | if (source[key] instanceof Object) 4 | Object.assign(source[key], mergeObjectsByMutate(target[key], source[key])) 5 | } 6 | 7 | Object.assign(target || {}, source) 8 | return target 9 | } 10 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | 2 | 3 | docker stop feedoong-frontend 4 | docker rm feedoong-frontend 5 | 6 | docker rmi $(docker images jamessoun93/feedoong-frontend -q) 7 | 8 | docker pull jamessoun93/feedoong-frontend 9 | 10 | docker run --name feedoong-frontend -d -p 3000:3000 jamessoun93/feedoong-frontend:latest 11 | 12 | echo "Deployment script executed successfully." 13 | -------------------------------------------------------------------------------- /apps/next-app/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20-alpine 2 | 3 | WORKDIR /app 4 | 5 | COPY ./apps/next-app/package* ./ 6 | COPY yarn.lock .pnp* ./ 7 | COPY .yarnrc.yml ./ 8 | COPY .yarn .yarn 9 | 10 | RUN yarn install 11 | 12 | COPY ./apps/next-app . 13 | 14 | RUN yarn build 15 | 16 | EXPOSE 3000 17 | 18 | CMD ["yarn", "start"] 19 | -------------------------------------------------------------------------------- /.yarn/sdks/eslint/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eslint", 3 | "version": "8.57.0-sdk", 4 | "main": "./lib/api.js", 5 | "type": "commonjs", 6 | "bin": { 7 | "eslint": "./bin/eslint.js" 8 | }, 9 | "exports": { 10 | "./package.json": "./package.json", 11 | ".": "./lib/api.js", 12 | "./use-at-your-own-risk": "./lib/unsupported-api.js" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /apps/extension/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /apps/next-app/src/app/introduce/_components/IntroduceHeaderTitle.tsx: -------------------------------------------------------------------------------- 1 | import * as S from '../Introduce.style' 2 | 3 | const IntroduceHeaderTitle = () => { 4 | return ( 5 | 6 | 여기저기 둥둥💭 떠있는 나의 인사이트💡 콘텐츠📚를{' '} 7 | 피둥🐽으로 모아보세요. 8 | 9 | ) 10 | } 11 | 12 | export default IntroduceHeaderTitle 13 | -------------------------------------------------------------------------------- /apps/next-app/orval.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | feedoongApp: { 3 | input: 'src/services/spec.json', 4 | output: { 5 | target: 'src/services/types/_generated', 6 | mode: 'tags', 7 | override: { 8 | mutator: { 9 | path: 'src/services/api/index.ts', 10 | name: 'feedoongApi', 11 | }, 12 | }, 13 | }, 14 | }, 15 | } 16 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Loading/Loading.tsx: -------------------------------------------------------------------------------- 1 | import * as S from './Loading.style' 2 | 3 | const Loading: React.FC = () => { 4 | return ( 5 | 6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | ) 14 | } 15 | 16 | export default Loading 17 | -------------------------------------------------------------------------------- /apps/next-app/src/utils/hooks/useColors.ts: -------------------------------------------------------------------------------- 1 | import { DARK_MODE_COLORS, LIGHT_MODE_COLORS } from 'constants/colorMode' 2 | import { useColorMode } from './useColorMode' 3 | 4 | const useColors = () => { 5 | const { isDarkMode } = useColorMode() 6 | 7 | return { 8 | colorSet: isDarkMode ? DARK_MODE_COLORS : LIGHT_MODE_COLORS, 9 | isDarkMode, 10 | } 11 | } 12 | 13 | export default useColors 14 | -------------------------------------------------------------------------------- /apps/next-app/src/app/introduce/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactNode } from 'react' 2 | 3 | import * as S from './Introduce.style' 4 | 5 | interface Props { 6 | children: ReactNode 7 | } 8 | 9 | const IntroduceLayout = ({ children }: Props) => { 10 | return ( 11 | 12 | {children} 13 | 14 | ) 15 | } 16 | 17 | export default IntroduceLayout 18 | -------------------------------------------------------------------------------- /apps/next-app/src/assets/icons/bookmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/next-app/src/pages/[userName].tsx: -------------------------------------------------------------------------------- 1 | import type { NextPage } from 'next' 2 | 3 | import UserPageContainer from 'components/views/UserPage' 4 | import { withPrefetchUser } from 'features/auth/withAuthQueryServerSideProps' 5 | 6 | const UserProfile: NextPage = () => { 7 | return 8 | } 9 | 10 | export default UserProfile 11 | 12 | export const getServerSideProps = withPrefetchUser 13 | -------------------------------------------------------------------------------- /apps/next-app/src/assets/icons/bookmark-deactive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/next-app/src/utils/hooks/useLockBodyScroll.ts: -------------------------------------------------------------------------------- 1 | 'use client' 2 | import { useLayoutEffect } from 'react' 3 | 4 | export const useLockBodyScroll = () => { 5 | useLayoutEffect(() => { 6 | const originalStyle = window.getComputedStyle(document.body).overflow 7 | document.body.style.overflow = 'hidden' 8 | 9 | return () => { 10 | document.body.style.overflow = originalStyle 11 | } 12 | }, []) 13 | } 14 | -------------------------------------------------------------------------------- /apps/next-app/src/components/common/Layout/Layout.style.tsx: -------------------------------------------------------------------------------- 1 | import styled, { css } from 'styled-components' 2 | 3 | export const Container = styled.main<{ $fullHeight: boolean }>` 4 | min-height: calc(100dvh - 75px); 5 | padding-top: 75px; // Nav 높이 만큼 6 | 7 | ${({ $fullHeight }) => 8 | $fullHeight 9 | ? css` 10 | min-height: 100dvh; 11 | padding-top: 0px; 12 | ` 13 | : ''} 14 | ` 15 | -------------------------------------------------------------------------------- /apps/extension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Feedoong: RSS Feed Reader", 3 | "description": "여기저기 둥둥 떠있는 나의 인사이트 컨텐츠들을 피둥에서 모아보기! 크롬 새 탭에서 바로 시작하세요!", 4 | "version": "1.1.0", 5 | "manifest_version": 3, 6 | "chrome_url_overrides": { 7 | "newtab": "index.html" 8 | }, 9 | "action": { 10 | "default_title": "Feedoong" 11 | }, 12 | "icons": { 13 | "48": "./favicon.png", 14 | "96": "./favicon.png" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /apps/next-app/src/app/(hasGNB)/layout.tsx: -------------------------------------------------------------------------------- 1 | import Nav from './_components/Nav' 2 | import Container from './_components/Container' 3 | 4 | interface HasGNBLayoutProps { 5 | children: React.ReactNode 6 | } 7 | 8 | const HasGNBLayout = async ({ children }: HasGNBLayoutProps) => { 9 | return ( 10 | <> 11 |