gitextract_7op3tyix/ ├── .all-contributorsrc ├── .circleci/ │ └── config.yml ├── .dockerignore ├── .github/ │ ├── CODEOWNERS │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── build-new-component.md │ │ └── feature-request-or-suggestion.md │ ├── actions/ │ │ └── destroy-fly-preview-app/ │ │ ├── Dockerfile │ │ ├── action.yml │ │ └── entrypoint.sh │ ├── labels.yml │ ├── pull_request_template.md │ └── workflows/ │ ├── codeql-analysis.yml │ ├── pr-preview-fly-deploy.yml │ ├── pr-preview-fly-destroy.yml │ ├── pr-preview-remove-label.yml │ ├── pr-stale.yml │ └── storybook-deploy.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .node-version ├── .releaserc.json ├── .snaplet/ │ ├── config.json │ ├── dataModel.json │ ├── library.json │ └── questions.json ├── .vscode/ │ └── launch.json ├── .yarnrc.yml ├── CNAME ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Dockerfile ├── Dockerfile.preview ├── FUNDING.yml ├── LICENSE ├── README.md ├── SECURITY.md ├── biome.json ├── codecov.yml ├── docs/ │ ├── circle-ci.md │ ├── db-seeding.md │ ├── maintainers.md │ ├── pwa-setup.md │ ├── react-router-7.md │ ├── supabase.md │ ├── team-principles.md │ └── technical-decisions.md ├── fly-ff.toml ├── fly-pk.toml ├── fly-pp.toml ├── fly-preview.toml ├── index.html ├── package.json ├── packages/ │ ├── components/ │ │ ├── .gitignore │ │ ├── .storybook/ │ │ │ ├── main.ts │ │ │ ├── manager.js │ │ │ └── preview.tsx │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Accordion/ │ │ │ │ ├── Accordion.stories.tsx │ │ │ │ ├── Accordion.test.tsx │ │ │ │ └── Accordion.tsx │ │ │ ├── ActionSet/ │ │ │ │ └── ActionSet.tsx │ │ │ ├── Alert/ │ │ │ │ └── Alert.stories.tsx │ │ │ ├── ArrowIcon/ │ │ │ │ ├── ArrowIcon.stories.tsx │ │ │ │ ├── ArrowIcon.tsx │ │ │ │ └── styles.css │ │ │ ├── ArticleCallToActionSupabase/ │ │ │ │ ├── ArticleCallToActionSupabase.stories.tsx │ │ │ │ └── ArticleCallToActionSupabase.tsx │ │ │ ├── AuthorDisplay/ │ │ │ │ └── AuthorDisplay.tsx │ │ │ ├── Banner/ │ │ │ │ ├── Banner.stories.tsx │ │ │ │ ├── Banner.test.tsx │ │ │ │ └── Banner.tsx │ │ │ ├── BlockedRoute/ │ │ │ │ ├── BlockedRoute.stories.tsx │ │ │ │ └── BlockedRoute.tsx │ │ │ ├── Breadcrumbs/ │ │ │ │ ├── Breadcrumbs.stories.tsx │ │ │ │ ├── Breadcrumbs.test.tsx │ │ │ │ ├── Breadcrumbs.tsx │ │ │ │ └── BreadcrumbsItem.tsx │ │ │ ├── Button/ │ │ │ │ ├── Button.stories.tsx │ │ │ │ └── Button.tsx │ │ │ ├── ButtonIcon/ │ │ │ │ ├── ButtonIcon.stories.tsx │ │ │ │ └── ButtonIcon.tsx │ │ │ ├── ButtonShowReplies/ │ │ │ │ ├── ButtonShowReplies.stories.tsx │ │ │ │ ├── ButtonShowReplies.test.tsx │ │ │ │ └── ButtonShowReplies.tsx │ │ │ ├── CardButton/ │ │ │ │ ├── CardButton.stories.tsx │ │ │ │ └── CardButton.tsx │ │ │ ├── CardListItem/ │ │ │ │ ├── CardListItem.stories.tsx │ │ │ │ └── CardListItem.tsx │ │ │ ├── CardProfile/ │ │ │ │ ├── CardDetailsMemberProfile.tsx │ │ │ │ ├── CardDetailsSpaceProfile.tsx │ │ │ │ ├── CardProfile.stories.tsx │ │ │ │ ├── CardProfile.test.tsx │ │ │ │ └── CardProfile.tsx │ │ │ ├── Category/ │ │ │ │ ├── Category.stories.tsx │ │ │ │ └── Category.tsx │ │ │ ├── CategoryHorizonalList/ │ │ │ │ ├── CategoryHorizonalList.stories.tsx │ │ │ │ ├── CategoryHorizonalList.test.tsx │ │ │ │ └── CategoryHorizonalList.tsx │ │ │ ├── CharacterCount/ │ │ │ │ ├── CharacterCount.stories.tsx │ │ │ │ └── CharacterCount.tsx │ │ │ ├── CommentAvatar/ │ │ │ │ └── CommentAvatar.tsx │ │ │ ├── CommentBody/ │ │ │ │ └── CommentBody.tsx │ │ │ ├── CommentDisplay/ │ │ │ │ ├── CommentDisplay.stories.tsx │ │ │ │ ├── CommentDisplay.test.tsx │ │ │ │ └── CommentDisplay.tsx │ │ │ ├── CommentsTitle/ │ │ │ │ ├── CommentsTitle.stories.tsx │ │ │ │ ├── CommentsTitle.test.tsx │ │ │ │ └── CommentsTitle.tsx │ │ │ ├── ConfirmModal/ │ │ │ │ ├── ConfirmModal.stories.tsx │ │ │ │ └── ConfirmModal.tsx │ │ │ ├── ContentStatistics/ │ │ │ │ ├── ContentStatistics.stories.tsx │ │ │ │ ├── ContentStatistics.tsx │ │ │ │ ├── ContentStatisticsList.tsx │ │ │ │ └── types.ts │ │ │ ├── CreateComment/ │ │ │ │ ├── CreateComment.css │ │ │ │ ├── CreateComment.stories.tsx │ │ │ │ ├── CreateComment.test.tsx │ │ │ │ └── CreateComment.tsx │ │ │ ├── CreateReply/ │ │ │ │ ├── CreateReply.stories.tsx │ │ │ │ ├── CreateReply.test.tsx │ │ │ │ └── CreateReply.tsx │ │ │ ├── DisplayDate/ │ │ │ │ ├── DisplayDate.stories.tsx │ │ │ │ ├── DisplayDate.test.tsx │ │ │ │ ├── DisplayDate.tsx │ │ │ │ └── display-date.css │ │ │ ├── DonationRequestModal/ │ │ │ │ ├── DonationRequestModal.stories.tsx │ │ │ │ ├── DonationRequestModal.test.tsx │ │ │ │ └── DonationRequestModal.tsx │ │ │ ├── DownloadButton/ │ │ │ │ ├── DownloadButton.stories.tsx │ │ │ │ ├── DownloadButton.test.tsx │ │ │ │ └── DownloadButton.tsx │ │ │ ├── DownloadCounter/ │ │ │ │ ├── DownloadCounter.stories.tsx │ │ │ │ ├── DownloadCounter.test.tsx │ │ │ │ └── DownloadCounter.tsx │ │ │ ├── DownloadStaticFile/ │ │ │ │ ├── DownloadStaticFile.stories.tsx │ │ │ │ └── DownloadStaticFile.tsx │ │ │ ├── EditComment/ │ │ │ │ ├── EditComment.stories.tsx │ │ │ │ ├── EditComment.test.tsx │ │ │ │ └── EditComment.tsx │ │ │ ├── ElWithBeforeIcon/ │ │ │ │ ├── ElWithBeforeIcon.stories.tsx │ │ │ │ └── ElWithBeforeIcon.tsx │ │ │ ├── ExternalLink/ │ │ │ │ ├── ExternalLink.stories.tsx │ │ │ │ └── ExternalLink.tsx │ │ │ ├── FieldCheckbox/ │ │ │ │ └── FieldCheckbox.tsx │ │ │ ├── FieldInput/ │ │ │ │ ├── FieldInput.stories.tsx │ │ │ │ └── FieldInput.tsx │ │ │ ├── FieldMarkdown/ │ │ │ │ ├── AddImage.tsx │ │ │ │ ├── FieldMarkdown.stories.tsx │ │ │ │ ├── FieldMarkdown.tsx │ │ │ │ └── style.css │ │ │ ├── FieldTextarea/ │ │ │ │ ├── FieldTextarea.stories.tsx │ │ │ │ └── FieldTextarea.tsx │ │ │ ├── FlagIcon/ │ │ │ │ └── FlagIcon.tsx │ │ │ ├── FollowButton/ │ │ │ │ ├── FollowButton.stories.tsx │ │ │ │ └── FollowButton.tsx │ │ │ ├── FollowIcon/ │ │ │ │ ├── FollowIcon.stories.tsx │ │ │ │ └── FollowIcon.tsx │ │ │ ├── GlobalStyles/ │ │ │ │ └── GlobalStyles.tsx │ │ │ ├── GridForm/ │ │ │ │ ├── GridForm.stories.tsx │ │ │ │ └── GridForm.tsx │ │ │ ├── Guidelines/ │ │ │ │ ├── Guidelines.stories.tsx │ │ │ │ ├── Guidelines.test.tsx │ │ │ │ └── Guidelines.tsx │ │ │ ├── Heading/ │ │ │ │ └── Heading.stories.tsx │ │ │ ├── HeroBanner/ │ │ │ │ ├── HeroBanner.stories.tsx │ │ │ │ └── HeroBanner.tsx │ │ │ ├── Icon/ │ │ │ │ ├── DonateIcon.tsx │ │ │ │ ├── DownloadIcon.tsx │ │ │ │ ├── ExternalUrl.tsx │ │ │ │ ├── Icon.stories.tsx │ │ │ │ ├── Icon.tsx │ │ │ │ ├── svgs.tsx │ │ │ │ └── types.ts │ │ │ ├── IconCountWithTooltip/ │ │ │ │ ├── IconCountWithTooltip.stories.tsx │ │ │ │ ├── IconCountWithTooltip.test.tsx │ │ │ │ └── IconCountWithTooltip.tsx │ │ │ ├── ImageGallery/ │ │ │ │ ├── ImageGallery.stories.tsx │ │ │ │ ├── ImageGallery.test.tsx │ │ │ │ └── ImageGallery.tsx │ │ │ ├── ImageGalleryThumbnail/ │ │ │ │ ├── ImageGalleryThumbnail.stories.tsx │ │ │ │ ├── ImageGalleryThumbnail.test.tsx │ │ │ │ └── ImageGalleryThumbnail.tsx │ │ │ ├── ImageInput/ │ │ │ │ ├── ImageInputDeleteOverlay.tsx │ │ │ │ ├── ImageInputV2.tsx │ │ │ │ ├── ImageInputWrapper.tsx │ │ │ │ └── isImageValid.ts │ │ │ ├── InformationTooltip/ │ │ │ │ ├── InformationTooltip.stories.tsx │ │ │ │ └── InformationTooltip.tsx │ │ │ ├── Input/ │ │ │ │ └── Input.stories.tsx │ │ │ ├── InternalLink/ │ │ │ │ ├── InternalLink.stories.tsx │ │ │ │ └── InternalLink.tsx │ │ │ ├── LinkifyText/ │ │ │ │ ├── LinkifyText.stories.tsx │ │ │ │ └── LinkifyText.tsx │ │ │ ├── Loader/ │ │ │ │ ├── Loader.stories.tsx │ │ │ │ └── Loader.tsx │ │ │ ├── Map/ │ │ │ │ ├── Map.client.tsx │ │ │ │ ├── Map.stories.tsx │ │ │ │ └── index.css │ │ │ ├── MapCardList/ │ │ │ │ ├── MapCardList.stories.tsx │ │ │ │ ├── MapCardList.test.tsx │ │ │ │ └── MapCardList.tsx │ │ │ ├── MapFilterListItem/ │ │ │ │ └── MapFilterListItem.tsx │ │ │ ├── MapWithPin/ │ │ │ │ ├── MapPin.client.tsx │ │ │ │ ├── MapPin.stories.tsx │ │ │ │ ├── MapWithPin.client.tsx │ │ │ │ └── MapWithPin.stories.tsx │ │ │ ├── MemberBadge/ │ │ │ │ ├── MemberBadge.stories.tsx │ │ │ │ └── MemberBadge.tsx │ │ │ ├── MemberHistory/ │ │ │ │ ├── MemberHistory.test.tsx │ │ │ │ └── MemberHistory.tsx │ │ │ ├── Modal/ │ │ │ │ ├── Modal.stories.tsx │ │ │ │ └── Modal.tsx │ │ │ ├── ModerationStatus/ │ │ │ │ ├── ModerationStatus.stories.tsx │ │ │ │ └── ModerationStatus.tsx │ │ │ ├── MoreContainer/ │ │ │ │ ├── MoreContainer.stories.tsx │ │ │ │ └── MoreContainer.tsx │ │ │ ├── NotificationItemSupabase/ │ │ │ │ ├── NotificationItemSupabase.stories.tsx │ │ │ │ └── NotificationItemSupabase.tsx │ │ │ ├── NotificationListSupabase/ │ │ │ │ ├── NotificationListSupabase.stories.tsx │ │ │ │ ├── NotificationListSupabase.test.tsx │ │ │ │ └── NotificationListSupabase.tsx │ │ │ ├── NotificationsModal/ │ │ │ │ └── NotificationsModal.tsx │ │ │ ├── OsmGeocoding/ │ │ │ │ ├── OsmGeocoding.stories.tsx │ │ │ │ ├── OsmGeocoding.tsx │ │ │ │ ├── OsmGeocodingLoader.tsx │ │ │ │ ├── OsmGeocodingResultsList.tsx │ │ │ │ └── types.tsx │ │ │ ├── Pagination/ │ │ │ │ ├── Pagination.test.tsx │ │ │ │ └── Pagination.tsx │ │ │ ├── PaginationIcons/ │ │ │ │ ├── PaginationIcons.stories.tsx │ │ │ │ ├── PaginationIcons.test.tsx │ │ │ │ └── PaginationIcons.tsx │ │ │ ├── PinProfile/ │ │ │ │ ├── PinProfile.stories.tsx │ │ │ │ └── PinProfile.tsx │ │ │ ├── ProfileBadgeContentLabel/ │ │ │ │ ├── ProfileBadgeContentLabel.stories.tsx │ │ │ │ └── ProfileBadgeContentLabel.tsx │ │ │ ├── ProfileLink/ │ │ │ │ ├── ProfileLink.stories.tsx │ │ │ │ └── ProfileLink.tsx │ │ │ ├── ProfileList/ │ │ │ │ ├── ProfileList.stories.tsx │ │ │ │ ├── ProfileList.test.tsx │ │ │ │ └── ProfileList.tsx │ │ │ ├── ProfileTagsList/ │ │ │ │ ├── ProfileTagsList.stories.tsx │ │ │ │ ├── ProfileTagsList.test.tsx │ │ │ │ └── ProfileTagsList.tsx │ │ │ ├── ResearchEditorOverview/ │ │ │ │ ├── ResearchEditorOverview.stories.tsx │ │ │ │ ├── ResearchEditorOverview.test.tsx │ │ │ │ ├── ResearchEditorOverview.tsx │ │ │ │ └── __snapshots__/ │ │ │ │ └── ResearchEditorOverview.test.tsx.snap │ │ │ ├── ReturnPathLink/ │ │ │ │ └── ReturnPathLink.tsx │ │ │ ├── SearchField/ │ │ │ │ ├── SearchField.stories.tsx │ │ │ │ └── SearchField.tsx │ │ │ ├── Select/ │ │ │ │ ├── DropdownIndicator.tsx │ │ │ │ ├── Option.tsx │ │ │ │ ├── Select.stories.tsx │ │ │ │ └── Select.tsx │ │ │ ├── SiteFooter/ │ │ │ │ ├── SiteFooter.stories.tsx │ │ │ │ └── SiteFooter.tsx │ │ │ ├── TabbedContent/ │ │ │ │ ├── TabbedContent.stories.tsx │ │ │ │ ├── TabbedContent.test.tsx │ │ │ │ └── TabbedContent.tsx │ │ │ ├── Tag/ │ │ │ │ ├── Tag.stories.tsx │ │ │ │ └── Tag.tsx │ │ │ ├── TagList/ │ │ │ │ ├── TagList.stories.tsx │ │ │ │ ├── TagList.test.tsx │ │ │ │ └── TagList.tsx │ │ │ ├── Text/ │ │ │ │ └── Text.stories.tsx │ │ │ ├── TextNotification/ │ │ │ │ ├── TextNotification.stories.tsx │ │ │ │ └── TextNotification.tsx │ │ │ ├── Textarea/ │ │ │ │ └── Textarea.stories.tsx │ │ │ ├── Tooltip/ │ │ │ │ ├── Tooltip.stories.tsx │ │ │ │ └── Tooltip.tsx │ │ │ ├── UsefulStatsButton/ │ │ │ │ ├── UsefulButtonLite.test.tsx │ │ │ │ ├── UsefulButtonLite.tsx │ │ │ │ ├── UsefulStatsButton.stories.tsx │ │ │ │ └── UsefulStatsButton.tsx │ │ │ ├── UserEngagementWrapper/ │ │ │ │ ├── UserEngagementWrapper.stories.tsx │ │ │ │ ├── UserEngagementWrapper.test.tsx │ │ │ │ └── UserEngagementWrapper.tsx │ │ │ ├── UserStatistics/ │ │ │ │ ├── UserStatistics.stories.tsx │ │ │ │ ├── UserStatistics.test.tsx │ │ │ │ └── UserStatistics.tsx │ │ │ ├── Username/ │ │ │ │ ├── DisplayName.stories.tsx │ │ │ │ ├── DisplayName.tsx │ │ │ │ ├── UserBadge.tsx │ │ │ │ ├── Username.stories.tsx │ │ │ │ ├── Username.test.tsx │ │ │ │ └── Username.tsx │ │ │ ├── VerticalList/ │ │ │ │ ├── VerticalList.client.tsx │ │ │ │ └── VerticalList.stories.tsx │ │ │ ├── VideoPlayer/ │ │ │ │ ├── VideoPlayer.stories.tsx │ │ │ │ ├── VideoPlayer.test.tsx │ │ │ │ └── VideoPlayer.tsx │ │ │ ├── VisitorModal/ │ │ │ │ ├── VisitorModal.tsx │ │ │ │ ├── VisitorModalFooter.test.tsx │ │ │ │ ├── VisitorModalFooter.tsx │ │ │ │ ├── VisitorModalHeader.test.tsx │ │ │ │ ├── VisitorModalHeader.tsx │ │ │ │ └── props.ts │ │ │ ├── __mocks__/ │ │ │ │ └── AuthWrapper.mock.tsx │ │ │ ├── hooks/ │ │ │ │ ├── useImageLightbox.tsx │ │ │ │ └── usePhotoSwipeLightbox.ts │ │ │ ├── index.ts │ │ │ ├── providers/ │ │ │ │ └── AuthorsContext.ts │ │ │ ├── test/ │ │ │ │ ├── setup.ts │ │ │ │ └── utils.tsx │ │ │ ├── types/ │ │ │ │ └── common.ts │ │ │ └── utils.ts │ │ ├── tsconfig.json │ │ ├── types/ │ │ │ ├── emotion.d.ts │ │ │ ├── images.d.ts │ │ │ └── photoswipe.d.ts │ │ └── vite.config.ts │ ├── cypress/ │ │ ├── .gitignore │ │ ├── .npmrc │ │ ├── README.md │ │ ├── cypress.config.ts │ │ ├── package.json │ │ ├── scripts/ │ │ │ └── start.mts │ │ ├── src/ │ │ │ ├── data/ │ │ │ │ └── index.ts │ │ │ ├── fixtures/ │ │ │ │ ├── images/ │ │ │ │ │ └── file.random │ │ │ │ └── searchResults.ts │ │ │ ├── integration/ │ │ │ │ ├── SignIn.spec.ts │ │ │ │ ├── SignUp.spec.ts │ │ │ │ ├── academy.spec.ts │ │ │ │ ├── common.spec.ts │ │ │ │ ├── library/ │ │ │ │ │ ├── discussions.spec.ts │ │ │ │ │ ├── read.spec.ts │ │ │ │ │ ├── seo.spec.ts │ │ │ │ │ └── write.spec.ts │ │ │ │ ├── news/ │ │ │ │ │ ├── discussions.spec.ts │ │ │ │ │ ├── read.spec.ts │ │ │ │ │ ├── search.spec.ts │ │ │ │ │ └── write.spec.ts │ │ │ │ ├── notifications.spec.ts │ │ │ │ ├── profile.spec.ts │ │ │ │ ├── profileList.spec.ts │ │ │ │ ├── questions/ │ │ │ │ │ ├── discussions.spec.ts │ │ │ │ │ ├── read.spec.ts │ │ │ │ │ ├── search.spec.ts │ │ │ │ │ └── write.spec.ts │ │ │ │ ├── research/ │ │ │ │ │ ├── discussions.spec.ts │ │ │ │ │ ├── follow.spec.ts │ │ │ │ │ ├── list.spec.ts │ │ │ │ │ ├── read.spec.ts │ │ │ │ │ └── write.spec.ts │ │ │ │ └── settings.spec.ts │ │ │ ├── support/ │ │ │ │ ├── commands.ts │ │ │ │ ├── commandsUi.ts │ │ │ │ ├── hooks.ts │ │ │ │ ├── index.ts │ │ │ │ └── rules.ts │ │ │ └── utils/ │ │ │ ├── TestUtils.ts │ │ │ └── supabaseTestsService.ts │ │ └── tsconfig.json │ └── themes/ │ ├── .gitignore │ ├── assets/ │ │ └── fonts/ │ │ └── README.md │ ├── package.json │ ├── src/ │ │ ├── common/ │ │ │ ├── button.ts │ │ │ ├── commonStyles.ts │ │ │ └── index.ts │ │ ├── fonts/ │ │ │ ├── fonts.d.ts │ │ │ └── index.ts │ │ ├── index.ts │ │ └── types/ │ │ └── index.ts │ └── tsconfig.json ├── react-router.config.ts ├── seed/ │ ├── profilesSeed.ts │ └── usersSeed.ts ├── seed.config.ts ├── seed.sql ├── seed.ts ├── server.js ├── shared/ │ ├── .gitignore │ ├── README.md │ ├── index.ts │ ├── messages.ts │ ├── mocks/ │ │ ├── auth/ │ │ │ ├── index.ts │ │ │ └── users.ts │ │ ├── data/ │ │ │ ├── badges.ts │ │ │ ├── categories.ts │ │ │ ├── discussions.ts │ │ │ ├── index.ts │ │ │ ├── mappins.ts │ │ │ ├── messages.ts │ │ │ ├── news.ts │ │ │ ├── profileTags.ts │ │ │ ├── profileTypes.ts │ │ │ ├── projects.ts │ │ │ ├── questions.ts │ │ │ ├── research.ts │ │ │ ├── researchUpdates.ts │ │ │ ├── tags.ts │ │ │ └── users.ts │ │ └── index.ts │ ├── models/ │ │ ├── author.ts │ │ ├── banner.ts │ │ ├── category.ts │ │ ├── comment.ts │ │ ├── common.ts │ │ ├── content.ts │ │ ├── db.ts │ │ ├── document.ts │ │ ├── filesForm.ts │ │ ├── index.ts │ │ ├── library.ts │ │ ├── maps.ts │ │ ├── media.ts │ │ ├── messages.ts │ │ ├── moderation.ts │ │ ├── news.ts │ │ ├── notifications.ts │ │ ├── notificationsPreferences.ts │ │ ├── patreon.ts │ │ ├── patreonSettings.ts │ │ ├── profile.ts │ │ ├── profileBadge.ts │ │ ├── profileTag.ts │ │ ├── profileType.ts │ │ ├── question.ts │ │ ├── research.ts │ │ ├── selectValue.ts │ │ ├── subscriber.ts │ │ ├── tag.ts │ │ ├── tags.ts │ │ ├── tenantSettings.ts │ │ ├── upgradeBadge.ts │ │ ├── user.ts │ │ ├── userCreatedDocs.ts │ │ ├── userEmailData.ts │ │ ├── voteUseful.ts │ │ └── webmanifest.ts │ ├── package.json │ ├── tsconfig.json │ └── utils/ │ ├── file.utils.ts │ ├── index.ts │ ├── markdown.test.ts │ └── markdown.ts ├── src/ │ ├── .server/ │ │ ├── models/ │ │ │ └── messageSettings.ts │ │ ├── resend.ts │ │ └── templates/ │ │ ├── Layout.tsx │ │ ├── ReceiverMessage.tsx │ │ ├── components/ │ │ │ ├── box-text.tsx │ │ │ ├── button.tsx │ │ │ ├── footer.tsx │ │ │ ├── header.tsx │ │ │ └── heading.tsx │ │ └── instant-notification-email.tsx │ ├── common/ │ │ ├── Alerts/ │ │ │ ├── AlertBanner.test.tsx │ │ │ ├── AlertBanner.tsx │ │ │ ├── AlertIncompleteProfile.tsx │ │ │ └── Alerts.tsx │ │ ├── Analytics/ │ │ │ ├── GoogleAnalytics.tsx │ │ │ └── index.tsx │ │ ├── AuthWrapper.test.tsx │ │ ├── AuthWrapper.tsx │ │ ├── DonationRequestModalContainer.test.tsx │ │ ├── DonationRequestModalContainer.tsx │ │ ├── DownloadWrapper.test.tsx │ │ ├── DownloadWrapper.tsx │ │ ├── Form/ │ │ │ ├── Checkbox.tsx │ │ │ ├── ErrorsContainer.test.tsx │ │ │ ├── ErrorsContainer.tsx │ │ │ ├── FieldContainer.ts │ │ │ ├── FileInput/ │ │ │ │ ├── FileDisplay.tsx │ │ │ │ └── FileInput.tsx │ │ │ ├── FileInput.field.tsx │ │ │ ├── FormWrapper.tsx │ │ │ ├── PasswordField.tsx │ │ │ ├── README.md │ │ │ ├── Select.field.tsx │ │ │ ├── TagsSelectField.tsx │ │ │ ├── UnsavedChangesDialog.tsx │ │ │ ├── labels.ts │ │ │ └── types.ts │ │ ├── HideDiscussionContainer.test.tsx │ │ ├── HideDiscussionContainer.tsx │ │ ├── Highlighter.tsx │ │ ├── PageHeader.tsx │ │ ├── PremiumTierWrapper.test.tsx │ │ ├── PremiumTierWrapper.tsx │ │ ├── Spinner.tsx │ │ ├── Tags/ │ │ │ ├── ProfileTagsSelect.tsx │ │ │ └── TagsSelect.tsx │ │ ├── Toast/ │ │ │ ├── CustomToast.tsx │ │ │ ├── index.tsx │ │ │ └── useToast.tsx │ │ ├── UserAction.test.tsx │ │ ├── UserAction.tsx │ │ └── hooks/ │ │ └── useClickOutside.ts │ ├── config/ │ │ ├── config.ts │ │ ├── constants.ts │ │ ├── default.json │ │ ├── imageTransforms.ts │ │ └── types.ts │ ├── constants.ts │ ├── entry.client.tsx │ ├── entry.server.tsx │ ├── factories/ │ │ ├── commentFactory.server.ts │ │ ├── mapPinFactory.server.ts │ │ └── profileFactory.server.ts │ ├── logger/ │ │ ├── index.test.ts │ │ └── index.ts │ ├── modules/ │ │ ├── index.test.ts │ │ └── index.ts │ ├── pages/ │ │ ├── Academy/ │ │ │ ├── Academy.test.tsx │ │ │ ├── Academy.tsx │ │ │ └── ExternalEmbed/ │ │ │ └── ExternalEmbed.tsx │ │ ├── Library/ │ │ │ ├── Content/ │ │ │ │ ├── Common/ │ │ │ │ │ ├── DeleteProjectButton.tsx │ │ │ │ │ ├── FormSettings.tsx │ │ │ │ │ ├── Library.form.test.tsx │ │ │ │ │ ├── LibraryCategory.field.tsx │ │ │ │ │ ├── LibraryCategoryGuidance.test.tsx │ │ │ │ │ ├── LibraryCategoryGuidance.tsx │ │ │ │ │ ├── LibraryDescription.field.test.tsx │ │ │ │ │ ├── LibraryDescription.field.tsx │ │ │ │ │ ├── LibraryDifficulty.field.tsx │ │ │ │ │ ├── LibraryFileLink.field.tsx │ │ │ │ │ ├── LibraryFileUpload.field.tsx │ │ │ │ │ ├── LibraryForm.tsx │ │ │ │ │ ├── LibraryFormProvider.tsx │ │ │ │ │ ├── LibraryPostingGuidelines.tsx │ │ │ │ │ ├── LibraryStep.field.test.tsx │ │ │ │ │ ├── LibraryStep.field.tsx │ │ │ │ │ ├── LibraryStepsContainer.field.test.tsx │ │ │ │ │ ├── LibraryStepsContainer.field.tsx │ │ │ │ │ ├── LibraryTime.field.tsx │ │ │ │ │ ├── LibraryTitle.field.test.tsx │ │ │ │ │ └── LibraryTitle.field.tsx │ │ │ │ ├── List/ │ │ │ │ │ ├── LibraryList.tsx │ │ │ │ │ ├── LibraryListHeader.tsx │ │ │ │ │ ├── LibrarySortOptions.ts │ │ │ │ │ └── ProjectCard.tsx │ │ │ │ ├── Page/ │ │ │ │ │ ├── LibraryDescription.tsx │ │ │ │ │ ├── LibraryStep.tsx │ │ │ │ │ └── ProjectPage.tsx │ │ │ │ └── utils/ │ │ │ │ ├── downloadCooldown.ts │ │ │ │ ├── index.ts │ │ │ │ ├── transformLibraryErrors.test.ts │ │ │ │ └── transformLibraryErrors.ts │ │ │ ├── constants.ts │ │ │ ├── labels.ts │ │ │ └── library.service.ts │ │ ├── Maps/ │ │ │ ├── Content/ │ │ │ │ ├── MapView/ │ │ │ │ │ ├── ButtonZoomIn.client.tsx │ │ │ │ │ ├── Cluster.client.tsx │ │ │ │ │ ├── MapList.tsx │ │ │ │ │ ├── MapView.tsx │ │ │ │ │ ├── MapWithListHeader.tsx │ │ │ │ │ ├── Popup.client.tsx │ │ │ │ │ ├── Sprites.tsx │ │ │ │ │ ├── popup.css │ │ │ │ │ └── sprites.css │ │ │ │ └── MemberTypeVerticalList/ │ │ │ │ └── MemberTypeVerticalList.client.tsx │ │ │ ├── MapContext.ts │ │ │ ├── MapFilterList.tsx │ │ │ ├── Maps.client.tsx │ │ │ ├── map.service.ts │ │ │ ├── styles.css │ │ │ └── utils/ │ │ │ ├── geolocation.ts │ │ │ ├── pinUtils.test.ts │ │ │ └── pinUtils.ts │ │ ├── News/ │ │ │ ├── Content/ │ │ │ │ └── Common/ │ │ │ │ ├── FormFields/ │ │ │ │ │ ├── NewsBodyField.tsx │ │ │ │ │ ├── NewsImageField.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── NewsForm.test.tsx │ │ │ │ ├── NewsForm.tsx │ │ │ │ └── NewsPostingGuidelines.tsx │ │ │ ├── NewsListHeader.tsx │ │ │ ├── NewsListItem.tsx │ │ │ ├── NewsListing.tsx │ │ │ ├── NewsPage.test.tsx │ │ │ ├── NewsPage.tsx │ │ │ ├── NewsSortOptions.ts │ │ │ ├── constants.ts │ │ │ ├── labels.ts │ │ │ └── newsContent.service.ts │ │ ├── NotFound/ │ │ │ └── NotFound.tsx │ │ ├── PageList.tsx │ │ ├── Question/ │ │ │ ├── Content/ │ │ │ │ └── Common/ │ │ │ │ ├── FormFields/ │ │ │ │ │ ├── QuestionDescription.field.tsx │ │ │ │ │ ├── QuestionImages.field.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── QuestionForm.tsx │ │ │ │ ├── QuestionPostingGuidelines.tsx │ │ │ │ └── index.ts │ │ │ ├── QuestionListHeader.tsx │ │ │ ├── QuestionListItem.tsx │ │ │ ├── QuestionListing.tsx │ │ │ ├── QuestionPage.test.tsx │ │ │ ├── QuestionPage.tsx │ │ │ ├── QuestionSortOptions.ts │ │ │ ├── constants.ts │ │ │ ├── labels.ts │ │ │ └── question.service.ts │ │ ├── Research/ │ │ │ ├── Content/ │ │ │ │ ├── Common/ │ │ │ │ │ ├── DeleteResearchButton.tsx │ │ │ │ │ ├── FormFields/ │ │ │ │ │ │ ├── ResearchCollaboratorsField.tsx │ │ │ │ │ │ ├── ResearchDescriptionField.tsx │ │ │ │ │ │ └── ResearchTitleField.tsx │ │ │ │ │ ├── ResearchCategorySelect.tsx │ │ │ │ │ ├── ResearchForm.tsx │ │ │ │ │ ├── ResearchPostingGuidelines.tsx │ │ │ │ │ ├── ResearchUpdateForm.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── CreateResearch/ │ │ │ │ │ └── Form/ │ │ │ │ │ ├── DescriptionField.tsx │ │ │ │ │ ├── ResearchImagesField.tsx │ │ │ │ │ ├── TitleField.tsx │ │ │ │ │ └── VideoUrlField.tsx │ │ │ │ ├── ResearchArticle.test.tsx │ │ │ │ ├── ResearchArticlePage.tsx │ │ │ │ ├── ResearchDescription.tsx │ │ │ │ ├── ResearchEngagementSection.tsx │ │ │ │ ├── ResearchFooter.tsx │ │ │ │ ├── ResearchLinkToUpdate.tsx │ │ │ │ ├── ResearchList.tsx │ │ │ │ ├── ResearchListHeader.tsx │ │ │ │ ├── ResearchListItem.tsx │ │ │ │ ├── ResearchSearchParams.ts │ │ │ │ ├── ResearchUpdate.tsx │ │ │ │ ├── helper.test.tsx │ │ │ │ └── helper.ts │ │ │ ├── ResearchSortOptions.ts │ │ │ ├── constants.ts │ │ │ ├── labels.ts │ │ │ ├── research.service.test.ts │ │ │ ├── research.service.ts │ │ │ ├── researchHelpers.test.ts │ │ │ └── researchHelpers.ts │ │ ├── SignUp/ │ │ │ └── SignUpMessage.tsx │ │ ├── User/ │ │ │ ├── constants.ts │ │ │ ├── contact/ │ │ │ │ ├── UserContactFieldMessage.tsx │ │ │ │ ├── UserContactFieldName.tsx │ │ │ │ ├── UserContactForm.test.tsx │ │ │ │ ├── UserContactForm.tsx │ │ │ │ ├── UserContactFormAvailable.tsx │ │ │ │ ├── UserContactFormNotLoggedIn.tsx │ │ │ │ ├── UserContactNotLoggedIn.tsx │ │ │ │ └── index.ts │ │ │ ├── content/ │ │ │ │ ├── ProfileContact.tsx │ │ │ │ ├── ProfileDetails.tsx │ │ │ │ ├── ProfileHeader.tsx │ │ │ │ ├── ProfileImage.tsx │ │ │ │ ├── ProfilePage.tsx │ │ │ │ ├── UserCreatedDocuments.test.tsx │ │ │ │ ├── UserCreatedDocuments.tsx │ │ │ │ ├── UserCreatedDocumentsItem.tsx │ │ │ │ └── UserProfile.tsx │ │ │ ├── impact/ │ │ │ │ ├── Impact.test.tsx │ │ │ │ ├── Impact.tsx │ │ │ │ ├── ImpactField.test.tsx │ │ │ │ ├── ImpactField.tsx │ │ │ │ ├── ImpactIcon.tsx │ │ │ │ ├── ImpactItem.test.tsx │ │ │ │ ├── ImpactItem.tsx │ │ │ │ ├── ImpactMissing.test.tsx │ │ │ │ ├── ImpactMissing.tsx │ │ │ │ ├── constants.ts │ │ │ │ └── labels.ts │ │ │ └── labels.ts │ │ ├── UserSettings/ │ │ │ ├── SettingsFormTab.tsx │ │ │ ├── SettingsFormTabList.tsx │ │ │ ├── SettingsPage.client.tsx │ │ │ ├── SettingsPageAccount.tsx │ │ │ ├── SettingsPageImpact.test.tsx │ │ │ ├── SettingsPageImpact.tsx │ │ │ ├── SettingsPageMapPin.test.tsx │ │ │ ├── SettingsPageMapPin.tsx │ │ │ ├── SettingsPageNotifications.tsx │ │ │ ├── SettingsPageUserProfile.test.tsx │ │ │ ├── SettingsPageUserProfile.tsx │ │ │ ├── SupabaseNotifications.tsx │ │ │ ├── SupabaseNotificationsForm.tsx │ │ │ ├── SupabaseNotificationsViaEmail.tsx │ │ │ ├── __mocks__/ │ │ │ │ └── FormProvider.tsx │ │ │ ├── constants.ts │ │ │ ├── content/ │ │ │ │ ├── elements.tsx │ │ │ │ ├── fields/ │ │ │ │ │ ├── ImpactQuestion.field.tsx │ │ │ │ │ ├── ImpactYear.field.tsx │ │ │ │ │ ├── ImpactYearDisplay.field.tsx │ │ │ │ │ ├── PatreonIntegration.test.tsx │ │ │ │ │ ├── PatreonIntegration.tsx │ │ │ │ │ └── ProfileTypeRadio.field.tsx │ │ │ │ ├── impactQuestions.ts │ │ │ │ └── sections/ │ │ │ │ ├── ChangeEmail.form.tsx │ │ │ │ ├── ChangePassword.form.tsx │ │ │ │ ├── EmailNotifications.section.tsx │ │ │ │ ├── ImpactYear.section.tsx │ │ │ │ ├── ProfileTags.section.tsx │ │ │ │ ├── ProfileType.section.test.tsx │ │ │ │ ├── ProfileType.section.tsx │ │ │ │ ├── PublicContact.section.test.tsx │ │ │ │ ├── PublicContact.section.tsx │ │ │ │ ├── UserImages.section.tsx │ │ │ │ ├── UserInfos.section.tsx │ │ │ │ └── VisitorSection.tsx │ │ │ ├── labels.ts │ │ │ ├── services/ │ │ │ │ └── account.service.ts │ │ │ ├── types.ts │ │ │ ├── utils.test.ts │ │ │ └── utils.ts │ │ ├── common/ │ │ │ ├── Breadcrumbs/ │ │ │ │ └── Breadcrumbs.tsx │ │ │ ├── Category/ │ │ │ │ └── CategoriesSelectV2.tsx │ │ │ ├── CommentsSupabase/ │ │ │ │ ├── CollapsableCommentSection.tsx │ │ │ │ ├── CommentItemSupabase.tsx │ │ │ │ ├── CommentReplySupabase.tsx │ │ │ │ ├── CommentSectionSupabase.tsx │ │ │ │ ├── CommentSort.tsx │ │ │ │ ├── CommentSortOptions.ts │ │ │ │ ├── CreateCommentSupabase.css │ │ │ │ ├── CreateCommentSupabase.tsx │ │ │ │ └── useCopyCommentLink.ts │ │ │ ├── Drafts/ │ │ │ │ ├── DraftButton.test.tsx │ │ │ │ ├── DraftButton.tsx │ │ │ │ ├── DraftTag.tsx │ │ │ │ └── useDraftsSupabase.tsx │ │ │ ├── FormFields/ │ │ │ │ ├── Category.field.tsx │ │ │ │ ├── FilesFields.tsx │ │ │ │ ├── FormFieldWrapper.test.tsx │ │ │ │ ├── FormFieldWrapper.tsx │ │ │ │ ├── ImageField.tsx │ │ │ │ ├── ImageInputFieldWrapper.tsx │ │ │ │ ├── ProfileBadgeField.tsx │ │ │ │ ├── StepImagesField.tsx │ │ │ │ ├── Tags.field.tsx │ │ │ │ ├── Title.field.tsx │ │ │ │ ├── index.ts │ │ │ │ └── labels.ts │ │ │ ├── GlobalSiteFooter/ │ │ │ │ └── GlobalSiteFooter.tsx │ │ │ ├── Header/ │ │ │ │ ├── Header.tsx │ │ │ │ ├── Menu/ │ │ │ │ │ ├── Logo/ │ │ │ │ │ │ └── Logo.tsx │ │ │ │ │ ├── MenuDesktop.tsx │ │ │ │ │ ├── MenuMobile/ │ │ │ │ │ │ ├── MenuMobileExternalLink.tsx │ │ │ │ │ │ ├── MenuMobileLink.tsx │ │ │ │ │ │ └── MenuMobilePanel.tsx │ │ │ │ │ ├── Notifications/ │ │ │ │ │ │ └── NotificationsSupabase.tsx │ │ │ │ │ ├── Profile/ │ │ │ │ │ │ ├── Profile.tsx │ │ │ │ │ │ ├── ProfileButtonItem.tsx │ │ │ │ │ │ ├── ProfileButtons.tsx │ │ │ │ │ │ ├── UpgradeBadgeLink.tsx │ │ │ │ │ │ └── profile.css │ │ │ │ │ └── ProfileModal/ │ │ │ │ │ └── ProfileModal.tsx │ │ │ │ └── MobileMenuContext.tsx │ │ │ ├── Layout/ │ │ │ │ ├── ListHeader.tsx │ │ │ │ ├── Main.tsx │ │ │ │ └── MobileSortModal.tsx │ │ │ ├── NotificationsContext.ts │ │ │ ├── SessionContext.ts │ │ │ ├── StickyButton.tsx │ │ │ ├── TenantContext.ts │ │ │ ├── UserNameSelect/ │ │ │ │ └── UserNameSelect.tsx │ │ │ ├── UserNameTag/ │ │ │ │ └── UserNameTag.tsx │ │ │ ├── banner.service.ts │ │ │ └── labels.ts │ │ ├── constants.ts │ │ └── policy/ │ │ ├── PrivacyPolicy.tsx │ │ └── TermsPolicy.tsx │ ├── repository/ │ │ ├── supabase.server.ts │ │ └── supabaseAdmin.server.ts │ ├── root.tsx │ ├── routes/ │ │ ├── [manifest.webmanifest].tsx │ │ ├── [robots.txt].tsx │ │ ├── _.$.tsx │ │ ├── _.academy.$.tsx │ │ ├── _.email-confirmation.tsx │ │ ├── _.email-preferences.tsx │ │ ├── _.feedback.tsx │ │ ├── _.forbidden.tsx │ │ ├── _.how-to.$slug._index.tsx │ │ ├── _.how-to.$slug.edit.tsx │ │ ├── _.how-to._index.tsx │ │ ├── _.how-to.create.tsx │ │ ├── _.how-to.tsx │ │ ├── _.library.$slug._index.tsx │ │ ├── _.library.$slug.edit.tsx │ │ ├── _.library._index.tsx │ │ ├── _.library.create.tsx │ │ ├── _.library.tsx │ │ ├── _.map.tsx │ │ ├── _.news.$slug._index.tsx │ │ ├── _.news.$slug.edit.tsx │ │ ├── _.news._index.tsx │ │ ├── _.news.create.tsx │ │ ├── _.news.tsx │ │ ├── _.patreon.tsx │ │ ├── _.privacy.tsx │ │ ├── _.questions.$slug._index.tsx │ │ ├── _.questions.$slug.edit.tsx │ │ ├── _.questions._index.tsx │ │ ├── _.questions.create.tsx │ │ ├── _.questions.tsx │ │ ├── _.research.$slug._index.tsx │ │ ├── _.research.$slug.edit-update.$updateId.tsx │ │ ├── _.research.$slug.edit.tsx │ │ ├── _.research.$slug.new-update.tsx │ │ ├── _.research._index.tsx │ │ ├── _.research.create.tsx │ │ ├── _.research.tsx │ │ ├── _.reset-password.tsx │ │ ├── _.settings.$.tsx │ │ ├── _.sign-in.tsx │ │ ├── _.sign-up-message.tsx │ │ ├── _.sign-up.tsx │ │ ├── _.terms.tsx │ │ ├── _.tsx │ │ ├── _.u.$id._index.tsx │ │ ├── _.u.tsx │ │ ├── _.update-password.tsx │ │ ├── _index.tsx │ │ ├── api.account.change-email.tsx │ │ ├── api.account.change-password.tsx │ │ ├── api.banner.ts │ │ ├── api.categories.$type.ts │ │ ├── api.comments.$id.source.ts │ │ ├── api.discussions.$sourceId.comments.$id.ts │ │ ├── api.discussions.$sourceType.$sourceId.comments.ts │ │ ├── api.documents.$type.$contentId.$docId.tsx │ │ ├── api.documents.ts │ │ ├── api.donation-settings.$profileId.ts │ │ ├── api.favicon.ts │ │ ├── api.images.ts │ │ ├── api.map-filters.ts │ │ ├── api.map-pin.ts │ │ ├── api.map-pins.$userId.ts │ │ ├── api.map-pins.ts │ │ ├── api.messages.tsx │ │ ├── api.news.$id.ts │ │ ├── api.news.drafts.count.ts │ │ ├── api.news.drafts.ts │ │ ├── api.news.ts │ │ ├── api.notifications-preferences-via-email.$userCode.ts │ │ ├── api.notifications-preferences.ts │ │ ├── api.notifications.$id.read.ts │ │ ├── api.notifications.all.read.ts │ │ ├── api.notifications.ts │ │ ├── api.patreon.ts │ │ ├── api.profile-badges.ts │ │ ├── api.profile-tags.ts │ │ ├── api.profile-types.ts │ │ ├── api.profile.ts │ │ ├── api.profile.username.ts │ │ ├── api.profiles.ts │ │ ├── api.projects.$id.ts │ │ ├── api.projects.drafts.count.ts │ │ ├── api.projects.drafts.ts │ │ ├── api.projects.ts │ │ ├── api.questions.$id.ts │ │ ├── api.questions.drafts.count.ts │ │ ├── api.questions.drafts.ts │ │ ├── api.questions.ts │ │ ├── api.research.$id.status.ts │ │ ├── api.research.$id.ts │ │ ├── api.research.$id.updates.$updateId.ts │ │ ├── api.research.$id.updates.ts │ │ ├── api.research.drafts.count.ts │ │ ├── api.research.drafts.ts │ │ ├── api.research.ts │ │ ├── api.settings.impact.ts │ │ ├── api.settings.map.ts │ │ ├── api.subscribers.$contentType.$contentId.subscribed.ts │ │ ├── api.subscribers.$contentType.$contentId.ts │ │ ├── api.tags.ts │ │ ├── api.upgrade-badges.ts │ │ ├── api.useful.$contentType.$contentId.ts │ │ ├── api.useful.$contentType.$contentId.users.ts │ │ ├── api.useful.$contentType.$contentId.voted.ts │ │ ├── api.useful.$contentType.$id.count.ts │ │ ├── logout.ts │ │ └── redirect.tsx │ ├── routes.ts │ ├── services/ │ │ ├── authService.server.ts │ │ ├── broadcastCoordinationService.server.ts │ │ ├── categoryService.ts │ │ ├── commentService.ts │ │ ├── contentRedirectService.server.ts │ │ ├── contentService.server.ts │ │ ├── discordService.server.ts │ │ ├── formDataHelper.ts │ │ ├── imageService.server.ts │ │ ├── impactService.server.ts │ │ ├── libraryService.server.ts │ │ ├── mapPinsService.server.ts │ │ ├── mapService.server.ts │ │ ├── messageService.ts │ │ ├── newsService.server.ts │ │ ├── newsService.ts │ │ ├── notificationEmailService.server.ts │ │ ├── notificationMapperService.server.ts │ │ ├── notificationsPreferencesService.ts │ │ ├── notificationsPreferencesViaEmailService.ts │ │ ├── notificationsSupabaseService.server.ts │ │ ├── notificationsSupabaseService.ts │ │ ├── patreonService.server.ts │ │ ├── patreonService.ts │ │ ├── profileBadgeService.ts │ │ ├── profileService.server.ts │ │ ├── profileService.ts │ │ ├── profileTagsService.ts │ │ ├── profileTypesService.server.ts │ │ ├── profileTypesService.ts │ │ ├── profilesService.ts │ │ ├── questionService.server.test.ts │ │ ├── questionService.server.ts │ │ ├── questionService.ts │ │ ├── redirectService.server.ts │ │ ├── researchService.server.ts │ │ ├── storageService.server.ts │ │ ├── storageService.ts │ │ ├── subscribersService.server.ts │ │ ├── subscribersService.ts │ │ ├── tagsService.server.ts │ │ ├── tagsService.ts │ │ ├── tenantSettingsService.server.ts │ │ ├── upgradeBadgeService.ts │ │ └── usefulService.ts │ ├── stores/ │ │ ├── Profile/ │ │ │ ├── profile.store.test.ts │ │ │ └── profile.store.tsx │ │ ├── Subscription/ │ │ │ ├── subscription.store.test.ts │ │ │ ├── subscription.store.tsx │ │ │ └── useSubscription.tsx │ │ └── UsefulVote/ │ │ ├── useUsefulVote.tsx │ │ └── usefulVote.store.tsx │ ├── styles/ │ │ ├── context.ts │ │ ├── createEmotionCache.ts │ │ └── leaflet.css │ ├── test/ │ │ ├── components/ │ │ │ └── SettingsFormProvider.tsx │ │ ├── factories/ │ │ │ ├── Category.ts │ │ │ ├── Comment.ts │ │ │ ├── Library.ts │ │ │ ├── MapPin.ts │ │ │ ├── News.ts │ │ │ ├── Question.ts │ │ │ ├── ResearchItem.ts │ │ │ ├── User.ts │ │ │ ├── dbNotification.ts │ │ │ ├── notificationsPreferences.ts │ │ │ ├── profile.ts │ │ │ └── supabaseNotification.ts │ │ ├── models/ │ │ │ └── profile.test.ts │ │ ├── routes/ │ │ │ └── api.notifications-preferences.test.ts │ │ ├── services/ │ │ │ ├── broadcastCoordinationService.server.ts │ │ │ ├── notificationsPreferencesService.test.ts │ │ │ ├── notificationsPreferencesViaEmailService.test.ts │ │ │ └── subscribersService.server.test.ts │ │ ├── setup.ts │ │ └── utils/ │ │ └── supabaseClientMock.ts │ ├── types/ │ │ └── emotion.d.ts │ └── utils/ │ ├── comparisons.ts │ ├── contentType.utils.ts │ ├── filters.ts │ ├── fireConfetti.ts │ ├── formatImageListForGallery.ts │ ├── getLocationData.ts │ ├── getSummaryFromMarkdown.test.ts │ ├── getSummaryFromMarkdown.ts │ ├── helpers.test.ts │ ├── helpers.ts │ ├── httpException.ts │ ├── mentions.utils.ts │ ├── redirect.server.ts │ ├── searchHelper.test.ts │ ├── searchHelper.ts │ ├── seo.utils.ts │ ├── sessionStorage.ts │ ├── slug.ts │ ├── statistics.tsx │ ├── stopwords.ts │ ├── storage.ts │ ├── tokens.server.ts │ ├── urlHelper.ts │ ├── urls.ts │ ├── validators.test.ts │ └── validators.ts ├── supabase/ │ ├── .gitignore │ ├── README.md │ ├── config.toml │ ├── functions/ │ │ └── send-email/ │ │ ├── .npmrc │ │ ├── _templates/ │ │ │ ├── components/ │ │ │ │ ├── box-text.tsx │ │ │ │ ├── button.tsx │ │ │ │ ├── footer.tsx │ │ │ │ ├── header.tsx │ │ │ │ ├── heading.tsx │ │ │ │ ├── hero.tsx │ │ │ │ ├── parent-box.tsx │ │ │ │ └── plain-text.tsx │ │ │ ├── email-change-new.tsx │ │ │ ├── layout.tsx │ │ │ ├── magic-link.tsx │ │ │ ├── moderation-email.tsx │ │ │ ├── reset-password.tsx │ │ │ └── sign-up.tsx │ │ ├── deno.json │ │ ├── getTenantSettings.ts │ │ ├── index.ts │ │ └── signWebhookHeader.ts │ ├── migrations/ │ │ ├── 20241125140428_profiles_and_comments.sql │ │ ├── 20250111151556_questions.sql │ │ ├── 20250113184950_profile_auth_columns.sql │ │ ├── 20250208130256_auth_rpc.sql │ │ ├── 20250209131232_profile_firebase.sql │ │ ├── 20250214235014_messages.sql │ │ ├── 20250225071100_unique_username.sql │ │ ├── 20250307061534_messages_temp_fix.sql │ │ ├── 20250312063008_patreon.sql │ │ ├── 20250331134409_add_news.sql │ │ ├── 20250416104948_research.sql │ │ ├── 20250422092704_add_notifications.sql │ │ ├── 20250512170000_research_sorting.sql │ │ ├── 20250513090512_update_for_email_notifications.sql │ │ ├── 20250514163118_update_notifications.sql │ │ ├── 20250520134140_update_notifications_for_research_comments.sql │ │ ├── 20250521044802_fix-research-sorting-useful.sql │ │ ├── 20250523104253_20250523_add-get-user-questions.sql │ │ ├── 20250603130017_add_notifications_preferences.sql │ │ ├── 20250605115351_research-latest-updated.sql │ │ ├── 20250609100159_research_query_ranking.sql │ │ ├── 20250609101144_library.sql │ │ ├── 20250617151457_update_notification_preferences.sql │ │ ├── 20250621165139_user_research_filter_draft.sql │ │ ├── 20250624101144_replace_get_projects_count.sql │ │ ├── 20250624101145_replace_get_user_projects.sql │ │ ├── 20250624101147_replace_get_user_projects_again.sql │ │ ├── 20250625162400_update_questions_news_is_draft.sql │ │ ├── 20250702155642_add_unsubscribe_to_preferences.sql │ │ ├── 20250722145300_profile.sql │ │ ├── 20250819103736_add_badge_id_to_news.sql │ │ ├── 20250824222054_fix-author-vote-count-deleted.sql │ │ ├── 20250830203011_banner.sql │ │ ├── 20250902101059_map_pins-optimizations.sql │ │ ├── 20250904101010_useful_comments.sql │ │ ├── 20250912091153_fix-delete-comment-trigger.sql │ │ ├── 20250912110000_optimize_get_comments_with_votes.sql │ │ ├── 20250912210000_optimize_profile_indexes.sql │ │ ├── 20250914104923_update_notifications.sql │ │ ├── 20251011132910_fix_messages_receiver.sql │ │ ├── 20251011233154_fix_policy_performance.sql │ │ ├── 20251011234304_fix_function_security_warning.sql │ │ ├── 20251012135652_fix_policy_performance_2.sql │ │ ├── 20251024140004_fix_get_project_count.sql │ │ ├── 20251025145021_add_most_views_sort.sql │ │ ├── 20251031045802_add_favicon.sql │ │ ├── 20251119072930_track_badges.sql │ │ ├── 20251124054625_profile_donations.sql │ │ ├── 20251130000401_create_upgrade_badge_table.sql │ │ ├── 20251203151049_research_author_search_fix.sql │ │ ├── 20251217132033_add_most_useful_last_week_feature.sql │ │ ├── 20260103002808_add_premium_tier.sql │ │ ├── 20260118140428_update_user_doc_gets.sql │ │ ├── 20260118233300_batch_notifications.sql │ │ ├── 20260216125228_more_tenant_settings.sql │ │ ├── 20260227070309_site_description.sql │ │ ├── 20260301000000_fix_partial_search.sql │ │ ├── 20260309135320_questions_search_rpc.sql │ │ ├── 20260317131051_add_published_at.sql │ │ ├── 20260322000000_add_get_storage_object_path.sql │ │ ├── 20260330124656_make_username_nullable.sql │ │ ├── 20260401000000_tenant_settings_ga.sql │ │ ├── 20260402103538_search_multiple_words.sql │ │ ├── 20260402150623_search_stop_words.sql │ │ └── 20260421051050_pwa_icons.sql │ ├── schemas/ │ │ ├── banners.sql │ │ ├── categories.sql │ │ ├── comments.sql │ │ ├── common.sql │ │ ├── map.sql │ │ ├── messages.sql │ │ ├── news.sql │ │ ├── notifications.sql │ │ ├── patreon.sql │ │ ├── profiles.sql │ │ ├── projects.sql │ │ ├── questions.sql │ │ ├── research.sql │ │ ├── subscribers.sql │ │ ├── tags.sql │ │ ├── tenant_settings.sql │ │ └── useful.sql │ └── seed.sql ├── tsconfig.json ├── tsconfig.prod.json ├── vite-env.d.ts └── vite.config.ts