├── .cert ├── key.pem └── public.pem ├── .circleci └── config.yml ├── .dockerignore ├── .editorconfig ├── .gitattributes ├── .github ├── CODEOWNERS ├── pull_request_template.md └── workflows │ ├── add-preview-domain.yml │ └── remove-preview-domain.yml ├── .gitignore ├── .gitpod.yml ├── .idea ├── .gitignore ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── daily-webapp.iml ├── dbnavigator.xml ├── inspectionProfiles │ └── Project_Default.xml ├── jsLibraryMappings.xml ├── jsLinters │ └── eslint.xml ├── misc.xml ├── modules.xml └── vcs.xml ├── .nvmrc ├── .pnpmfile.cjs ├── .vscode ├── apps.code-workspace └── extensions.json ├── Dockerfile ├── LICENSE ├── README.md ├── Tiltfile ├── docker-compose.yml ├── package.json ├── packages ├── eslint-config │ ├── index.js │ └── package.json ├── eslint-rules │ ├── __tests__ │ │ └── eslint-rules.test.js │ ├── lib │ │ ├── index.js │ │ └── rules │ │ │ └── no-custom-color.js │ └── package.json ├── extension │ ├── .env │ ├── .env.production │ ├── .eslintignore │ ├── .eslintrc.js │ ├── .graphqlconfig │ ├── __mocks__ │ │ ├── reactMarkdownMock.tsx │ │ └── svgrMock.ts │ ├── __tests__ │ │ └── setup.ts │ ├── babel.config.js │ ├── custom.d.ts │ ├── jest.config.js │ ├── package.json │ ├── postcss.config.js │ ├── public │ │ ├── css │ │ │ └── daily-companion-app.css │ │ ├── dailydev.svg │ │ ├── google.svg │ │ ├── icons │ │ │ ├── 128.png │ │ │ ├── 16.png │ │ │ ├── 48.png │ │ │ ├── action_16.png │ │ │ └── action_32.png │ │ ├── mvs_firefox.jpg │ │ └── mvs_google.jpg │ ├── src │ │ ├── background │ │ │ └── index.ts │ │ ├── companion │ │ │ ├── App.tsx │ │ │ ├── Companion.spec.tsx │ │ │ ├── Companion.tsx │ │ │ ├── CompanionContent.tsx │ │ │ ├── CompanionContextMenu.tsx │ │ │ ├── CompanionDiscussion.tsx │ │ │ ├── CompanionEngagements.tsx │ │ │ ├── CompanionMenu.tsx │ │ │ ├── CompanionPermission.spec.tsx │ │ │ ├── CompanionPermission.tsx │ │ │ ├── CompanionPopupButton.tsx │ │ │ ├── CompanionToggle.tsx │ │ │ ├── common.tsx │ │ │ ├── companionFetch.tsx │ │ │ ├── companionRequest.tsx │ │ │ ├── index.tsx │ │ │ ├── useBackgroundPaginatedRequest.ts │ │ │ ├── useCompanionActions.ts │ │ │ └── useCompanionSettings.ts │ │ ├── content │ │ │ └── index.tsx │ │ ├── contexts │ │ │ └── ExtensionContext.tsx │ │ ├── lib │ │ │ ├── CustomRouter.ts │ │ │ └── extensionScripts.ts │ │ ├── manifest.json │ │ └── newtab │ │ │ ├── App.tsx │ │ │ ├── CustomLinks.tsx │ │ │ ├── DndBanner.tsx │ │ │ ├── DndModal.tsx │ │ │ ├── MainFeedPage.tsx │ │ │ ├── ShortcutLinks │ │ │ ├── ShortcutGetStarted.tsx │ │ │ ├── ShortcutLinks.spec.tsx │ │ │ ├── ShortcutLinks.tsx │ │ │ ├── ShortcutLinksItem.tsx │ │ │ ├── ShortcutLinksList.tsx │ │ │ └── ShortcutOptionsMenu.tsx │ │ │ ├── dnd.ts │ │ │ └── index.tsx │ ├── tailwind.config.ts │ ├── tsconfig.eslint.json │ ├── tsconfig.jest.json │ ├── tsconfig.json │ ├── views │ │ ├── companion.html │ │ └── newtab.html │ └── webpack.config.js ├── prettier-config │ ├── index.js │ └── package.json ├── shared │ ├── .eslintignore │ ├── .eslintrc.js │ ├── .gitignore │ ├── .graphqlconfig │ ├── __mocks__ │ │ ├── reactMarkdownMock.tsx │ │ └── svgrMock.ts │ ├── __tests__ │ │ ├── fixture │ │ │ ├── ad.ts │ │ │ ├── auth.ts │ │ │ ├── comment.ts │ │ │ ├── feed.ts │ │ │ ├── loggedUser.ts │ │ │ ├── paddle.ts │ │ │ ├── post.ts │ │ │ ├── settings.ts │ │ │ └── squads.ts │ │ ├── helpers │ │ │ ├── boot.tsx │ │ │ ├── dateMock.ts │ │ │ ├── graphql.ts │ │ │ ├── tanstack-query.tsx │ │ │ └── utilities.ts │ │ └── setup.ts │ ├── babel.config.js │ ├── custom.d.ts │ ├── icons │ │ ├── browsers.svg │ │ ├── mail_sent.svg │ │ ├── mail_verified.svg │ │ ├── source_beta.svg │ │ └── supercharge.svg │ ├── jest.config.js │ ├── package.json │ ├── postcss.config.js │ ├── src │ │ ├── commentPopupText.ts │ │ ├── components │ │ │ ├── AlertDot.tsx │ │ │ ├── AnimatedAward.tsx │ │ │ ├── Badge.tsx │ │ │ ├── BookmarkEmptyScreen.tsx │ │ │ ├── BookmarkFeedLayout.tsx │ │ │ ├── CalendarHeatmap.tsx │ │ │ ├── CloseButton.tsx │ │ │ ├── CommentFeed.tsx │ │ │ ├── ConditionalWrapper.tsx │ │ │ ├── CreateMyFeedButton.tsx │ │ │ ├── Custom404.tsx │ │ │ ├── CustomFeedEmptyScreen.tsx │ │ │ ├── CustomFeedOptionsMenu.tsx │ │ │ ├── DailyCircle.tsx │ │ │ ├── DevCardPlaceholder.tsx │ │ │ ├── ElementPlaceholder.tsx │ │ │ ├── EmptyScreen.tsx │ │ │ ├── ErrorBoundary.tsx │ │ │ ├── ExtensionOnboarding.tsx │ │ │ ├── ExtensionPermissionsPrompt.tsx │ │ │ ├── Feed.module.css │ │ │ ├── Feed.spec.tsx │ │ │ ├── Feed.tsx │ │ │ ├── FeedEmptyScreen.tsx │ │ │ ├── FeedErrorScreen.tsx │ │ │ ├── FeedItemComponent.tsx │ │ │ ├── FollowingFeedEmptyScreen.tsx │ │ │ ├── GoToDevCardButton.tsx │ │ │ ├── GrowthBookProvider.tsx │ │ │ ├── HorizontalScroll │ │ │ │ ├── HorizontalScroll.spec.tsx │ │ │ │ ├── HorizontalScroll.tsx │ │ │ │ ├── HorizontalScrollHeader.tsx │ │ │ │ ├── useCalculateVisibleElements.ts │ │ │ │ ├── useHorizontalScrollHeader.spec.tsx │ │ │ │ ├── useHorizontalScrollHeader.tsx │ │ │ │ ├── useScrollManagement.spec.tsx │ │ │ │ └── useScrollManagement.tsx │ │ │ ├── Icon.tsx │ │ │ ├── InteractionCounter.tsx │ │ │ ├── KeyboardShortcutLabel.tsx │ │ │ ├── LazyImage.tsx │ │ │ ├── Loader.module.css │ │ │ ├── Loader.tsx │ │ │ ├── LoaderOverlay.tsx │ │ │ ├── LoginButton.spec.tsx │ │ │ ├── LoginButton.tsx │ │ │ ├── Logo.tsx │ │ │ ├── MainFeedLayout.module.css │ │ │ ├── MainFeedLayout.tsx │ │ │ ├── MainLayout.tsx │ │ │ ├── Markdown.tsx │ │ │ ├── MenuIcon.tsx │ │ │ ├── Pill.tsx │ │ │ ├── PlusUser.tsx │ │ │ ├── PlusUserBadge.tsx │ │ │ ├── PostOptionsMenu.tsx │ │ │ ├── PostOptionsReadingHistoryMenu.tsx │ │ │ ├── PostsSearch.tsx │ │ │ ├── ProfileMenu │ │ │ │ ├── ProfileMenu.tsx │ │ │ │ ├── ProfileMenuFooter.tsx │ │ │ │ ├── ProfileMenuHeader.tsx │ │ │ │ ├── ProfileSection.spec.tsx │ │ │ │ ├── ProfileSection.tsx │ │ │ │ ├── ProfileSectionItem.spec.tsx │ │ │ │ ├── ProfileSectionItem.tsx │ │ │ │ └── sections │ │ │ │ │ ├── AccountSection.tsx │ │ │ │ │ ├── ExtensionSection.tsx │ │ │ │ │ ├── MainSection.tsx │ │ │ │ │ ├── ResourceSection.tsx │ │ │ │ │ ├── ThemeSection.spec.tsx │ │ │ │ │ └── ThemeSection.tsx │ │ │ ├── ProfilePicture.tsx │ │ │ ├── ProfilePictureGroup.tsx │ │ │ ├── ProgressCircle.tsx │ │ │ ├── PromotionalBanner.tsx │ │ │ ├── RadialProgress.module.css │ │ │ ├── RadialProgress.spec.tsx │ │ │ ├── RadialProgress.tsx │ │ │ ├── RecommendedMention.tsx │ │ │ ├── RecommendedTags.tsx │ │ │ ├── RelatedSources.tsx │ │ │ ├── RenderMarkdown.tsx │ │ │ ├── ReputationUserBadge.tsx │ │ │ ├── ScrollToTopButton.tsx │ │ │ ├── SearchEmptyScreen.tsx │ │ │ ├── ShareBar.spec.tsx │ │ │ ├── ShareBar.tsx │ │ │ ├── ShareMobile.tsx │ │ │ ├── ShareOptionsMenu.tsx │ │ │ ├── TagLinks.tsx │ │ │ ├── UpgradeToPlus.tsx │ │ │ ├── UserBadge.tsx │ │ │ ├── VerifiedCompanyUserBadge.tsx │ │ │ ├── accordion │ │ │ │ └── index.tsx │ │ │ ├── alert │ │ │ │ ├── AlertBanner.tsx │ │ │ │ ├── AlertPointer.tsx │ │ │ │ ├── Pointer.tsx │ │ │ │ └── common.ts │ │ │ ├── auth │ │ │ │ ├── AuthContainer.tsx │ │ │ │ ├── AuthDefault.tsx │ │ │ │ ├── AuthForm.tsx │ │ │ │ ├── AuthHeader.tsx │ │ │ │ ├── AuthModalFooter.tsx │ │ │ │ ├── AuthModalHeading.tsx │ │ │ │ ├── AuthOptions.tsx │ │ │ │ ├── AuthOptionsInner.tsx │ │ │ │ ├── AuthSignBack.tsx │ │ │ │ ├── AuthenticationBanner.tsx │ │ │ │ ├── ChangePasswordForm.tsx │ │ │ │ ├── CodeVerificationForm.tsx │ │ │ │ ├── CustomAuthBanner.tsx │ │ │ │ ├── EmailCodeVerification.tsx │ │ │ │ ├── EmailSignupForm.tsx │ │ │ │ ├── ForgotPasswordForm.spec.tsx │ │ │ │ ├── ForgotPasswordForm.tsx │ │ │ │ ├── LoginForm.spec.tsx │ │ │ │ ├── LoginForm.tsx │ │ │ │ ├── OnboardingHeadline.tsx │ │ │ │ ├── OnboardingRegistrationForm.tsx │ │ │ │ ├── OrDivider.tsx │ │ │ │ ├── PostAuthBanner.tsx │ │ │ │ ├── RegistrationFieldsForm.tsx │ │ │ │ ├── RegistrationForm.spec.tsx │ │ │ │ ├── RegistrationForm.tsx │ │ │ │ ├── SignBackButton.tsx │ │ │ │ ├── SignupDisclaimer.tsx │ │ │ │ ├── SocialRegistrationForm.tsx │ │ │ │ ├── TokenField.tsx │ │ │ │ ├── VerifySessionModal.tsx │ │ │ │ ├── common.tsx │ │ │ │ └── index.ts │ │ │ ├── award │ │ │ │ └── AwardButton.tsx │ │ │ ├── badges │ │ │ │ ├── BadgeIcon.tsx │ │ │ │ └── TopReaderBadge.tsx │ │ │ ├── banners │ │ │ │ ├── common.ts │ │ │ │ ├── index.ts │ │ │ │ └── personalized │ │ │ │ │ ├── GeoPersonalizedBanner.tsx │ │ │ │ │ ├── SocialPersonalizedBanner.tsx │ │ │ │ │ └── UserPersonalizedBanner.tsx │ │ │ ├── bookmark │ │ │ │ └── BookmarkFolderContextMenu.tsx │ │ │ ├── buttons │ │ │ │ ├── BookmarkButton.tsx │ │ │ │ ├── Button.spec.tsx │ │ │ │ ├── Button.tsx │ │ │ │ ├── ClickableText.spec.tsx │ │ │ │ ├── ClickableText.tsx │ │ │ │ ├── DeleteCustomFeed.tsx │ │ │ │ ├── GetExtensionButton.tsx │ │ │ │ ├── OptionsButton.tsx │ │ │ │ ├── QuaternaryButton.tsx │ │ │ │ ├── ToggleClickbaitShield.tsx │ │ │ │ ├── common.ts │ │ │ │ └── index.ts │ │ │ ├── cards │ │ │ │ ├── AcquisitionForm │ │ │ │ │ ├── AcquisitionFormGrid.tsx │ │ │ │ │ ├── AcquisitionFormList.tsx │ │ │ │ │ └── common │ │ │ │ │ │ ├── AcquisitionFormInner.tsx │ │ │ │ │ │ └── common.tsx │ │ │ │ ├── ActionsButtons │ │ │ │ │ ├── ActionButtons.tsx │ │ │ │ │ ├── UpvoteButtonIcon.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Freeform │ │ │ │ │ ├── FreeformGrid.tsx │ │ │ │ │ └── FreeformList.tsx │ │ │ │ ├── Leaderboard │ │ │ │ │ ├── CompanyTopList.tsx │ │ │ │ │ ├── LeaderboardList.tsx │ │ │ │ │ ├── LeaderboardListContainer.tsx │ │ │ │ │ ├── LeaderboardListItem.tsx │ │ │ │ │ ├── SourceTopList.tsx │ │ │ │ │ ├── TagTopList.tsx │ │ │ │ │ ├── UserTopList.tsx │ │ │ │ │ ├── common.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── SimilarPosts │ │ │ │ │ ├── PostEngagementCounts.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ad │ │ │ │ │ ├── AdCard.spec.tsx │ │ │ │ │ ├── AdGrid.tsx │ │ │ │ │ ├── AdList.tsx │ │ │ │ │ └── common │ │ │ │ │ │ ├── AdAttribution.tsx │ │ │ │ │ │ ├── AdImage.tsx │ │ │ │ │ │ ├── AdLink.tsx │ │ │ │ │ │ ├── AdPixel.tsx │ │ │ │ │ │ ├── AdRefresh.tsx │ │ │ │ │ │ ├── RemoveAd.tsx │ │ │ │ │ │ └── common.tsx │ │ │ │ ├── article │ │ │ │ │ ├── ArticleGrid.spec.tsx │ │ │ │ │ ├── ArticleGrid.tsx │ │ │ │ │ ├── ArticleList.tsx │ │ │ │ │ └── feedback │ │ │ │ │ │ ├── FeedbackGrid.tsx │ │ │ │ │ │ ├── FeedbackList.tsx │ │ │ │ │ │ └── common │ │ │ │ │ │ ├── FeedbackButtons.tsx │ │ │ │ │ │ └── common.tsx │ │ │ │ ├── collection │ │ │ │ │ ├── CollectionCardHeader.tsx │ │ │ │ │ ├── CollectionGrid.spec.tsx │ │ │ │ │ ├── CollectionGrid.tsx │ │ │ │ │ ├── CollectionList.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── common │ │ │ │ │ ├── BookmarkProviderHeader.tsx │ │ │ │ │ ├── Card.module.css │ │ │ │ │ ├── Card.tsx │ │ │ │ │ ├── CardCover.tsx │ │ │ │ │ ├── CardCoverContainer.tsx │ │ │ │ │ ├── CardCoverShare.tsx │ │ │ │ │ ├── CardOverlay.tsx │ │ │ │ │ ├── ClickbaitShield.tsx │ │ │ │ │ ├── CommentPopup.tsx │ │ │ │ │ ├── FeedItemContainer.tsx │ │ │ │ │ ├── InteractiveFeedCardCover.tsx │ │ │ │ │ ├── PostCardFooter.tsx │ │ │ │ │ ├── PostCardHeader.tsx │ │ │ │ │ ├── PostMetadata.tsx │ │ │ │ │ ├── PostSummary.tsx │ │ │ │ │ ├── PostTags.tsx │ │ │ │ │ ├── RaisedLabel.tsx │ │ │ │ │ ├── ReadArticleButton.tsx │ │ │ │ │ ├── SharedCardCover.tsx │ │ │ │ │ ├── ShowMoreContent.tsx │ │ │ │ │ ├── SourceButton.tsx │ │ │ │ │ ├── SquadHeaderPicture.tsx │ │ │ │ │ ├── SquadPostCardHeader.tsx │ │ │ │ │ ├── WelcomePostCardFooter.tsx │ │ │ │ │ ├── common.tsx │ │ │ │ │ └── list │ │ │ │ │ │ ├── ActionButtons.tsx │ │ │ │ │ │ ├── BookmarkProviderHeader.tsx │ │ │ │ │ │ ├── CardCover.tsx │ │ │ │ │ │ ├── FeedItemContainer.tsx │ │ │ │ │ │ ├── ListCard.tsx │ │ │ │ │ │ ├── PostCardHeader.tsx │ │ │ │ │ │ ├── PostMetadata.tsx │ │ │ │ │ │ ├── PostReadTime.tsx │ │ │ │ │ │ ├── RaisedLabel.tsx │ │ │ │ │ │ ├── SharedPostCardFooter.tsx │ │ │ │ │ │ ├── TypeLabel.tsx │ │ │ │ │ │ └── hooks.ts │ │ │ │ ├── placeholder │ │ │ │ │ ├── PlaceholderGrid.tsx │ │ │ │ │ ├── PlaceholderList.tsx │ │ │ │ │ └── common │ │ │ │ │ │ └── common.tsx │ │ │ │ ├── share │ │ │ │ │ ├── ShareGrid.spec.tsx │ │ │ │ │ ├── ShareGrid.tsx │ │ │ │ │ └── ShareList.tsx │ │ │ │ ├── socials │ │ │ │ │ ├── SocialBar.tsx │ │ │ │ │ └── SocialIconButton.tsx │ │ │ │ └── squad │ │ │ │ │ ├── PlaceholderSquadGrid.tsx │ │ │ │ │ ├── PlaceholderSquadList.tsx │ │ │ │ │ ├── SquadGrid.spec.tsx │ │ │ │ │ ├── SquadGrid.tsx │ │ │ │ │ ├── SquadList.spec.tsx │ │ │ │ │ ├── SquadList.tsx │ │ │ │ │ ├── SquadsDirectoryFeed.tsx │ │ │ │ │ ├── UnfeaturedSquadGrid.spec.tsx │ │ │ │ │ ├── UnfeaturedSquadGrid.tsx │ │ │ │ │ └── common │ │ │ │ │ ├── SquadImage.tsx │ │ │ │ │ └── types.ts │ │ │ ├── checklist │ │ │ │ ├── AboutPublicSquadStep.tsx │ │ │ │ ├── ChecklistBar.tsx │ │ │ │ ├── ChecklistCard.spec.tsx │ │ │ │ ├── ChecklistCard.tsx │ │ │ │ ├── ChecklistConfetti.tsx │ │ │ │ ├── ChecklistStep.spec.tsx │ │ │ │ ├── ChecklistStep.tsx │ │ │ │ ├── EditSquadStep.tsx │ │ │ │ ├── InstallExtensionChecklistStep.tsx │ │ │ │ ├── InviteMemberChecklistStep.tsx │ │ │ │ ├── NotificationChecklistStep.tsx │ │ │ │ ├── SharePostChecklistStep.tsx │ │ │ │ ├── SquadChecklistCard.tsx │ │ │ │ ├── SquadEditWelcomePostChecklistStep.tsx │ │ │ │ ├── SquadFirstCommentChecklistStep.tsx │ │ │ │ └── actionUtils.ts │ │ │ ├── comments │ │ │ │ ├── AdAsComment.tsx │ │ │ │ ├── CommentActionButtons.spec.tsx │ │ │ │ ├── CommentActionButtons.tsx │ │ │ │ ├── CommentAuthor.tsx │ │ │ │ ├── CommentAwardActions.tsx │ │ │ │ ├── CommentBox.tsx │ │ │ │ ├── CommentContainer.tsx │ │ │ │ ├── CommentInputOrModal.tsx │ │ │ │ ├── CommentPublishDate.tsx │ │ │ │ ├── MainComment.spec.tsx │ │ │ │ ├── MainComment.tsx │ │ │ │ ├── PlaceholderComment.tsx │ │ │ │ ├── PlaceholderCommentList.tsx │ │ │ │ ├── SubComment.spec.tsx │ │ │ │ ├── SubComment.tsx │ │ │ │ └── common.tsx │ │ │ ├── containers │ │ │ │ ├── Carousel.tsx │ │ │ │ ├── CarouselIndicator.tsx │ │ │ │ ├── FeedTopicCard.tsx │ │ │ │ └── InfiniteScrolling.tsx │ │ │ ├── contentPreference │ │ │ │ ├── BlockButton.tsx │ │ │ │ └── FollowButton.tsx │ │ │ ├── cores │ │ │ │ ├── AwardFeesNote.tsx │ │ │ │ ├── BuyCore.tsx │ │ │ │ ├── CoreAmountNeeded.tsx │ │ │ │ ├── CoreFAQ.tsx │ │ │ │ ├── CoreOptionButton.tsx │ │ │ │ ├── CoreOptionList.tsx │ │ │ │ ├── FeaturedCoresWidget.tsx │ │ │ │ ├── TransactionItem.tsx │ │ │ │ └── common.tsx │ │ │ ├── credit │ │ │ │ └── BuyCreditsButton.tsx │ │ │ ├── crypto.ts │ │ │ ├── drawers │ │ │ │ ├── ContextMenuDrawer.tsx │ │ │ │ ├── Drawer.tsx │ │ │ │ ├── ListDrawer.tsx │ │ │ │ ├── ListDrawerItem.tsx │ │ │ │ ├── NavDrawer.tsx │ │ │ │ ├── NavDrawerItem.tsx │ │ │ │ ├── common.ts │ │ │ │ └── index.ts │ │ │ ├── errors │ │ │ │ ├── ServerError.tsx │ │ │ │ ├── SquadLoading.tsx │ │ │ │ └── Unauthorized.tsx │ │ │ ├── feeds │ │ │ │ ├── FeedContainer.tsx │ │ │ │ ├── FeedCustomActions.tsx │ │ │ │ ├── FeedCustomPreview.tsx │ │ │ │ ├── FeedNav.tsx │ │ │ │ ├── FeedPreviewControls.tsx │ │ │ │ ├── FeedSettings │ │ │ │ │ ├── FeedSettingsCreate.tsx │ │ │ │ │ ├── FeedSettingsEdit.tsx │ │ │ │ │ ├── FeedSettingsEditBody.tsx │ │ │ │ │ ├── FeedSettingsEditContext.tsx │ │ │ │ │ ├── FeedSettingsEditHeader.tsx │ │ │ │ │ ├── FeedSettingsTitle.tsx │ │ │ │ │ ├── TagElement.tsx │ │ │ │ │ ├── components │ │ │ │ │ │ ├── BlockedSourceList.tsx │ │ │ │ │ │ ├── BlockedTagList.tsx │ │ │ │ │ │ ├── BlockedUserList.tsx │ │ │ │ │ │ ├── FollowingSourceList.tsx │ │ │ │ │ │ ├── FollowingUserList.tsx │ │ │ │ │ │ ├── SmartPrompts.tsx │ │ │ │ │ │ └── SuspenseLoader.tsx │ │ │ │ │ ├── sections │ │ │ │ │ │ ├── FeedSettingsAISection.tsx │ │ │ │ │ │ ├── FeedSettingsBlockingSection.tsx │ │ │ │ │ │ ├── FeedSettingsContentPreferencesSection.tsx │ │ │ │ │ │ ├── FeedSettingsContentSourcesSection.tsx │ │ │ │ │ │ ├── FeedSettingsFiltersSection.tsx │ │ │ │ │ │ ├── FeedSettingsGeneralSection.tsx │ │ │ │ │ │ └── FeedSettingsTagsSection.tsx │ │ │ │ │ ├── types.ts │ │ │ │ │ └── useFeedSettingsEdit.tsx │ │ │ │ ├── FeedSettingsButton.tsx │ │ │ │ ├── HorizontalFeed.tsx │ │ │ │ ├── MobileFeedActions.tsx │ │ │ │ ├── PreparingYourFeed.tsx │ │ │ │ ├── SimilarEmptyScreen.tsx │ │ │ │ ├── index.ts │ │ │ │ └── useFeedContentPreferenceMutationSubscription.ts │ │ │ ├── fields │ │ │ │ ├── AutoCompleteMenu.tsx │ │ │ │ ├── BaseFieldContainer.tsx │ │ │ │ ├── CardCheckbox.tsx │ │ │ │ ├── Checkbox.module.css │ │ │ │ ├── Checkbox.spec.tsx │ │ │ │ ├── Checkbox.tsx │ │ │ │ ├── CodeField.tsx │ │ │ │ ├── ContextMenu.tsx │ │ │ │ ├── CustomSwitch.module.css │ │ │ │ ├── CustomSwitch.tsx │ │ │ │ ├── Dropdown.module.css │ │ │ │ ├── Dropdown.tsx │ │ │ │ ├── FilterCheckbox.tsx │ │ │ │ ├── HourDropdown.tsx │ │ │ │ ├── ImageInput.tsx │ │ │ │ ├── MarkdownInput │ │ │ │ │ ├── CommentMarkdownInput.tsx │ │ │ │ │ ├── MarkdownUploadLabel.tsx │ │ │ │ │ ├── SavingLabel.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── MarkdownPreview.tsx │ │ │ │ ├── PasswordField.spec.tsx │ │ │ │ ├── PasswordField.tsx │ │ │ │ ├── ProgressBar.tsx │ │ │ │ ├── Radio.tsx │ │ │ │ ├── RadioItem.module.css │ │ │ │ ├── RadioItem.tsx │ │ │ │ ├── SearchField.spec.tsx │ │ │ │ ├── SearchField.tsx │ │ │ │ ├── Switch.module.css │ │ │ │ ├── Switch.tsx │ │ │ │ ├── TextField.module.css │ │ │ │ ├── TextField.spec.tsx │ │ │ │ ├── TextField.tsx │ │ │ │ ├── Textarea.tsx │ │ │ │ ├── ToggleRadio.tsx │ │ │ │ ├── common.tsx │ │ │ │ ├── fields.module.css │ │ │ │ └── form │ │ │ │ │ ├── FormWrapper.tsx │ │ │ │ │ ├── common.tsx │ │ │ │ │ └── index.ts │ │ │ ├── filters │ │ │ │ ├── BlockedWords.tsx │ │ │ │ ├── CategoryButton.tsx │ │ │ │ ├── FilterSwitch.tsx │ │ │ │ ├── FollowingFilter.tsx │ │ │ │ ├── MyFeedHeading.tsx │ │ │ │ ├── SourceItemList.tsx │ │ │ │ ├── SourceItemRow.tsx │ │ │ │ ├── TagButton.tsx │ │ │ │ ├── TagCategoryDropdown.tsx │ │ │ │ ├── TagItemList.tsx │ │ │ │ ├── TagItemRow.tsx │ │ │ │ ├── TagOptionsMenu.tsx │ │ │ │ ├── TagsFilter.spec.tsx │ │ │ │ ├── TagsFilter.tsx │ │ │ │ ├── Test.tsx │ │ │ │ ├── UnblockCopy.tsx │ │ │ │ ├── common.tsx │ │ │ │ └── helpers.ts │ │ │ ├── footer │ │ │ │ ├── FooterLinks.tsx │ │ │ │ └── index.ts │ │ │ ├── header │ │ │ │ ├── BreadCrumbs.tsx │ │ │ │ ├── FeedExploreDropdown.tsx │ │ │ │ ├── FeedExploreHeader.tsx │ │ │ │ ├── MobileExploreHeader.tsx │ │ │ │ └── index.ts │ │ │ ├── history │ │ │ │ ├── ReadingHistory.spec.tsx │ │ │ │ ├── ReadingHistoryEmptyScreen.tsx │ │ │ │ ├── ReadingHistoryList.tsx │ │ │ │ └── ReadingHistoryPlaceholder.tsx │ │ │ ├── icons │ │ │ │ ├── AddUser │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Ai │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Alert │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Amazon │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── white.svg │ │ │ │ ├── App │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Apple │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── white.svg │ │ │ │ ├── Arrow │ │ │ │ │ ├── Long │ │ │ │ │ │ ├── filled.svg │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Straight │ │ │ │ │ │ ├── filled.svg │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Triangle │ │ │ │ │ │ ├── filled.svg │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── outlined.svg │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── At │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Bell │ │ │ │ │ ├── Add │ │ │ │ │ │ ├── filled.svg │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── outlined.svg │ │ │ │ │ ├── Disabled │ │ │ │ │ │ ├── filled.svg │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── outlined.svg │ │ │ │ │ ├── Notify │ │ │ │ │ │ ├── filled.svg │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── outlined.svg │ │ │ │ │ ├── Subscribed │ │ │ │ │ │ ├── filled.svg │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── outlined.svg │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Block │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Bluesky │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── mono.svg │ │ │ │ ├── Bookmark │ │ │ │ │ ├── Reminder │ │ │ │ │ │ ├── filled.svg │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── outlined.svg │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── BringForward │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Browser │ │ │ │ │ ├── Chrome │ │ │ │ │ │ ├── chrome.svg │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── Edge │ │ │ │ │ │ ├── edge.svg │ │ │ │ │ │ └── index.tsx │ │ │ │ ├── BrowserPermission │ │ │ │ │ ├── chrome.svg │ │ │ │ │ └── primary.svg │ │ │ │ ├── Browsers │ │ │ │ │ ├── group.svg │ │ │ │ │ └── index.tsx │ │ │ │ ├── Calendar │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Camera │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Card │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── CardLayout │ │ │ │ │ ├── cards.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── list.svg │ │ │ │ ├── ChecklistA │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── ChecklistB │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Clear │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── CodePen │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── mono.svg │ │ │ │ ├── Coin │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── CommunityPicksIcon │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── primary.svg │ │ │ │ ├── Cookie │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Copy │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Core │ │ │ │ │ └── index.tsx │ │ │ │ ├── CreditCard │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── CustomPrompt │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── DailyIcon │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── primary.svg │ │ │ │ │ └── secondary.svg │ │ │ │ ├── DefaultSquad │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── primary.svg │ │ │ │ ├── DevCard │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── DevPlus │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── DigitalOcean │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── white.svg │ │ │ │ ├── Discord │ │ │ │ │ ├── color.svg │ │ │ │ │ └── index.tsx │ │ │ │ ├── Discuss │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Docs │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Download │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Downvote │ │ │ │ │ └── index.tsx │ │ │ │ ├── DrawnArrow │ │ │ │ │ ├── arrow.svg │ │ │ │ │ └── index.tsx │ │ │ │ ├── Earth │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Edit │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── EditPrompt │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Embed │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Exit │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Eye │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── EyeCancel │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Facebook │ │ │ │ │ ├── color.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── white.svg │ │ │ │ ├── Feather │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Feedback │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Filter │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Flag │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Folder │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── GitHub │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── white.svg │ │ │ │ ├── GitLab │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── white.svg │ │ │ │ ├── Google │ │ │ │ │ ├── Play │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── primary.svg │ │ │ │ │ ├── color.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── white.svg │ │ │ │ ├── Hamburger │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Hammer │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Hashnode │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── white.svg │ │ │ │ ├── Hashtag │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Home │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Hot │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Image │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Info │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Invite │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── JetBrains │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── white.svg │ │ │ │ ├── Key │ │ │ │ │ ├── KeyReferral │ │ │ │ │ │ ├── filled.svg │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── outlined.svg │ │ │ │ │ ├── KeyReferralOutline │ │ │ │ │ │ ├── filled.svg │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── outlined.svg │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Label │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Language │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Layout │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Line │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Link │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── LinkedIn │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── primary.svg │ │ │ │ │ └── secondary.svg │ │ │ │ ├── Loader │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── loader.svg │ │ │ │ ├── Lock │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Magic │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Mail │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Markdown │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Mastodon │ │ │ │ │ ├── color.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── mono.svg │ │ │ │ ├── MedalBadge │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Megaphone │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Menu │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Microsoft │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── white.svg │ │ │ │ ├── MiniClose │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Minus │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Moon │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── MoveTo │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── NewSquad │ │ │ │ │ └── index.tsx │ │ │ │ ├── NewTab │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── NotificationToggle │ │ │ │ │ └── primary.svg │ │ │ │ ├── OpenLink │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Organization │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── PWA │ │ │ │ │ ├── Chrome │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── pwa.svg │ │ │ │ │ ├── Edge │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── pwa.svg │ │ │ │ │ ├── Safari │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── pwa.svg │ │ │ │ │ └── index.ts │ │ │ │ ├── Pause │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Phone │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Pin │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Play │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Plus │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── PlusUser │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Power │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Privacy │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── ReadingStreak │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── primary.svg │ │ │ │ │ └── secondary.svg │ │ │ │ ├── Reddit │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── primary.svg │ │ │ │ │ └── secondary.svg │ │ │ │ ├── Redis │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── white.svg │ │ │ │ ├── Refresh │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── RemoveUser │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Reputation │ │ │ │ │ ├── filled.svg │ │ │ │ │ └── index.tsx │ │ │ │ ├── ReputationLightning │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Roadmap │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── mono.svg │ │ │ │ ├── Scout │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Search │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── SendAirplane │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── SendBackward │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Settings │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Share │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Shield │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── ShieldCheck │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── ShieldPlus │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── ShieldWarning │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Shortcuts │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Sidebar │ │ │ │ │ ├── SidebarArrowLeft │ │ │ │ │ │ ├── filled.svg │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── outlined.svg │ │ │ │ │ ├── SidebarArrowRight │ │ │ │ │ │ ├── filled.svg │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── outlined.svg │ │ │ │ │ └── index.ts │ │ │ │ ├── Sites │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Slack │ │ │ │ │ ├── color.svg │ │ │ │ │ └── index.tsx │ │ │ │ ├── Sort │ │ │ │ │ ├── Time │ │ │ │ │ │ ├── filled.svg │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── outlined.svg │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Source │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Sparkle │ │ │ │ │ ├── filled.svg │ │ │ │ │ └── index.tsx │ │ │ │ ├── Spotify │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── white.svg │ │ │ │ ├── Squad │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── StackOverflow │ │ │ │ │ ├── color.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── mono.svg │ │ │ │ ├── Star │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Story │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Sun │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── TLDR │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Telegram │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── primary.svg │ │ │ │ │ └── secondary.svg │ │ │ │ ├── Terminal │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── ThemeAuto │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Threads │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── mono.svg │ │ │ │ ├── TimeZone │ │ │ │ │ ├── DaytimeIcon.tsx │ │ │ │ │ ├── NighttimeIcon.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── timezone_daytime.svg │ │ │ │ │ └── timezone_nighttime.svg │ │ │ │ ├── Timer │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Tip │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outline.svg │ │ │ │ ├── Tour │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Trash │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Trending │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Twitter │ │ │ │ │ ├── color.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── white.svg │ │ │ │ ├── Unread │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Upvote │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── User │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── UserShare │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── V │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Warning │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ ├── Whatsapp │ │ │ │ │ ├── color.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── white.svg │ │ │ │ ├── Youtube │ │ │ │ │ ├── color.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── mono.svg │ │ │ │ ├── gift │ │ │ │ │ ├── filled.svg │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── outlined.svg │ │ │ │ └── index.ts │ │ │ ├── image │ │ │ │ ├── Image.tsx │ │ │ │ └── VideoImage.tsx │ │ │ ├── index.ts │ │ │ ├── integrations │ │ │ │ ├── NewUserIntegration.tsx │ │ │ │ ├── UserIntegrationItem.tsx │ │ │ │ └── UserSourceIntegrationList.tsx │ │ │ ├── layout │ │ │ │ ├── DefaultSquadHeader.tsx │ │ │ │ ├── HeaderButtons.tsx │ │ │ │ ├── HeaderLogo.tsx │ │ │ │ ├── MainLayoutHeader.tsx │ │ │ │ ├── PageWrapperLayout.tsx │ │ │ │ └── common.tsx │ │ │ ├── markdown.module.css │ │ │ ├── marketingCta │ │ │ │ ├── MarketingCtaCard.tsx │ │ │ │ ├── MarketingCtaList.tsx │ │ │ │ ├── MarketingCtaModal.tsx │ │ │ │ ├── MarketingCtaPopoverSmall.tsx │ │ │ │ ├── common.tsx │ │ │ │ └── index.ts │ │ │ ├── modals │ │ │ │ ├── ArticlePostModal.tsx │ │ │ │ ├── BasePostModal.module.css │ │ │ │ ├── BasePostModal.tsx │ │ │ │ ├── BootPopups.tsx │ │ │ │ ├── ClickbaitShieldModal.tsx │ │ │ │ ├── CollectionPostModal.tsx │ │ │ │ ├── ContentModal.tsx │ │ │ │ ├── KeywordSynonymModal.tsx │ │ │ │ ├── LazyModalElement.tsx │ │ │ │ ├── NewSourceModal.spec.tsx │ │ │ │ ├── NewSourceModal.tsx │ │ │ │ ├── Prompt.tsx │ │ │ │ ├── PushNotificationModal.tsx │ │ │ │ ├── ReputationAlert.tsx │ │ │ │ ├── ReputationPrivilegesModal.tsx │ │ │ │ ├── ShareModal.spec.tsx │ │ │ │ ├── ShareModal.tsx │ │ │ │ ├── SharePostModal.tsx │ │ │ │ ├── SharedBookmarksModal.spec.tsx │ │ │ │ ├── SharedBookmarksModal.tsx │ │ │ │ ├── SlackIntegrationModal │ │ │ │ │ ├── SlackIntegrationIntroBody.tsx │ │ │ │ │ ├── SlackIntegrationModal.tsx │ │ │ │ │ └── useSlackIntegrationModal.ts │ │ │ │ ├── SquadMemberModal.tsx │ │ │ │ ├── SquadTourModal.tsx │ │ │ │ ├── SubmitArticleModal.spec.tsx │ │ │ │ ├── SubmitArticleModal.tsx │ │ │ │ ├── UpvotedPopupModal.spec.tsx │ │ │ │ ├── UpvotedPopupModal.tsx │ │ │ │ ├── UserFollowersModal.tsx │ │ │ │ ├── UserFollowingModal.tsx │ │ │ │ ├── UserListModal.tsx │ │ │ │ ├── VideoModal.tsx │ │ │ │ ├── award │ │ │ │ │ ├── BuyCoresModal.tsx │ │ │ │ │ ├── GiveAwardModal.tsx │ │ │ │ │ └── ListAwardsModal.tsx │ │ │ │ ├── badges │ │ │ │ │ └── TopReaderBadgeModal.tsx │ │ │ │ ├── bookmark │ │ │ │ │ ├── BookmarkFolderModal.tsx │ │ │ │ │ └── MoveBookmarkModal.tsx │ │ │ │ ├── common.tsx │ │ │ │ ├── common │ │ │ │ │ ├── Modal.tsx │ │ │ │ │ ├── ModalBody.tsx │ │ │ │ │ ├── ModalClose.tsx │ │ │ │ │ ├── ModalFooter.tsx │ │ │ │ │ ├── ModalHeader.tsx │ │ │ │ │ ├── ModalSidebar.tsx │ │ │ │ │ ├── ModalStepsWrapper.tsx │ │ │ │ │ ├── ModalTabs.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── customModal.module.css │ │ │ │ ├── feed │ │ │ │ │ └── AddToCustomFeedModal.tsx │ │ │ │ ├── generic │ │ │ │ │ ├── common.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── plus │ │ │ │ │ ├── MobileSmartPromptsModal.tsx │ │ │ │ │ └── SmartPromptModal.tsx │ │ │ │ ├── post │ │ │ │ │ ├── BookmarkReminderModal.tsx │ │ │ │ │ ├── CommentModal.tsx │ │ │ │ │ ├── CreateSharedPostModal.tsx │ │ │ │ │ ├── ReadingHistoryModal.tsx │ │ │ │ │ ├── ReadingHistoryTitle.tsx │ │ │ │ │ ├── common.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── referral │ │ │ │ │ └── GenericReferralModal.tsx │ │ │ │ ├── report │ │ │ │ │ ├── ReasonSelectionModal.tsx │ │ │ │ │ ├── ReportComentModal.spec.tsx │ │ │ │ │ ├── ReportCommentModal.tsx │ │ │ │ │ ├── ReportPostModal.tsx │ │ │ │ │ ├── ReportSourceModal.tsx │ │ │ │ │ ├── ReportUserModal.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── soon │ │ │ │ │ └── BookmarkFolderSoonModal.tsx │ │ │ │ ├── squads │ │ │ │ │ ├── NewSquadModal.tsx │ │ │ │ │ ├── PostModerationModal.tsx │ │ │ │ │ ├── PrivilegedMembersModal.tsx │ │ │ │ │ ├── SquadNotificationsModal.tsx │ │ │ │ │ └── SquadPromotionModal.tsx │ │ │ │ ├── streaks │ │ │ │ │ ├── NewStreakModal.tsx │ │ │ │ │ ├── StreakRecoverModal.spec.tsx │ │ │ │ │ ├── StreakRecoverModal.tsx │ │ │ │ │ └── common.ts │ │ │ │ └── user │ │ │ │ │ ├── CookieConsentItem.tsx │ │ │ │ │ ├── CookieConsentModal.spec.tsx │ │ │ │ │ └── CookieConsentModal.tsx │ │ │ ├── notifications │ │ │ │ ├── EnableNotification.tsx │ │ │ │ ├── FirstNotification.tsx │ │ │ │ ├── InAppNotification.module.css │ │ │ │ ├── InAppNotification.tsx │ │ │ │ ├── InAppNotificationItem.tsx │ │ │ │ ├── NotificationIcon.tsx │ │ │ │ ├── NotificationItem.spec.tsx │ │ │ │ ├── NotificationItem.tsx │ │ │ │ ├── NotificationItemAttachment.tsx │ │ │ │ ├── NotificationItemAvatar.tsx │ │ │ │ ├── NotificationsBell.tsx │ │ │ │ ├── Toast.module.css │ │ │ │ ├── Toast.spec.tsx │ │ │ │ ├── Toast.tsx │ │ │ │ └── utils.ts │ │ │ ├── onboarding │ │ │ │ ├── ContentTypes │ │ │ │ │ ├── ContentTypes.tsx │ │ │ │ │ └── helpers.ts │ │ │ │ ├── CreateFeedButton.tsx │ │ │ │ ├── EditTag.tsx │ │ │ │ ├── Extension │ │ │ │ │ ├── OnboardingExtension.tsx │ │ │ │ │ └── useOnboardingExtension.ts │ │ │ │ ├── FeedPreviewStep.tsx │ │ │ │ ├── FilterOnboarding.tsx │ │ │ │ ├── InteractiveFeedStep.tsx │ │ │ │ ├── MemberAlready.tsx │ │ │ │ ├── OnboardingFooter.tsx │ │ │ │ ├── OnboardingHeader.tsx │ │ │ │ ├── OnboardingPWA.tsx │ │ │ │ ├── OnboardingStep.tsx │ │ │ │ ├── Plus │ │ │ │ │ ├── OnboardingPlus.tsx │ │ │ │ │ ├── OnboardingPlusControl.tsx │ │ │ │ │ ├── OnboardingPlusVariationV1.tsx │ │ │ │ │ ├── PlusSuccess.tsx │ │ │ │ │ └── common.tsx │ │ │ │ ├── ReadingReminder.tsx │ │ │ │ ├── common.ts │ │ │ │ └── index.ts │ │ │ ├── pagination │ │ │ │ ├── PaginationActions.tsx │ │ │ │ └── index.ts │ │ │ ├── plus │ │ │ │ ├── GiftPlusModal.tsx │ │ │ │ ├── GiftReceivedPlusModal.tsx │ │ │ │ ├── GiftUserContext.tsx │ │ │ │ ├── GiftingSelectedUser.tsx │ │ │ │ ├── PlusAdjustQuantity.tsx │ │ │ │ ├── PlusCheckoutContainer.tsx │ │ │ │ ├── PlusComparingCards.tsx │ │ │ │ ├── PlusDesktop.tsx │ │ │ │ ├── PlusExtension.tsx │ │ │ │ ├── PlusFAQ.tsx │ │ │ │ ├── PlusIOS.tsx │ │ │ │ ├── PlusInfo.tsx │ │ │ │ ├── PlusList.tsx │ │ │ │ ├── PlusListItem.tsx │ │ │ │ ├── PlusListModalSection.tsx │ │ │ │ ├── PlusMarketingModal.tsx │ │ │ │ ├── PlusMobile.tsx │ │ │ │ ├── PlusMobileDrawer.tsx │ │ │ │ ├── PlusOptionRadio.tsx │ │ │ │ ├── PlusPlanExtraLabel.tsx │ │ │ │ ├── PlusPlus.tsx │ │ │ │ ├── PlusProductList.tsx │ │ │ │ ├── PlusProductToggle.tsx │ │ │ │ ├── PlusTitle.tsx │ │ │ │ ├── PlusTrustRefund.tsx │ │ │ │ ├── PlusTrustReviews.tsx │ │ │ │ ├── PlusUnavailable.tsx │ │ │ │ ├── PlusWebapp.tsx │ │ │ │ ├── PostUpgradeToPlus.tsx │ │ │ │ └── common.tsx │ │ │ ├── post │ │ │ │ ├── AuthorOnboarding.module.css │ │ │ │ ├── AuthorOnboarding.tsx │ │ │ │ ├── BasePostContent.tsx │ │ │ │ ├── FixedPostNavigation.tsx │ │ │ │ ├── GoBackHeaderMobile.tsx │ │ │ │ ├── MarkdownPostContent.tsx │ │ │ │ ├── NewComment.tsx │ │ │ │ ├── PostActions.tsx │ │ │ │ ├── PostCodeSnippets.tsx │ │ │ │ ├── PostComments.tsx │ │ │ │ ├── PostContent.tsx │ │ │ │ ├── PostContentContainer.tsx │ │ │ │ ├── PostEngagements.tsx │ │ │ │ ├── PostHeaderActions.tsx │ │ │ │ ├── PostItemCard.tsx │ │ │ │ ├── PostLoadingPlaceholder.tsx │ │ │ │ ├── PostLoadingSkeleton.tsx │ │ │ │ ├── PostMenuOptions.tsx │ │ │ │ ├── PostNavigation.tsx │ │ │ │ ├── PostPreview.tsx │ │ │ │ ├── PostSourceInfo.tsx │ │ │ │ ├── PostUpvotesCommentsCount.tsx │ │ │ │ ├── PostWidgets.tsx │ │ │ │ ├── RelatedPostsWidget.tsx │ │ │ │ ├── SharePostContent.tsx │ │ │ │ ├── ShareYouTubeContent.tsx │ │ │ │ ├── SquadPostAuthor.tsx │ │ │ │ ├── SquadPostContent.tsx │ │ │ │ ├── SquadPostWidgets.tsx │ │ │ │ ├── block │ │ │ │ │ ├── PostBlockedPanel.tsx │ │ │ │ │ ├── PostTagsPanel.tsx │ │ │ │ │ └── common.ts │ │ │ │ ├── collection │ │ │ │ │ ├── CollectionPillSources.tsx │ │ │ │ │ ├── CollectionPostContent.tsx │ │ │ │ │ ├── CollectionPostHeaderActions.tsx │ │ │ │ │ ├── CollectionPostWidgets.tsx │ │ │ │ │ ├── CollectionSubscribeButton.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── common.tsx │ │ │ │ ├── common │ │ │ │ │ ├── PostClickbaitShield.tsx │ │ │ │ │ ├── PostContentReminder.tsx │ │ │ │ │ ├── PostContentShare.tsx │ │ │ │ │ ├── PostContentWidget.tsx │ │ │ │ │ ├── PostReminderOptions.tsx │ │ │ │ │ ├── SharedLinkContainer.tsx │ │ │ │ │ └── SharedPostLink.tsx │ │ │ │ ├── freeform │ │ │ │ │ ├── index.ts │ │ │ │ │ └── write │ │ │ │ │ │ ├── WriteFreeFormSkeleton.tsx │ │ │ │ │ │ ├── WriteFreeformContent.tsx │ │ │ │ │ │ ├── WritePage.tsx │ │ │ │ │ │ ├── WritePostHeader.tsx │ │ │ │ │ │ ├── common.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ ├── infinite │ │ │ │ │ ├── InfiniteReadingHistory.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── share │ │ │ │ │ ├── SharePostTitle.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── smartPrompts │ │ │ │ │ ├── CustomPrompt.tsx │ │ │ │ │ ├── PromptButton.tsx │ │ │ │ │ ├── PromptButtons.tsx │ │ │ │ │ ├── SmartPrompt.tsx │ │ │ │ │ ├── SmartPromptResponse.tsx │ │ │ │ │ └── common.ts │ │ │ │ ├── tags │ │ │ │ │ ├── InteractiveFeedTagOverlay.tsx │ │ │ │ │ └── PostTagList.tsx │ │ │ │ ├── useCommentContentPreferenceMutationSubscription.ts │ │ │ │ ├── widgets │ │ │ │ │ ├── CollectionsIntro.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── withPostById.tsx │ │ │ │ └── write │ │ │ │ │ ├── CreatePostButton.tsx │ │ │ │ │ ├── ShareLink.tsx │ │ │ │ │ ├── SquadsDropdown.tsx │ │ │ │ │ ├── SubmitExternalLink.tsx │ │ │ │ │ ├── WriteFooter.tsx │ │ │ │ │ ├── WriteLinkPreview.tsx │ │ │ │ │ ├── WritePreviewSkeleton.tsx │ │ │ │ │ ├── common.ts │ │ │ │ │ └── index.ts │ │ │ ├── profile │ │ │ │ ├── AccountDangerZone.tsx │ │ │ │ ├── ActivitySection.tsx │ │ │ │ ├── Awards.tsx │ │ │ │ ├── ExperienceLevelDropdown.tsx │ │ │ │ ├── Header.tsx │ │ │ │ ├── HeroImage.tsx │ │ │ │ ├── JoinedDate.tsx │ │ │ │ ├── LanguageDropdown.tsx │ │ │ │ ├── MyProfileEmptyScreen.tsx │ │ │ │ ├── ProfileButton.spec.tsx │ │ │ │ ├── ProfileButton.tsx │ │ │ │ ├── ProfileEmptyScreen.tsx │ │ │ │ ├── ProfileForm.module.css │ │ │ │ ├── ProfileImageLink.tsx │ │ │ │ ├── ProfileLink.tsx │ │ │ │ ├── ProfileSettingsMenu.tsx │ │ │ │ ├── ProfileTooltip.tsx │ │ │ │ ├── ProfileWidgets.spec.tsx │ │ │ │ ├── ProfileWidgets.tsx │ │ │ │ ├── ReadingHeatmapWidget.tsx │ │ │ │ ├── ReadingStreaksWidget.tsx │ │ │ │ ├── ReadingTagProgress.spec.tsx │ │ │ │ ├── ReadingTagProgress.tsx │ │ │ │ ├── ReadingTagsWidget.tsx │ │ │ │ ├── Readme.tsx │ │ │ │ ├── SocialChips.tsx │ │ │ │ ├── SourceList.tsx │ │ │ │ ├── SourceListPlaceholder.tsx │ │ │ │ ├── SourceProfilePicture.tsx │ │ │ │ ├── SquadsList.tsx │ │ │ │ ├── TagList.tsx │ │ │ │ ├── TagListPlaceholder.tsx │ │ │ │ ├── TopReaderWidget.tsx │ │ │ │ ├── UserList.tsx │ │ │ │ ├── UserMetadata.tsx │ │ │ │ ├── UserShortInfo.tsx │ │ │ │ ├── UserShortInfoPlaceholder.tsx │ │ │ │ ├── UserStats.tsx │ │ │ │ ├── common.module.css │ │ │ │ ├── devcard │ │ │ │ │ ├── DevCard.tsx │ │ │ │ │ ├── DevCardContainer.tsx │ │ │ │ │ ├── DevCardFetchWrapper.tsx │ │ │ │ │ ├── DevCardFooter.tsx │ │ │ │ │ ├── DevCardStats.tsx │ │ │ │ │ ├── DevCardStatsSection.tsx │ │ │ │ │ ├── DevCardTwitterCover.tsx │ │ │ │ │ ├── common.ts │ │ │ │ │ └── index.ts │ │ │ │ └── source │ │ │ │ │ ├── SourceAvatar.tsx │ │ │ │ │ ├── SourceShortInfo.tsx │ │ │ │ │ └── index.ts │ │ │ ├── referral │ │ │ │ ├── InviteLinkInput.tsx │ │ │ │ └── index.ts │ │ │ ├── search │ │ │ │ ├── PlaceholderSearchSource.tsx │ │ │ │ ├── SearchEmpty.tsx │ │ │ │ ├── SearchFeedback.tsx │ │ │ │ ├── SearchMessage.module.css │ │ │ │ ├── SearchMessage.tsx │ │ │ │ ├── SearchPanel │ │ │ │ │ ├── SearchPanel.tsx │ │ │ │ │ ├── SearchPanelAction.tsx │ │ │ │ │ ├── SearchPanelContext.ts │ │ │ │ │ ├── SearchPanelCustomAction.tsx │ │ │ │ │ ├── SearchPanelDropdown.tsx │ │ │ │ │ ├── SearchPanelInput.tsx │ │ │ │ │ ├── SearchPanelInputContainer.tsx │ │ │ │ │ ├── SearchPanelInputCursor.tsx │ │ │ │ │ ├── SearchPanelItem.tsx │ │ │ │ │ ├── SearchPanelPostSuggestions.tsx │ │ │ │ │ ├── SearchPanelProvider.tsx │ │ │ │ │ ├── SearchPanelSourceSuggestions.tsx │ │ │ │ │ ├── SearchPanelTagSuggestions.tsx │ │ │ │ │ ├── SearchPanelUserSuggestions.tsx │ │ │ │ │ ├── common.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── useSearchPanelAction.ts │ │ │ │ ├── SearchProgressBar.module.css │ │ │ │ ├── SearchProgressBar.tsx │ │ │ │ ├── SearchResult.tsx │ │ │ │ ├── SearchResults │ │ │ │ │ ├── SearchResultsLayout.tsx │ │ │ │ │ ├── SearchResultsSources.tsx │ │ │ │ │ ├── SearchResultsTags.tsx │ │ │ │ │ └── SearchResultsUsers.tsx │ │ │ │ ├── SearchSkeleton.tsx │ │ │ │ ├── SearchSourceItem.tsx │ │ │ │ ├── SearchSourceList.tsx │ │ │ │ ├── SearchSubmitButton.tsx │ │ │ │ ├── common.ts │ │ │ │ └── index.ts │ │ │ ├── sidebar │ │ │ │ ├── ClickableNavItem.tsx │ │ │ │ ├── Section.tsx │ │ │ │ ├── Sidebar.spec.tsx │ │ │ │ ├── Sidebar.tsx │ │ │ │ ├── SidebarDesktop.tsx │ │ │ │ ├── SidebarItem.tsx │ │ │ │ ├── SidebarList.tsx │ │ │ │ ├── SidebarListItem.tsx │ │ │ │ ├── SidebarMenuIcon.tsx │ │ │ │ ├── SidebarTablet.tsx │ │ │ │ ├── common.tsx │ │ │ │ └── sections │ │ │ │ │ ├── BookmarkSection.tsx │ │ │ │ │ ├── CustomFeedSection.tsx │ │ │ │ │ ├── DiscoverSection.tsx │ │ │ │ │ ├── MainSection.tsx │ │ │ │ │ ├── NetworkSection.tsx │ │ │ │ │ └── common.tsx │ │ │ ├── sources │ │ │ │ ├── SourceActions │ │ │ │ │ ├── SourceActionsBlock.tsx │ │ │ │ │ ├── SourceActionsFollow.tsx │ │ │ │ │ ├── SourceActionsNotify.tsx │ │ │ │ │ └── index.tsx │ │ │ │ └── index.ts │ │ │ ├── squads │ │ │ │ ├── Details.tsx │ │ │ │ ├── MangeSquadPageSkeleton.tsx │ │ │ │ ├── Members │ │ │ │ │ ├── BlockedMembersPlaceholder.tsx │ │ │ │ │ ├── PrivilegedMemberItem.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── PromotionTour.tsx │ │ │ │ ├── SharePostBar.tsx │ │ │ │ ├── SquadActionButton.tsx │ │ │ │ ├── SquadCommentJoinBanner.tsx │ │ │ │ ├── SquadEmptyScreen.tsx │ │ │ │ ├── SquadFeedHeading.tsx │ │ │ │ ├── SquadHeaderBar.spec.tsx │ │ │ │ ├── SquadHeaderBar.tsx │ │ │ │ ├── SquadHeaderMenu.tsx │ │ │ │ ├── SquadImage.tsx │ │ │ │ ├── SquadMemberItemOptionsButton.tsx │ │ │ │ ├── SquadMemberMenu.tsx │ │ │ │ ├── SquadMemberShortList.tsx │ │ │ │ ├── SquadPageHeader.tsx │ │ │ │ ├── SquadPostListItem.tsx │ │ │ │ ├── SquadTabs.tsx │ │ │ │ ├── SquadTour.tsx │ │ │ │ ├── SquadTourCard.tsx │ │ │ │ ├── SquadsToShare.tsx │ │ │ │ ├── common │ │ │ │ │ ├── SquadPrivacyState.tsx │ │ │ │ │ └── SquadStat.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── layout │ │ │ │ │ ├── SquadDirectoryLayout.tsx │ │ │ │ │ ├── SquadDirectoryNavbar.tsx │ │ │ │ │ ├── SquadDirectoryNavbarItem.tsx │ │ │ │ │ └── useSquadDirectoryLayout.ts │ │ │ │ ├── moderation │ │ │ │ │ ├── SquadEmptyScreen.tsx │ │ │ │ │ ├── SquadModerationActions.tsx │ │ │ │ │ ├── SquadModerationEmptyScreen.tsx │ │ │ │ │ ├── SquadModerationItem.tsx │ │ │ │ │ ├── SquadModerationItemContextMenu.tsx │ │ │ │ │ ├── SquadModerationList.tsx │ │ │ │ │ └── useSourceModerationItem.ts │ │ │ │ ├── settings │ │ │ │ │ ├── SquadCategoryDropdown.tsx │ │ │ │ │ ├── SquadDangerZone.tsx │ │ │ │ │ ├── SquadModerationSettingsSection.tsx │ │ │ │ │ ├── SquadPrivacySection.tsx │ │ │ │ │ ├── SquadSettingsSection.tsx │ │ │ │ │ └── index.ts │ │ │ │ └── utils.tsx │ │ │ ├── streak │ │ │ │ ├── ReadingStreakButton.tsx │ │ │ │ ├── ReadingStreakSwitch.tsx │ │ │ │ ├── StreakReminderSwitch.tsx │ │ │ │ └── popup │ │ │ │ │ ├── DayStreak.tsx │ │ │ │ │ ├── ReadingStreakPopup.tsx │ │ │ │ │ ├── StreakSection.tsx │ │ │ │ │ └── index.ts │ │ │ ├── tabs │ │ │ │ ├── TabContainer.spec.tsx │ │ │ │ ├── TabContainer.tsx │ │ │ │ ├── TabList.tsx │ │ │ │ └── common.tsx │ │ │ ├── tags │ │ │ │ ├── RelevancyTag.tsx │ │ │ │ ├── TagElement.tsx │ │ │ │ ├── TagSelection.tsx │ │ │ │ └── common.tsx │ │ │ ├── text │ │ │ │ ├── Anchor.tsx │ │ │ │ └── index.ts │ │ │ ├── tooltips │ │ │ │ ├── BaseTooltip.module.css │ │ │ │ ├── BaseTooltip.tsx │ │ │ │ ├── BaseTooltipContainer.tsx │ │ │ │ ├── InteractivePopup.tsx │ │ │ │ ├── LinkWithTooltip.tsx │ │ │ │ ├── Portal.tsx │ │ │ │ ├── RecommendedMentionTooltip.tsx │ │ │ │ ├── SimpleTooltip.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── notifications │ │ │ │ │ ├── NotificationPreferenceMenu.tsx │ │ │ │ │ └── index.ts │ │ │ │ └── utils.ts │ │ │ ├── typography │ │ │ │ └── Typography.tsx │ │ │ ├── utilities │ │ │ │ ├── DateFormat.spec.tsx │ │ │ │ ├── DateFormat.tsx │ │ │ │ ├── Divider.tsx │ │ │ │ ├── Link.tsx │ │ │ │ ├── SelectableLink.tsx │ │ │ │ ├── common.spec.tsx │ │ │ │ ├── common.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── loaders │ │ │ │ │ ├── common.ts │ │ │ │ │ ├── generic.tsx │ │ │ │ │ └── index.tsx │ │ │ │ └── utilities.module.css │ │ │ ├── video │ │ │ │ ├── YoutubeVideo.spec.tsx │ │ │ │ ├── YoutubeVideo.tsx │ │ │ │ ├── YoutubeVideoWithoutConsent.tsx │ │ │ │ └── common.ts │ │ │ ├── widgets │ │ │ │ ├── Alert.tsx │ │ │ │ ├── BestDiscussions.spec.tsx │ │ │ │ ├── BestDiscussions.tsx │ │ │ │ ├── DangerZone.tsx │ │ │ │ ├── FurtherReading.spec.tsx │ │ │ │ ├── FurtherReading.tsx │ │ │ │ ├── ListItemPlaceholder.tsx │ │ │ │ ├── PostToc.module.css │ │ │ │ ├── PostToc.tsx │ │ │ │ ├── PostUsersHighlights.tsx │ │ │ │ ├── ReferralSocialShareButtons.tsx │ │ │ │ ├── ReferralWidget.tsx │ │ │ │ ├── SimilarPosts.spec.tsx │ │ │ │ ├── SimilarPosts.tsx │ │ │ │ ├── SocialShare.tsx │ │ │ │ ├── SocialShareButton.tsx │ │ │ │ ├── SocialShareContainer.tsx │ │ │ │ ├── SocialShareList.tsx │ │ │ │ ├── ThemeWidget.tsx │ │ │ │ ├── ThemeWidgetBackground.tsx │ │ │ │ ├── TimezoneDropdown.spec.tsx │ │ │ │ ├── TimezoneDropdown.tsx │ │ │ │ ├── ToggleWeekStart.tsx │ │ │ │ ├── UserItemPlaceholder.tsx │ │ │ │ ├── WidgetCard.tsx │ │ │ │ └── common.ts │ │ │ ├── withExperiment.tsx │ │ │ ├── withFeaturesBoundary.spec.tsx │ │ │ └── withFeaturesBoundary.tsx │ │ ├── contexts │ │ │ ├── ActiveFeedContext.tsx │ │ │ ├── ActiveFeedNameContext.tsx │ │ │ ├── AlertContext.tsx │ │ │ ├── AuthContext.tsx │ │ │ ├── AuthDataContext.tsx │ │ │ ├── BootProvider.spec.tsx │ │ │ ├── BootProvider.tsx │ │ │ ├── BuyCoresContext │ │ │ │ ├── BuyCoresContext.tsx │ │ │ │ ├── PaddleBuyCoresContext.tsx │ │ │ │ ├── StoreKitBuyCoresContext.tsx │ │ │ │ └── types.ts │ │ │ ├── DndContext.tsx │ │ │ ├── ExtensionContext.tsx │ │ │ ├── FeedContext.tsx │ │ │ ├── GiveAwardModalContext.tsx │ │ │ ├── InteractiveFeedContext.tsx │ │ │ ├── LogContext.spec.tsx │ │ │ ├── LogContext.tsx │ │ │ ├── NotificationsContext.tsx │ │ │ ├── PixelsContext.ts │ │ │ ├── ProgressiveEnhancementContext.tsx │ │ │ ├── PushNotificationContext.tsx │ │ │ ├── SettingsContext.tsx │ │ │ ├── SubscriptionContext.tsx │ │ │ ├── WriteCommentContext.ts │ │ │ ├── WritePostContext.tsx │ │ │ ├── __snapshots__ │ │ │ │ └── LogContext.spec.tsx.snap │ │ │ ├── common.ts │ │ │ ├── index.ts │ │ │ └── payment │ │ │ │ ├── BasePaymentProvider.tsx │ │ │ │ ├── ChromeExtension.tsx │ │ │ │ ├── Paddle.tsx │ │ │ │ ├── StoreKit.tsx │ │ │ │ ├── common.ts │ │ │ │ ├── context.ts │ │ │ │ └── index.tsx │ │ ├── features │ │ │ ├── common │ │ │ │ └── components │ │ │ │ │ ├── FormInputCheckboxGroup.spec.tsx │ │ │ │ │ ├── FormInputCheckboxGroup.tsx │ │ │ │ │ ├── FormInputRating.spec.tsx │ │ │ │ │ └── FormInputRating.tsx │ │ │ ├── onboarding │ │ │ │ ├── funnelBoot.ts │ │ │ │ ├── hooks │ │ │ │ │ ├── useFunnelBoot.ts │ │ │ │ │ ├── useFunnelCookies.ts │ │ │ │ │ ├── useFunnelNavigation.spec.ts │ │ │ │ │ ├── useFunnelNavigation.ts │ │ │ │ │ ├── useFunnelPricing.ts │ │ │ │ │ ├── useFunnelTracking.ts │ │ │ │ │ └── useStepTransition.ts │ │ │ │ ├── shared │ │ │ │ │ ├── Box.tsx │ │ │ │ │ ├── CookieConsent.spec.tsx │ │ │ │ │ ├── CookieConsent.tsx │ │ │ │ │ ├── CreditCards.tsx │ │ │ │ │ ├── DiscountTimer.spec.tsx │ │ │ │ │ ├── DiscountTimer.tsx │ │ │ │ │ ├── FunnelBannerMessage.tsx │ │ │ │ │ ├── FunnelStepBackground.tsx │ │ │ │ │ ├── FunnelStepCtaWrapper.tsx │ │ │ │ │ ├── FunnelStepper.spec.tsx │ │ │ │ │ ├── FunnelStepper.tsx │ │ │ │ │ ├── Header.spec.tsx │ │ │ │ │ ├── Header.tsx │ │ │ │ │ ├── ImageReview.tsx │ │ │ │ │ ├── PricingPlan.module.css │ │ │ │ │ ├── PricingPlan.spec.tsx │ │ │ │ │ ├── PricingPlan.tsx │ │ │ │ │ ├── PricingPlans.spec.tsx │ │ │ │ │ ├── PricingPlans.tsx │ │ │ │ │ ├── ProgressBar.spec.tsx │ │ │ │ │ ├── ProgressBar.tsx │ │ │ │ │ ├── Reviews.tsx │ │ │ │ │ ├── SocialRegistration.tsx │ │ │ │ │ ├── Stars.tsx │ │ │ │ │ ├── StepHeadline.spec.tsx │ │ │ │ │ ├── StepHeadline.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── utils.ts │ │ │ │ │ └── withActiveGuard.tsx │ │ │ │ ├── steps │ │ │ │ │ ├── FunnelCheckout.tsx │ │ │ │ │ ├── FunnelContentTypes.tsx │ │ │ │ │ ├── FunnelEditTags.tsx │ │ │ │ │ ├── FunnelFact │ │ │ │ │ │ ├── FunnelFact.spec.tsx │ │ │ │ │ │ ├── FunnelFactCentered.tsx │ │ │ │ │ │ ├── FunnelFactDefault.tsx │ │ │ │ │ │ ├── FunnelFactWrapper.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── FunnelInstallPwa.tsx │ │ │ │ │ ├── FunnelLoading.spec.tsx │ │ │ │ │ ├── FunnelLoading.tsx │ │ │ │ │ ├── FunnelPaymentSuccessful.spec.tsx │ │ │ │ │ ├── FunnelPaymentSuccessful.tsx │ │ │ │ │ ├── FunnelPricing.spec.tsx │ │ │ │ │ ├── FunnelPricing.tsx │ │ │ │ │ ├── FunnelProfileForm.tsx │ │ │ │ │ ├── FunnelQuiz.tsx │ │ │ │ │ ├── FunnelReadingReminder.tsx │ │ │ │ │ ├── FunnelRegistration.spec.tsx │ │ │ │ │ ├── FunnelRegistration.tsx │ │ │ │ │ ├── FunnelSocialProof.spec.tsx │ │ │ │ │ ├── FunnelSocialProof.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── store │ │ │ │ │ └── funnelStore.tsx │ │ │ │ └── types │ │ │ │ │ ├── funnel.ts │ │ │ │ │ ├── funnelBoot.ts │ │ │ │ │ └── funnelEvents.ts │ │ │ ├── organizations │ │ │ │ ├── components │ │ │ │ │ ├── InviteMemberModal.tsx │ │ │ │ │ ├── SeatsOverview.tsx │ │ │ │ │ ├── Sidebar.tsx │ │ │ │ │ ├── SidebarHeader.tsx │ │ │ │ │ └── manageSeats │ │ │ │ │ │ ├── CheckoutChanges.tsx │ │ │ │ │ │ ├── Modal.tsx │ │ │ │ │ │ └── PreviewChanges.tsx │ │ │ │ ├── graphql.ts │ │ │ │ ├── hooks │ │ │ │ │ ├── useOrganization.ts │ │ │ │ │ ├── useOrganizationSubscription.ts │ │ │ │ │ └── useOrganizations.ts │ │ │ │ ├── types.ts │ │ │ │ └── utils.ts │ │ │ └── shortcuts │ │ │ │ ├── components │ │ │ │ ├── CardSelection.tsx │ │ │ │ ├── LinksForm.tsx │ │ │ │ └── modals │ │ │ │ │ ├── CustomLinksModal.tsx │ │ │ │ │ └── MostVisitedSitesModal.tsx │ │ │ │ ├── contexts │ │ │ │ └── ShortcutsProvider.tsx │ │ │ │ └── hooks │ │ │ │ ├── useShortcutLinks.ts │ │ │ │ ├── useShortcutsUser.ts │ │ │ │ └── useTopSites.ts │ │ ├── graphql │ │ │ ├── actions.ts │ │ │ ├── alerts.ts │ │ │ ├── banner.ts │ │ │ ├── bookmarks.ts │ │ │ ├── bookmarksSharing.ts │ │ │ ├── comments.spec.ts │ │ │ ├── comments.ts │ │ │ ├── common.ts │ │ │ ├── contentPreference.ts │ │ │ ├── emptyResponse.ts │ │ │ ├── features.ts │ │ │ ├── feed.ts │ │ │ ├── feedSettings.ts │ │ │ ├── fragments.ts │ │ │ ├── furtherReading.ts │ │ │ ├── integrations.ts │ │ │ ├── keywords.ts │ │ │ ├── leaderboard.ts │ │ │ ├── newSource.ts │ │ │ ├── njord.ts │ │ │ ├── notifications.ts │ │ │ ├── paddle.ts │ │ │ ├── posts.spec.ts │ │ │ ├── posts.ts │ │ │ ├── prompt.ts │ │ │ ├── queryClient.ts │ │ │ ├── search.ts │ │ │ ├── settings.ts │ │ │ ├── source │ │ │ │ ├── categories.ts │ │ │ │ └── common.ts │ │ │ ├── sources.ts │ │ │ ├── squads.ts │ │ │ ├── submitArticle.ts │ │ │ ├── subscriptions.ts │ │ │ ├── types.ts │ │ │ ├── urlShortener.ts │ │ │ └── users.ts │ │ ├── hooks │ │ │ ├── auth │ │ │ │ ├── index.ts │ │ │ │ ├── useIsSpecialUser.ts │ │ │ │ ├── useOnboarding.tsx │ │ │ │ └── useSignBack.ts │ │ │ ├── bookmark │ │ │ │ ├── common.ts │ │ │ │ ├── index.ts │ │ │ │ ├── types.ts │ │ │ │ ├── useBookmarkFolder.ts │ │ │ │ ├── useBookmarkFolderList.ts │ │ │ │ ├── useBookmarkReminderCover.ts │ │ │ │ ├── useCreateBookmarkFolder.ts │ │ │ │ ├── useFeedBookmarkPost.ts │ │ │ │ ├── useJustBookmarked.ts │ │ │ │ └── useMoveBookmarkToFolder.ts │ │ │ ├── chat │ │ │ │ ├── index.ts │ │ │ │ ├── types.ts │ │ │ │ ├── useChat.ts │ │ │ │ ├── useChatSession.ts │ │ │ │ └── useChatStream.ts │ │ │ ├── comments │ │ │ │ ├── useCommentById.ts │ │ │ │ └── useDeleteComment.ts │ │ │ ├── companion │ │ │ │ ├── index.ts │ │ │ │ ├── useBackgroundRequest.ts │ │ │ │ └── useRawBackgroundRequest.ts │ │ │ ├── constants.ts │ │ │ ├── contentPreference │ │ │ │ ├── types.ts │ │ │ │ ├── useBlockedQuery.ts │ │ │ │ ├── useContentPreference.ts │ │ │ │ ├── useContentPreferenceStatusQuery.ts │ │ │ │ ├── useFollowContentPreferenceMutationSubscription.ts │ │ │ │ ├── useFollowersQuery.ts │ │ │ │ ├── useFollowingQuery.ts │ │ │ │ ├── useSearchSuggestionsContentPreferenceMutationSubscription.ts │ │ │ │ ├── useSourceContentPreferenceMutationSubscription.ts │ │ │ │ └── useUsersContentPreferenceMutationSubscription.ts │ │ │ ├── feed │ │ │ │ ├── index.ts │ │ │ │ ├── useAdvancedSettings.ts │ │ │ │ ├── useAutoRotatingAds.ts │ │ │ │ ├── useCardCover.tsx │ │ │ │ ├── useCommentPopup.ts │ │ │ │ ├── useCustomDefaultFeed.ts │ │ │ │ ├── useCustomFeed.ts │ │ │ │ ├── useFeedContextMenu.ts │ │ │ │ ├── useFeedInfiniteScroll.ts │ │ │ │ ├── useFeedName.ts │ │ │ │ ├── useFeedOnPostClick.ts │ │ │ │ ├── useFeedTags.ts │ │ │ │ ├── useFeeds.spec.tsx │ │ │ │ ├── useFeeds.ts │ │ │ │ ├── useFollowPostTags.ts │ │ │ │ ├── useInteractiveFeed.ts │ │ │ │ ├── useLogImpression.ts │ │ │ │ └── useSortedFeeds.ts │ │ │ ├── index.ts │ │ │ ├── input │ │ │ │ ├── index.ts │ │ │ │ ├── useDebouncedUrl.ts │ │ │ │ ├── useDiscardPost.ts │ │ │ │ ├── useMarkdownInput.ts │ │ │ │ └── useSyncUploader.ts │ │ │ ├── integrations │ │ │ │ ├── slack │ │ │ │ │ ├── useSlack.ts │ │ │ │ │ ├── useSlackChannelsQuery.ts │ │ │ │ │ └── useSlackConnectSourceMutation.ts │ │ │ │ ├── useIntegration.ts │ │ │ │ ├── useIntegrationQuery.ts │ │ │ │ ├── useIntegrationsQuery.ts │ │ │ │ ├── useSourceIntegrationQuery.ts │ │ │ │ └── useSourceIntegrationsQuery.ts │ │ │ ├── log │ │ │ │ ├── useBackfillPendingLogs.ts │ │ │ │ ├── useDeviceId.ts │ │ │ │ ├── useLogContextData.ts │ │ │ │ ├── useLogLifecycleEvents.ts │ │ │ │ ├── useLogPageView.ts │ │ │ │ ├── useLogQueue.ts │ │ │ │ └── useLogSharedProps.ts │ │ │ ├── modals │ │ │ │ └── useTopReaderModal.ts │ │ │ ├── mutationSubscription │ │ │ │ ├── index.ts │ │ │ │ ├── types.ts │ │ │ │ └── useMutationSubscription.ts │ │ │ ├── notifications │ │ │ │ ├── index.ts │ │ │ │ ├── useBookmarkReminder.spec.tsx │ │ │ │ ├── useBookmarkReminder.ts │ │ │ │ ├── useEnableNotification.ts │ │ │ │ ├── useNotificationPreference.ts │ │ │ │ ├── useNotificationPreferenceToggle.ts │ │ │ │ ├── useNotificationToggle.ts │ │ │ │ ├── usePromotionModal.ts │ │ │ │ ├── usePushNotificationMutation.tsx │ │ │ │ └── useStreakRecoverModal.ts │ │ │ ├── onboarding │ │ │ │ ├── useCheckExistingEmail.ts │ │ │ │ └── useGenerateUsername.ts │ │ │ ├── payment │ │ │ │ └── useStoreKitPayment.ts │ │ │ ├── post │ │ │ │ ├── common.ts │ │ │ │ ├── index.ts │ │ │ │ ├── useBlockPostPanel.ts │ │ │ │ ├── useComments.ts │ │ │ │ ├── useEditCommentProps.ts │ │ │ │ ├── useLoggedCopyPostLink.ts │ │ │ │ ├── useMutateComment.ts │ │ │ │ ├── usePostActions.spec.tsx │ │ │ │ ├── usePostActions.ts │ │ │ │ ├── usePostCodeSnippets.ts │ │ │ │ ├── usePostImage.ts │ │ │ │ ├── usePublicReadingHistory.ts │ │ │ │ ├── useRelatedPosts.ts │ │ │ │ ├── useSmartTitle.ts │ │ │ │ └── useViewPost.ts │ │ │ ├── profile │ │ │ │ ├── useActivityTimeFilter.ts │ │ │ │ ├── useDevCard.ts │ │ │ │ ├── useProfile.ts │ │ │ │ └── useProfileReadme.ts │ │ │ ├── prompt │ │ │ │ ├── usePromptButtons.ts │ │ │ │ ├── usePromptsQuery.ts │ │ │ │ └── useSmartPrompt.ts │ │ │ ├── referral │ │ │ │ ├── index.ts │ │ │ │ ├── useJoinReferral.spec.tsx │ │ │ │ ├── useJoinReferral.ts │ │ │ │ ├── useReferralCampaign.ts │ │ │ │ └── useReferralConfig.ts │ │ │ ├── search │ │ │ │ ├── index.ts │ │ │ │ ├── useSearchHistory.ts │ │ │ │ ├── useSearchProvider.spec.tsx │ │ │ │ ├── useSearchProvider.ts │ │ │ │ ├── useSearchProviderSuggestions.spec.tsx │ │ │ │ ├── useSearchProviderSuggestions.ts │ │ │ │ └── useSearchResultsLayout.ts │ │ │ ├── source │ │ │ │ ├── index.ts │ │ │ │ ├── usePrivateSourceJoin.ts │ │ │ │ ├── useSourceActions.ts │ │ │ │ ├── useSourceActionsBlock.ts │ │ │ │ ├── useSourceActionsFollow.ts │ │ │ │ ├── useSourceActionsNotify.ts │ │ │ │ ├── useSourcePostModeration.ts │ │ │ │ ├── useSourcePostModerationById.ts │ │ │ │ └── useSources.ts │ │ │ ├── squads │ │ │ │ ├── index.ts │ │ │ │ ├── usePostToSquad.ts │ │ │ │ ├── useSourceModerationList.ts │ │ │ │ ├── useSquad.ts │ │ │ │ ├── useSquadActions.ts │ │ │ │ ├── useSquadCategories.ts │ │ │ │ ├── useSquadCreate.ts │ │ │ │ └── useSquadPendingPosts.ts │ │ │ ├── streaks │ │ │ │ ├── index.ts │ │ │ │ ├── useReadingStreak.ts │ │ │ │ ├── useStreakRecover.ts │ │ │ │ └── useStreakTimezoneOk.ts │ │ │ ├── translation │ │ │ │ └── useTranslation.ts │ │ │ ├── useAccountEmailFlow.ts │ │ │ ├── useActions.ts │ │ │ ├── useActiveNav.tsx │ │ │ ├── useAuthErrors.ts │ │ │ ├── useAuthForms.ts │ │ │ ├── useAuthVerificationRecovery.ts │ │ │ ├── useAutoComplete.ts │ │ │ ├── useAutomation.ts │ │ │ ├── useBanner.ts │ │ │ ├── useBookmarkPost.ts │ │ │ ├── useBookmarkProvider.ts │ │ │ ├── useBoot.ts │ │ │ ├── useChangelog.spec.tsx │ │ │ ├── useChangelog.ts │ │ │ ├── useCheckCoresRole.ts │ │ │ ├── useChecklist.spec.tsx │ │ │ ├── useChecklist.ts │ │ │ ├── useClickbaitTries.ts │ │ │ ├── useConditionalFeature.spec.tsx │ │ │ ├── useConditionalFeature.ts │ │ │ ├── useConfetti.tsx │ │ │ ├── useConsoleLogo.ts │ │ │ ├── useContentScriptStatus.ts │ │ │ ├── useContextMenu.ts │ │ │ ├── useCookieBanner.ts │ │ │ ├── useCookieConsent.ts │ │ │ ├── useCopy.ts │ │ │ ├── useCopyPostLink.ts │ │ │ ├── useCoresFeature.ts │ │ │ ├── useDebounce.ts │ │ │ ├── useDebounceFn.spec.ts │ │ │ ├── useDebounceFn.ts │ │ │ ├── useDeleteSquad.ts │ │ │ ├── useDomPurify.ts │ │ │ ├── useError.ts │ │ │ ├── useEventListener.spec.ts │ │ │ ├── useEventListener.ts │ │ │ ├── useExitConfirmation.ts │ │ │ ├── useFeed.ts │ │ │ ├── useFeedLayout.ts │ │ │ ├── useFeedPreviewMode.ts │ │ │ ├── useFeedSettings.ts │ │ │ ├── useFindSquadWelcomePost.ts │ │ │ ├── useHideMobileSidebar.ts │ │ │ ├── useHideOnModal.ts │ │ │ ├── useHostPermissionStatus.ts │ │ │ ├── useIOSError.ts │ │ │ ├── useInAppNotification.ts │ │ │ ├── useInfiniteReadingHistory.ts │ │ │ ├── useInputField.ts │ │ │ ├── useInputFieldFunctions.ts │ │ │ ├── useJoinSquad.ts │ │ │ ├── useKeyboardNavigation.ts │ │ │ ├── useLanguage.ts │ │ │ ├── useLazyModal.ts │ │ │ ├── useLeaveSquad.ts │ │ │ ├── useLogModal.ts │ │ │ ├── useLogin.ts │ │ │ ├── useMedia.ts │ │ │ ├── useMemberRoleForSource.ts │ │ │ ├── useMutateFilters.ts │ │ │ ├── useNotificationParams.ts │ │ │ ├── useNotificationPermissionPopup.ts │ │ │ ├── useOnPostClick.ts │ │ │ ├── usePaddlePayment.ts │ │ │ ├── usePersistentContext.ts │ │ │ ├── usePersistentState.ts │ │ │ ├── usePersonalizedDigest.spec.tsx │ │ │ ├── usePersonalizedDigest.ts │ │ │ ├── usePlusSubscription.ts │ │ │ ├── usePopupSelector.ts │ │ │ ├── usePostById.ts │ │ │ ├── usePostContent.ts │ │ │ ├── usePostFeedback.ts │ │ │ ├── usePostMenuActions.ts │ │ │ ├── usePostModalNavigation.ts │ │ │ ├── usePostNavigationPosition.ts │ │ │ ├── usePrevious.spec.tsx │ │ │ ├── usePrevious.ts │ │ │ ├── usePrivilegedSession.ts │ │ │ ├── useProductPricing.ts │ │ │ ├── useProfileForm.ts │ │ │ ├── useProfileMenu.ts │ │ │ ├── useProgressAnimation.ts │ │ │ ├── usePrompt.ts │ │ │ ├── useQuerySubscription.ts │ │ │ ├── useReadingHistory.ts │ │ │ ├── useReadingHistoryContextMenu.ts │ │ │ ├── useRefreshToken.ts │ │ │ ├── useRegistration.ts │ │ │ ├── useReportComment.ts │ │ │ ├── useReportPost.ts │ │ │ ├── useReportPostMenu.ts │ │ │ ├── useRequestProtocol.ts │ │ │ ├── useRequirePermissions.ts │ │ │ ├── useResetScrollForResponsiveModal.ts │ │ │ ├── useScrollRestoration.ts │ │ │ ├── useScrollTopClassName.ts │ │ │ ├── useScrollTopOffset.ts │ │ │ ├── useShareComment.ts │ │ │ ├── useShareOrCopyLink.ts │ │ │ ├── useSharePost.ts │ │ │ ├── useSidebarRendered.ts │ │ │ ├── useSourceSearch.ts │ │ │ ├── useSquadChecklist.tsx │ │ │ ├── useSquadInvitation.ts │ │ │ ├── useSquadNavigation.ts │ │ │ ├── useSquadOnboarding.ts │ │ │ ├── useSquadTour.ts │ │ │ ├── useSubscription.ts │ │ │ ├── useTagAndSource.ts │ │ │ ├── useTagContext.ts │ │ │ ├── useTagSearch.ts │ │ │ ├── useTimedAnimation.ts │ │ │ ├── useTimer.ts │ │ │ ├── useToastNotification.ts │ │ │ ├── useToggle.ts │ │ │ ├── useTopReader.ts │ │ │ ├── useTruncatedSummary.ts │ │ │ ├── useUpdatePost.ts │ │ │ ├── useUpdateQuery.ts │ │ │ ├── useUpvoteQuery.ts │ │ │ ├── useViewSize.spec.ts │ │ │ ├── useViewSize.ts │ │ │ ├── useWebVitals.ts │ │ │ ├── user │ │ │ │ └── useUserShortByIdQuery.ts │ │ │ ├── userCompany │ │ │ │ ├── index.tsx │ │ │ │ └── useUserCompaniesQuery.tsx │ │ │ ├── utils │ │ │ │ ├── index.ts │ │ │ │ ├── useFeatureTheme.ts │ │ │ │ ├── useGetShortUrl.ts │ │ │ │ ├── useInteractivePopup.ts │ │ │ │ ├── useOutsideClick.ts │ │ │ │ ├── usePagination.ts │ │ │ │ ├── useQueryState.ts │ │ │ │ ├── useThemedAsset.ts │ │ │ │ └── useVisualViewport.ts │ │ │ └── vote │ │ │ │ ├── index.ts │ │ │ │ ├── types.ts │ │ │ │ ├── useFeedVotePost.ts │ │ │ │ ├── useReadHistoryVotePost.ts │ │ │ │ ├── useVote.ts │ │ │ │ ├── useVoteComment.ts │ │ │ │ ├── useVotePost.ts │ │ │ │ └── utils.ts │ │ ├── lib │ │ │ ├── ads.ts │ │ │ ├── auth.ts │ │ │ ├── base64.ts │ │ │ ├── blob.ts │ │ │ ├── boot.ts │ │ │ ├── canonical.ts │ │ │ ├── checklist.ts │ │ │ ├── classed.ts │ │ │ ├── click.ts │ │ │ ├── config.ts │ │ │ ├── constants.ts │ │ │ ├── cookie.spec.ts │ │ │ ├── cookie.ts │ │ │ ├── cores.ts │ │ │ ├── date.ts │ │ │ ├── dateFormat.spec.ts │ │ │ ├── dateFormat.ts │ │ │ ├── dynamicParent.tsx │ │ │ ├── element.ts │ │ │ ├── errors.ts │ │ │ ├── extension.ts │ │ │ ├── featureManagement.ts │ │ │ ├── featureValues.ts │ │ │ ├── feed.ts │ │ │ ├── fetchTimeout.ts │ │ │ ├── form.ts │ │ │ ├── func.ts │ │ │ ├── geo.ts │ │ │ ├── image.ts │ │ │ ├── index.ts │ │ │ ├── integrations.ts │ │ │ ├── ios.ts │ │ │ ├── kratos.ts │ │ │ ├── labels.ts │ │ │ ├── lifecycle.ts │ │ │ ├── links.spec.ts │ │ │ ├── links.ts │ │ │ ├── log.ts │ │ │ ├── markdown.ts │ │ │ ├── numberFormat.spec.ts │ │ │ ├── numberFormat.ts │ │ │ ├── plus.ts │ │ │ ├── query.ts │ │ │ ├── referral.ts │ │ │ ├── share.spec.ts │ │ │ ├── share.ts │ │ │ ├── socialMedia.ts │ │ │ ├── storage.ts │ │ │ ├── storageWrapper.ts │ │ │ ├── strings.ts │ │ │ ├── structuredClone.ts │ │ │ ├── textarea.ts │ │ │ ├── timezones.ts │ │ │ ├── tooltip.ts │ │ │ ├── topReader.ts │ │ │ ├── transaction.tsx │ │ │ ├── user.ts │ │ │ ├── userCompany.ts │ │ │ ├── utils.ts │ │ │ └── withNoSSR.ts │ │ ├── report.ts │ │ ├── styles │ │ │ ├── base.css │ │ │ ├── colors.ts │ │ │ ├── components.css │ │ │ ├── components │ │ │ │ ├── buttons.css │ │ │ │ └── menu.css │ │ │ ├── custom.ts │ │ │ ├── globals.css │ │ │ ├── ios.css │ │ │ ├── media.ts │ │ │ ├── shadows.ts │ │ │ ├── typography.ts │ │ │ └── utilities.css │ │ ├── svg │ │ │ ├── BetaBadge.tsx │ │ │ ├── ConfettiSvg.tsx │ │ │ ├── LogoIcon.tsx │ │ │ ├── LogoText.tsx │ │ │ └── SquadReady.tsx │ │ ├── types.ts │ │ └── useDynamicHeader.ts │ ├── tailwind.config.ts │ ├── tailwind │ │ ├── .eslintrc.js │ │ ├── boxShadow.ts │ │ ├── buttons.ts │ │ ├── caret.ts │ │ ├── colors.ts │ │ ├── colors │ │ │ ├── accent.ts │ │ │ ├── action.ts │ │ │ ├── background.ts │ │ │ ├── blur.ts │ │ │ ├── border.ts │ │ │ ├── brand.ts │ │ │ ├── overlay.ts │ │ │ ├── shadow.ts │ │ │ ├── status.ts │ │ │ ├── surface.ts │ │ │ └── text.ts │ │ ├── overlay.ts │ │ └── typography.ts │ ├── tsconfig.eslint.json │ └── tsconfig.json ├── storybook │ ├── .eslintrc.js │ ├── .gitignore │ ├── .storybook │ │ ├── main.ts │ │ └── preview.tsx │ ├── mock │ │ ├── GrowthBookProvider.tsx │ │ ├── boot.ts │ │ ├── gb.ts │ │ ├── hooks.ts │ │ ├── next-router.ts │ │ ├── node-fetch.ts │ │ └── webextension-polyfill.ts │ ├── package.json │ ├── postcss.config.cjs │ ├── public │ │ ├── images │ │ │ └── onboarding │ │ │ │ └── onboarding-fact-img.png │ │ └── mockServiceWorker.js │ ├── stories │ │ ├── atoms │ │ │ ├── Button.stories.tsx │ │ │ ├── DateFormat.stories.tsx │ │ │ ├── GenericLoader.stories.tsx │ │ │ ├── Icon.stories.tsx │ │ │ ├── Icons.mdx │ │ │ ├── ProfilePicture.stories.tsx │ │ │ ├── Typography.stories.tsx │ │ │ ├── pill.stories.tsx │ │ │ └── video.stories.tsx │ │ ├── components │ │ │ ├── ActionButtons.stories.tsx │ │ │ ├── FormWrapper.stories.tsx │ │ │ ├── HorizontalScroll.stories.tsx │ │ │ ├── TopReaderBadge.stories.tsx │ │ │ ├── cards │ │ │ │ ├── AcquisitionForm │ │ │ │ │ ├── AcquisitionFormGrid.stories.tsx │ │ │ │ │ └── AcquisitionFormList.stories.tsx │ │ │ │ ├── Squad │ │ │ │ │ ├── SquadGrid.stories.tsx │ │ │ │ │ ├── SquadList.stories.tsx │ │ │ │ │ └── UnfeaturedSquadGrid.stories.tsx │ │ │ │ └── ad │ │ │ │ │ ├── AdGrid.stories.tsx │ │ │ │ │ └── AdList.stories.tsx │ │ │ ├── comments │ │ │ │ └── CommentContainer.stories.tsx │ │ │ ├── drawers │ │ │ │ ├── Drawer.stories.tsx │ │ │ │ ├── ListDrawer.stories.tsx │ │ │ │ └── NavDrawer.stories.tsx │ │ │ ├── form │ │ │ │ ├── FormInputCheckboxGroup.stories.tsx │ │ │ │ └── FormInputRating.stories.tsx │ │ │ ├── modals │ │ │ │ └── BookmarkReminderModal.stories.tsx │ │ │ └── onboarding │ │ │ │ ├── Box.stories.tsx │ │ │ │ ├── CookieConsent.stories.tsx │ │ │ │ ├── CreditCards.stories.tsx │ │ │ │ ├── DiscountTimer.stories.tsx │ │ │ │ ├── FunnelCheckout.stories.tsx │ │ │ │ ├── FunnelFact.stories.tsx │ │ │ │ ├── FunnelLoading.stories.tsx │ │ │ │ ├── FunnelPaymentSuccessful.stories.tsx │ │ │ │ ├── FunnelPricing.stories.tsx │ │ │ │ ├── FunnelQuiz.stories.tsx │ │ │ │ ├── FunnelSocialProof.stories.tsx │ │ │ │ ├── FunnelStepper.stories.tsx │ │ │ │ ├── Header.stories.tsx │ │ │ │ ├── ImageReview.stories.tsx │ │ │ │ ├── PricingPlan.stories.tsx │ │ │ │ ├── PricingPlans.stories.tsx │ │ │ │ ├── Reviews.stories.tsx │ │ │ │ └── StepHeadline.stories.tsx │ │ ├── experiments │ │ │ └── Helpers.mdx │ │ ├── extension │ │ │ ├── ShortcutLinks.stories.tsx │ │ │ └── _providers.tsx │ │ └── tokens │ │ │ └── Color.stories.tsx │ ├── tailwind.config.ts │ ├── tsconfig.json │ └── vite.config.ts └── webapp │ ├── .env │ ├── .eslintignore │ ├── .eslintrc.js │ ├── .gitignore │ ├── .graphqlconfig │ ├── README.md │ ├── __mocks__ │ ├── reactMarkdownMock.tsx │ └── svgrMock.ts │ ├── __tests__ │ ├── AccountNotificationsPage.tsx │ ├── AccountProfilePage.tsx │ ├── AccountSecurityPage.tsx │ ├── BookmarksPage.tsx │ ├── Callback.spec.tsx │ ├── HistoryPage.spec.tsx │ ├── KeywordPage.tsx │ ├── MainLayout.tsx │ ├── MostDiscussedPage.tsx │ ├── MostUpvotedPage.tsx │ ├── MyFeedPage.tsx │ ├── NotificationsPage.tsx │ ├── PendingKeywords.tsx │ ├── PopularPage.tsx │ ├── PostPage.tsx │ ├── ProfileIndexPage.tsx │ ├── ProfilePostsPage.tsx │ ├── ProfileRepliesPage.tsx │ ├── ProfileUpvotedPage.tsx │ ├── SearchPage.tsx │ ├── SearchResultsPage.tsx │ ├── SourcePage.tsx │ ├── SquadFeedPage.tsx │ ├── SquadTokenPage.tsx │ ├── TagPage.tsx │ └── setup.ts │ ├── components │ ├── KeywordManagement.module.css │ ├── KeywordManagement.spec.tsx │ ├── KeywordManagement.tsx │ ├── Pixels.tsx │ ├── PostSEOSchema.tsx │ ├── Promotion.module.css │ ├── ProtectedPage.tsx │ ├── RouterPostsSearch.tsx │ ├── banner │ │ ├── CookieBanner.spec.tsx │ │ ├── CookieBanner.tsx │ │ └── CookieBannerContainer.tsx │ ├── common.ts │ ├── footer │ │ ├── FooterNavBarItem.tsx │ │ ├── FooterNavBarTabs.tsx │ │ ├── FooterPlusButton.tsx │ │ ├── FooterWrapper.tsx │ │ ├── MobileFooterNavbar.tsx │ │ └── common.ts │ ├── history │ │ ├── common.ts │ │ ├── index.ts │ │ └── reading.tsx │ ├── invite │ │ ├── AISearchInvite.tsx │ │ ├── Referral.tsx │ │ └── common.tsx │ ├── layouts │ │ ├── BookmarkFeedPage.tsx │ │ ├── CoresLayout.tsx │ │ ├── FeedByIds │ │ │ ├── FeedByIdsLayout.tsx │ │ │ └── FeedByIdsPage.tsx │ │ ├── FeedLayout.tsx │ │ ├── FooterNavBarLayout.tsx │ │ ├── MainFeedPage.tsx │ │ ├── MainFooterLayout.tsx │ │ ├── MainLayout.tsx │ │ ├── OrganizationLayout │ │ │ └── index.tsx │ │ ├── PlusLayout │ │ │ ├── PlusHeader.tsx │ │ │ └── PlusLayout.tsx │ │ ├── ProfileLayout │ │ │ ├── NavBar.module.css │ │ │ ├── NavBar.tsx │ │ │ └── index.tsx │ │ ├── SearchLayout.tsx │ │ ├── SettingsLayout │ │ │ ├── AccountContentSection.tsx │ │ │ ├── AccountPageContainer.tsx │ │ │ ├── Customization │ │ │ │ └── DevCard │ │ │ │ │ ├── DevCardStep1.tsx │ │ │ │ │ └── DevCardStep2.tsx │ │ │ ├── EmailForm.tsx │ │ │ ├── EmailSentSection.tsx │ │ │ ├── FeedSettingsLayout.tsx │ │ │ ├── Profile │ │ │ │ ├── VerifiedCompanyBadge │ │ │ │ │ └── VerifiedCompanyBadgeSection.tsx │ │ │ │ ├── VerifyWorkEmail.tsx │ │ │ │ └── index.tsx │ │ │ ├── Security │ │ │ │ ├── AccountLoginSection.tsx │ │ │ │ ├── EmailFormPage.tsx │ │ │ │ └── index.tsx │ │ │ ├── common.tsx │ │ │ └── index.tsx │ │ └── utils.ts │ └── search │ │ └── SearchPostFinderPage.tsx │ ├── context │ └── PixelsContext.tsx │ ├── custom.d.ts │ ├── graphql │ └── devcard.ts │ ├── hooks │ ├── useSharedByToast.tsx │ └── useWebappVersion.ts │ ├── jest.config.js │ ├── next-seo.ts │ ├── next.config.ts │ ├── package.json │ ├── pages │ ├── 404.tsx │ ├── [userId] │ │ ├── index.tsx │ │ ├── posts.tsx │ │ ├── replies.tsx │ │ └── upvoted.tsx │ ├── _app.tsx │ ├── api │ │ └── files │ │ │ └── security.ts │ ├── backoffice │ │ ├── keywords │ │ │ └── [value].tsx │ │ └── pendingKeywords.tsx │ ├── bookmarks │ │ ├── [folderId].tsx │ │ ├── index.tsx │ │ └── later.tsx │ ├── callback.tsx │ ├── cores │ │ ├── index.tsx │ │ └── payment.tsx │ ├── discussed.tsx │ ├── error.tsx │ ├── feed-by-ids.tsx │ ├── feeds │ │ ├── [slugOrId] │ │ │ ├── edit.tsx │ │ │ └── index.tsx │ │ └── new.tsx │ ├── following.tsx │ ├── helloworld │ │ ├── [id] │ │ │ └── index.tsx │ │ └── index.tsx │ ├── history.tsx │ ├── image-generator │ │ ├── badges │ │ │ └── [badgeId].tsx │ │ └── devcards │ │ │ └── [userId].tsx │ ├── index.tsx │ ├── join │ │ ├── index.tsx │ │ └── organization.tsx │ ├── my-feed.tsx │ ├── notifications.tsx │ ├── onboarding.tsx │ ├── plus │ │ ├── gift │ │ │ └── index.tsx │ │ ├── index.tsx │ │ ├── payment.tsx │ │ └── success.tsx │ ├── popular.tsx │ ├── popup │ │ └── notifications │ │ │ └── enable.tsx │ ├── posts │ │ ├── [id] │ │ │ ├── edit.tsx │ │ │ ├── index.tsx │ │ │ └── share │ │ │ │ └── index.tsx │ │ ├── discussed.tsx │ │ ├── index.tsx │ │ ├── latest.tsx │ │ └── upvoted.tsx │ ├── roast.tsx │ ├── search │ │ └── posts │ │ │ └── index.tsx │ ├── settings │ │ ├── appearance.tsx │ │ ├── customization │ │ │ ├── devcard.tsx │ │ │ ├── integrations.tsx │ │ │ └── streaks.tsx │ │ ├── feed │ │ │ ├── ai.tsx │ │ │ ├── blocked.tsx │ │ │ ├── general.tsx │ │ │ ├── preferences.tsx │ │ │ ├── sources.tsx │ │ │ └── tags.tsx │ │ ├── invite.tsx │ │ ├── notifications.tsx │ │ ├── organization │ │ │ ├── [orgId] │ │ │ │ ├── billing.tsx │ │ │ │ ├── general.tsx │ │ │ │ ├── index.ts │ │ │ │ └── members.tsx │ │ │ └── index.tsx │ │ ├── privacy.tsx │ │ ├── profile.tsx │ │ ├── security.tsx │ │ └── subscription.tsx │ ├── sources │ │ ├── [source].tsx │ │ └── index.tsx │ ├── squads │ │ ├── [handle] │ │ │ ├── [token].tsx │ │ │ ├── edit.tsx │ │ │ ├── index.tsx │ │ │ └── moderate.tsx │ │ ├── create.tsx │ │ ├── discover │ │ │ ├── [id].tsx │ │ │ ├── featured.tsx │ │ │ ├── index.tsx │ │ │ └── my.tsx │ │ ├── index.tsx │ │ ├── moderate.tsx │ │ └── new.tsx │ ├── tags │ │ ├── [tag].tsx │ │ └── index.tsx │ ├── upvoted.tsx │ ├── users.tsx │ ├── verification.tsx │ ├── wallet.tsx │ └── welcome │ │ └── index.tsx │ ├── postcss.config.js │ ├── public │ ├── .well-known │ │ ├── apple-app-site-association │ │ ├── apple-developer-merchantid-domain-association │ │ └── assetlinks.json │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── assets │ │ ├── dailydev.svg │ │ ├── google.svg │ │ ├── maskable_icon.png │ │ └── mstile-150x150.png │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── manifest.json │ ├── push │ │ └── onesignal │ │ │ └── OneSignalSDKWorker.js │ ├── robots.txt │ └── sitemap.txt │ ├── sw.ts │ ├── tailwind.config.ts │ ├── tsconfig.eslint.json │ ├── tsconfig.jest.json │ ├── tsconfig.json │ └── vercel.json ├── patches └── graphql-request@3.7.0.patch ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── vercel.json └── wait-for.sh /.cert/public.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PUBLIC KEY----- 2 | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyGzVJVj3CcT7oSGVtZmG 3 | zAz4ashHU6anDs0HeEfBF/XuUc/dl+Tg2I7D1pbYgN9XkcqfmKVmT8pKSl1TvjDQ 4 | 92BscqCCqer1ks5X8YstpRbMPBiQAXOL+QQH5tMyXuNjNmD4oJ6ljAeeh+CIjhbe 5 | cm8mIDLLhgkfkRME//00sVf0berDvMA2kLG20Rw8W7qCY+AYZzAS5OPoX7cg8KM6 6 | xuvS53ijMxqXV69vkHPGoYfWG0XCoQFiWPu9sZ4y1RtstPW+XDuWBbi63kBMR2gm 7 | 6S+tkxhzAgWZNOhtqvSTFxKH9c51/jTCLDrPvHNlzNoeqhvaowUmvOrRoT1TZ8hs 8 | 7QIDAQAB 9 | -----END PUBLIC KEY----- 10 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .garden/ 3 | **/*/node_modules/ 4 | packages/webapp/.env 5 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # http://editorconfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | 9 | # Change these settings to your own preference 10 | indent_style = space 11 | indent_size = 2 12 | 13 | # We recommend you to keep these unchanged 14 | end_of_line = lf 15 | charset = utf-8 16 | trim_trailing_whitespace = true 17 | insert_final_newline = true 18 | max_line_length = 80 19 | 20 | [*.md] 21 | trim_trailing_whitespace = false 22 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | Dockerfile eol=lf 2 | *.sh eol=lf 3 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @dailydotdev/web-team 2 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /.idea/jsLibraryMappings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/jsLinters/eslint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 22.11 2 | -------------------------------------------------------------------------------- /.pnpmfile.cjs: -------------------------------------------------------------------------------- 1 | function switchDependency(pkg, dep, newDep) { 2 | if (pkg.dependencies[dep]) { 3 | pkg.dependencies[dep] = newDep; 4 | } 5 | } 6 | 7 | function readPackage(pkg) { 8 | if (pkg.dependencies) { 9 | switchDependency(pkg, '@growthbook/growthbook', 'https://gitpkg.now.sh/dailydotdev/growthbook/packages/sdk-js?e354fcf41b2b3f67590294a0e2cdfb56044d7a1e'); 10 | } 11 | return pkg 12 | } 13 | 14 | module.exports = { 15 | hooks: { 16 | readPackage 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "firsttris.vscode-jest-runner", 4 | "bradlc.vscode-tailwindcss", 5 | "dbaeumer.vscode-eslint", 6 | "esbenp.prettier-vscode" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "daily-apps", 3 | "private": true, 4 | "dependencies": { 5 | "@babel/runtime": "^7.25.9", 6 | "postcss-rem-to-responsive-pixel": "^6.0.2" 7 | }, 8 | "scripts": { 9 | "prepare": "corepack enable || true", 10 | "pnpm-version": "pnpm -v" 11 | }, 12 | "packageManager": "pnpm@9.14.4", 13 | "pnpm": { 14 | "patchedDependencies": { 15 | "graphql-request@3.7.0": "patches/graphql-request@3.7.0.patch" 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /packages/eslint-rules/__tests__/eslint-rules.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const eslintRules = require('..'); 4 | 5 | describe('eslint-rules', () => { 6 | it('needs tests'); 7 | }); 8 | -------------------------------------------------------------------------------- /packages/eslint-rules/lib/index.js: -------------------------------------------------------------------------------- 1 | module.exports.rules = { 2 | 'no-custom-color': require('./rules/no-custom-color'), 3 | }; 4 | -------------------------------------------------------------------------------- /packages/extension/.env.production: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_API_URL=https://api.daily.dev 2 | NEXT_PUBLIC_SUBS_URL=wss://subs.daily.dev/graphql 3 | NEXT_PUBLIC_DOMAIN=daily.dev 4 | NEXT_PUBLIC_GA=UA-109059578-1 5 | NEXT_PUBLIC_AMPLITUDE=ee64cef405fb51cba273308cfcef7228 6 | 7 | NEXT_PUBLIC_WEBAPP_URL=https://app.daily.dev/ 8 | NEXT_PUBLIC_AUTH_URL=https://sso.daily.dev 9 | 10 | NEXT_PUBLIC_ONESIGNAL_APP_ID=94045faf-ffdd-4079-a793-6ccaca80e265 11 | NEXT_PUBLIC_EXPERIMENTATION_KEY=ACCB0B287D9C5EACBA90999B3356069F 12 | 13 | NEXT_PUBLIC_SLACK_CLIENT_ID=1137730955072.7361269413077 14 | NEXT_PUBLIC_PADDLE_TOKEN=topsecret 15 | -------------------------------------------------------------------------------- /packages/extension/.eslintignore: -------------------------------------------------------------------------------- 1 | dist 2 | -------------------------------------------------------------------------------- /packages/extension/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['@dailydotdev'], 3 | env: { 4 | webextensions: true, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /packages/extension/.graphqlconfig: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Daily GraphQL Schema", 3 | "extensions": { 4 | "endpoints": { 5 | "Daily GraphQL Endpoint": { 6 | "url": "http://localhost:5000/graphql", 7 | "introspect": true 8 | } 9 | } 10 | }, 11 | "schemaPath": "./schema.graphql" 12 | } -------------------------------------------------------------------------------- /packages/extension/__mocks__/reactMarkdownMock.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement, ReactNode } from 'react'; 2 | import React from 'react'; 3 | 4 | const ReactMarkdown = ({ 5 | children, 6 | }: { 7 | children?: ReactNode; 8 | }): ReactElement => { 9 | return <>{children}; 10 | }; 11 | 12 | export default ReactMarkdown; 13 | -------------------------------------------------------------------------------- /packages/extension/__mocks__/svgrMock.ts: -------------------------------------------------------------------------------- 1 | export default 'div'; 2 | -------------------------------------------------------------------------------- /packages/extension/custom.d.ts: -------------------------------------------------------------------------------- 1 | type SvgrComponent = React.FC>; 2 | 3 | declare module '*.svg' { 4 | const value: SvgrComponent; 5 | export default value; 6 | } 7 | 8 | declare module '*.css' { 9 | const mod: { [cls: string]: string }; 10 | export default mod; 11 | } 12 | -------------------------------------------------------------------------------- /packages/extension/postcss.config.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-var-requires */ 2 | const config = require('@dailydotdev/shared/postcss.config'); 3 | 4 | module.exports = config; 5 | -------------------------------------------------------------------------------- /packages/extension/public/icons/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/extension/public/icons/128.png -------------------------------------------------------------------------------- /packages/extension/public/icons/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/extension/public/icons/16.png -------------------------------------------------------------------------------- /packages/extension/public/icons/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/extension/public/icons/48.png -------------------------------------------------------------------------------- /packages/extension/public/icons/action_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/extension/public/icons/action_16.png -------------------------------------------------------------------------------- /packages/extension/public/icons/action_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/extension/public/icons/action_32.png -------------------------------------------------------------------------------- /packages/extension/public/mvs_firefox.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/extension/public/mvs_firefox.jpg -------------------------------------------------------------------------------- /packages/extension/public/mvs_google.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/extension/public/mvs_google.jpg -------------------------------------------------------------------------------- /packages/extension/src/companion/common.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { AlertPointerCopy } from '@dailydotdev/shared/src/components/alert/common'; 3 | 4 | export const companionAlertMessage = ( 5 | 6 | Meet your new superpower! 🦸 7 |
8 | We prepared a TLDR for you inside 9 |
10 | ); 11 | -------------------------------------------------------------------------------- /packages/extension/src/companion/companionFetch.tsx: -------------------------------------------------------------------------------- 1 | import { ExtensionMessageType } from '@dailydotdev/shared/src/lib/extension'; 2 | import browser from 'webextension-polyfill'; 3 | 4 | const proxyFetch = { 5 | apply(_, __, args) { 6 | browser.runtime.sendMessage({ 7 | type: ExtensionMessageType.FetchRequest, 8 | url: args[0], 9 | args: args[1], 10 | }); 11 | return null; 12 | }, 13 | }; 14 | 15 | export const companionFetch = new Proxy(fetch, proxyFetch); 16 | -------------------------------------------------------------------------------- /packages/extension/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line import/no-extraneous-dependencies 2 | import { type Config } from 'tailwindcss'; 3 | import config from '@dailydotdev/shared/tailwind.config'; 4 | 5 | module.exports = { 6 | ...config, 7 | content: [ 8 | './src/**/*.{js,ts,jsx,tsx}', 9 | './node_modules/@dailydotdev/shared/src/**/*.{js,ts,jsx,tsx}', 10 | ], 11 | // eslint-disable-next-line 12 | } satisfies Config; 13 | -------------------------------------------------------------------------------- /packages/extension/tsconfig.eslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": [ 4 | "custom.d.ts", 5 | "src/**/*.ts", 6 | "src/**/*.tsx", 7 | "*.js", 8 | "*.ts", 9 | "**/.eslintrc.js", 10 | "__tests__/**/*.ts", 11 | "__tests__/**/*.tsx", 12 | "__mocks__/**/*.ts", 13 | "__mocks__/**/*.tsx" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /packages/extension/tsconfig.jest.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "jsx": "react", 4 | "allowJs": true, 5 | "allowSyntheticDefaultImports": true, 6 | "esModuleInterop": true, 7 | "noImplicitAny": true, 8 | "sourceMap": true, 9 | "target": "es6" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/prettier-config/index.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | singleQuote: true, 3 | trailingComma: 'all', 4 | }; 5 | -------------------------------------------------------------------------------- /packages/prettier-config/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@dailydotdev/prettier-config", 3 | "version": "0.0.0", 4 | "main": "index.js" 5 | } 6 | -------------------------------------------------------------------------------- /packages/shared/.eslintignore: -------------------------------------------------------------------------------- 1 | *.d.ts 2 | dist/ 3 | -------------------------------------------------------------------------------- /packages/shared/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['@dailydotdev'], 3 | plugins: ['sort-exports'], 4 | rules: { 5 | 'sort-exports/sort-exports': [ 6 | 'error', 7 | { sortDir: 'asc', ignoreCase: true, pattern: '**/icons/index.ts' }, 8 | ], 9 | }, 10 | }; 11 | -------------------------------------------------------------------------------- /packages/shared/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/shared/.gitignore -------------------------------------------------------------------------------- /packages/shared/.graphqlconfig: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Daily GraphQL Schema", 3 | "extensions": { 4 | "endpoints": { 5 | "Daily GraphQL Endpoint": { 6 | "url": "http://localhost:5000/graphql", 7 | "introspect": true 8 | } 9 | } 10 | }, 11 | "schemaPath": "./schema.graphql" 12 | } -------------------------------------------------------------------------------- /packages/shared/__mocks__/reactMarkdownMock.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement, ReactNode } from 'react'; 2 | import React from 'react'; 3 | 4 | const ReactMarkdown = ({ 5 | children, 6 | }: { 7 | children?: ReactNode; 8 | }): ReactElement => { 9 | return <>{children}; 10 | }; 11 | 12 | export default ReactMarkdown; 13 | -------------------------------------------------------------------------------- /packages/shared/__mocks__/svgrMock.ts: -------------------------------------------------------------------------------- 1 | export default 'svg'; 2 | -------------------------------------------------------------------------------- /packages/shared/__tests__/fixture/ad.ts: -------------------------------------------------------------------------------- 1 | import type { Ad } from '../../src/graphql/posts'; 2 | 3 | const ad: Ad = { 4 | description: 'I am an ad!', 5 | image: 'https://daily.dev/daily.png', 6 | link: 'https://daily.dev', 7 | source: 'Daily', 8 | }; 9 | 10 | export default ad; 11 | -------------------------------------------------------------------------------- /packages/shared/__tests__/fixture/comment.ts: -------------------------------------------------------------------------------- 1 | import type { Comment } from '../../src/graphql/comments'; 2 | import { author } from './loggedUser'; 3 | 4 | const comment: Comment = { 5 | id: 'c1', 6 | content: 'my comment', 7 | contentHtml: '

my comment

', 8 | author, 9 | createdAt: new Date(2017, 1, 10, 0, 0).toISOString(), 10 | permalink: 'https://daily.dev', 11 | numUpvotes: 0, 12 | }; 13 | 14 | export default comment; 15 | -------------------------------------------------------------------------------- /packages/shared/__tests__/helpers/tanstack-query.tsx: -------------------------------------------------------------------------------- 1 | import type { QueryClientConfig } from '@tanstack/react-query'; 2 | 3 | export const defaultQueryClientTestingConfig: QueryClientConfig = { 4 | defaultOptions: { 5 | queries: { 6 | retry: false, 7 | }, 8 | }, 9 | }; 10 | -------------------------------------------------------------------------------- /packages/shared/custom.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.css'; 2 | 3 | type SvgrComponent = React.FC>; 4 | 5 | declare module '*.svg' { 6 | const value: SvgrComponent; 7 | export default value; 8 | } 9 | -------------------------------------------------------------------------------- /packages/shared/src/components/ElementPlaceholder.tsx: -------------------------------------------------------------------------------- 1 | import type { HTMLAttributes, ReactElement } from 'react'; 2 | import React from 'react'; 3 | import classNames from 'classnames'; 4 | 5 | export const ElementPlaceholder = ({ 6 | className, 7 | ...props 8 | }: HTMLAttributes): ReactElement => ( 9 |
16 | ); 17 | -------------------------------------------------------------------------------- /packages/shared/src/components/FeedErrorScreen.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import { PageContainer } from './utilities'; 4 | import ServerError from './errors/ServerError'; 5 | 6 | function FeedErrorScreen(): ReactElement { 7 | return ( 8 |
9 | 10 | 11 | 12 |
13 | ); 14 | } 15 | 16 | export default FeedErrorScreen; 17 | -------------------------------------------------------------------------------- /packages/shared/src/components/LoaderOverlay.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { LoaderProps } from './Loader'; 4 | import { Loader } from './Loader'; 5 | 6 | export function LoaderOverlay({ ...props }: LoaderProps): ReactElement { 7 | return ( 8 |
9 | 10 |
11 | ); 12 | } 13 | 14 | export default LoaderOverlay; 15 | -------------------------------------------------------------------------------- /packages/shared/src/components/MainFeedLayout.module.css: -------------------------------------------------------------------------------- 1 | .welcome { 2 | max-width: 23rem; 3 | } 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/auth/AuthOptions.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import { AuthDataProvider } from '../../contexts/AuthDataContext'; 4 | import AuthOptionsInner from './AuthOptionsInner'; 5 | import type { AuthOptionsProps } from './common'; 6 | 7 | function AuthOptions({ 8 | initialEmail = '', 9 | ...props 10 | }: AuthOptionsProps): ReactElement { 11 | return ( 12 | 13 | 14 | 15 | ); 16 | } 17 | 18 | export default AuthOptions; 19 | -------------------------------------------------------------------------------- /packages/shared/src/components/auth/TokenField.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | 4 | interface TokenInputProps { 5 | token: string; 6 | } 7 | 8 | function TokenInput({ token }: TokenInputProps): ReactElement { 9 | return ( 10 | 19 | ); 20 | } 21 | 22 | export default TokenInput; 23 | -------------------------------------------------------------------------------- /packages/shared/src/components/auth/index.ts: -------------------------------------------------------------------------------- 1 | export * from './AuthenticationBanner'; 2 | export * from './OnboardingHeadline'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/components/banners/common.ts: -------------------------------------------------------------------------------- 1 | import classed from '../../lib/classed'; 2 | 3 | export const bottomBannerBaseClasses = 4 | 'fixed bottom-0 left-0 z-modal flex w-full flex-row justify-center border-none'; 5 | 6 | export const BottomBannerContainer = classed('div', bottomBannerBaseClasses); 7 | 8 | export const authGradientBg = 9 | 'bg-background-default bg-gradient-to-l from-theme-overlay-active-cabbage from-0% to-theme-overlay-active-onion to-100%'; 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/banners/index.ts: -------------------------------------------------------------------------------- 1 | export * from './common'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/buttons/index.ts: -------------------------------------------------------------------------------- 1 | export * from './BookmarkButton'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/cards/AcquisitionForm/AcquisitionFormGrid.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import { Card } from '../common/Card'; 4 | import { AcquisitionFormInner } from './common/AcquisitionFormInner'; 5 | 6 | export function AcquisitionFormGrid(): ReactElement { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /packages/shared/src/components/cards/AcquisitionForm/AcquisitionFormList.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import { ListCard } from '../common/list/ListCard'; 4 | import { AcquisitionFormInner } from './common/AcquisitionFormInner'; 5 | 6 | export function AcquisitionFormList(): ReactElement { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /packages/shared/src/components/cards/ActionsButtons/UpvoteButtonIcon.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import { UpvoteIcon } from '../../icons'; 4 | import type { IconProps } from '../../Icon'; 5 | 6 | export const UpvoteButtonIcon = React.memo(function UpvoteButtonIconComp( 7 | props: IconProps, 8 | ): ReactElement { 9 | const { secondary: isUpvoteActive, ...attrs } = props; 10 | 11 | return ( 12 | 13 | 14 | 15 | ); 16 | }); 17 | -------------------------------------------------------------------------------- /packages/shared/src/components/cards/ActionsButtons/index.ts: -------------------------------------------------------------------------------- 1 | import type { ActionButtonsProps } from './ActionButtons'; 2 | import ActionButtons from './ActionButtons'; 3 | 4 | export type { ActionButtonsProps }; 5 | export default ActionButtons; 6 | -------------------------------------------------------------------------------- /packages/shared/src/components/cards/Leaderboard/common.ts: -------------------------------------------------------------------------------- 1 | import type { ReactNode } from 'react'; 2 | import classed from '../../../lib/classed'; 3 | 4 | export interface LeaderboardListContainerProps { 5 | title: string; 6 | children: ReactNode; 7 | className?: string; 8 | } 9 | 10 | export const LeaderboardCard = classed( 11 | 'div', 12 | 'flex flex-col border-b border-border-subtlest-tertiary p-4 tablet:rounded-12 tablet:border tablet:bg-surface-float', 13 | ); 14 | -------------------------------------------------------------------------------- /packages/shared/src/components/cards/Leaderboard/index.ts: -------------------------------------------------------------------------------- 1 | export * from './LeaderboardList'; 2 | export * from './LeaderboardListItem'; 3 | export * from './LeaderboardListContainer'; 4 | export * from './SourceTopList'; 5 | export * from './UserTopList'; 6 | export * from './TagTopList'; 7 | export * from './common'; 8 | -------------------------------------------------------------------------------- /packages/shared/src/components/cards/SimilarPosts/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PostEngagementCounts'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/cards/ad/common/AdPixel.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { Ad } from '../../../../graphql/posts'; 4 | 5 | export const AdPixel = ({ pixel }: Pick): ReactElement => { 6 | return ( 7 | <> 8 | {pixel?.map((p) => ( 9 | Pixel 16 | ))} 17 | 18 | ); 19 | }; 20 | -------------------------------------------------------------------------------- /packages/shared/src/components/cards/ad/common/common.tsx: -------------------------------------------------------------------------------- 1 | import type { HTMLAttributes } from 'react'; 2 | import type { Ad } from '../../../../graphql/posts'; 3 | 4 | type Callback = (ad: Ad) => unknown; 5 | export interface AdCardProps { 6 | ad: Ad; 7 | index: number; 8 | feedIndex: number; 9 | onLinkClick?: Callback; 10 | onRefresh?: Callback; 11 | domProps?: HTMLAttributes; 12 | } 13 | -------------------------------------------------------------------------------- /packages/shared/src/components/cards/article/feedback/common/common.tsx: -------------------------------------------------------------------------------- 1 | import type { MouseEventHandler } from 'react'; 2 | import type { Post } from '../../../../../graphql/posts'; 3 | 4 | export interface FeedbackProps { 5 | post: Post; 6 | onUpvoteClick: MouseEventHandler; 7 | onDownvoteClick: MouseEventHandler; 8 | isVideoType?: boolean; 9 | } 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/cards/collection/index.ts: -------------------------------------------------------------------------------- 1 | export * from './CollectionGrid'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/cards/placeholder/common/common.tsx: -------------------------------------------------------------------------------- 1 | import type { HTMLAttributes } from 'react'; 2 | 3 | export type PlaceholderProps = HTMLAttributes; 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/cards/squad/common/types.ts: -------------------------------------------------------------------------------- 1 | import type { Squad } from '../../../../graphql/sources'; 2 | 3 | type SquadCardActionType = 'link' | 'action'; 4 | export interface SquadCardAction { 5 | type: SquadCardActionType; 6 | text: string; 7 | href?: string; 8 | target?: string; 9 | onClick?: () => void; 10 | } 11 | 12 | export interface UnFeaturedSquadCardProps { 13 | source: Squad; 14 | className?: string; 15 | } 16 | -------------------------------------------------------------------------------- /packages/shared/src/components/comments/common.tsx: -------------------------------------------------------------------------------- 1 | export interface CommentClassName { 2 | container?: string; 3 | commentBox?: { 4 | container?: string; 5 | }; 6 | } 7 | -------------------------------------------------------------------------------- /packages/shared/src/components/drawers/common.ts: -------------------------------------------------------------------------------- 1 | import type React from 'react'; 2 | 3 | export interface SelectParams { 4 | value: string; 5 | index: number; 6 | event: React.MouseEvent; 7 | } 8 | -------------------------------------------------------------------------------- /packages/shared/src/components/drawers/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Drawer'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/feeds/FeedSettings/FeedSettingsEditContext.tsx: -------------------------------------------------------------------------------- 1 | import { createContext, useContext } from 'react'; 2 | import type { FeedSettingsEditContextValue } from './types'; 3 | 4 | export const FeedSettingsEditContext = 5 | createContext(undefined); 6 | 7 | export const useFeedSettingsEditContext = (): FeedSettingsEditContextValue => 8 | useContext(FeedSettingsEditContext); 9 | -------------------------------------------------------------------------------- /packages/shared/src/components/feeds/FeedSettings/components/SuspenseLoader.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import { Loader } from '../../../Loader'; 4 | 5 | export const SuspenseLoader = (): ReactElement => { 6 | return ( 7 |
8 | 9 |
10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /packages/shared/src/components/feeds/index.ts: -------------------------------------------------------------------------------- 1 | export * from './FeedContainer'; 2 | export * from './PreparingYourFeed'; 3 | export * from './FeedCustomPreview'; 4 | export * from './FeedCustomActions'; 5 | export * from './FeedPreviewControls'; 6 | -------------------------------------------------------------------------------- /packages/shared/src/components/fields/Dropdown.module.css: -------------------------------------------------------------------------------- 1 | .dropdown { 2 | & button { 3 | & :global(.icon) { 4 | font-size: 1.5rem; 5 | margin-right: 0.5rem; 6 | } 7 | 8 | &:focus, 9 | &[aria-expanded='true'] { 10 | color: var(--theme-text-primary); 11 | background: transparent; 12 | outline: none; 13 | box-shadow: inset 0 0 0 0.0625rem var(--theme-text-primary); 14 | 15 | & .chevron { 16 | color: var(--theme-text-primary); 17 | } 18 | } 19 | } 20 | } 21 | 22 | .item:global(.h-auto) > * { 23 | height: auto !important; 24 | } 25 | -------------------------------------------------------------------------------- /packages/shared/src/components/fields/form/common.tsx: -------------------------------------------------------------------------------- 1 | export enum WriteFormTab { 2 | Share = 'Share a link', 3 | NewPost = 'New post', 4 | } 5 | 6 | export const WriteFormTabToFormID = { 7 | [WriteFormTab.Share]: 'write-post-link', 8 | [WriteFormTab.NewPost]: 'write-post-freeform', 9 | }; 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/fields/form/index.ts: -------------------------------------------------------------------------------- 1 | export * from './FormWrapper'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/filters/Test.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | 4 | export default function Test(): ReactElement { 5 | return
Testing inside sidebar component
; 6 | } 7 | -------------------------------------------------------------------------------- /packages/shared/src/components/footer/index.ts: -------------------------------------------------------------------------------- 1 | export * from './FooterLinks'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/header/index.ts: -------------------------------------------------------------------------------- 1 | export * from './BreadCrumbs'; 2 | export * from './FeedExploreHeader'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/AddUser/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import FilledIcon from './filled.svg'; 6 | import OutlinedIcon from './outlined.svg'; 7 | 8 | export const AddUserIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Ai/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const AiIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Alert/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | 7 | export const AlertIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Amazon/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import WhiteIcon from './white.svg'; 6 | 7 | export const AmazonIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/App/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const AppIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Apple/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import WhiteIcon from './white.svg'; 6 | 7 | export const AppleIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Arrow/Long/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import FilledIcon from './filled.svg'; 6 | 7 | export const LongArrowIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Arrow/Straight/filled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Arrow/Straight/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import FilledIcon from './filled.svg'; 6 | 7 | export const StraightArrowIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Arrow/Triangle/filled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Arrow/Triangle/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const TriangleArrowIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Arrow/Triangle/outlined.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Arrow/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const ArrowIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | 12 | export * from './Long'; 13 | export * from './Straight'; 14 | export * from './Triangle'; 15 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/At/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const AtIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Bell/Add/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const BellAddIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Bell/Disabled/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const BellDisabledIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Bell/Notify/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const BellNotifyIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Bell/Subscribed/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const BellSubscribedIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Bell/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const BellIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | export * from './Add'; 12 | export * from './Disabled'; 13 | export * from './Notify'; 14 | export * from './Subscribed'; 15 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Block/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const BlockIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Bluesky/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import MonoIcon from './mono.svg'; 6 | 7 | export const BlueskyIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Bookmark/Reminder/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const BookmarkReminderIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Bookmark/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const BookmarkIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/BringForward/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const BringForwardIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Browser/Chrome/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import Chrome from './chrome.svg'; 6 | 7 | export const ChromeIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Browser/Edge/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import Edge from './edge.svg'; 6 | 7 | export const EdgeIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Browsers/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import Group from './group.svg'; 6 | 7 | export const BrowserGroupIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Calendar/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const CalendarIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Camera/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const CameraIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Card/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const CardIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/CardLayout/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import CardsIcon from './cards.svg'; 6 | import ListIcon from './list.svg'; 7 | 8 | export const CardLayout = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/ChecklistA/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import FilledIcon from './filled.svg'; 6 | import OutlinedIcon from './outlined.svg'; 7 | 8 | export const ChecklistAIcon = ({ size, ...rest }: IconProps): ReactElement => ( 9 | 15 | ); 16 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/ChecklistB/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import FilledIcon from './filled.svg'; 6 | import OutlinedIcon from './outlined.svg'; 7 | 8 | export const ChecklistBIcon = ({ size, ...rest }: IconProps): ReactElement => ( 9 | 15 | ); 16 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Clear/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const ClearIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/CodePen/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import MonoIcon from './mono.svg'; 6 | 7 | export const CodePenIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Coin/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const CoinIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/CommunityPicksIcon/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import PrimaryIcon from './primary.svg'; 6 | 7 | export const CommunityPicksIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Cookie/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const CookieIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Copy/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const CopyIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/CreditCard/filled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/CreditCard/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const CreditCardIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/CreditCard/outlined.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/CustomPrompt/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const CustomPromptIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/DailyIcon/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import PrimaryIcon from './primary.svg'; 6 | import SecondaryIcon from './secondary.svg'; 7 | 8 | export const DailyIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/DefaultSquad/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import SquadIcon from './primary.svg'; 6 | 7 | export const DefaultSquadIcon = (props: IconProps): ReactElement => ( 8 | 14 | ); 15 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/DevCard/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const DevCardIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/DevPlus/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const DevPlusIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/DigitalOcean/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import WhiteIcon from './white.svg'; 6 | 7 | export const DigitalOceanIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Discord/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import ColorIcon from './color.svg'; 6 | 7 | export const DiscordIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Discuss/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const DiscussIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Docs/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const DocsIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Download/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const DownloadIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Downvote/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import classNames from 'classnames'; 4 | import { UpvoteIcon } from '../Upvote'; 5 | import type { IconProps } from '../../Icon'; 6 | 7 | export const DownvoteIcon = ({ 8 | className, 9 | ...rest 10 | }: IconProps): ReactElement => ( 11 | 12 | ); 13 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/DrawnArrow/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import Arrow from './arrow.svg'; 6 | 7 | export const DrawnArrowIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Earth/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const EarthIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Edit/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const EditIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/EditPrompt/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const EditPromptIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Embed/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const EmbedIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Exit/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const ExitIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Eye/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const EyeIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/EyeCancel/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const EyeCancelIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Facebook/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import WhiteIcon from './white.svg'; 6 | import ColorIcon from './color.svg'; 7 | 8 | export const FacebookIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Feather/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const FeatherIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Feedback/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const FeedbackIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Filter/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const FilterIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Flag/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const FlagIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Folder/filled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Folder/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const FolderIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/GitHub/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import WhiteIcon from './white.svg'; 6 | 7 | export const GitHubIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/GitLab/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import WhiteIcon from './white.svg'; 6 | 7 | export const GitLabIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Google/Play/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import Primary from './primary.svg'; 4 | import type { IconProps } from '../../../Icon'; 5 | import Icon from '../../../Icon'; 6 | 7 | export const GooglePlayIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Google/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import WhiteIcon from './white.svg'; 6 | import ColorIcon from './color.svg'; 7 | 8 | export const GoogleIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Hamburger/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const HamburgerIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Hammer/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const HammerIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Hashnode/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import WhiteIcon from './white.svg'; 6 | 7 | export const HashnodeIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Hashnode/white.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Hashtag/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const HashtagIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Home/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const HomeIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Hot/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const HotIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | 12 | export default HotIcon; 13 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Image/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const ImageIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Info/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | 7 | export const InfoIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Invite/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const InviteIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/JetBrains/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import WhiteIcon from './white.svg'; 6 | 7 | export const JetBrainsIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Key/KeyReferral/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const KeyReferralIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Key/KeyReferralOutline/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const KeyReferralOutlineIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Key/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const KeyIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | 12 | export * from './KeyReferral'; 13 | export * from './KeyReferralOutline'; 14 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Label/filled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Label/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const LabelIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Language/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const LanguageIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Layout/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const LayoutIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Line/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const LineIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Link/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const LinkIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/LinkedIn/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import PrimaryIcon from './primary.svg'; 6 | import SecondaryIcon from './secondary.svg'; 7 | 8 | export const LinkedInIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Loader/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import IconImage from './loader.svg'; 6 | 7 | export const LoaderIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Lock/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const LockIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Magic/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const MagicIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Mail/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const MailIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Markdown/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const MarkdownIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Mastodon/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import MonoIcon from './mono.svg'; 6 | import ColorIcon from './color.svg'; 7 | 8 | export const MastodonIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/MedalBadge/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const MedalBadgeIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Megaphone/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import FilledIcon from './filled.svg'; 6 | import OutlinedIcon from './outlined.svg'; 7 | 8 | export const MegaphoneIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Menu/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const MenuIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Microsoft/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import WhiteIcon from './white.svg'; 6 | 7 | export const MicrosoftIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/MiniClose/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const MiniCloseIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Minus/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const MinusIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Moon/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const MoonIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/MoveTo/filled.svg: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/MoveTo/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const MoveToIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/MoveTo/outlined.svg: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/NewSquad/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import { PlusIcon } from '../Plus'; 6 | 7 | const Primary = () => ( 8 |
9 | 10 |
11 | ); 12 | 13 | export const NewSquadIcon = (props: IconProps): ReactElement => ( 14 | 15 | ); 16 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/NewTab/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import FilledIcon from './filled.svg'; 6 | import OutlinedIcon from './outlined.svg'; 7 | 8 | export const NewTabIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/OpenLink/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const OpenLinkIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Organization/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const OrganizationIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/PWA/Chrome/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import OutlinedIcon from './pwa.svg'; 6 | 7 | export const PWAChromeIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/PWA/Chrome/pwa.svg: -------------------------------------------------------------------------------- 1 | 3 | Download PWA 4 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/PWA/Edge/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import OutlinedIcon from './pwa.svg'; 6 | 7 | export const PWAEdgeIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/PWA/Safari/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import OutlinedIcon from './pwa.svg'; 6 | 7 | export const PWASafariIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/PWA/index.ts: -------------------------------------------------------------------------------- 1 | export { PWAChromeIcon } from './Chrome'; 2 | export { PWAEdgeIcon } from './Edge'; 3 | export { PWASafariIcon } from './Safari'; 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Pause/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const PauseIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Phone/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const PhoneIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Pin/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const PinIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Play/filled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Play/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const PlayIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Plus/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const PlusIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/PlusUser/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const PlusUserIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Power/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const PowerIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Privacy/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const PrivacyIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/ReadingStreak/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import PrimaryIcon from './primary.svg'; 6 | import SecondaryIcon from './secondary.svg'; 7 | 8 | export const ReadingStreakIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Reddit/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import PrimaryIcon from './primary.svg'; 6 | import SecondaryIcon from './secondary.svg'; 7 | 8 | export const RedditIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Redis/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import WhiteIcon from './white.svg'; 6 | 7 | export const RedisIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Refresh/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const RefreshIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/RemoveUser/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import FilledIcon from './filled.svg'; 6 | import OutlinedIcon from './outlined.svg'; 7 | 8 | export const RemoveUserIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Reputation/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import FilledIcon from './filled.svg'; 6 | 7 | export const ReputationIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/ReputationLightning/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const ReputationLightningIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Roadmap/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import MonoIcon from './mono.svg'; 6 | 7 | export const RoadmapIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Scout/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const ScoutIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Search/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const SearchIcon = ({ size, ...rest }: IconProps): ReactElement => ( 9 | 15 | ); 16 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/SendAirplane/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const SendAirplaneIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/SendBackward/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const SendBackwardIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Settings/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const SettingsIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Share/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const ShareIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Shield/filled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Shield/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const ShieldIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/ShieldCheck/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const ShieldCheckIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/ShieldPlus/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const ShieldPlusIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/ShieldWarning/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const ShieldWarningIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Shortcuts/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const ShortcutsIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Sidebar/SidebarArrowLeft/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const SidebarArrowLeft = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Sidebar/SidebarArrowRight/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const SidebarArrowRight = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Sidebar/index.ts: -------------------------------------------------------------------------------- 1 | export * from './SidebarArrowLeft'; 2 | export * from './SidebarArrowRight'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Sites/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const SitesIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Slack/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import ColorIcon from './color.svg'; 6 | 7 | export const SlackIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Sort/Time/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../../Icon'; 4 | import Icon from '../../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const TimeSortIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Sort/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const SortIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Source/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const SourceIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Sparkle/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import FilledIcon from './filled.svg'; 6 | 7 | export const SparkleIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Spotify/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import WhiteIcon from './white.svg'; 6 | 7 | export const SpotifyIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Squad/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const SquadIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/StackOverflow/color.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/StackOverflow/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import MonoIcon from './mono.svg'; 6 | import ColorIcon from './color.svg'; 7 | 8 | export const StackOverflowIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/StackOverflow/mono.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Star/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const StarIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Story/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const StoryIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Sun/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const SunIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/TLDR/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const TLDRIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Telegram/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import PrimaryIcon from './primary.svg'; 6 | import SecondaryIcon from './secondary.svg'; 7 | 8 | export const TelegramIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Terminal/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const TerminalIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/ThemeAuto/filled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/ThemeAuto/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const ThemeAutoIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/ThemeAuto/outlined.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Threads/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import MonoIcon from './mono.svg'; 6 | 7 | export const ThreadsIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/TimeZone/DaytimeIcon.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import SvgIcon from './timezone_daytime.svg'; 6 | 7 | export const DaytimeIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/TimeZone/NighttimeIcon.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import SvgIcon from './timezone_nighttime.svg'; 6 | 7 | export const NighttimeIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/TimeZone/index.ts: -------------------------------------------------------------------------------- 1 | export * from './DaytimeIcon'; 2 | export * from './NighttimeIcon'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Timer/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const TimerIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Tip/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import SvgIcon from './outline.svg'; 6 | 7 | export const TipIcon = (props: IconProps): ReactElement => ( 8 | 9 | ); 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Tour/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const TourIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Trash/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const TrashIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Trending/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const TrendingIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Twitter/color.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Twitter/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import WhiteIcon from './white.svg'; 6 | import ColorIcon from './color.svg'; 7 | 8 | export const TwitterIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Twitter/white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Unread/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const UnreadIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Upvote/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const UpvoteIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/User/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const UserIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/UserShare/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const UserShareIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/V/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const VIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Warning/filled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Warning/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const WarningIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Warning/outlined.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Whatsapp/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import WhiteIcon from './white.svg'; 6 | import ColorIcon from './color.svg'; 7 | 8 | export const WhatsappIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Youtube/color.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Youtube/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import MonoIcon from './mono.svg'; 6 | import ColorIcon from './color.svg'; 7 | 8 | export const YoutubeIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/Youtube/mono.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/icons/gift/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { IconProps } from '../../Icon'; 4 | import Icon from '../../Icon'; 5 | import OutlinedIcon from './outlined.svg'; 6 | import FilledIcon from './filled.svg'; 7 | 8 | export const GiftIcon = (props: IconProps): ReactElement => ( 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './feeds'; 2 | export * from './search'; 3 | export * from './sources'; 4 | export * from './squads'; 5 | export * from './RenderMarkdown'; 6 | export * from './withFeaturesBoundary'; 7 | export * from './KeyboardShortcutLabel'; 8 | export * from './ReputationUserBadge'; 9 | export * from './footer'; 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/layout/PageWrapperLayout.tsx: -------------------------------------------------------------------------------- 1 | import type { ComponentProps, PropsWithChildren, ReactElement } from 'react'; 2 | import React from 'react'; 3 | import classNames from 'classnames'; 4 | 5 | export const pageMainClassNames = 'tablet:p-4 laptop:px-10 laptop:py-5'; 6 | 7 | export const PageWrapperLayout = ({ 8 | children, 9 | className, 10 | ...attrs 11 | }: PropsWithChildren & ComponentProps<'main'>): ReactElement => { 12 | return ( 13 |
14 | {children} 15 |
16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /packages/shared/src/components/marketingCta/index.ts: -------------------------------------------------------------------------------- 1 | export * from './MarketingCtaCard'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/modals/BasePostModal.module.css: -------------------------------------------------------------------------------- 1 | .postModal { 2 | & :global(.post-modal-overlay) { 3 | position: fixed; 4 | top: 0; 5 | left: 0; 6 | right: 0; 7 | bottom: 0; 8 | min-height: 100vh; 9 | padding: 0; 10 | overflow-y: scroll; 11 | z-index: 100; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/shared/src/components/modals/customModal.module.css: -------------------------------------------------------------------------------- 1 | .customModal { 2 | & :global(.modal) { 3 | padding: 3rem 0 0; 4 | 5 | @screen responsiveModalBreakpoint { 6 | max-height: 40rem; 7 | padding-top: 0; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/modals/generic/index.ts: -------------------------------------------------------------------------------- 1 | export * from './common'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/modals/index.ts: -------------------------------------------------------------------------------- 1 | export * from './report'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/modals/post/common.ts: -------------------------------------------------------------------------------- 1 | import type { FeedItemPosition } from '../../../lib/feed'; 2 | import type { Post } from '../../../graphql/posts'; 3 | import type { Comment } from '../../../graphql/comments'; 4 | import type { Origin } from '../../../lib/log'; 5 | 6 | export interface ShareProps extends FeedItemPosition { 7 | post: Post; 8 | comment?: Comment; 9 | origin: Origin; 10 | } 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/modals/post/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ReadingHistoryModal'; 2 | export * from './ReadingHistoryTitle'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/components/modals/report/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ReportCommentModal'; 2 | export * from './ReportPostModal'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/components/modals/streaks/common.ts: -------------------------------------------------------------------------------- 1 | import type { UserStreak } from '../../../graphql/users'; 2 | import type { LazyModalCommonProps } from '../common/Modal'; 3 | 4 | export interface StreakModalProps extends LazyModalCommonProps { 5 | currentStreak: UserStreak['current']; 6 | maxStreak: UserStreak['max']; 7 | } 8 | -------------------------------------------------------------------------------- /packages/shared/src/components/onboarding/Plus/OnboardingPlus.tsx: -------------------------------------------------------------------------------- 1 | import { withExperiment } from '../../withExperiment'; 2 | import { OnboardingPlusControl } from './OnboardingPlusControl'; 3 | import { OnboardingPlusVariationV1 } from './OnboardingPlusVariationV1'; 4 | import { featureOnboardingGridVariationV1 } from '../../../lib/featureManagement'; 5 | 6 | export const OnboardingPlus = withExperiment(OnboardingPlusVariationV1, { 7 | feature: featureOnboardingGridVariationV1, 8 | value: true, 9 | fallback: OnboardingPlusControl, 10 | }); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/onboarding/Plus/common.tsx: -------------------------------------------------------------------------------- 1 | export interface OnboardingStepProps { 2 | onClickNext: () => void; 3 | onClickPlus: () => void; 4 | headline?: string; 5 | } 6 | -------------------------------------------------------------------------------- /packages/shared/src/components/onboarding/index.ts: -------------------------------------------------------------------------------- 1 | export * from './FilterOnboarding'; 2 | export * from '../tags/TagSelection'; 3 | export * from './CreateFeedButton'; 4 | export * from './OnboardingHeader'; 5 | export * from '../tags/TagElement'; 6 | export * from './EditTag'; 7 | export * from './ReadingReminder'; 8 | export * from './ContentTypes/ContentTypes'; 9 | export * from './OnboardingPWA'; 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/pagination/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PaginationActions'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/plus/GiftUserContext.tsx: -------------------------------------------------------------------------------- 1 | import { createContext, useContext } from 'react'; 2 | import type { UserShortProfile } from '../../lib/user'; 3 | 4 | export interface GiftUserContextData { 5 | giftToUser?: UserShortProfile; 6 | } 7 | export const GiftUserContext = createContext({}); 8 | 9 | export const useGiftUserContext = (): GiftUserContextData => 10 | useContext(GiftUserContext); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/post/collection/index.ts: -------------------------------------------------------------------------------- 1 | export * from './CollectionPillSources'; 2 | export * from './CollectionPostContent'; 3 | export * from './CollectionPostHeaderActions'; 4 | export * from './CollectionPostWidgets'; 5 | export * from './CollectionSubscribeButton'; 6 | -------------------------------------------------------------------------------- /packages/shared/src/components/post/freeform/index.ts: -------------------------------------------------------------------------------- 1 | export * from './write'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/post/freeform/write/common.tsx: -------------------------------------------------------------------------------- 1 | import classed from '../../../../lib/classed'; 2 | import { BasePageContainer, pageBorders } from '../../../utilities'; 3 | 4 | export const WritePageContainer = classed( 5 | BasePageContainer, 6 | '!p-0 laptop:min-h-page h-full !max-w-[100vw] laptop:!max-w-[42.5rem]', 7 | pageBorders, 8 | ); 9 | 10 | export const WritePageMain = classed('form', 'flex flex-col'); 11 | -------------------------------------------------------------------------------- /packages/shared/src/components/post/freeform/write/index.ts: -------------------------------------------------------------------------------- 1 | export * from './WritePage'; 2 | export * from './WritePostHeader'; 3 | export * from './WriteFreeformContent'; 4 | export * from './WriteFreeFormSkeleton'; 5 | export * from './common'; 6 | -------------------------------------------------------------------------------- /packages/shared/src/components/post/infinite/index.ts: -------------------------------------------------------------------------------- 1 | export * from './InfiniteReadingHistory'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/post/share/index.ts: -------------------------------------------------------------------------------- 1 | export * from './SharePostTitle'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/post/widgets/index.ts: -------------------------------------------------------------------------------- 1 | export * from './CollectionsIntro'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/post/write/common.ts: -------------------------------------------------------------------------------- 1 | import classed from '../../../lib/classed'; 2 | import { FlexCol, FlexRow } from '../../utilities'; 3 | 4 | export const previewImageClass = 5 | 'w-28 h-16 rounded-12 bg-text-disabled object-cover'; 6 | 7 | export const WritePreviewContainer = classed( 8 | FlexCol, 9 | 'rounded-16 border border-border-subtlest-tertiary', 10 | ); 11 | 12 | export const WritePreviewContent = classed( 13 | FlexRow, 14 | 'relative gap-3 items-center py-5 px-4', 15 | ); 16 | -------------------------------------------------------------------------------- /packages/shared/src/components/post/write/index.ts: -------------------------------------------------------------------------------- 1 | export * from './WriteFooter'; 2 | export * from './SquadsDropdown'; 3 | export * from './CreatePostButton'; 4 | export * from './WriteLinkPreview'; 5 | export * from './WritePreviewSkeleton'; 6 | -------------------------------------------------------------------------------- /packages/shared/src/components/profile/JoinedDate.tsx: -------------------------------------------------------------------------------- 1 | import type { HTMLAttributes, ReactElement } from 'react'; 2 | import React from 'react'; 3 | import { format } from 'date-fns'; 4 | 5 | export interface JoinedDateProps extends HTMLAttributes { 6 | date: Date; 7 | } 8 | 9 | export default function JoinedDate({ 10 | date, 11 | ...props 12 | }: JoinedDateProps): ReactElement { 13 | return ( 14 |
15 | Joined  16 | 17 |
18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /packages/shared/src/components/profile/ProfileForm.module.css: -------------------------------------------------------------------------------- 1 | .optionalFields { 2 | &[open] { 3 | padding-bottom: 0.75rem; 4 | } 5 | } 6 | 7 | .optionalSummary + .sectionHeading { 8 | margin-top: 0.75rem; 9 | } 10 | 11 | .optionalFields + .sectionHeading { 12 | margin-top: 2.5rem; 13 | } 14 | 15 | .sectionHeading + .formSwitch { 16 | margin-top: -0.25rem; 17 | } 18 | -------------------------------------------------------------------------------- /packages/shared/src/components/profile/common.module.css: -------------------------------------------------------------------------------- 1 | .commentContent { 2 | max-height: 3.75rem; 3 | -webkit-line-clamp: 3; 4 | 5 | @screen tablet { 6 | max-width: 19.25rem; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/shared/src/components/profile/devcard/index.ts: -------------------------------------------------------------------------------- 1 | export * from './DevCard'; 2 | export * from './DevCardTwitterCover'; 3 | export * from './DevCardStats'; 4 | export * from './DevCardStatsSection'; 5 | export * from './DevCardFooter'; 6 | export * from './DevCardContainer'; 7 | export * from './common'; 8 | -------------------------------------------------------------------------------- /packages/shared/src/components/profile/source/index.ts: -------------------------------------------------------------------------------- 1 | export * from './SourceShortInfo'; 2 | export * from './SourceAvatar'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/components/referral/index.ts: -------------------------------------------------------------------------------- 1 | export * from './InviteLinkInput'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/search/SearchMessage.module.css: -------------------------------------------------------------------------------- 1 | @keyframes caretBlink { 2 | from, 3 | to { 4 | background: transparent; 5 | } 6 | 50% { 7 | background: var(--theme-accent-cabbage-default); 8 | } 9 | } 10 | 11 | /* blink caret and the end of last element */ 12 | .caret > *:last-child:after { 13 | content: ""; 14 | display: inline-block; 15 | width: 8px; 16 | height: 1rem; 17 | vertical-align: text-bottom; 18 | animation: caretBlink 400ms step-end infinite; 19 | margin-left: 2px; 20 | background: var(--theme-accent-cabbage-default); 21 | } 22 | -------------------------------------------------------------------------------- /packages/shared/src/components/search/SearchPanel/SearchPanelInputContainer.tsx: -------------------------------------------------------------------------------- 1 | import type { HTMLAttributes, ReactElement, ReactNode } from 'react'; 2 | import React from 'react'; 3 | 4 | export type SearchPanelItemContainerProps = { 5 | children?: ReactNode; 6 | } & HTMLAttributes; 7 | 8 | export const SearchPanelItemContainer = ({ 9 | children, 10 | ...props 11 | }: SearchPanelItemContainerProps): ReactElement => { 12 | return ( 13 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /packages/shared/src/components/search/SearchPanel/index.ts: -------------------------------------------------------------------------------- 1 | export * from './SearchPanel'; 2 | export * from './common'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/components/search/SearchProgressBar.module.css: -------------------------------------------------------------------------------- 1 | .animatedBar { 2 | background-image: linear-gradient(to right, rgba(113, 71, 237, 0), rgb(206, 61, 243)); 3 | animation: fadeLeftToRight 1.2s linear infinite; 4 | } 5 | 6 | @keyframes fadeLeftToRight { 7 | 0% { 8 | left: -100%; 9 | } 10 | 100% { 11 | left: 120%; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/shared/src/components/search/common.ts: -------------------------------------------------------------------------------- 1 | import classed from '../../lib/classed'; 2 | 3 | export const SearchHistoryContainer = classed('div', 'flex flex-col gap-3 p-6'); 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/search/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PlaceholderSearchSource'; 2 | export * from './SearchFeedback'; 3 | export * from './SearchProgressBar'; 4 | export * from './SearchResult'; 5 | export * from './SearchSourceList'; 6 | export * from './SearchSourceItem'; 7 | export * from './SearchMessage'; 8 | export * from './SearchSkeleton'; 9 | export * from './SearchEmpty'; 10 | export * from './common'; 11 | export * from './SearchPanel'; 12 | -------------------------------------------------------------------------------- /packages/shared/src/components/sidebar/sections/common.tsx: -------------------------------------------------------------------------------- 1 | import { webappUrl } from '../../../lib/constants'; 2 | 3 | export const locationPush = (path: string) => (): void => 4 | window.location.assign(`${webappUrl}${path}`); 5 | 6 | export type SidebarSectionProps = { 7 | isItemsButton: boolean; 8 | sidebarExpanded: boolean; 9 | shouldShowLabel: boolean; 10 | activePage: string; 11 | title?: string; 12 | onNavTabClick?: (page: string) => void; 13 | }; 14 | -------------------------------------------------------------------------------- /packages/shared/src/components/sources/index.ts: -------------------------------------------------------------------------------- 1 | export * from './SourceActions'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/squads/Members/BlockedMembersPlaceholder.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import { BlockIcon } from '../../icons'; 4 | import { IconSize } from '../../Icon'; 5 | 6 | export function BlockedMembersPlaceholder(): ReactElement { 7 | return ( 8 |
9 | 10 |

No blocked members found

11 |
12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /packages/shared/src/components/squads/Members/index.ts: -------------------------------------------------------------------------------- 1 | export * from './BlockedMembersPlaceholder'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/squads/index.ts: -------------------------------------------------------------------------------- 1 | export * from '../cards/squad/SquadGrid'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/squads/settings/index.ts: -------------------------------------------------------------------------------- 1 | export * from './SquadSettingsSection'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/streak/popup/StreakSection.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | 4 | interface StreakSectionProps { 5 | streak: number; 6 | label: string; 7 | } 8 | 9 | export function StreakSection({ 10 | streak, 11 | label, 12 | }: StreakSectionProps): ReactElement { 13 | return ( 14 | 15 | {streak} 16 |

{label}

17 |
18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /packages/shared/src/components/streak/popup/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ReadingStreakPopup'; 2 | export * from './StreakSection'; 3 | export * from './DayStreak'; 4 | -------------------------------------------------------------------------------- /packages/shared/src/components/tabs/common.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactNode } from 'react'; 2 | 3 | export type RenderTab = ({ 4 | label, 5 | isActive, 6 | }: { 7 | label: string; 8 | isActive: boolean; 9 | }) => ReactNode | null; 10 | -------------------------------------------------------------------------------- /packages/shared/src/components/tags/common.tsx: -------------------------------------------------------------------------------- 1 | import type { Tag } from '../../graphql/feedSettings'; 2 | 3 | export type OnSelectTagProps = { 4 | tag: Tag; 5 | action: 'follow' | 'unfollow'; 6 | }; 7 | -------------------------------------------------------------------------------- /packages/shared/src/components/text/Anchor.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import classNames from 'classnames'; 4 | 5 | export function Anchor({ 6 | className, 7 | children, 8 | ...props 9 | }: JSX.IntrinsicElements['a']): ReactElement { 10 | return ( 11 | 18 | {children} 19 | 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /packages/shared/src/components/text/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Anchor'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/tooltips/index.ts: -------------------------------------------------------------------------------- 1 | export * from './SimpleTooltip'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/tooltips/notifications/index.ts: -------------------------------------------------------------------------------- 1 | export * from './NotificationPreferenceMenu'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/components/tooltips/utils.ts: -------------------------------------------------------------------------------- 1 | import classed from '../../lib/classed'; 2 | 3 | export const Bubble = classed( 4 | 'span', 5 | 'absolute flex justify-center items-center min-w-[1.25rem] min-h-[1.25rem] font-normal text-white rounded-8 bg-accent-cabbage-default typo-subhead', 6 | ); 7 | 8 | export const Badge = classed( 9 | 'span', 10 | 'flex flex-row justify-center items-center p-1 px-2 mr-2 rounded-full bg-accent-cabbage-default typo-caption1', 11 | ); 12 | -------------------------------------------------------------------------------- /packages/shared/src/components/utilities/index.ts: -------------------------------------------------------------------------------- 1 | export * from './common'; 2 | export * from './Divider'; 3 | export * from './SelectableLink'; 4 | export * from './DateFormat'; 5 | -------------------------------------------------------------------------------- /packages/shared/src/components/utilities/loaders/common.ts: -------------------------------------------------------------------------------- 1 | import classed from '../../../lib/classed'; 2 | import { ElementPlaceholder } from '../../ElementPlaceholder'; 3 | 4 | export const Pill = classed(ElementPlaceholder, 'h-8 rounded-12'); 5 | -------------------------------------------------------------------------------- /packages/shared/src/components/utilities/loaders/index.tsx: -------------------------------------------------------------------------------- 1 | export * from './common'; 2 | export * from './generic'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/components/utilities/utilities.module.css: -------------------------------------------------------------------------------- 1 | .pageContainer { 2 | max-width: $pageMaxWidth; 3 | margin: auto; 4 | 5 | @screen laptop { 6 | width: $pageMaxWidth; 7 | margin-left: calc(50% - (($pageMaxWidth / 2) - 3rem)); 8 | } 9 | 10 | @screen laptopL { 11 | width: $pageMaxWidth; 12 | margin: auto; 13 | } 14 | 15 | &:global(.modal-post) { 16 | margin: unset; 17 | } 18 | } 19 | 20 | .feedPage { 21 | &.notReady { 22 | & > * { 23 | visibility: hidden; 24 | } 25 | } 26 | } 27 | 28 | .activeTabIndicator { 29 | border-radius: 0.063rem; 30 | } 31 | -------------------------------------------------------------------------------- /packages/shared/src/components/video/common.ts: -------------------------------------------------------------------------------- 1 | import classed from '../../lib/classed'; 2 | 3 | export const YoutubeVideoContainer = classed( 4 | 'div', 5 | 'relative w-full overflow-hidden rounded-16 pt-[56.25%]', 6 | ); 7 | 8 | export const YoutubeVideoBackground = classed( 9 | 'div', 10 | 'absolute inset-0 z-1 flex flex-col bg-surface-float p-6', 11 | ); 12 | -------------------------------------------------------------------------------- /packages/shared/src/components/widgets/PostToc.module.css: -------------------------------------------------------------------------------- 1 | .details { 2 | &[open] { 3 | padding-bottom: 0.75rem; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /packages/shared/src/components/widgets/common.ts: -------------------------------------------------------------------------------- 1 | import classed from '../../lib/classed'; 2 | import { ElementPlaceholder } from '../ElementPlaceholder'; 3 | 4 | export const widgetClasses = 5 | 'border border-border-subtlest-tertiary rounded-16'; 6 | 7 | export const WidgetContainer = classed('div', widgetClasses); 8 | 9 | export const TextPlaceholder = classed( 10 | ElementPlaceholder, 11 | 'h-3 rounded-12 my-0.5', 12 | ); 13 | 14 | export const PlaceholderSeparator = classed( 15 | 'div', 16 | 'h-px bg-border-subtlest-tertiary', 17 | ); 18 | -------------------------------------------------------------------------------- /packages/shared/src/contexts/WriteCommentContext.ts: -------------------------------------------------------------------------------- 1 | import { createContext, useContext } from 'react'; 2 | import type { UseMutateCommentResult } from '../hooks/post/useMutateComment'; 3 | 4 | interface WriteCommentContextProp { 5 | mutateComment: UseMutateCommentResult; 6 | } 7 | 8 | export const WriteCommentContext = createContext({ 9 | mutateComment: null, 10 | }); 11 | 12 | export const useWriteCommentContext = (): WriteCommentContextProp => 13 | useContext(WriteCommentContext); 14 | -------------------------------------------------------------------------------- /packages/shared/src/contexts/common.ts: -------------------------------------------------------------------------------- 1 | export const BOOT_LOCAL_KEY = 'boot:local'; 2 | export const BOOT_QUERY_KEY = ['boot']; 3 | -------------------------------------------------------------------------------- /packages/shared/src/contexts/index.ts: -------------------------------------------------------------------------------- 1 | export * from './WritePostContext'; 2 | export * from './ActiveFeedContext'; 3 | export * from './ActiveFeedNameContext'; 4 | -------------------------------------------------------------------------------- /packages/shared/src/features/onboarding/shared/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ProgressBar'; 2 | export * from './Header'; 3 | export * from './DiscountTimer'; 4 | export * from './Box'; 5 | export * from './PricingPlan'; 6 | export * from './PricingPlans'; 7 | export * from './CreditCards'; 8 | export * from './Reviews'; 9 | export * from './FunnelStepBackground'; 10 | export * from './FunnelStepCtaWrapper'; 11 | export * from './CookieConsent'; 12 | export * from './ImageReview'; 13 | export * from './Stars'; 14 | export * from './StepHeadline'; 15 | export * from './utils'; 16 | -------------------------------------------------------------------------------- /packages/shared/src/features/onboarding/shared/withActiveGuard.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import type { FunnelStep } from '../types/funnel'; 3 | 4 | export const withIsActiveGuard = ( 5 | Component: React.FC, 6 | ) => { 7 | return function GuardedStep(props: Step) { 8 | const { isActive } = props; 9 | if (!isActive) { 10 | return null; 11 | } 12 | return ; 13 | }; 14 | }; 15 | -------------------------------------------------------------------------------- /packages/shared/src/features/onboarding/steps/FunnelFact/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import type { FunnelStepFact } from '../../types/funnel'; 3 | import { FunnelFactCentered } from './FunnelFactCentered'; 4 | import { FunnelFactDefault } from './FunnelFactDefault'; 5 | 6 | export const FunnelFact = (props: FunnelStepFact) => { 7 | const { parameters } = props; 8 | 9 | switch (parameters.layout) { 10 | case 'centered': 11 | return ; 12 | default: 13 | return ; 14 | } 15 | }; 16 | -------------------------------------------------------------------------------- /packages/shared/src/features/onboarding/steps/index.ts: -------------------------------------------------------------------------------- 1 | export { FunnelQuiz } from './FunnelQuiz'; 2 | export { FunnelSocialProof } from './FunnelSocialProof'; 3 | export { FunnelPricing } from './FunnelPricing'; 4 | export { FunnelPaymentSuccessful } from './FunnelPaymentSuccessful'; 5 | export { FunnelProfileForm } from './FunnelProfileForm'; 6 | export { FunnelEditTags } from './FunnelEditTags'; 7 | export { FunnelContentTypes } from './FunnelContentTypes'; 8 | export { FunnelReadingReminder } from './FunnelReadingReminder'; 9 | export { FunnelInstallPwa } from './FunnelInstallPwa'; 10 | -------------------------------------------------------------------------------- /packages/shared/src/features/organizations/utils.ts: -------------------------------------------------------------------------------- 1 | import { settingsUrl } from '../../lib/constants'; 2 | import { OrganizationMemberRole } from './types'; 3 | 4 | export const getOrganizationSettingsUrl = (orgId: string, suffix?: string) => 5 | `${settingsUrl}/organization/${orgId}${suffix ? `/${suffix}` : ''}`; 6 | 7 | export const isPrivilegedOrganizationRole = (role: OrganizationMemberRole) => 8 | role === OrganizationMemberRole.Owner || 9 | role === OrganizationMemberRole.Admin; 10 | -------------------------------------------------------------------------------- /packages/shared/src/graphql/emptyResponse.ts: -------------------------------------------------------------------------------- 1 | export interface EmptyResponse { 2 | _: boolean; 3 | } 4 | -------------------------------------------------------------------------------- /packages/shared/src/graphql/subscriptions.ts: -------------------------------------------------------------------------------- 1 | import type { Client } from 'graphql-ws'; 2 | import { createClient } from 'graphql-ws'; 3 | 4 | export function createSubscriptionClient(token: string): Client { 5 | return createClient({ 6 | url: process.env.NEXT_PUBLIC_SUBS_URL, 7 | lazy: false, 8 | connectionParams: { token }, 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /packages/shared/src/graphql/types.ts: -------------------------------------------------------------------------------- 1 | declare module 'graphql-request/dist/types' { 2 | interface GraphQLError { 3 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 4 | extensions?: Record; 5 | message?: string; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /packages/shared/src/graphql/urlShortener.ts: -------------------------------------------------------------------------------- 1 | import { gql } from 'graphql-request'; 2 | 3 | export const GET_SHORT_URL_QUERY = gql` 4 | query GetShortUrl($url: String!) { 5 | getShortUrl(url: $url) 6 | } 7 | `; 8 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/auth/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useOnboarding'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/bookmark/common.ts: -------------------------------------------------------------------------------- 1 | export interface UseBookmarkProviderProps { 2 | bookmarked: boolean; 3 | } 4 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/bookmark/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useJustBookmarked'; 2 | export * from './useBookmarkFolderList'; 3 | export * from './useCreateBookmarkFolder'; 4 | export * from './common'; 5 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/bookmark/types.ts: -------------------------------------------------------------------------------- 1 | import type { UseMutationMatcher } from '../mutationSubscription'; 2 | 3 | export type UseBookmarkMutationProps = { 4 | id: string; 5 | }; 6 | 7 | export const bookmarkMutationKey = ['post', 'mutation', 'bookmark']; 8 | 9 | export const bookmarkMutationMatcher: UseMutationMatcher< 10 | Partial 11 | > = ({ status, mutation }) => 12 | status === 'success' && 13 | mutation?.options?.mutationKey?.toString() === bookmarkMutationKey.toString(); 14 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/bookmark/useBookmarkReminderCover.ts: -------------------------------------------------------------------------------- 1 | import { useJustBookmarked } from './useJustBookmarked'; 2 | import type { Post } from '../../graphql/posts'; 3 | 4 | export const useBookmarkReminderCover = (post: Post): boolean => { 5 | const { justBookmarked } = useJustBookmarked({ 6 | bookmarked: post?.bookmarked, 7 | }); 8 | 9 | return justBookmarked && !post?.bookmark?.remindAt; 10 | }; 11 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/chat/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useChat'; 2 | export * from './types'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/companion/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useBackgroundRequest'; 2 | export * from './useRawBackgroundRequest'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/feed/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useAdvancedSettings'; 2 | export * from './useFeeds'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/feed/useCustomDefaultFeed.ts: -------------------------------------------------------------------------------- 1 | import { useAuthContext } from '../../contexts/AuthContext'; 2 | 3 | type UseCustomDefaultFeed = { 4 | isCustomDefaultFeed: boolean; 5 | defaultFeedId: string; 6 | }; 7 | 8 | const useCustomDefaultFeed = (): UseCustomDefaultFeed => { 9 | const { user } = useAuthContext(); 10 | 11 | return { 12 | isCustomDefaultFeed: user?.defaultFeedId && user.defaultFeedId !== user?.id, 13 | defaultFeedId: user?.defaultFeedId ?? user?.id, 14 | }; 15 | }; 16 | 17 | export default useCustomDefaultFeed; 18 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/input/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useSyncUploader'; 2 | export * from './useMarkdownInput'; 3 | export * from './useDebouncedUrl'; 4 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/input/useDebouncedUrl.ts: -------------------------------------------------------------------------------- 1 | import type { CancelEvent, StartFn } from '../useDebounceFn'; 2 | import useDebounceFn from '../useDebounceFn'; 3 | import { isValidHttpUrl } from '../../lib/links'; 4 | 5 | export const useDebouncedUrl = ( 6 | callback: StartFn, 7 | onValidate: StartFn, 8 | delay = 1000, 9 | ): [StartFn, CancelEvent] => 10 | useDebounceFn((value: string) => { 11 | if (!isValidHttpUrl(value) || !onValidate(value)) { 12 | return null; 13 | } 14 | 15 | return callback(value); 16 | }, delay); 17 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/mutationSubscription/index.ts: -------------------------------------------------------------------------------- 1 | export * from './types'; 2 | export * from './useMutationSubscription'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/notifications/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useNotificationToggle'; 2 | export * from './useNotificationPreference'; 3 | export * from './usePushNotificationMutation'; 4 | export * from './useEnableNotification'; 5 | export * from './useNotificationPreferenceToggle'; 6 | export * from './useBookmarkReminder'; 7 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/post/common.ts: -------------------------------------------------------------------------------- 1 | import type { CommentMarkdownInputProps } from '../../components/fields/MarkdownInput/CommentMarkdownInput'; 2 | 3 | export interface CommentWriteProps { 4 | commentId: string; 5 | parentCommentId?: string; 6 | lastUpdatedAt?: string; 7 | } 8 | 9 | export interface CommentWrite { 10 | inputProps: Partial; 11 | } 12 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/post/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useComments'; 2 | export * from './usePublicReadingHistory'; 3 | export * from './useRelatedPosts'; 4 | export * from './useLoggedCopyPostLink'; 5 | export * from './useViewPost'; 6 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/referral/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useReferralCampaign'; 2 | export * from './useJoinReferral'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/search/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useSearchHistory'; 2 | export * from './useSearchProvider'; 3 | export * from './useSearchProviderSuggestions'; 4 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/source/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useSourceActions'; 2 | export * from './useSourceActionsNotify'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/squads/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useSquad'; 2 | export * from './usePostToSquad'; 3 | export * from './useSquadActions'; 4 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/streaks/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useReadingStreak'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/useCopyPostLink.ts: -------------------------------------------------------------------------------- 1 | import type { CopyNotifyFunction } from './useCopy'; 2 | import { useCopyLink } from './useCopy'; 3 | 4 | export function useCopyPostLink(link?: string): [boolean, CopyNotifyFunction] { 5 | const [copying, copy] = useCopyLink(link ? () => link : undefined); 6 | 7 | return [copying, copy]; 8 | } 9 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/useDebounce.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | 3 | export default function useDebounce(value: T, delay: number): T { 4 | const [debouncedValue, setDebouncedValue] = useState(value); 5 | 6 | useEffect(() => { 7 | const handler = setTimeout(() => { 8 | setDebouncedValue(value); 9 | }, delay); 10 | 11 | return () => { 12 | clearTimeout(handler); 13 | }; 14 | }, [value, delay]); 15 | 16 | return debouncedValue; 17 | } 18 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/useFeedPreviewMode.ts: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | import { ActiveFeedContext } from '../contexts/ActiveFeedContext'; 3 | import { RequestKey } from '../lib/query'; 4 | 5 | export const useFeedPreviewMode = (): boolean => { 6 | const { queryKey: feedQueryKey } = useContext(ActiveFeedContext); 7 | 8 | return feedQueryKey?.[0] === RequestKey.FeedPreview; 9 | }; 10 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/useHideOnModal.ts: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | 3 | export function useHideOnModal(predicate: boolean): void { 4 | useEffect(() => { 5 | const root = document.querySelector('#__next'); 6 | if (!root) { 7 | return undefined; 8 | } 9 | if (predicate) { 10 | root.classList.add('hide-on-modal'); 11 | } else { 12 | root.classList.remove('hide-on-modal'); 13 | } 14 | 15 | return () => { 16 | root.classList.remove('hide-on-modal'); 17 | }; 18 | }, [predicate]); 19 | } 20 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/usePrevious.ts: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from 'react'; 2 | 3 | export const usePrevious = (value: T): T => { 4 | const ref = React.useRef(); 5 | useEffect(() => { 6 | ref.current = value; 7 | }); 8 | return ref.current; 9 | }; 10 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/useProfileMenu.ts: -------------------------------------------------------------------------------- 1 | import { useContextMenu } from '@dailydotdev/react-contexify'; 2 | 3 | export default function useProfileMenu(): { 4 | onMenuClick: (e: React.MouseEvent) => void; 5 | } { 6 | const { show } = useContextMenu({ id: 'profile-context' }); 7 | 8 | const onMenuClick = (e: React.MouseEvent) => { 9 | const { right, bottom } = e.currentTarget.getBoundingClientRect(); 10 | show(e, { 11 | position: { x: right, y: bottom + 4 }, 12 | }); 13 | }; 14 | 15 | return { 16 | onMenuClick, 17 | }; 18 | } 19 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/useSidebarRendered.ts: -------------------------------------------------------------------------------- 1 | import { useMemo } from 'react'; 2 | import { useViewSize, ViewSize } from './useViewSize'; 3 | 4 | export default function useSidebarRendered(): { 5 | sidebarRendered: boolean; 6 | } { 7 | const sidebarRendered = useViewSize(ViewSize.Laptop); 8 | 9 | return useMemo(() => { 10 | return { 11 | sidebarRendered, 12 | }; 13 | }, [sidebarRendered]); 14 | } 15 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/useSquadOnboarding.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/shared/src/hooks/useSquadOnboarding.ts -------------------------------------------------------------------------------- /packages/shared/src/hooks/useToggle.ts: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | 3 | type UseToggle = ( 4 | initialState: boolean, 5 | ) => readonly [boolean, (forced?: boolean) => void]; 6 | 7 | export const useToggle: UseToggle = (initialState) => { 8 | const [state, setState] = useState(initialState); 9 | const toggle = (forced?: boolean) => { 10 | if (typeof forced === 'boolean') { 11 | setState(forced); 12 | return; 13 | } 14 | 15 | setState((value) => !value); 16 | }; 17 | return [state, toggle] as const; 18 | }; 19 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/userCompany/index.tsx: -------------------------------------------------------------------------------- 1 | export * from './useUserCompaniesQuery'; 2 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './usePagination'; 2 | export * from './useThemedAsset'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/hooks/vote/index.ts: -------------------------------------------------------------------------------- 1 | export * from './types'; 2 | export * from './useVotePost'; 3 | export * from './useFeedVotePost'; 4 | export * from './useReadHistoryVotePost'; 5 | export * from './useVoteComment'; 6 | -------------------------------------------------------------------------------- /packages/shared/src/lib/base64.ts: -------------------------------------------------------------------------------- 1 | export async function base64ToFile( 2 | dataUrl: string, 3 | fileName: string, 4 | ): Promise { 5 | const res: Response = await fetch(dataUrl); 6 | const blob: Blob = await res.blob(); 7 | const type = dataUrl.substring( 8 | dataUrl.indexOf(':') + 1, 9 | dataUrl.indexOf(';'), 10 | ); 11 | return new File([blob], fileName, { type }); 12 | } 13 | -------------------------------------------------------------------------------- /packages/shared/src/lib/config.ts: -------------------------------------------------------------------------------- 1 | export const apiUrl = 2 | process.env.NEXT_PUBLIC_DOMAIN === 'localhost' 3 | ? '/api' 4 | : process.env.NEXT_PUBLIC_API_URL; 5 | 6 | export const graphqlUrl = `${apiUrl}/graphql`; 7 | 8 | export const fallbackImages = { 9 | avatar: 10 | 'https://media.daily.dev/image/upload/s--qsFuKGv_--/t_logo,f_auto/public/noProfile', 11 | }; 12 | 13 | export const MAX_VISIBLE_PRIVILEGED_MEMBERS_LAPTOP = 3; 14 | export const MAX_VISIBLE_PRIVILEGED_MEMBERS_MOBILE = 1; 15 | -------------------------------------------------------------------------------- /packages/shared/src/lib/errors.ts: -------------------------------------------------------------------------------- 1 | import type { ApiError } from '../graphql/common'; 2 | 3 | export class HttpError extends Error { 4 | public url: string; 5 | 6 | public statusCode: number; 7 | 8 | public response: string; 9 | 10 | constructor(url: string, status: number, response: string) { 11 | super(`Unexpected status code: ${status}`); 12 | 13 | this.name = 'HttpError'; 14 | this.url = url; 15 | this.statusCode = status; 16 | this.response = response; 17 | } 18 | } 19 | 20 | export type GraphQLError = { 21 | response: { errors: { extensions: { code: ApiError } }[] }; 22 | }; 23 | -------------------------------------------------------------------------------- /packages/shared/src/lib/extension.ts: -------------------------------------------------------------------------------- 1 | export enum ExtensionMessageType { 2 | ContentLoaded = 'CONTENT_LOADED', 3 | GraphQLRequest = 'GRAPHQL_REQUEST', 4 | FetchRequest = 'FETCH_REQUEST', 5 | DisableCompanion = 'DISABLE_COMPANION', 6 | RequestUpdate = 'REQUEST_UPDATE', 7 | } 8 | 9 | export const getCompanionWrapper = (): HTMLElement => 10 | globalThis?.document 11 | ?.querySelector('daily-companion-app') 12 | ?.shadowRoot?.querySelector('#daily-companion-wrapper'); 13 | -------------------------------------------------------------------------------- /packages/shared/src/lib/fetchTimeout.ts: -------------------------------------------------------------------------------- 1 | export default function fetchTimeout( 2 | url: string, 3 | ms: number, 4 | { signal, ...options }: RequestInit = {}, 5 | ): Promise { 6 | const controller = new AbortController(); 7 | const promise = fetch(url, { signal: controller.signal, ...options }); 8 | if (signal) { 9 | signal.addEventListener('abort', () => controller.abort()); 10 | } 11 | const timeout = setTimeout(() => controller.abort(), ms); 12 | return promise.finally(() => clearTimeout(timeout)); 13 | } 14 | -------------------------------------------------------------------------------- /packages/shared/src/lib/index.ts: -------------------------------------------------------------------------------- 1 | export * from './labels'; 2 | export * from './numberFormat'; 3 | export * from './referral'; 4 | export * from './links'; 5 | export * from './integrations'; 6 | -------------------------------------------------------------------------------- /packages/shared/src/lib/plus.ts: -------------------------------------------------------------------------------- 1 | export enum SubscriptionProvider { 2 | Paddle = 'paddle', 3 | AppleStoreKit = 'storekit', 4 | } 5 | 6 | export enum SubscriptionStatus { 7 | Active = 'active', 8 | Expired = 'expired', 9 | Cancelled = 'cancelled', 10 | } 11 | -------------------------------------------------------------------------------- /packages/shared/src/lib/referral.ts: -------------------------------------------------------------------------------- 1 | export enum ReferralCampaignKey { 2 | Generic = 'generic', 3 | Search = 'search', 4 | SharePost = 'share_post', 5 | ShareComment = 'share_comment', 6 | ShareProfile = 'share_profile', 7 | ShareSource = 'share_source', 8 | ShareTag = 'share_tag', 9 | } 10 | -------------------------------------------------------------------------------- /packages/shared/src/lib/storage.ts: -------------------------------------------------------------------------------- 1 | export enum StorageTopic { 2 | Squad = 'squad', 3 | ReferralCampaign = 'referralCampaign', 4 | Popup = 'popup', 5 | Post = 'post', 6 | Onboarding = 'onboarding', 7 | } 8 | 9 | export const APP_KEY_PREFIX = 'dailydev'; 10 | 11 | export const generateStorageKey = ( 12 | topic: StorageTopic, 13 | key: string, 14 | identifier = 'global', 15 | ): string => `${APP_KEY_PREFIX}:${topic}:${key}:${identifier}`; 16 | -------------------------------------------------------------------------------- /packages/shared/src/lib/tooltip.ts: -------------------------------------------------------------------------------- 1 | export const isTouchDevice = (): boolean => { 2 | if (typeof window === 'undefined') { 3 | return false; 4 | } 5 | 6 | return 'ontouchstart' in window || navigator.maxTouchPoints > 0; 7 | }; 8 | -------------------------------------------------------------------------------- /packages/shared/src/lib/userCompany.ts: -------------------------------------------------------------------------------- 1 | export interface Company { 2 | id: string; 3 | name: string; 4 | createdAt: Date; 5 | updatedAt: Date; 6 | image: string; 7 | } 8 | 9 | export interface UserCompany { 10 | createdAt: Date; 11 | updatedAt: Date; 12 | company?: Company; 13 | email: string; 14 | } 15 | -------------------------------------------------------------------------------- /packages/shared/src/lib/withNoSSR.ts: -------------------------------------------------------------------------------- 1 | import dynamic from 'next/dynamic'; 2 | import type { ComponentType } from 'react'; 3 | 4 | export const withNoSSR = (Component: ComponentType): ComponentType => 5 | dynamic(() => Promise.resolve>(Component), { 6 | ssr: false, 7 | }); 8 | -------------------------------------------------------------------------------- /packages/shared/src/styles/components.css: -------------------------------------------------------------------------------- 1 | @import './components/buttons.css'; 2 | @import './components/menu.css'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/styles/globals.css: -------------------------------------------------------------------------------- 1 | @import 'tailwindcss/base.css'; 2 | @import './base.css'; 3 | 4 | @import 'tailwindcss/components.css'; 5 | @import './components.css'; 6 | 7 | @import 'tailwindcss/utilities.css'; 8 | @import './utilities.css'; 9 | 10 | @import './ios.css'; 11 | -------------------------------------------------------------------------------- /packages/shared/src/styles/media.ts: -------------------------------------------------------------------------------- 1 | export const mobileM = `@media (min-width: 356px)`; 2 | export const mobileL = `@media (min-width: 420px)`; 3 | export const mobileXL = `@media (min-width: 500px)`; 4 | export const tablet = `@media (min-width: 656px)`; 5 | export const laptop = `@media (min-width: 1020px)`; 6 | export const laptopL = `@media (min-width: 1360px)`; 7 | export const laptopXL = `@media (min-width: 1668px)`; 8 | export const desktop = `@media (min-width: 1976px)`; 9 | export const desktopL = `@media (min-width: 2156px)`; 10 | export const userPrefersReducedMotions = `@media (prefers-reduced-motion)`; 11 | -------------------------------------------------------------------------------- /packages/shared/src/styles/shadows.ts: -------------------------------------------------------------------------------- 1 | export const shadow2 = (color: string): string => 2 | `0 0.375rem 0.375rem -0.125rem ${color}`; 3 | 4 | export const shadow3 = (color: string): string => 5 | `0 0.875rem 0.875rem -0.375rem ${color}`; 6 | -------------------------------------------------------------------------------- /packages/shared/src/types.ts: -------------------------------------------------------------------------------- 1 | import type { Origin } from './lib/log'; 2 | 3 | export type PropsParameters< 4 | T extends (props: Record) => unknown, 5 | > = T extends (props: infer P) => unknown ? P : never; 6 | 7 | declare module 'graphql-request' { 8 | export interface GraphQLClient { 9 | unsetHeader(header: string): GraphQLClient; 10 | } 11 | } 12 | 13 | export type LogStartBuyingCreditsProps = { 14 | origin: Origin; 15 | target_id?: string; 16 | amount?: number; 17 | }; 18 | 19 | export type FAQItem = { 20 | question: string; 21 | answer: React.ReactNode; 22 | }; 23 | -------------------------------------------------------------------------------- /packages/shared/tailwind/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | rules: { 3 | '@typescript-eslint/no-var-requires': 'off', 4 | 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /packages/shared/tailwind/colors/background.ts: -------------------------------------------------------------------------------- 1 | const backgroundColors = { 2 | default: 'var(--theme-background-default)', 3 | subtle: 'var(--theme-background-subtle)', 4 | popover: 'var(--theme-background-popover)', 5 | post: { 6 | post: 'var(--theme-background-post-post)', 7 | disabled: 'var(--theme-background-post-disabled)', 8 | }, 9 | }; 10 | 11 | export default backgroundColors; 12 | -------------------------------------------------------------------------------- /packages/shared/tailwind/colors/blur.ts: -------------------------------------------------------------------------------- 1 | const blurColors = { 2 | highlight: 'var(--theme-blur-blur-highlight)', 3 | baseline: 'var(--theme-blur-blur-baseline)', 4 | bg: 'var(--theme-blur-blur-bg)', 5 | glass: 'var(--theme-blur-blur-glass)', 6 | }; 7 | 8 | export default blurColors; 9 | -------------------------------------------------------------------------------- /packages/shared/tailwind/colors/brand.ts: -------------------------------------------------------------------------------- 1 | const brandColors = { 2 | subtler: 'var(--theme-brand-subtler)', 3 | default: 'var(--theme-brand-default)', 4 | bolder: 'var(--theme-brand-bolder)', 5 | float: 'var(--theme-brand-float)', 6 | hover: 'var(--theme-brand-hover)', 7 | active: 'var(--theme-brand-active)', 8 | }; 9 | 10 | export default brandColors; 11 | -------------------------------------------------------------------------------- /packages/shared/tailwind/colors/overlay.ts: -------------------------------------------------------------------------------- 1 | const overlayColors = { 2 | // Todo: Remove the base object, only here to have backward compatibility 3 | base: { 4 | primary: 'var(--theme-overlay-base-primary)', 5 | secondary: 'var(--theme-overlay-base-secondary)', 6 | tertiary: 'var(--theme-overlay-base-tertiary)', 7 | quaternary: 'var(--theme-overlay-base-quaternary)', 8 | }, 9 | dark: { 10 | dark1: 'var(--theme-overlay-dark-dark1)', 11 | dark2: 'var(--theme-overlay-dark-dark2)', 12 | dark3: 'var(--theme-overlay-dark-dark3)', 13 | }, 14 | }; 15 | 16 | export default overlayColors; 17 | -------------------------------------------------------------------------------- /packages/shared/tailwind/colors/shadow.ts: -------------------------------------------------------------------------------- 1 | const shadowColors = { 2 | shadow1: 'var(--theme-shadow-shadow1)', 3 | shadow2: 'var(--theme-shadow-shadow2)', 4 | shadow3: 'var(--theme-shadow-shadow3)', 5 | cabbage: 'var(--theme-shadow-cabbage)', 6 | }; 7 | 8 | export default shadowColors; 9 | -------------------------------------------------------------------------------- /packages/shared/tailwind/colors/status.ts: -------------------------------------------------------------------------------- 1 | const statusColors = { 2 | error: 'var(--status-error)', 3 | warning: 'var(--status-warning)', 4 | help: 'var(--status-help)', 5 | success: 'var(--status-success)', 6 | info: 'var(--theme-status-info)', 7 | }; 8 | 9 | export default statusColors; 10 | -------------------------------------------------------------------------------- /packages/shared/tailwind/colors/surface.ts: -------------------------------------------------------------------------------- 1 | const surfaceColors = { 2 | primary: 'var(--theme-surface-primary)', 3 | secondary: 'var(--theme-surface-secondary)', 4 | invert: 'var(--theme-surface-invert)', 5 | float: 'var(--theme-surface-float)', 6 | hover: 'var(--theme-surface-hover)', 7 | active: 'var(--theme-surface-active)', 8 | disabled: 'var(--theme-surface-disabled)', 9 | focus: 'var(--theme-surface-focus)', 10 | }; 11 | 12 | export default surfaceColors; 13 | -------------------------------------------------------------------------------- /packages/shared/tailwind/colors/text.ts: -------------------------------------------------------------------------------- 1 | const textColors = { 2 | primary: 'var(--theme-text-primary)', 3 | secondary: 'var(--theme-text-secondary)', 4 | tertiary: 'var(--theme-text-tertiary)', 5 | quaternary: 'var(--theme-text-quaternary)', 6 | disabled: 'var(--theme-text-disabled)', 7 | link: 'var(--theme-text-link)', 8 | highlight: { 9 | default: 'var(--theme-text-highlight-default)', 10 | hover: 'var(--theme-text-highlight-hover)', 11 | }, 12 | credit: 'var(--theme-accent-bun-default)', 13 | }; 14 | 15 | export default textColors; 16 | -------------------------------------------------------------------------------- /packages/shared/tsconfig.eslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": [ 4 | "next-env.d.ts", 5 | "custom.d.ts", 6 | "src/**/*.ts", 7 | "src/**/*.tsx", 8 | "tailwind/**/*.ts", 9 | "*.js", 10 | "*.ts", 11 | "**/.eslintrc.js", 12 | "__tests__/**/*.ts", 13 | "__tests__/**/*.tsx", 14 | "__mocks__/**/*.ts", 15 | "__mocks__/**/*.tsx" 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /packages/storybook/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['@dailydotdev', 'plugin:storybook/recommended'], 3 | }; 4 | -------------------------------------------------------------------------------- /packages/storybook/.gitignore: -------------------------------------------------------------------------------- 1 | storybook-static 2 | -------------------------------------------------------------------------------- /packages/storybook/mock/GrowthBookProvider.tsx: -------------------------------------------------------------------------------- 1 | import { fn } from '@storybook/test'; 2 | import * as actual from '@dailydotdev/shared/src/components/GrowthBookProvider'; 3 | 4 | export const useFeature = fn(actual.useFeature) 5 | .mockName('useFeature') 6 | .mockReturnValue('control'); 7 | 8 | export * from '@dailydotdev/shared/src/components/GrowthBookProvider'; 9 | -------------------------------------------------------------------------------- /packages/storybook/mock/hooks.ts: -------------------------------------------------------------------------------- 1 | import { fn } from '@storybook/test'; 2 | 3 | export const useConditionalFeature = fn() 4 | .mockName('useConditionalFeature') 5 | .mockReturnValue({ value: 'control', isLoading: false }); 6 | 7 | export * from '@dailydotdev/shared/src/hooks'; 8 | -------------------------------------------------------------------------------- /packages/storybook/mock/next-router.ts: -------------------------------------------------------------------------------- 1 | import { fn } from '@storybook/test'; 2 | 3 | export const useRouter = () => ({ 4 | replace: fn(), 5 | push: fn(), 6 | pathname: '/', 7 | query: {}, 8 | }); 9 | 10 | export const usePathname = () => '/'; 11 | 12 | export const useSearchParams = () => new URLSearchParams(); 13 | -------------------------------------------------------------------------------- /packages/storybook/mock/node-fetch.ts: -------------------------------------------------------------------------------- 1 | export default fetch; 2 | -------------------------------------------------------------------------------- /packages/storybook/public/images/onboarding/onboarding-fact-img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/storybook/public/images/onboarding/onboarding-fact-img.png -------------------------------------------------------------------------------- /packages/storybook/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from 'tailwindcss' 2 | import config from '@dailydotdev/shared/tailwind.config'; 3 | 4 | export default { 5 | ...config, 6 | content: [ 7 | './src/**/*.{ts,tsx}', 8 | './node_modules/@dailydotdev/shared/src/**/*.{ts,tsx}', 9 | ], 10 | safelist: [ 11 | { 12 | pattern: /^(.*?)/, 13 | }, 14 | ] 15 | } satisfies Config; 16 | -------------------------------------------------------------------------------- /packages/storybook/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2018", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "skipLibCheck": true, 6 | "strict": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "node", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true 16 | }, 17 | "include": ["."], 18 | "exclude": ["dist", "build", "node_modules"] 19 | } 20 | -------------------------------------------------------------------------------- /packages/storybook/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react"; 3 | 4 | export default defineConfig({ 5 | plugins: [react()], 6 | }); 7 | -------------------------------------------------------------------------------- /packages/webapp/.eslintignore: -------------------------------------------------------------------------------- 1 | build/* 2 | next.config.js 3 | public/push/onesignal/OneSignalSDKWorker.js 4 | public/scripts/*.js 5 | public/sw.js 6 | -------------------------------------------------------------------------------- /packages/webapp/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['@dailydotdev'], 3 | }; 4 | -------------------------------------------------------------------------------- /packages/webapp/.gitignore: -------------------------------------------------------------------------------- 1 | pages/demo.tsx 2 | next-env.d.ts 3 | *.development 4 | # sw files that are generated on build 5 | public/sw.js 6 | workbox-*.js 7 | 8 | certificates 9 | -------------------------------------------------------------------------------- /packages/webapp/.graphqlconfig: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Daily GraphQL Schema", 3 | "extensions": { 4 | "endpoints": { 5 | "Daily GraphQL Endpoint": { 6 | "url": "http://localhost:5000/graphql", 7 | "introspect": true 8 | } 9 | } 10 | }, 11 | "schemaPath": "./schema.graphql" 12 | } -------------------------------------------------------------------------------- /packages/webapp/__mocks__/reactMarkdownMock.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement, ReactNode } from 'react'; 2 | import React from 'react'; 3 | 4 | const ReactMarkdown = ({ 5 | children, 6 | }: { 7 | children?: ReactNode; 8 | }): ReactElement => { 9 | return <>{children}; 10 | }; 11 | 12 | export default ReactMarkdown; 13 | -------------------------------------------------------------------------------- /packages/webapp/__mocks__/svgrMock.ts: -------------------------------------------------------------------------------- 1 | export default 'div'; 2 | -------------------------------------------------------------------------------- /packages/webapp/components/KeywordManagement.module.css: -------------------------------------------------------------------------------- 1 | .buttons { 2 | max-width: calc($pageMaxWidth - 1rem); 3 | } 4 | -------------------------------------------------------------------------------- /packages/webapp/components/Promotion.module.css: -------------------------------------------------------------------------------- 1 | .promotion { 2 | right: calc((100vw - $pageMaxWidth) / 4 - $promotionWidth / 2); 3 | width: $promotionWidth; 4 | } 5 | -------------------------------------------------------------------------------- /packages/webapp/components/common.ts: -------------------------------------------------------------------------------- 1 | import type { NextSeoProps } from 'next-seo'; 2 | 3 | export interface DynamicSeoProps { 4 | seo?: NextSeoProps; 5 | } 6 | -------------------------------------------------------------------------------- /packages/webapp/components/history/common.ts: -------------------------------------------------------------------------------- 1 | export enum HistoryType { 2 | Reading = 'Reading history', 3 | Search = 'Search history', 4 | } 5 | -------------------------------------------------------------------------------- /packages/webapp/components/history/index.ts: -------------------------------------------------------------------------------- 1 | export * from './reading'; 2 | export * from './common'; 3 | -------------------------------------------------------------------------------- /packages/webapp/components/layouts/ProfileLayout/NavBar.module.css: -------------------------------------------------------------------------------- 1 | .nav { 2 | &:before { 3 | content: ''; 4 | position: absolute; 5 | bottom: 0; 6 | left: 0; 7 | right: 0; 8 | height: 0.063rem; 9 | margin: 0 auto; 10 | background: var(--theme-border-subtlest-quaternary); 11 | } 12 | 13 | & > div { 14 | position: relative; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /packages/webapp/components/layouts/utils.ts: -------------------------------------------------------------------------------- 1 | export const getTemplatedTitle = ( 2 | title: string, 3 | template = '| daily.dev', 4 | ): string => `${title} ${template}`; 5 | -------------------------------------------------------------------------------- /packages/webapp/custom.d.ts: -------------------------------------------------------------------------------- 1 | import '@serwist/next/typings'; 2 | 3 | type SvgrComponent = React.FC>; 4 | 5 | declare module '*.svg' { 6 | const value: SvgrComponent; 7 | export default value; 8 | } 9 | -------------------------------------------------------------------------------- /packages/webapp/pages/helloworld/[id]/index.tsx: -------------------------------------------------------------------------------- 1 | import HelloWorldPage from '../index'; 2 | 3 | // Re-use the same component but with different params 4 | export default HelloWorldPage; 5 | 6 | // Re-use the getServerSideProps logic from the parent page 7 | export { getServerSideProps } from '../index'; 8 | -------------------------------------------------------------------------------- /packages/webapp/pages/settings/organization/[orgId]/index.ts: -------------------------------------------------------------------------------- 1 | import type { GetServerSideProps } from 'next'; 2 | 3 | export const getServerSideProps: GetServerSideProps = async ({ params }) => { 4 | const { orgId } = params; 5 | 6 | return { 7 | redirect: { 8 | destination: `/settings/organization/${orgId}/members`, 9 | permanent: false, 10 | }, 11 | }; 12 | }; 13 | 14 | const Page = () => null; 15 | 16 | export default Page; 17 | -------------------------------------------------------------------------------- /packages/webapp/pages/squads/[handle]/moderate.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { GetServerSidePropsResult } from 'next'; 4 | import { webappUrl } from '@dailydotdev/shared/src/lib/constants'; 5 | 6 | const Page = (): ReactElement => { 7 | return <>; 8 | }; 9 | 10 | export async function getServerSideProps(): Promise< 11 | GetServerSidePropsResult 12 | > { 13 | return { 14 | redirect: { 15 | destination: `${webappUrl}squads/moderate`, 16 | permanent: true, 17 | }, 18 | }; 19 | } 20 | 21 | export default Page; 22 | -------------------------------------------------------------------------------- /packages/webapp/pages/squads/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import React from 'react'; 3 | import type { GetServerSidePropsResult } from 'next'; 4 | import { squadCategoriesPaths } from '@dailydotdev/shared/src/lib/constants'; 5 | 6 | const SquadsPage = (): ReactElement => { 7 | return <>; 8 | }; 9 | 10 | export async function getServerSideProps(): Promise< 11 | GetServerSidePropsResult 12 | > { 13 | return { 14 | redirect: { 15 | destination: squadCategoriesPaths.discover, 16 | permanent: true, 17 | }, 18 | }; 19 | } 20 | 21 | export default SquadsPage; 22 | -------------------------------------------------------------------------------- /packages/webapp/postcss.config.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-var-requires */ 2 | const config = require('@dailydotdev/shared/postcss.config'); 3 | 4 | module.exports = config; 5 | -------------------------------------------------------------------------------- /packages/webapp/public/.well-known/assetlinks.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "relation": ["delegate_permission/common.handle_all_urls"], 3 | "target" : { "namespace": "android_app", "package_name": "dev.daily", 4 | "sha256_cert_fingerprints": ["DD:F0:70:20:89:BB:2A:A6:E0:57:9E:02:E2:58:44:12:78:B6:E7:4C:DA:0E:E0:26:C1:0B:41:3A:FE:B4:FA:FF"] } 5 | } 6 | ] -------------------------------------------------------------------------------- /packages/webapp/public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/webapp/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /packages/webapp/public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/webapp/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /packages/webapp/public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/webapp/public/apple-touch-icon.png -------------------------------------------------------------------------------- /packages/webapp/public/assets/maskable_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/webapp/public/assets/maskable_icon.png -------------------------------------------------------------------------------- /packages/webapp/public/assets/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/webapp/public/assets/mstile-150x150.png -------------------------------------------------------------------------------- /packages/webapp/public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/webapp/public/favicon-16x16.png -------------------------------------------------------------------------------- /packages/webapp/public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/webapp/public/favicon-32x32.png -------------------------------------------------------------------------------- /packages/webapp/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailydotdev/apps/f93a100b8f78e27868d0780683e8784fac0a9fd8/packages/webapp/public/favicon.ico -------------------------------------------------------------------------------- /packages/webapp/public/push/onesignal/OneSignalSDKWorker.js: -------------------------------------------------------------------------------- 1 | importScripts("https://cdn.onesignal.com/sdks/web/v16/OneSignalSDK.sw.js"); 2 | -------------------------------------------------------------------------------- /packages/webapp/public/robots.txt: -------------------------------------------------------------------------------- 1 | Sitemap: https://app.daily.dev/sitemap.txt 2 | User-agent: * 3 | Disallow: /join 4 | Disallow: /error 5 | Disallow: /callback 6 | Disallow: /helloworld 7 | Disallow: /helloworld/ 8 | -------------------------------------------------------------------------------- /packages/webapp/public/sitemap.txt: -------------------------------------------------------------------------------- 1 | https://app.daily.dev/sources 2 | https://app.daily.dev/squads 3 | https://app.daily.dev/tags 4 | https://app.daily.dev/devcard 5 | https://app.daily.dev/roast 6 | https://app.daily.dev/users 7 | https://app.daily.dev/posts 8 | -------------------------------------------------------------------------------- /packages/webapp/tsconfig.eslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": [ 4 | "*.ts", 5 | "components/**/*.ts", 6 | "components/**/*.tsx", 7 | "graphql/**/*.ts", 8 | "app/**/*.ts", 9 | "app/**/*.tsx", 10 | "pages/**/*.tsx", 11 | "pages/**/*.ts", 12 | "*.js", 13 | "**/.eslintrc.js", 14 | "__tests__/**/*.ts", 15 | "__tests__/**/*.tsx", 16 | "__mocks__/**/*.ts", 17 | "__mocks__/**/*.tsx" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /packages/webapp/tsconfig.jest.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "jsx": "react", 4 | "allowJs": true, 5 | "allowSyntheticDefaultImports": true, 6 | "esModuleInterop": true, 7 | "noImplicitAny": true, 8 | "sourceMap": true, 9 | "target": "es6" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/webapp/vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "github": { 3 | "silent": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - "packages/*" 3 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "installCommand": "pnpm install" 3 | } 4 | --------------------------------------------------------------------------------